<?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>17898</bug_id>
          
          <creation_ts>2008-03-17 12:50:42 -0700</creation_ts>
          <short_desc>Split PluginMessageThrottlerWin into its own files</short_desc>
          <delta_ts>2008-03-17 13:35:33 -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>Plug-ins</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Rodney Dawes">dobey</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>74137</commentid>
    <comment_count>0</comment_count>
    <who name="Rodney Dawes">dobey</who>
    <bug_when>2008-03-17 12:50:42 -0700</bug_when>
    <thetext>As a requirement for refactoring PluginView into shared code, we need to split out PluginMessageThrottlerWin into its own source files, so that the class is defined in a header which can be included, to resolve the methods needed by the OwnPtr template used with this class in PluginView. The attached patch accomplishes this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74138</commentid>
    <comment_count>1</comment_count>
      <attachid>19844</attachid>
    <who name="Rodney Dawes">dobey</who>
    <bug_when>2008-03-17 12:51:18 -0700</bug_when>
    <thetext>Created attachment 19844
Patch to split PluginMessageThrottlerWin from PluginViewWin.cpp</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74140</commentid>
    <comment_count>2</comment_count>
      <attachid>19844</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-17 13:03:34 -0700</bug_when>
    <thetext>Comment on attachment 19844
Patch to split PluginMessageThrottlerWin from PluginViewWin.cpp

+++ WebCore/plugins/PluginView.h	(working copy)
@@ -34,6 +34,7 @@
 #include &quot;IntRect.h&quot;
 #include &quot;KURL.h&quot;
 #include &quot;PlatformString.h&quot;
+#include &quot;PluginMessageThrottlerWin.h&quot;
 #include &quot;PluginStream.h&quot;
 #include &quot;ResourceRequest.h&quot;
 #include &quot;Timer.h&quot;
@@ -59,7 +60,6 @@ namespace WebCore {
     class KeyboardEvent;
     class MouseEvent;
     class KURL;
-    class PluginMessageThrottlerWin;
     class PluginPackage;
     class PluginRequest;
     class PluginStream;

This change should not be necessary for just moving the class into its own files.

PluginView.h should not change in this patch.

+#ifndef PluginMessageThrottlerWin_H

That should be a lowercase &quot;h&quot; at the end of the macro.

I&apos;ll fix the above two issues when landing this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74144</commentid>
    <comment_count>3</comment_count>
    <who name="Rodney Dawes">dobey</who>
    <bug_when>2008-03-17 13:21:01 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; This change should not be necessary for just moving the class into its own
&gt; files.
&gt; 
&gt; PluginView.h should not change in this patch.

I changed this because the compile failed without doing so. I also noted this change in the ChangeLog entry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74146</commentid>
    <comment_count>4</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-17 13:35:09 -0700</bug_when>
    <thetext>Committed in r31106</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74147</commentid>
    <comment_count>5</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2008-03-17 13:35:33 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; This change should not be necessary for just moving the class into its own
&gt; &gt; files.
&gt; &gt; 
&gt; &gt; PluginView.h should not change in this patch.
&gt; 
&gt; I changed this because the compile failed without doing so. I also noted this
&gt; change in the ChangeLog entry.

It works just fine if you add the include to PluginViewWin.cpp instead, which is where it&apos;s actually needed. I did this before landing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19844</attachid>
            <date>2008-03-17 12:51:18 -0700</date>
            <delta_ts>2008-03-17 13:03:34 -0700</delta_ts>
            <desc>Patch to split PluginMessageThrottlerWin from PluginViewWin.cpp</desc>
            <filename>webkit-pluginthrottler.patch</filename>
            <type>text/plain</type>
            <size>113799</size>
            <attacher name="Rodney Dawes">dobey</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzMTEwMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMDgtMDMtMTcgIFJvZG5leSBEYXdlcyAgPGRvYmV5QHdheW9mdGhl
bW9ua2V5LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhISkKKworICAg
ICAgICBNb3ZlIHRoZSBQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luIGNsYXNzIGludG8gaXRzIG93
biBmaWxlcywgaW4KKyAgICAgICAgcHJlcGFyYXRpb24gZm9yIHJlZmFjdG9yaW5nIFBsdWdpblZp
ZXcgY29kZSB0byBiZSBzaGFyZWQuCisgICAgICAgIEluY2x1ZGUgdGhlIGhlYWRlciBpbnN0ZWFk
IG9mIHVzaW5nIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiwgc28gdGhhdAorICAgICAgICB0aGUgT3du
UHRyIHVzYWdlIHdpbGwgY29tcGlsZSBwcm9wZXJseS4KKworICAgICAgICAqIFdlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIHBsdWdpbnMvUGx1Z2luVmlldy5oOgorICAg
ICAgICAqIHBsdWdpbnMvd2luL1BsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4uY3BwOgorICAgICAg
ICAqIHBsdWdpbnMvd2luL1BsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4uaDoKKyAgICAgICAgKiBw
bHVnaW5zL3dpbi9QbHVnaW5WaWV3V2luLmNwcDoKKwogMjAwOC0wMy0xNiAgVGltb3RoeSBIYXRj
aGVyICA8dGltb3RoeUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRs
ZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDMx
MTAyKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBj
b3B5KQpAQCAtMTAyMjEsNiArMTAyMjEsMTQgQEAKIAkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbHVn
aW5zXHdpblxQbHVnaW5WaWV3V2luLmNwcCINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KKwkJCQk8
RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbHVnaW5zXHdpblxQbHVnaW5NZXNzYWdlVGhy
b3R0bGVyV2luLmNwcCINCisJCQkJCT4NCisJCQkJPC9GaWxlPg0KKwkJCQk8RmlsZQ0KKwkJCQkJ
UmVsYXRpdmVQYXRoPSIuLlxwbHVnaW5zXHdpblxQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luLmgi
DQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCiAJCQk8L0ZpbHRlcj4NCiAJCTwvRmlsdGVyPg0KIAkJ
PEZpbHRlcg0KSW5kZXg6IFdlYkNvcmUvcGx1Z2lucy9QbHVnaW5WaWV3LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbHVnaW5zL1BsdWdpblZpZXcuaAkocmV2aXNpb24gMzExMDIpCisrKyBXZWJD
b3JlL3BsdWdpbnMvUGx1Z2luVmlldy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw3IEBA
CiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4uaCIKICNp
bmNsdWRlICJQbHVnaW5TdHJlYW0uaCIKICNpbmNsdWRlICJSZXNvdXJjZVJlcXVlc3QuaCIKICNp
bmNsdWRlICJUaW1lci5oIgpAQCAtNTksNyArNjAsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAg
ICAgY2xhc3MgS2V5Ym9hcmRFdmVudDsKICAgICBjbGFzcyBNb3VzZUV2ZW50OwogICAgIGNsYXNz
IEtVUkw7Ci0gICAgY2xhc3MgUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjsKICAgICBjbGFzcyBQ
bHVnaW5QYWNrYWdlOwogICAgIGNsYXNzIFBsdWdpblJlcXVlc3Q7CiAgICAgY2xhc3MgUGx1Z2lu
U3RyZWFtOwpJbmRleDogV2ViQ29yZS9wbHVnaW5zL3dpbi9QbHVnaW5NZXNzYWdlVGhyb3R0bGVy
V2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsdWdpbnMvd2luL1BsdWdpbk1lc3NhZ2VU
aHJvdHRsZXJXaW4uY3BwCShyZXZpc2lvbiAzMTA5NikJKGZyb20gV2ViQ29yZS9wbHVnaW5zL3dp
bi9QbHVnaW5WaWV3V2luLmNwcDozMTA5NikKKysrIFdlYkNvcmUvcGx1Z2lucy93aW4vUGx1Z2lu
TWVzc2FnZVRocm90dGxlcldpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjU1IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEsIEx0ZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlBsdWdpblZpZXcuaCIKKworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1l
bnRMb2FkZXIuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5o
IgorI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5o
IgorI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1h
Z2UuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGx1Z0luRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkpTRE9NV2luZG93LmgiCisjaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5o
IgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJNb3VzZUV2ZW50Lmgi
CisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVk
ZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisj
aW5jbHVkZSAiUGx1Z2luUGFja2FnZS5oIgorI2luY2x1ZGUgImtqc19iaW5kaW5nLmgiCisjaW5j
bHVkZSAia2pzX3Byb3h5LmgiCisjaW5jbHVkZSAiUGx1Z2luRGF0YWJhc2UuaCIKKyNpbmNsdWRl
ICJQbHVnaW5EZWJ1Zy5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJj
X2luc3RhbmNlLmgiCisjaW5jbHVkZSAibnBydW50aW1lX2ltcGwuaCIKKyNpbmNsdWRlICJydW50
aW1lX3Jvb3QuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgInJ1bnRpbWUuaCIK
KyNpbmNsdWRlIDxranMvSlNMb2NrLmg+CisjaW5jbHVkZSA8a2pzL3ZhbHVlLmg+CisjaW5jbHVk
ZSA8d3RmL0FTQ0lJQ1R5cGUuaD4KKwordXNpbmcgS0pTOjpFeGVjU3RhdGU7Cit1c2luZyBLSlM6
OkpTTG9jazsKK3VzaW5nIEtKUzo6SlNPYmplY3Q7Cit1c2luZyBLSlM6OkpTVmFsdWU7Cit1c2lu
ZyBLSlM6OlVTdHJpbmc7CisKK3VzaW5nIHN0ZDo6bWluOworCit1c2luZyBuYW1lc3BhY2UgV1RG
OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBFdmVudE5hbWVzOwor
dXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKworY2xhc3MgUGx1Z2luUmVxdWVzdCB7CitwdWJs
aWM6CisgICAgUGx1Z2luUmVxdWVzdChjb25zdCBGcmFtZUxvYWRSZXF1ZXN0JiBmcmFtZUxvYWRS
ZXF1ZXN0LCBib29sIHNlbmROb3RpZmljYXRpb24sIHZvaWQqIG5vdGlmeURhdGEsIGJvb2wgc2hv
dWxkQWxsb3dQb3B1cHMpCisgICAgICAgIDogbV9mcmFtZUxvYWRSZXF1ZXN0KGZyYW1lTG9hZFJl
cXVlc3QpCisgICAgICAgICwgbV9ub3RpZnlEYXRhKG5vdGlmeURhdGEpCisgICAgICAgICwgbV9z
ZW5kTm90aWZpY2F0aW9uKHNlbmROb3RpZmljYXRpb24pCisgICAgICAgICwgbV9zaG91bGRBbGxv
d1BvcHVwcyhzaG91bGRBbGxvd1BvcHVwcykgeyB9CitwdWJsaWM6CisgICAgY29uc3QgRnJhbWVM
b2FkUmVxdWVzdCYgZnJhbWVMb2FkUmVxdWVzdCgpIGNvbnN0IHsgcmV0dXJuIG1fZnJhbWVMb2Fk
UmVxdWVzdDsgfQorICAgIHZvaWQqIG5vdGlmeURhdGEoKSBjb25zdCB7IHJldHVybiBtX25vdGlm
eURhdGE7IH0KKyAgICBib29sIHNlbmROb3RpZmljYXRpb24oKSBjb25zdCB7IHJldHVybiBtX3Nl
bmROb3RpZmljYXRpb247IH0KKyAgICBib29sIHNob3VsZEFsbG93UG9wdXBzKCkgY29uc3QgeyBy
ZXR1cm4gbV9zaG91bGRBbGxvd1BvcHVwczsgfQorcHJpdmF0ZToKKyAgICBGcmFtZUxvYWRSZXF1
ZXN0IG1fZnJhbWVMb2FkUmVxdWVzdDsKKyAgICB2b2lkKiBtX25vdGlmeURhdGE7CisgICAgYm9v
bCBtX3NlbmROb3RpZmljYXRpb247CisgICAgYm9vbCBtX3Nob3VsZEFsbG93UG9wdXBzOworfTsK
Kworc3RhdGljIGNvbnN0IGRvdWJsZSBNZXNzYWdlVGhyb3R0bGVUaW1lSW50ZXJ2YWwgPSAwLjAw
MTsKK3N0YXRpYyBpbnQgc19jYWxsaW5nUGx1Z2luOworCitjbGFzcyBQbHVnaW5NZXNzYWdlVGhy
b3R0bGVyV2luIHsKK3B1YmxpYzoKKyAgICBQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luKFBsdWdp
blZpZXcqIHBsdWdpblZpZXcpCisgICAgICAgIDogbV9iYWNrKDApLCBtX2Zyb250KDApCisgICAg
ICAgICwgbV9wbHVnaW5WaWV3KHBsdWdpblZpZXcpCisgICAgICAgICwgbV9tZXNzYWdlVGhyb3R0
bGVUaW1lcih0aGlzLCAmUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjo6bWVzc2FnZVRocm90dGxl
VGltZXJGaXJlZCkKKyAgICB7CisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCB3
aXRoIG91ciBpbmxpbmUgbWVzc2FnZXMKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IE51bUlubGluZU1lc3NhZ2VzIC0gMTsgaSsrKQorICAgICAgICAgICAgbV9pbmxpbmVNZXNzYWdl
c1tpXS5uZXh0ID0gJm1faW5saW5lTWVzc2FnZXNbaSArIDFdOworICAgICAgICBtX2lubGluZU1l
c3NhZ2VzW051bUlubGluZU1lc3NhZ2VzIC0gMV0ubmV4dCA9IDA7CisgICAgICAgIG1fZnJlZUlu
bGluZU1lc3NhZ2VzID0gJm1faW5saW5lTWVzc2FnZXNbMF07CisgICAgfQorCisgICAgflBsdWdp
bk1lc3NhZ2VUaHJvdHRsZXJXaW4oKQorICAgIHsKKyAgICAgICAgUGx1Z2luTWVzc2FnZSogbmV4
dDsKKyAgICAKKyAgICAgICAgZm9yIChQbHVnaW5NZXNzYWdlKiBtZXNzYWdlID0gbV9mcm9udDsg
bWVzc2FnZTsgbWVzc2FnZSA9IG5leHQpIHsKKyAgICAgICAgICAgIG5leHQgPSBtZXNzYWdlLT5u
ZXh0OworICAgICAgICAgICAgZnJlZU1lc3NhZ2UobWVzc2FnZSk7CisgICAgICAgIH0gICAgICAg
IAorICAgIH0KKyAgICAKKyAgICB2b2lkIGFwcGVuZE1lc3NhZ2UoSFdORCBoV25kLCBVSU5UIG1z
ZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkgCisgICAgeworICAgICAgICBQbHVnaW5N
ZXNzYWdlKiBtZXNzYWdlID0gYWxsb2NhdGVNZXNzYWdlKCk7CisKKyAgICAgICAgbWVzc2FnZS0+
aFduZCA9IGhXbmQ7CisgICAgICAgIG1lc3NhZ2UtPm1zZyA9IG1zZzsKKyAgICAgICAgbWVzc2Fn
ZS0+d1BhcmFtID0gd1BhcmFtOworICAgICAgICBtZXNzYWdlLT5sUGFyYW0gPSBsUGFyYW07Cisg
ICAgICAgIG1lc3NhZ2UtPm5leHQgPSAwOworCisgICAgICAgIGlmIChtX2JhY2spCisgICAgICAg
ICAgICBtX2JhY2stPm5leHQgPSBtZXNzYWdlOworICAgICAgICBtX2JhY2sgPSBtZXNzYWdlOwor
ICAgICAgICBpZiAoIW1fZnJvbnQpCisgICAgICAgICAgICBtX2Zyb250ID0gbWVzc2FnZTsKKwor
ICAgICAgICBpZiAoIW1fbWVzc2FnZVRocm90dGxlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAg
ICAgIG1fbWVzc2FnZVRocm90dGxlVGltZXIuc3RhcnRPbmVTaG90KE1lc3NhZ2VUaHJvdHRsZVRp
bWVJbnRlcnZhbCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0cnVjdCBQbHVnaW5NZXNzYWdl
IHsKKyAgICAgICAgSFdORCBoV25kOworICAgICAgICBVSU5UIG1zZzsKKyAgICAgICAgV1BBUkFN
IHdQYXJhbTsKKyAgICAgICAgTFBBUkFNIGxQYXJhbTsKKworICAgICAgICBzdHJ1Y3QgUGx1Z2lu
TWVzc2FnZSogbmV4dDsKKyAgICB9OworICAgIAorICAgIHZvaWQgbWVzc2FnZVRocm90dGxlVGlt
ZXJGaXJlZChUaW1lcjxQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luPiopCisgICAgeworICAgICAg
ICBQbHVnaW5NZXNzYWdlKiBtZXNzYWdlID0gbV9mcm9udDsKKyAgICAgICAgbV9mcm9udCA9IG1f
ZnJvbnQtPm5leHQ7CisgICAgICAgIGlmIChtZXNzYWdlID09IG1fYmFjaykKKyAgICAgICAgICAg
IG1fYmFjayA9IDA7CisKKyAgICAgICAgOjpDYWxsV2luZG93UHJvYyhtX3BsdWdpblZpZXctPnBs
dWdpblduZFByb2MoKSwgbWVzc2FnZS0+aFduZCwgbWVzc2FnZS0+bXNnLCBtZXNzYWdlLT53UGFy
YW0sIG1lc3NhZ2UtPmxQYXJhbSk7CisKKyAgICAgICAgZnJlZU1lc3NhZ2UobWVzc2FnZSk7CisK
KyAgICAgICAgaWYgKG1fZnJvbnQpCisgICAgICAgICAgICBtX21lc3NhZ2VUaHJvdHRsZVRpbWVy
LnN0YXJ0T25lU2hvdChNZXNzYWdlVGhyb3R0bGVUaW1lSW50ZXJ2YWwpOworICAgIH0KKworICAg
IFBsdWdpbk1lc3NhZ2UqIGFsbG9jYXRlTWVzc2FnZSgpCisgICAgeworICAgICAgICBQbHVnaW5N
ZXNzYWdlICptZXNzYWdlOworCisgICAgICAgIGlmIChtX2ZyZWVJbmxpbmVNZXNzYWdlcykgewor
ICAgICAgICAgICAgbWVzc2FnZSA9IG1fZnJlZUlubGluZU1lc3NhZ2VzOworICAgICAgICAgICAg
bV9mcmVlSW5saW5lTWVzc2FnZXMgPSBtZXNzYWdlLT5uZXh0OworICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgUGx1Z2luTWVzc2FnZTsKKworICAgICAgICByZXR1cm4g
bWVzc2FnZTsKKyAgICB9CisKKyAgICBib29sIGlzSW5saW5lTWVzc2FnZShQbHVnaW5NZXNzYWdl
KiBtZXNzYWdlKSAKKyAgICB7CisgICAgICAgIHJldHVybiBtZXNzYWdlID49ICZtX2lubGluZU1l
c3NhZ2VzWzBdICYmIG1lc3NhZ2UgPD0gJm1faW5saW5lTWVzc2FnZXNbTnVtSW5saW5lTWVzc2Fn
ZXMgLSAxXTsKKyAgICB9CisKKyAgICB2b2lkIGZyZWVNZXNzYWdlKFBsdWdpbk1lc3NhZ2UqIG1l
c3NhZ2UpIAorICAgIHsKKyAgICAgICAgaWYgKGlzSW5saW5lTWVzc2FnZShtZXNzYWdlKSkgewor
ICAgICAgICAgICAgbWVzc2FnZS0+bmV4dCA9IG1fZnJlZUlubGluZU1lc3NhZ2VzOworICAgICAg
ICAgICAgbV9mcmVlSW5saW5lTWVzc2FnZXMgPSBtZXNzYWdlOworICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlOworICAgIH0KKworICAgIFBsdWdpblZpZXcqIG1fcGx1
Z2luVmlldzsKKyAgICBQbHVnaW5NZXNzYWdlKiBtX2JhY2s7CisgICAgUGx1Z2luTWVzc2FnZSog
bV9mcm9udDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtSW5saW5lTWVzc2FnZXMgPSA0Owor
ICAgIFBsdWdpbk1lc3NhZ2UgbV9pbmxpbmVNZXNzYWdlc1tOdW1JbmxpbmVNZXNzYWdlc107Cisg
ICAgUGx1Z2luTWVzc2FnZSogbV9mcmVlSW5saW5lTWVzc2FnZXM7CisKKyAgICBUaW1lcjxQbHVn
aW5NZXNzYWdlVGhyb3R0bGVyV2luPiBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyOworfTsKKworc3Rh
dGljIFN0cmluZyBzY3JpcHRTdHJpbmdJZkphdmFTY3JpcHRVUkwoY29uc3QgS1VSTCYgdXJsKQor
eworICAgIGlmICghdXJsLnByb3RvY29sSXMoImphdmFzY3JpcHQiKSkKKyAgICAgICAgcmV0dXJu
IFN0cmluZygpOworCisgICAgLy8gVGhpcyByZXR1cm5zIGFuIHVuZXNjYXBlZCBzdHJpbmcKKyAg
ICByZXR1cm4gZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKHVybC5zdHJpbmcoKS5zdWJzdHJpbmco
MTEpKTsKK30KKworUGx1Z2luVmlldyogUGx1Z2luVmlldzo6c19jdXJyZW50UGx1Z2luVmlldyA9
IDA7CisKK2NvbnN0IExQQ1dTVFIga1dlYlBsdWdpblZpZXdkb3dDbGFzc05hbWUgPSBMIldlYlBs
dWdpblZpZXciOworY29uc3QgTFBDV1NUUiBrV2ViUGx1Z2luVmlld1Byb3BlcnR5ID0gTCJXZWJQ
bHVnaW5WaWV3UHJvcGVydHkiOworCitzdGF0aWMgY29uc3QgY2hhciogTW96aWxsYVVzZXJBZ2Vu
dCA9ICJNb3ppbGxhLzUuMCAoV2luZG93czsgVTsgV2luZG93cyBOVCA1LjE7IGVuLVVTOyBydjox
LjguMSkgR2Vja28vMjAwNjEwMTAgRmlyZWZveC8yLjAiOworCitzdGF0aWMgTFJFU1VMVCBDQUxM
QkFDSyBQbHVnaW5WaWV3V25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQ
YXJhbSwgTFBBUkFNIGxQYXJhbSk7CisKK3N0YXRpYyBib29sIHJlZ2lzdGVyUGx1Z2luVmlldygp
Cit7CisgICAgc3RhdGljIGJvb2wgaGF2ZVJlZ2lzdGVyZWRXaW5kb3dDbGFzcyA9IGZhbHNlOwor
ICAgIGlmIChoYXZlUmVnaXN0ZXJlZFdpbmRvd0NsYXNzKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIGhhdmVSZWdpc3RlcmVkV2luZG93Q2xhc3MgPSB0cnVlOworCisgICAgQVNTRVJUKFBh
Z2U6Omluc3RhbmNlSGFuZGxlKCkpOworCisgICAgV05EQ0xBU1NFWCB3Y2V4OworCisgICAgd2Nl
eC5jYlNpemUgPSBzaXplb2YoV05EQ0xBU1NFWCk7CisKKyAgICB3Y2V4LnN0eWxlICAgICAgICAg
ID0gQ1NfREJMQ0xLUzsKKyAgICB3Y2V4LmxwZm5XbmRQcm9jICAgID0gRGVmV2luZG93UHJvYzsK
KyAgICB3Y2V4LmNiQ2xzRXh0cmEgICAgID0gMDsKKyAgICB3Y2V4LmNiV25kRXh0cmEgICAgID0g
MDsKKyAgICB3Y2V4LmhJbnN0YW5jZSAgICAgID0gUGFnZTo6aW5zdGFuY2VIYW5kbGUoKTsKKyAg
ICB3Y2V4LmhJY29uICAgICAgICAgID0gMDsKKyAgICB3Y2V4LmhDdXJzb3IgICAgICAgID0gTG9h
ZEN1cnNvcigwLCBJRENfQVJST1cpOworICAgIHdjZXguaGJyQmFja2dyb3VuZCAgPSAoSEJSVVNI
KUNPTE9SX1dJTkRPVzsKKyAgICB3Y2V4Lmxwc3pNZW51TmFtZSAgID0gMDsKKyAgICB3Y2V4Lmxw
c3pDbGFzc05hbWUgID0ga1dlYlBsdWdpblZpZXdkb3dDbGFzc05hbWU7CisgICAgd2NleC5oSWNv
blNtICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gISFSZWdpc3RlckNsYXNzRXgoJndjZXgpOwor
fQorCitzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBQbHVnaW5WaWV3V25kUHJvYyhIV05EIGhXbmQs
IFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBQbHVn
aW5WaWV3KiBwbHVnaW5WaWV3ID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5WaWV3Kj4oR2V0UHJv
cChoV25kLCBrV2ViUGx1Z2luVmlld1Byb3BlcnR5KSk7CisKKyAgICByZXR1cm4gcGx1Z2luVmll
dy0+d25kUHJvYyhoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6cG9wUG9wdXBzU3RhdGVUaW1lckZpcmVkKFRpbWVyPFBsdWdpblZpZXc+KikKK3sK
KyAgICBwb3BQb3B1cHNFbmFibGVkU3RhdGUoKTsKK30KKworCitzdGF0aWMgYm9vbCBpc1dpbmRv
d3NNZXNzYWdlVXNlckdlc3R1cmUoVUlOVCBtZXNzYWdlKQoreworICAgIHN3aXRjaCAobWVzc2Fn
ZSkgeworICAgICAgICBjYXNlIFdNX0xCVVRUT05VUDoKKyAgICAgICAgY2FzZSBXTV9NQlVUVE9O
VVA6CisgICAgICAgIGNhc2UgV01fUkJVVFRPTlVQOgorICAgICAgICBjYXNlIFdNX0tFWVVQOgor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitMUkVTVUxUCitQbHVnaW5WaWV3Ojp3bmRQcm9jKEhX
TkQgaFduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorewor
ICAgIC8vIDxyZGFyOi8vNTcxMTEzNj4gU29tZXRpbWVzIEZsYXNoIHdpbGwgY2FsbCBTZXRDYXB0
dXJlIGJlZm9yZSBjcmVhdGluZworICAgIC8vIGEgZnVsbC1zY3JlZW4gd2luZG93IGFuZCB3aWxs
IG5vdCByZWxlYXNlIGl0LCB3aGljaCBjYXVzZXMgdGhlCisgICAgLy8gZnVsbC1zY3JlZW4gd2lu
ZG93IHRvIG5ldmVyIHJlY2VpdmUgbW91c2UgZXZlbnRzLiBXZSBzZXQvcmVsZWFzZSBjYXB0dXJl
CisgICAgLy8gb24gbW91c2UgZG93bi91cCBiZWZvcmUgc2VuZGluZyB0aGUgZXZlbnQgdG8gdGhl
IHBsdWctaW4gdG8gcHJldmVudCB0aGF0LgorICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAgICAg
ICBjYXNlIFdNX0xCVVRUT05ET1dOOgorICAgICAgICBjYXNlIFdNX01CVVRUT05ET1dOOgorICAg
ICAgICBjYXNlIFdNX1JCVVRUT05ET1dOOgorICAgICAgICAgICAgOjpTZXRDYXB0dXJlKGhXbmQp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV01fTEJVVFRPTlVQOgorICAgICAg
ICBjYXNlIFdNX01CVVRUT05VUDoKKyAgICAgICAgY2FzZSBXTV9SQlVUVE9OVVA6CisgICAgICAg
ICAgICA6OlJlbGVhc2VDYXB0dXJlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBpZiAobWVzc2FnZSA9PSBtX2xhc3RNZXNzYWdlICYmCisgICAgICAgIG1fcGx1Z2luLT5xdWly
a3MoKS5jb250YWlucyhQbHVnaW5RdWlya0RvbnRDYWxsV25kUHJvY0ZvclNhbWVNZXNzYWdlUmVj
dXJzaXZlbHkpICYmIAorICAgICAgICBtX2lzQ2FsbGluZ1BsdWdpblduZFByb2MpCisgICAgICAg
IHJldHVybiAxOworCisgICAgaWYgKG1lc3NhZ2UgPT0gV01fVVNFUiArIDEgJiYKKyAgICAgICAg
bV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrVGhyb3R0bGVXTVVzZXJQbHVz
T25lTWVzc2FnZXMpKSB7CisgICAgICAgIGlmICghbV9tZXNzYWdlVGhyb3R0bGVyKQorICAgICAg
ICAgICAgbV9tZXNzYWdlVGhyb3R0bGVyLnNldChuZXcgUGx1Z2luTWVzc2FnZVRocm90dGxlcldp
bih0aGlzKSk7CisKKyAgICAgICAgbV9tZXNzYWdlVGhyb3R0bGVyLT5hcHBlbmRNZXNzYWdlKGhX
bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgbV9sYXN0TWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgbV9pc0NhbGxpbmdQbHVnaW5XbmRQ
cm9jID0gdHJ1ZTsKKworICAgIC8vIElmIHRoZSBwbHVnLWluIGRvZXNuJ3QgZXhwbGljaXRseSBz
dXBwb3J0IGNoYW5naW5nIHRoZSBwb3AtdXAgc3RhdGUsIHdlIGVuYWJsZQorICAgIC8vIHBvcHVw
cyBmb3IgYWxsIHVzZXIgZ2VzdHVyZXMuCisgICAgLy8gTm90ZSB0aGF0IHdlIG5lZWQgdG8gcG9w
IHRoZSBzdGF0ZSBpbiBhIHRpbWVyLCBiZWNhdXNlIHRoZSBGbGFzaCBwbHVnLWluIAorICAgIC8v
IHBvcHMgdXAgd2luZG93cyBpbiByZXNwb25zZSB0byBhIHBvc3RlZCBtZXNzYWdlLgorICAgIGlm
IChtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+dmVyc2lvbiA8IE5QVkVSU19IQVNfUE9QVVBTX0VO
QUJMRURfU1RBVEUgJiYKKyAgICAgICAgaXNXaW5kb3dzTWVzc2FnZVVzZXJHZXN0dXJlKG1lc3Nh
Z2UpICYmICFtX3BvcFBvcHVwc1N0YXRlVGltZXIuaXNBY3RpdmUoKSkgeworICAgICAgICAKKyAg
ICAgICAgcHVzaFBvcHVwc0VuYWJsZWRTdGF0ZSh0cnVlKTsKKworICAgICAgICBtX3BvcFBvcHVw
c1N0YXRlVGltZXIuc3RhcnRPbmVTaG90KDApOworICAgIH0KKworICAgIC8vIENhbGwgdGhlIHBs
dWctaW4ncyB3aW5kb3cgcHJvYy4KKyAgICBMUkVTVUxUIHJlc3VsdCA9IDo6Q2FsbFdpbmRvd1By
b2MobV9wbHVnaW5XbmRQcm9jLCBoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisKKyAg
ICBtX2lzQ2FsbGluZ1BsdWdpblduZFByb2MgPSBmYWxzZTsKKworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6dXBkYXRlV2luZG93KCkgY29uc3QKK3sKKyAgICBpZiAo
IXBhcmVudCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQocGFyZW50KCktPmlzRnJh
bWVWaWV3KCkpOworICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVW
aWV3Kj4ocGFyZW50KCkpOworCisgICAgSW50UmVjdCBvbGRXaW5kb3dSZWN0ID0gbV93aW5kb3dS
ZWN0OworICAgIEludFJlY3Qgb2xkQ2xpcFJlY3QgPSBtX2NsaXBSZWN0OworCisgICAgbV93aW5k
b3dSZWN0ID0gSW50UmVjdChmcmFtZVZpZXctPmNvbnRlbnRzVG9XaW5kb3coZnJhbWVHZW9tZXRy
eSgpLmxvY2F0aW9uKCkpLCBmcmFtZUdlb21ldHJ5KCkuc2l6ZSgpKTsKKyAgICBtX2NsaXBSZWN0
ID0gd2luZG93Q2xpcFJlY3QoKTsKKyAgICBtX2NsaXBSZWN0Lm1vdmUoLW1fd2luZG93UmVjdC54
KCksIC1tX3dpbmRvd1JlY3QueSgpKTsKKworICAgIGlmIChtX3dpbmRvdyAmJiAobV93aW5kb3dS
ZWN0ICE9IG9sZFdpbmRvd1JlY3QgfHwgbV9jbGlwUmVjdCAhPSBvbGRDbGlwUmVjdCkpIHsKKyAg
ICAgICAgSFJHTiByZ247CisKKyAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKworICAg
ICAgICAvLyBUbyBwcmV2ZW50IGZsYXNoZXMgd2hpbGUgc2Nyb2xsaW5nLCB3ZSBkaXNhYmxlIGRy
YXdpbmcgZHVyaW5nIHRoZSB3aW5kb3cKKyAgICAgICAgLy8gdXBkYXRlIHByb2Nlc3MgYnkgY2xp
cHBpbmcgdGhlIHdpbmRvdyB0byB0aGUgemVybyByZWN0LgorCisgICAgICAgIGJvb2wgY2xpcFRv
WmVyb1JlY3QgPSAhbV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrRG9udENs
aXBUb1plcm9SZWN0V2hlblNjcm9sbGluZyk7CisKKyAgICAgICAgaWYgKGNsaXBUb1plcm9SZWN0
KSB7CisgICAgICAgICAgICByZ24gPSA6OkNyZWF0ZVJlY3RSZ24oMCwgMCwgMCwgMCk7CisgICAg
ICAgICAgICA6OlNldFdpbmRvd1JnbihtX3dpbmRvdywgcmduLCBGQUxTRSk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICByZ24gPSA6OkNyZWF0ZVJlY3RSZ24obV9jbGlwUmVjdC54KCks
IG1fY2xpcFJlY3QueSgpLCBtX2NsaXBSZWN0LnJpZ2h0KCksIG1fY2xpcFJlY3QuYm90dG9tKCkp
OworICAgICAgICAgICAgOjpTZXRXaW5kb3dSZ24obV93aW5kb3csIHJnbiwgVFJVRSk7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAobV93aW5kb3dSZWN0ICE9IG9sZFdpbmRvd1JlY3QpCisgICAg
ICAgICAgICA6Ok1vdmVXaW5kb3cobV93aW5kb3csIG1fd2luZG93UmVjdC54KCksIG1fd2luZG93
UmVjdC55KCksIG1fd2luZG93UmVjdC53aWR0aCgpLCBtX3dpbmRvd1JlY3QuaGVpZ2h0KCksIFRS
VUUpOworCisgICAgICAgIGlmIChjbGlwVG9aZXJvUmVjdCkgeworICAgICAgICAgICAgcmduID0g
OjpDcmVhdGVSZWN0UmduKG1fY2xpcFJlY3QueCgpLCBtX2NsaXBSZWN0LnkoKSwgbV9jbGlwUmVj
dC5yaWdodCgpLCBtX2NsaXBSZWN0LmJvdHRvbSgpKTsKKyAgICAgICAgICAgIDo6U2V0V2luZG93
UmduKG1fd2luZG93LCByZ24sIFRSVUUpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Q2FsbGlu
Z1BsdWdpbihmYWxzZSk7CisgICAgfQorfQorCitJbnRSZWN0IFBsdWdpblZpZXc6OndpbmRvd0Ns
aXBSZWN0KCkgY29uc3QKK3sKKyAgICAvLyBTdGFydCBieSBjbGlwcGluZyB0byBvdXIgYm91bmRz
LgorICAgIEludFJlY3QgY2xpcFJlY3QobV93aW5kb3dSZWN0KTsKKyAgICAKKyAgICAvLyBUYWtl
IG91ciBlbGVtZW50IGFuZCBnZXQgdGhlIGNsaXAgcmVjdCBmcm9tIHRoZSBlbmNsb3NpbmcgbGF5
ZXIgYW5kIGZyYW1lIHZpZXcuCisgICAgUmVuZGVyTGF5ZXIqIGxheWVyID0gbV9lbGVtZW50LT5y
ZW5kZXJlcigpLT5lbmNsb3NpbmdMYXllcigpOworICAgIEZyYW1lVmlldyogcGFyZW50VmlldyA9
IG1fZWxlbWVudC0+ZG9jdW1lbnQoKS0+dmlldygpOworICAgIGNsaXBSZWN0LmludGVyc2VjdChw
YXJlbnRWaWV3LT53aW5kb3dDbGlwUmVjdEZvckxheWVyKGxheWVyLCB0cnVlKSk7CisKKyAgICBy
ZXR1cm4gY2xpcFJlY3Q7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0RnJhbWVHZW9tZXRyeShj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChtX2VsZW1lbnQtPmRvY3VtZW50KCktPnBy
aW50aW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyZWN0ICE9IGZyYW1lR2VvbWV0
cnkoKSkKKyAgICAgICAgV2lkZ2V0OjpzZXRGcmFtZUdlb21ldHJ5KHJlY3QpOworCisgICAgdXBk
YXRlV2luZG93KCk7CisgICAgc2V0TlBXaW5kb3dSZWN0KHJlY3QpOworfQorCit2b2lkIFBsdWdp
blZpZXc6Omdlb21ldHJ5Q2hhbmdlZCgpIGNvbnN0Cit7CisgICAgdXBkYXRlV2luZG93KCk7Cit9
CisKK3ZvaWQgUGx1Z2luVmlldzo6c2V0Rm9jdXMoKQoreworICAgIGlmIChtX3dpbmRvdykKKyAg
ICAgICAgU2V0Rm9jdXMobV93aW5kb3cpOworCisgICAgV2lkZ2V0OjpzZXRGb2N1cygpOworfQor
Cit2b2lkIFBsdWdpblZpZXc6OnNob3coKQoreworICAgIG1faXNWaXNpYmxlID0gdHJ1ZTsKKwor
ICAgIGlmIChtX2F0dGFjaGVkVG9XaW5kb3cgJiYgbV93aW5kb3cpCisgICAgICAgIFNob3dXaW5k
b3cobV93aW5kb3csIFNXX1NIT1dOQSk7CisKKyAgICBXaWRnZXQ6OnNob3coKTsKK30KKwordm9p
ZCBQbHVnaW5WaWV3OjpoaWRlKCkKK3sKKyAgICBtX2lzVmlzaWJsZSA9IGZhbHNlOworCisgICAg
aWYgKG1fYXR0YWNoZWRUb1dpbmRvdyAmJiBtX3dpbmRvdykKKyAgICAgICAgU2hvd1dpbmRvdyht
X3dpbmRvdywgU1dfSElERSk7CisKKyAgICBXaWRnZXQ6OmhpZGUoKTsKK30KKwordm9pZCBQbHVn
aW5WaWV3OjpwYWludE1pc3NpbmdQbHVnaW5JY29uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBzdGF0aWMgSW1hZ2UqIG51bGxQbHVnaW5JbWFn
ZTsKKyAgICBpZiAoIW51bGxQbHVnaW5JbWFnZSkKKyAgICAgICAgbnVsbFBsdWdpbkltYWdlID0g
SW1hZ2U6OmxvYWRQbGF0Zm9ybVJlc291cmNlKCJudWxsUGx1Z2luIik7CisKKyAgICBJbnRSZWN0
IGltYWdlUmVjdChmcmFtZUdlb21ldHJ5KCkueCgpLCBmcmFtZUdlb21ldHJ5KCkueSgpLCBudWxs
UGx1Z2luSW1hZ2UtPndpZHRoKCksIG51bGxQbHVnaW5JbWFnZS0+aGVpZ2h0KCkpOworCisgICAg
aW50IHhPZmZzZXQgPSAoZnJhbWVHZW9tZXRyeSgpLndpZHRoKCkgLSBpbWFnZVJlY3Qud2lkdGgo
KSkgLyAyOworICAgIGludCB5T2Zmc2V0ID0gKGZyYW1lR2VvbWV0cnkoKS5oZWlnaHQoKSAtIGlt
YWdlUmVjdC5oZWlnaHQoKSkgLyAyOworCisgICAgaW1hZ2VSZWN0Lm1vdmUoeE9mZnNldCwgeU9m
ZnNldCk7CisKKyAgICBpZiAoIXJlY3QuaW50ZXJzZWN0cyhpbWFnZVJlY3QpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgY29udGV4dC0+Y2xpcCh3aW5kb3dD
bGlwUmVjdCgpKTsKKyAgICBjb250ZXh0LT5kcmF3SW1hZ2UobnVsbFBsdWdpbkltYWdlLCBpbWFn
ZVJlY3QubG9jYXRpb24oKSk7CisgICAgY29udGV4dC0+cmVzdG9yZSgpOworfQorCitib29sIFBs
dWdpblZpZXc6OmRpc3BhdGNoTlBFdmVudChOUEV2ZW50JiBucEV2ZW50KQoreworICAgIGlmICgh
bV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmV2ZW50KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIGJvb2wgc2hvdWxkUG9wID0gZmFsc2U7CisKKyAgICBpZiAobV9wbHVnaW4tPnBsdWdpbkZ1
bmNzKCktPnZlcnNpb24gPCBOUFZFUlNfSEFTX1BPUFVQU19FTkFCTEVEX1NUQVRFICYmIGlzV2lu
ZG93c01lc3NhZ2VVc2VyR2VzdHVyZShucEV2ZW50LmV2ZW50KSkgeworICAgICAgICBwdXNoUG9w
dXBzRW5hYmxlZFN0YXRlKHRydWUpOworICAgICAgICBzaG91bGRQb3AgPSB0cnVlOworICAgIH0K
KworICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOworICAgIHNldENh
bGxpbmdQbHVnaW4odHJ1ZSk7CisgICAgYm9vbCByZXN1bHQgPSBtX3BsdWdpbi0+cGx1Z2luRnVu
Y3MoKS0+ZXZlbnQobV9pbnN0YW5jZSwgJm5wRXZlbnQpOworICAgIHNldENhbGxpbmdQbHVnaW4o
ZmFsc2UpOworCisgICAgaWYgKHNob3VsZFBvcCkgCisgICAgICAgIHBvcFBvcHVwc0VuYWJsZWRT
dGF0ZSgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpwYWlu
dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAg
aWYgKCFtX2lzU3RhcnRlZCkgeworICAgICAgICAvLyBEcmF3IHRoZSAibWlzc2luZyBwbHVnaW4i
IGltYWdlCisgICAgICAgIHBhaW50TWlzc2luZ1BsdWdpbkljb24oY29udGV4dCwgcmVjdCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9pc1dpbmRvd2VkIHx8IGNvbnRleHQt
PnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKHBhcmVu
dCgpLT5pc0ZyYW1lVmlldygpKTsKKyAgICBJbnRSZWN0IHJlY3RJbldpbmRvdyA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZUdlb21ldHJ5
KCkpOworICAgIEhEQyBoZGMgPSBjb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dChyZWN0SW5XaW5k
b3csIG1faXNUcmFuc3BhcmVudCk7CisgICAgTlBFdmVudCBucEV2ZW50OworCisgICAgaWYgKCFj
b250ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKKyAgICAgICAgLy8gVGhlIHBsdWdpbiBl
eHBlY3RzIHRoYXQgdGhlIHBhc3NlZCBpbiBEQyBoYXMgd2luZG93IGNvb3JkaW5hdGVzLgorICAg
ICAgICBYRk9STSB0cmFuc2Zvcm07CisgICAgICAgIEdldFdvcmxkVHJhbnNmb3JtKGhkYywgJnRy
YW5zZm9ybSk7CisgICAgICAgIHRyYW5zZm9ybS5lRHggPSAwOworICAgICAgICB0cmFuc2Zvcm0u
ZUR5ID0gMDsKKyAgICAgICAgU2V0V29ybGRUcmFuc2Zvcm0oaGRjLCAmdHJhbnNmb3JtKTsKKyAg
ICB9CisKKyAgICBtX25wV2luZG93LnR5cGUgPSBOUFdpbmRvd1R5cGVEcmF3YWJsZTsKKyAgICBt
X25wV2luZG93LndpbmRvdyA9IGhkYzsKKworICAgIEludFBvaW50IHAgPSBzdGF0aWNfY2FzdDxG
cmFtZVZpZXcqPihwYXJlbnQoKSktPmNvbnRlbnRzVG9XaW5kb3coZnJhbWVHZW9tZXRyeSgpLmxv
Y2F0aW9uKCkpOworICAgIAorICAgIFdJTkRPV1BPUyB3aW5kb3dwb3M7CisgICAgbWVtc2V0KCZ3
aW5kb3dwb3MsIDAsIHNpemVvZih3aW5kb3dwb3MpKTsKKworICAgIHdpbmRvd3Bvcy54ID0gcC54
KCk7CisgICAgd2luZG93cG9zLnkgPSBwLnkoKTsKKyAgICB3aW5kb3dwb3MuY3ggPSBmcmFtZUdl
b21ldHJ5KCkud2lkdGgoKTsKKyAgICB3aW5kb3dwb3MuY3kgPSBmcmFtZUdlb21ldHJ5KCkuaGVp
Z2h0KCk7CisKKyAgICBucEV2ZW50LmV2ZW50ID0gV01fV0lORE9XUE9TQ0hBTkdFRDsKKyAgICBu
cEV2ZW50LmxQYXJhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyPigmd2luZG93cG9zKTsKKyAg
ICBucEV2ZW50LndQYXJhbSA9IDA7CisKKyAgICBkaXNwYXRjaE5QRXZlbnQobnBFdmVudCk7CisK
KyAgICBzZXROUFdpbmRvd1JlY3QoZnJhbWVHZW9tZXRyeSgpKTsKKworICAgIG5wRXZlbnQuZXZl
bnQgPSBXTV9QQUlOVDsKKyAgICBucEV2ZW50LndQYXJhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWlu
dDMyPihoZGMpOworCisgICAgLy8gVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBhIHBvaW50ZXIgdG8g
dGhlIGRpcnR5IHJlY3QsIGJ1dCBpdCBzZWVtcyB0aGF0IHRoZSBGbGFzaCBwbHVnaW4KKyAgICAv
LyBpZ25vcmVzIGl0IHNvIHdlIGp1c3QgcGFzcyBudWxsLgorICAgIG5wRXZlbnQubFBhcmFtID0g
MDsKKworICAgIGRpc3BhdGNoTlBFdmVudChucEV2ZW50KTsKKworICAgIGNvbnRleHQtPnJlbGVh
c2VXaW5kb3dzQ29udGV4dChoZGMsIGZyYW1lR2VvbWV0cnkoKSwgbV9pc1RyYW5zcGFyZW50KTsK
K30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVLZXlib2FyZEV2ZW50KEtleWJvYXJkRXZlbnQq
IGV2ZW50KQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKworICAgIG5wRXZlbnQud1BhcmFtID0g
ZXZlbnQtPmtleUNvZGUoKTsgICAgCisKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBrZXlkb3du
RXZlbnQpIHsKKyAgICAgICAgbnBFdmVudC5ldmVudCA9IFdNX0tFWURPV047CisgICAgICAgIG5w
RXZlbnQubFBhcmFtID0gMDsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0ga2V5dXBF
dmVudCkgeworICAgICAgICBucEV2ZW50LmV2ZW50ID0gV01fS0VZVVA7CisgICAgICAgIG5wRXZl
bnQubFBhcmFtID0gMHg4MDAwOworICAgIH0KKworICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9j
a3M7CisgICAgaWYgKCFkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCisgICAgICAgIGV2ZW50LT5z
ZXREZWZhdWx0SGFuZGxlZCgpOworfQorCitleHRlcm4gSENVUlNPUiBsYXN0U2V0Q3Vyc29yOwor
ZXh0ZXJuIGJvb2wgaWdub3JlTmV4dFNldEN1cnNvcjsKKwordm9pZCBQbHVnaW5WaWV3OjpoYW5k
bGVNb3VzZUV2ZW50KE1vdXNlRXZlbnQqIGV2ZW50KQoreworICAgIE5QRXZlbnQgbnBFdmVudDsK
KworICAgIEludFBvaW50IHAgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihwYXJlbnQoKSktPmNv
bnRlbnRzVG9XaW5kb3coSW50UG9pbnQoZXZlbnQtPnBhZ2VYKCksIGV2ZW50LT5wYWdlWSgpKSk7
CisKKyAgICBucEV2ZW50LmxQYXJhbSA9IE1BS0VMUEFSQU0ocC54KCksIHAueSgpKTsKKyAgICBu
cEV2ZW50LndQYXJhbSA9IDA7CisKKyAgICBpZiAoZXZlbnQtPmN0cmxLZXkoKSkKKyAgICAgICAg
bnBFdmVudC53UGFyYW0gfD0gTUtfQ09OVFJPTDsKKyAgICBpZiAoZXZlbnQtPnNoaWZ0S2V5KCkp
CisgICAgICAgIG5wRXZlbnQud1BhcmFtIHw9IE1LX1NISUZUOworCisgICAgaWYgKGV2ZW50LT50
eXBlKCkgPT0gbW91c2Vtb3ZlRXZlbnQgfHwKKyAgICAgICAgZXZlbnQtPnR5cGUoKSA9PSBtb3Vz
ZW91dEV2ZW50IHx8IAorICAgICAgICBldmVudC0+dHlwZSgpID09IG1vdXNlb3ZlckV2ZW50KSB7
CisgICAgICAgIG5wRXZlbnQuZXZlbnQgPSBXTV9NT1VTRU1PVkU7CisgICAgICAgIGlmIChldmVu
dC0+YnV0dG9uRG93bigpKQorICAgICAgICAgICAgc3dpdGNoIChldmVudC0+YnV0dG9uKCkpIHsK
KyAgICAgICAgICAgICAgICBjYXNlIExlZnRCdXR0b246CisgICAgICAgICAgICAgICAgICAgIG5w
RXZlbnQud1BhcmFtIHw9IE1LX0xCVVRUT047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIGNhc2UgTWlkZGxlQnV0dG9uOgorICAgICAgICAgICAgICAgICAgICBu
cEV2ZW50LndQYXJhbSB8PSBNS19NQlVUVE9OOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICBjYXNlIFJpZ2h0QnV0dG9uOgorICAgICAgICAgICAgICAgICAgICBu
cEV2ZW50LndQYXJhbSB8PSBNS19SQlVUVE9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IG1vdXNlZG93
bkV2ZW50KSB7CisgICAgICAgIC8vIEZvY3VzIHRoZSBwbHVnaW4KKyAgICAgICAgaWYgKFBhZ2Uq
IHBhZ2UgPSBtX3BhcmVudEZyYW1lLT5wYWdlKCkpCisgICAgICAgICAgICBwYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+c2V0Rm9jdXNlZEZyYW1lKG1fcGFyZW50RnJhbWUpOworICAgICAgICBtX3Bh
cmVudEZyYW1lLT5kb2N1bWVudCgpLT5zZXRGb2N1c2VkTm9kZShtX2VsZW1lbnQpOworICAgICAg
ICBzd2l0Y2ggKGV2ZW50LT5idXR0b24oKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAg
ICAgICAgICAgIG5wRXZlbnQuZXZlbnQgPSBXTV9MQlVUVE9ORE9XTjsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBucEV2ZW50LmV2
ZW50ID0gV01fTUJVVFRPTkRPV047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICBjYXNlIDI6CisgICAgICAgICAgICAgICAgbnBFdmVudC5ldmVudCA9IFdNX1JCVVRUT05ET1dO
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChldmVu
dC0+dHlwZSgpID09IG1vdXNldXBFdmVudCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LT5idXR0
b24oKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIG5wRXZlbnQuZXZl
bnQgPSBXTV9MQlVUVE9OVVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBj
YXNlIDE6CisgICAgICAgICAgICAgICAgbnBFdmVudC5ldmVudCA9IFdNX01CVVRUT05VUDsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAg
ICBucEV2ZW50LmV2ZW50ID0gV01fUkJVVFRPTlVQOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybjsKKworICAgIEhDVVJTT1IgY3Vy
cmVudEN1cnNvciA9IDo6R2V0Q3Vyc29yKCk7CisKKyAgICBLSlM6OkpTTG9jazo6RHJvcEFsbExv
Y2tzOworICAgIGlmICghZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQpKQorICAgICAgICBldmVudC0+
c2V0RGVmYXVsdEhhbmRsZWQoKTsKKworICAgIC8vIEN1cnJlbnRseSwgV2lkZ2V0OjpzZXRDdXJz
b3IgaXMgYWx3YXlzIGNhbGxlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIGluIEV2ZW50SGFuZGxlci5j
cHAKKyAgICAvLyBhbmQgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0aGF0IHdlIHNldCBpZ25vcmVOZXh0
U2V0Q3Vyc29yIHRvIHRydWUgaGVyZSB0byBwcmV2ZW50IHRoYXQuCisgICAgaWdub3JlTmV4dFNl
dEN1cnNvciA9IHRydWU7ICAgICAKKyAgICBsYXN0U2V0Q3Vyc29yID0gOjpHZXRDdXJzb3IoKTsK
K30KKwordm9pZCBQbHVnaW5WaWV3OjpoYW5kbGVFdmVudChFdmVudCogZXZlbnQpCit7CisgICAg
aWYgKCFtX3BsdWdpbiB8fCBtX2lzV2luZG93ZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChldmVudC0+aXNNb3VzZUV2ZW50KCkpCisgICAgICAgIGhhbmRsZU1vdXNlRXZlbnQoc3RhdGlj
X2Nhc3Q8TW91c2VFdmVudCo+KGV2ZW50KSk7CisgICAgZWxzZSBpZiAoZXZlbnQtPmlzS2V5Ym9h
cmRFdmVudCgpKQorICAgICAgICBoYW5kbGVLZXlib2FyZEV2ZW50KHN0YXRpY19jYXN0PEtleWJv
YXJkRXZlbnQqPihldmVudCkpOworfQorCit2b2lkIFBsdWdpblZpZXc6OnNldFBhcmVudChTY3Jv
bGxWaWV3KiBwYXJlbnQpCit7CisgICAgV2lkZ2V0OjpzZXRQYXJlbnQocGFyZW50KTsKKworICAg
IGlmIChwYXJlbnQpCisgICAgICAgIGluaXQoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKCFt
X3dpbmRvdykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBJZiB0aGUgcGx1Zy1p
biB3aW5kb3cgb3Igb25lIG9mIGl0cyBjaGlsZHJlbiBoYXZlIHRoZSBmb2N1cywgd2UgbmVlZCB0
byAKKyAgICAgICAgLy8gY2xlYXIgaXQgdG8gcHJldmVudCB0aGUgd2ViIHZpZXcgd2luZG93IGZy
b20gYmVpbmcgZm9jdXNlZCBiZWNhdXNlIHRoYXQgY2FuCisgICAgICAgIC8vIHRyaWdnZXIgYSBs
YXlvdXQgd2hpbGUgdGhlIHBsdWdpbiBlbGVtZW50IGlzIGJlaW5nIGRldGFjaGVkLgorICAgICAg
ICBIV05EIGZvY3VzZWRXaW5kb3cgPSA6OkdldEZvY3VzKCk7CisgICAgICAgIGlmIChtX3dpbmRv
dyA9PSBmb2N1c2VkV2luZG93IHx8IDo6SXNDaGlsZChtX3dpbmRvdywgZm9jdXNlZFdpbmRvdykp
CisgICAgICAgICAgICA6OlNldEZvY3VzKDApOworICAgIH0KKworfQorCit2b2lkIFBsdWdpblZp
ZXc6OmF0dGFjaFRvV2luZG93KCkKK3sKKyAgICBpZiAobV9hdHRhY2hlZFRvV2luZG93KQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX2F0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOworICAgIGlmICht
X2lzVmlzaWJsZSAmJiBtX3dpbmRvdykKKyAgICAgICAgU2hvd1dpbmRvdyhtX3dpbmRvdywgU1df
U0hPV05BKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpkZXRhY2hGcm9tV2luZG93KCkKK3sKKyAg
ICBpZiAoIW1fYXR0YWNoZWRUb1dpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1f
aXNWaXNpYmxlICYmIG1fd2luZG93KQorICAgICAgICBTaG93V2luZG93KG1fd2luZG93LCBTV19I
SURFKTsKKyAgICBtX2F0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKK30KKwordm9pZCBQbHVnaW5W
aWV3OjpzZXROUFdpbmRvd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1f
aXNTdGFydGVkKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRQb2ludCBwID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5jb250ZW50c1RvV2luZG93KHJlY3QubG9jYXRpb24o
KSk7CisgICAgbV9ucFdpbmRvdy54ID0gcC54KCk7CisgICAgbV9ucFdpbmRvdy55ID0gcC55KCk7
CisKKyAgICBtX25wV2luZG93LndpZHRoID0gcmVjdC53aWR0aCgpOworICAgIG1fbnBXaW5kb3cu
aGVpZ2h0ID0gcmVjdC5oZWlnaHQoKTsKKworICAgIG1fbnBXaW5kb3cuY2xpcFJlY3QubGVmdCA9
IDA7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC50b3AgPSAwOworICAgIG1fbnBXaW5kb3cuY2xp
cFJlY3QucmlnaHQgPSByZWN0LndpZHRoKCk7CisgICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5ib3R0
b20gPSByZWN0LmhlaWdodCgpOworCisgICAgaWYgKG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5z
ZXR3aW5kb3cpIHsKKyAgICAgICAgS0pTOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9j
a3M7CisgICAgICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7CisgICAgICAgIG1fcGx1Z2luLT5w
bHVnaW5GdW5jcygpLT5zZXR3aW5kb3cobV9pbnN0YW5jZSwgJm1fbnBXaW5kb3cpOworICAgICAg
ICBzZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsKKworICAgICAgICBpZiAoIW1faXNXaW5kb3dlZCkK
KyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBBU1NFUlQobV93aW5kb3cpOworCisgICAg
ICAgIFdORFBST0MgY3VycmVudFduZFByb2MgPSAoV05EUFJPQylHZXRXaW5kb3dMb25nUHRyKG1f
d2luZG93LCBHV0xQX1dORFBST0MpOworICAgICAgICBpZiAoY3VycmVudFduZFByb2MgIT0gUGx1
Z2luVmlld1duZFByb2MpCisgICAgICAgICAgICBtX3BsdWdpblduZFByb2MgPSAoV05EUFJPQylT
ZXRXaW5kb3dMb25nUHRyKG1fd2luZG93LCBHV0xQX1dORFBST0MsIChMT05HKVBsdWdpblZpZXdX
bmRQcm9jKTsKKyAgICB9Cit9CisKK2Jvb2wgUGx1Z2luVmlldzo6c3RhcnQoKQoreworICAgIGlm
IChtX2lzU3RhcnRlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKG1fcGx1
Z2luKTsKKyAgICBBU1NFUlQobV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPm5ld3ApOworCisgICAg
TlBFcnJvciBucEVycjsKKyAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldyh0aGlz
KTsKKyAgICB7CisgICAgICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tz
OworICAgICAgICBzZXRDYWxsaW5nUGx1Z2luKHRydWUpOworICAgICAgICBucEVyciA9IG1fcGx1
Z2luLT5wbHVnaW5GdW5jcygpLT5uZXdwKChOUE1JTUVUeXBlKW1fbWltZVR5cGUuZGF0YSgpLCBt
X2luc3RhbmNlLCBtX21vZGUsIG1fcGFyYW1Db3VudCwgbV9wYXJhbU5hbWVzLCBtX3BhcmFtVmFs
dWVzLCBOVUxMKTsKKyAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgICAgIExP
R19OUEVSUk9SKG5wRXJyKTsKKyAgICB9CisgICAgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdp
blZpZXcoMCk7CisKKyAgICBpZiAobnBFcnIgIT0gTlBFUlJfTk9fRVJST1IpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIG1faXNTdGFydGVkID0gdHJ1ZTsKKworICAgIGlmICghbV91cmwu
aXNFbXB0eSgpICYmICFtX2xvYWRNYW51YWxseSkgeworICAgICAgICBGcmFtZUxvYWRSZXF1ZXN0
IGZyYW1lTG9hZFJlcXVlc3Q7CisgICAgICAgIGZyYW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1
ZXN0KCkuc2V0SFRUUE1ldGhvZCgiR0VUIik7CisgICAgICAgIGZyYW1lTG9hZFJlcXVlc3QucmVz
b3VyY2VSZXF1ZXN0KCkuc2V0VVJMKG1fdXJsKTsKKyAgICAgICAgbG9hZChmcmFtZUxvYWRSZXF1
ZXN0LCBmYWxzZSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6c3RvcCgpCit7CisgICAgaWYgKCFtX2lzU3RhcnRlZCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgSGFzaFNldDxSZWZQdHI8UGx1Z2luU3RyZWFtPiA+IHN0cmVhbXMgPSBtX3N0cmVh
bXM7CisgICAgSGFzaFNldDxSZWZQdHI8UGx1Z2luU3RyZWFtPiA+OjppdGVyYXRvciBlbmQgPSBz
dHJlYW1zLmVuZCgpOworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8UGx1Z2luU3RyZWFtPiA+Ojpp
dGVyYXRvciBpdCA9IHN0cmVhbXMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
ICgqaXQpLT5zdG9wKCk7CisgICAgICAgIGRpc2Nvbm5lY3RTdHJlYW0oKCppdCkuZ2V0KCkpOwor
ICAgIH0KKworICAgIEFTU0VSVChtX3N0cmVhbXMuaXNFbXB0eSgpKTsKKworICAgIG1faXNTdGFy
dGVkID0gZmFsc2U7CisKKyAgICAvLyBVbnN1YmNsYXNzIHRoZSB3aW5kb3cKKyAgICBpZiAobV9p
c1dpbmRvd2VkKSB7CisgICAgICAgIFdORFBST0MgY3VycmVudFduZFByb2MgPSAoV05EUFJPQylH
ZXRXaW5kb3dMb25nUHRyKG1fd2luZG93LCBHV0xQX1dORFBST0MpOworICAgICAgICAKKyAgICAg
ICAgaWYgKGN1cnJlbnRXbmRQcm9jID09IFBsdWdpblZpZXdXbmRQcm9jKQorICAgICAgICAgICAg
U2V0V2luZG93TG9uZ1B0cihtX3dpbmRvdywgR1dMUF9XTkRQUk9DLCAoTE9ORyltX3BsdWdpbldu
ZFByb2MpOworICAgIH0KKworICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3M7CisKKyAgICAv
LyBDbGVhciB0aGUgd2luZG93CisgICAgbV9ucFdpbmRvdy53aW5kb3cgPSAwOworICAgIGlmICht
X3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+c2V0d2luZG93ICYmICFtX3BsdWdpbi0+cXVpcmtzKCku
Y29udGFpbnMoUGx1Z2luUXVpcmtEb250U2V0TnVsbFdpbmRvd0hhbmRsZU9uRGVzdHJveSkpIHsK
KyAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKKyAgICAgICAgbV9wbHVnaW4tPnBsdWdp
bkZ1bmNzKCktPnNldHdpbmRvdyhtX2luc3RhbmNlLCAmbV9ucFdpbmRvdyk7CisgICAgICAgIHNl
dENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgIH0KKworICAgIC8vIERlc3Ryb3kgdGhlIHBsdWdp
bgorICAgIE5QU2F2ZWREYXRhKiBzYXZlZERhdGEgPSAwOworICAgIHNldENhbGxpbmdQbHVnaW4o
dHJ1ZSk7CisgICAgTlBFcnJvciBucEVyciA9IG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5kZXN0
cm95KG1faW5zdGFuY2UsICZzYXZlZERhdGEpOworICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2Up
OworICAgIExPR19OUEVSUk9SKG5wRXJyKTsKKworICAgIGlmIChzYXZlZERhdGEpIHsKKyAgICAg
ICAgaWYgKHNhdmVkRGF0YS0+YnVmKQorICAgICAgICAgICAgTlBOX01lbUZyZWUoc2F2ZWREYXRh
LT5idWYpOworICAgICAgICBOUE5fTWVtRnJlZShzYXZlZERhdGEpOworICAgIH0KKworICAgIG1f
aW5zdGFuY2UtPnBkYXRhID0gMDsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1
Z2luVmlldyhQbHVnaW5WaWV3KiBwbHVnaW5WaWV3KQoreworICAgIHNfY3VycmVudFBsdWdpblZp
ZXcgPSBwbHVnaW5WaWV3OworfQorCitQbHVnaW5WaWV3KiBQbHVnaW5WaWV3OjpjdXJyZW50UGx1
Z2luVmlldygpCit7CisgICAgcmV0dXJuIHNfY3VycmVudFBsdWdpblZpZXc7Cit9CisKK3N0YXRp
YyBjaGFyKiBjcmVhdGVVVEY4U3RyaW5nKGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIENTdHJp
bmcgY3N0ciA9IHN0ci51dGY4KCk7CisgICAgY2hhciogcmVzdWx0ID0gcmVpbnRlcnByZXRfY2Fz
dDxjaGFyKj4oZmFzdE1hbGxvYyhjc3RyLmxlbmd0aCgpICsgMSkpOworCisgICAgc3RybmNweShy
ZXN1bHQsIGNzdHIuZGF0YSgpLCBjc3RyLmxlbmd0aCgpICsgMSk7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCitzdGF0aWMgdm9pZCBmcmVlU3RyaW5nQXJyYXkoY2hhcioqIHN0cmluZ0FycmF5
LCBpbnQgbGVuZ3RoKQoreworICAgIGlmICghc3RyaW5nQXJyYXkpCisgICAgICAgIHJldHVybjsK
KworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisgICAgICAgIGZhc3RGcmVl
KHN0cmluZ0FycmF5W2ldKTsKKworICAgIGZhc3RGcmVlKHN0cmluZ0FycmF5KTsKK30KKworc3Rh
dGljIGJvb2wgZ2V0U3RyaW5nKEtKU1Byb3h5KiBwcm94eSwgSlNWYWx1ZSogcmVzdWx0LCBTdHJp
bmcmIHN0cmluZykKK3sKKyAgICBpZiAoIXByb3h5IHx8ICFyZXN1bHQgfHwgcmVzdWx0LT5pc1Vu
ZGVmaW5lZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgSlNMb2NrIGxvY2s7CisKKyAg
ICBFeGVjU3RhdGUqIGV4ZWMgPSBwcm94eS0+Z2xvYmFsT2JqZWN0KCktPmdsb2JhbEV4ZWMoKTsK
KyAgICBVU3RyaW5nIHVzdHJpbmcgPSByZXN1bHQtPnRvU3RyaW5nKGV4ZWMpOworICAgIGV4ZWMt
PmNsZWFyRXhjZXB0aW9uKCk7CisKKyAgICBzdHJpbmcgPSB1c3RyaW5nOworICAgIHJldHVybiB0
cnVlOworfQorCit2b2lkIFBsdWdpblZpZXc6OnBlcmZvcm1SZXF1ZXN0KFBsdWdpblJlcXVlc3Qq
IHJlcXVlc3QpCit7CisgICAgLy8gZG9uJ3QgbGV0IGEgcGx1Z2luIHN0YXJ0IGFueSBsb2FkcyBp
ZiBpdCBpcyBubyBsb25nZXIgcGFydCBvZiBhIGRvY3VtZW50IHRoYXQgaXMgYmVpbmcgCisgICAg
Ly8gZGlzcGxheWVkIHVubGVzcyB0aGUgbG9hZHMgYXJlIGluIHRoZSBzYW1lIGZyYW1lIGFzIHRo
ZSBwbHVnaW4uCisgICAgY29uc3QgU3RyaW5nJiB0YXJnZXRGcmFtZU5hbWUgPSByZXF1ZXN0LT5m
cmFtZUxvYWRSZXF1ZXN0KCkuZnJhbWVOYW1lKCk7CisgICAgaWYgKG1fcGFyZW50RnJhbWUtPmxv
YWRlcigpLT5kb2N1bWVudExvYWRlcigpICE9IG1fcGFyZW50RnJhbWUtPmxvYWRlcigpLT5hY3Rp
dmVEb2N1bWVudExvYWRlcigpICYmCisgICAgICAgICh0YXJnZXRGcmFtZU5hbWUuaXNOdWxsKCkg
fHwgbV9wYXJlbnRGcmFtZS0+dHJlZSgpLT5maW5kKHRhcmdldEZyYW1lTmFtZSkgIT0gbV9wYXJl
bnRGcmFtZSkpCisgICAgICAgIHJldHVybjsKKworICAgIEtVUkwgcmVxdWVzdFVSTCA9IHJlcXVl
c3QtPmZyYW1lTG9hZFJlcXVlc3QoKS5yZXNvdXJjZVJlcXVlc3QoKS51cmwoKTsKKyAgICBTdHJp
bmcganNTdHJpbmcgPSBzY3JpcHRTdHJpbmdJZkphdmFTY3JpcHRVUkwocmVxdWVzdFVSTCk7CisK
KyAgICBpZiAoanNTdHJpbmcuaXNOdWxsKCkpIHsKKyAgICAgICAgLy8gaWYgdGhpcyBpcyBub3Qg
YSB0YXJnZXRlZCByZXF1ZXN0LCBjcmVhdGUgYSBzdHJlYW0gZm9yIGl0LiBvdGhlcndpc2UsCisg
ICAgICAgIC8vIGp1c3QgcGFzcyBpdCBvZmYgdG8gdGhlIGxvYWRlcgorICAgICAgICBpZiAodGFy
Z2V0RnJhbWVOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgUGx1Z2luU3RyZWFtKiBzdHJl
YW0gPSBuZXcgUGx1Z2luU3RyZWFtKHRoaXMsIG1fcGFyZW50RnJhbWUsIHJlcXVlc3QtPmZyYW1l
TG9hZFJlcXVlc3QoKS5yZXNvdXJjZVJlcXVlc3QoKSwgcmVxdWVzdC0+c2VuZE5vdGlmaWNhdGlv
bigpLCByZXF1ZXN0LT5ub3RpZnlEYXRhKCksIHBsdWdpbigpLT5wbHVnaW5GdW5jcygpLCBpbnN0
YW5jZSgpLCBtX3BsdWdpbi0+cXVpcmtzKCkpOworICAgICAgICAgICAgbV9zdHJlYW1zLmFkZChz
dHJlYW0pOworICAgICAgICAgICAgc3RyZWFtLT5zdGFydCgpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgbV9wYXJlbnRGcmFtZS0+bG9hZGVyKCktPmxvYWQocmVxdWVzdC0+ZnJhbWVM
b2FkUmVxdWVzdCgpLnJlc291cmNlUmVxdWVzdCgpLCB0YXJnZXRGcmFtZU5hbWUpOworICAgICAg
CisgICAgICAgICAgICAvLyBGSVhNRTogPHJkYXI6Ly9wcm9ibGVtLzQ4MDc0Njk+IFRoaXMgc2hv
dWxkIGJlIHNlbnQgd2hlbiB0aGUgZG9jdW1lbnQgaGFzIGZpbmlzaGVkIGxvYWRpbmcKKyAgICAg
ICAgICAgIGlmIChyZXF1ZXN0LT5zZW5kTm90aWZpY2F0aW9uKCkpIHsKKyAgICAgICAgICAgICAg
ICBLSlM6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgICAgICAg
ICBzZXRDYWxsaW5nUGx1Z2luKHRydWUpOworICAgICAgICAgICAgICAgIG1fcGx1Z2luLT5wbHVn
aW5GdW5jcygpLT51cmxub3RpZnkobV9pbnN0YW5jZSwgcmVxdWVzdFVSTC5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpLCBOUFJFU19ET05FLCByZXF1ZXN0LT5ub3RpZnlEYXRhKCkpOworICAgICAgICAg
ICAgICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUYXJnZXRlZCBKYXZhU2NyaXB0IHJl
cXVlc3RzIGFyZSBvbmx5IGFsbG93ZWQgb24gdGhlIGZyYW1lIHRoYXQgY29udGFpbnMgdGhlIEph
dmFTY3JpcHQgcGx1Z2luCisgICAgLy8gYW5kIHRoaXMgaGFzIGJlZW4gbWFkZSBzdXJlIGluIDo6
bG9hZC4KKyAgICBBU1NFUlQodGFyZ2V0RnJhbWVOYW1lLmlzRW1wdHkoKSB8fCBtX3BhcmVudEZy
YW1lLT50cmVlKCktPmZpbmQodGFyZ2V0RnJhbWVOYW1lKSA9PSBtX3BhcmVudEZyYW1lKTsKKyAg
ICAKKyAgICAvLyBFeGVjdXRpbmcgYSBzY3JpcHQgY2FuIGNhdXNlIHRoZSBwbHVnaW4gdmlldyB0
byBiZSBkZXN0cm95ZWQsIHNvIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBmcmFt
ZS4KKyAgICBSZWZQdHI8RnJhbWU+IHBhcmVudEZyYW1lID0gbV9wYXJlbnRGcmFtZTsKKyAgICBK
U1ZhbHVlKiByZXN1bHQgPSBtX3BhcmVudEZyYW1lLT5sb2FkZXIoKS0+ZXhlY3V0ZVNjcmlwdChq
c1N0cmluZywgcmVxdWVzdC0+c2hvdWxkQWxsb3dQb3B1cHMoKSk7CisKKyAgICBpZiAodGFyZ2V0
RnJhbWVOYW1lLmlzTnVsbCgpKSB7CisgICAgICAgIFN0cmluZyByZXN1bHRTdHJpbmc7CisKKyAg
ICAgICAgQ1N0cmluZyBjc3RyOworICAgICAgICBpZiAoZ2V0U3RyaW5nKHBhcmVudEZyYW1lLT5z
Y3JpcHRQcm94eSgpLCByZXN1bHQsIHJlc3VsdFN0cmluZykpCisgICAgICAgICAgICBjc3RyID0g
cmVzdWx0U3RyaW5nLnV0ZjgoKTsKKworICAgICAgICBSZWZQdHI8UGx1Z2luU3RyZWFtPiBzdHJl
YW0gPSBuZXcgUGx1Z2luU3RyZWFtKHRoaXMsIG1fcGFyZW50RnJhbWUsIHJlcXVlc3QtPmZyYW1l
TG9hZFJlcXVlc3QoKS5yZXNvdXJjZVJlcXVlc3QoKSwgcmVxdWVzdC0+c2VuZE5vdGlmaWNhdGlv
bigpLCByZXF1ZXN0LT5ub3RpZnlEYXRhKCksIHBsdWdpbigpLT5wbHVnaW5GdW5jcygpLCBpbnN0
YW5jZSgpLCBtX3BsdWdpbi0+cXVpcmtzKCkpOworICAgICAgICBtX3N0cmVhbXMuYWRkKHN0cmVh
bSk7CisgICAgICAgIHN0cmVhbS0+c2VuZEphdmFTY3JpcHRTdHJlYW0ocmVxdWVzdFVSTCwgY3N0
cik7CisgICAgfQorfQorCit2b2lkIFBsdWdpblZpZXc6OnJlcXVlc3RUaW1lckZpcmVkKFRpbWVy
PFBsdWdpblZpZXc+KiB0aW1lcikKK3sKKyAgICBBU1NFUlQodGltZXIgPT0gJm1fcmVxdWVzdFRp
bWVyKTsKKyAgICBBU1NFUlQobV9yZXF1ZXN0cy5zaXplKCkgPiAwKTsKKworICAgIFBsdWdpblJl
cXVlc3QqIHJlcXVlc3QgPSBtX3JlcXVlc3RzWzBdOworICAgIG1fcmVxdWVzdHMucmVtb3ZlKDAp
OworICAgIAorICAgIC8vIFNjaGVkdWxlIGEgbmV3IHJlcXVlc3QgYmVmb3JlIGNhbGxpbmcgcGVy
Zm9ybVJlcXVlc3Qgc2luY2UgdGhlIGNhbGwgdG8KKyAgICAvLyBwZXJmb3JtUmVxdWVzdCBjYW4g
Y2F1c2UgdGhlIHBsdWdpbiB2aWV3IHRvIGJlIGRlbGV0ZWQuCisgICAgaWYgKG1fcmVxdWVzdHMu
c2l6ZSgpID4gMCkKKyAgICAgICAgbV9yZXF1ZXN0VGltZXIuc3RhcnRPbmVTaG90KDApOworCisg
ICAgcGVyZm9ybVJlcXVlc3QocmVxdWVzdCk7CisgICAgZGVsZXRlIHJlcXVlc3Q7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6c2NoZWR1bGVSZXF1ZXN0KFBsdWdpblJlcXVlc3QqIHJlcXVlc3QpCit7
CisgICAgbV9yZXF1ZXN0cy5hcHBlbmQocmVxdWVzdCk7CisgICAgbV9yZXF1ZXN0VGltZXIuc3Rh
cnRPbmVTaG90KDApOworfQorCitOUEVycm9yIFBsdWdpblZpZXc6OmxvYWQoY29uc3QgRnJhbWVM
b2FkUmVxdWVzdCYgZnJhbWVMb2FkUmVxdWVzdCwgYm9vbCBzZW5kTm90aWZpY2F0aW9uLCB2b2lk
KiBub3RpZnlEYXRhKQoreworICAgIEFTU0VSVChmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNlUmVx
dWVzdCgpLmh0dHBNZXRob2QoKSA9PSAiR0VUIiB8fCBmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNl
UmVxdWVzdCgpLmh0dHBNZXRob2QoKSA9PSAiUE9TVCIpOworCisgICAgS1VSTCB1cmwgPSBmcmFt
ZUxvYWRSZXF1ZXN0LnJlc291cmNlUmVxdWVzdCgpLnVybCgpOworICAgIAorICAgIGlmICh1cmwu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gTlBFUlJfSU5WQUxJRF9VUkw7CisKKyAgICBjb25z
dCBTdHJpbmcmIHRhcmdldEZyYW1lTmFtZSA9IGZyYW1lTG9hZFJlcXVlc3QuZnJhbWVOYW1lKCk7
CisgICAgU3RyaW5nIGpzU3RyaW5nID0gc2NyaXB0U3RyaW5nSWZKYXZhU2NyaXB0VVJMKHVybCk7
CisKKyAgICBpZiAoIWpzU3RyaW5nLmlzTnVsbCgpKSB7CisgICAgICAgIFNldHRpbmdzKiBzZXR0
aW5ncyA9IG1fcGFyZW50RnJhbWUtPnNldHRpbmdzKCk7CisgICAgICAgIGlmICghc2V0dGluZ3Mg
fHwgIXNldHRpbmdzLT5pc0phdmFTY3JpcHRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFJl
dHVybiBOUEVSUl9HRU5FUklDX0VSUk9SIGlmIEpTIGlzIGRpc2FibGVkLiBUaGlzIGlzIHdoYXQg
TW96aWxsYSBkb2VzLgorICAgICAgICAgICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Cisg
ICAgICAgIH0gCisgICAgICAgIAorICAgICAgICBpZiAoIXRhcmdldEZyYW1lTmFtZS5pc051bGwo
KSAmJiBtX3BhcmVudEZyYW1lLT50cmVlKCktPmZpbmQodGFyZ2V0RnJhbWVOYW1lKSAhPSBtX3Bh
cmVudEZyYW1lKSB7CisgICAgICAgICAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucywgb25seSBh
bGxvdyBKUyByZXF1ZXN0cyB0byBiZSBtYWRlIG9uIHRoZSBmcmFtZSB0aGF0IGNvbnRhaW5zIHRo
ZSBwbHVnLWluLgorICAgICAgICAgICAgcmV0dXJuIE5QRVJSX0lOVkFMSURfUEFSQU07CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBQbHVnaW5SZXF1ZXN0KiByZXF1ZXN0ID0gbmV3IFBsdWdpblJl
cXVlc3QoZnJhbWVMb2FkUmVxdWVzdCwgc2VuZE5vdGlmaWNhdGlvbiwgbm90aWZ5RGF0YSwgYXJl
UG9wdXBzQWxsb3dlZCgpKTsKKyAgICBzY2hlZHVsZVJlcXVlc3QocmVxdWVzdCk7CisKKyAgICBy
ZXR1cm4gTlBFUlJfTk9fRVJST1I7Cit9CisKK3N0YXRpYyBLVVJMIG1ha2VVUkwoY29uc3QgS1VS
TCYgYmFzZVVSTCwgY29uc3QgY2hhciogcmVsYXRpdmVVUkxTdHJpbmcpCit7CisgICAgU3RyaW5n
IHVybFN0cmluZyA9IHJlbGF0aXZlVVJMU3RyaW5nOworCisgICAgLy8gU3RyaXAgcmV0dXJuIGNo
YXJhY3RlcnMuCisgICAgdXJsU3RyaW5nLnJlcGxhY2UoJ1xuJywgIiIpOworICAgIHVybFN0cmlu
Zy5yZXBsYWNlKCdccicsICIiKTsKKworICAgIHJldHVybiBLVVJMKGJhc2VVUkwsIHVybFN0cmlu
Zyk7Cit9CisKK05QRXJyb3IgUGx1Z2luVmlldzo6Z2V0VVJMTm90aWZ5KGNvbnN0IGNoYXIqIHVy
bCwgY29uc3QgY2hhciogdGFyZ2V0LCB2b2lkKiBub3RpZnlEYXRhKQoreworICAgIEZyYW1lTG9h
ZFJlcXVlc3QgZnJhbWVMb2FkUmVxdWVzdDsKKworICAgIGZyYW1lTG9hZFJlcXVlc3Quc2V0RnJh
bWVOYW1lKHRhcmdldCk7CisgICAgZnJhbWVMb2FkUmVxdWVzdC5yZXNvdXJjZVJlcXVlc3QoKS5z
ZXRIVFRQTWV0aG9kKCJHRVQiKTsKKyAgICBmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNlUmVxdWVz
dCgpLnNldFVSTChtYWtlVVJMKG1fYmFzZVVSTCwgdXJsKSk7CisKKyAgICByZXR1cm4gbG9hZChm
cmFtZUxvYWRSZXF1ZXN0LCB0cnVlLCBub3RpZnlEYXRhKTsKK30KKworTlBFcnJvciBQbHVnaW5W
aWV3OjpnZXRVUkwoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiB0YXJnZXQpCit7CisgICAg
RnJhbWVMb2FkUmVxdWVzdCBmcmFtZUxvYWRSZXF1ZXN0OworCisgICAgZnJhbWVMb2FkUmVxdWVz
dC5zZXRGcmFtZU5hbWUodGFyZ2V0KTsKKyAgICBmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNlUmVx
dWVzdCgpLnNldEhUVFBNZXRob2QoIkdFVCIpOworICAgIGZyYW1lTG9hZFJlcXVlc3QucmVzb3Vy
Y2VSZXF1ZXN0KCkuc2V0VVJMKG1ha2VVUkwobV9iYXNlVVJMLCB1cmwpKTsKKworICAgIHJldHVy
biBsb2FkKGZyYW1lTG9hZFJlcXVlc3QsIGZhbHNlLCAwKTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIHN0YXJ0c1dpdGhCbGFua0xpbmUoY29uc3QgVmVjdG9yPGNoYXI+JiBidWZmZXIpCit7Cisg
ICAgcmV0dXJuIGJ1ZmZlci5zaXplKCkgPiAwICYmIGJ1ZmZlclswXSA9PSAnXG4nOworfQorCitz
dGF0aWMgaW5saW5lIGludCBsb2NhdGlvbkFmdGVyRmlyc3RCbGFua0xpbmUoY29uc3QgVmVjdG9y
PGNoYXI+JiBidWZmZXIpCit7CisgICAgY29uc3QgY2hhciogYnl0ZXMgPSBidWZmZXIuZGF0YSgp
OworICAgIHVuc2lnbmVkIGxlbmd0aCA9IGJ1ZmZlci5zaXplKCk7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgbGVuZ3RoIC0gNDsgaSsrKSB7CisgICAgICAgIC8vIFN1cHBvcnQgZm9y
IEFjcm9iYXQuIEl0IHNlbmRzICJcblxuIi4KKyAgICAgICAgaWYgKGJ5dGVzW2ldID09ICdcbicg
JiYgYnl0ZXNbaSArIDFdID09ICdcbicpCisgICAgICAgICAgICByZXR1cm4gaSArIDI7CisgICAg
ICAgIAorICAgICAgICAvLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBhZnRlciAyIENSTEYncyBvciAx
IENSTEYgaWYgaXQgaXMgdGhlIGZpcnN0IGxpbmUuCisgICAgICAgIGlmIChieXRlc1tpXSA9PSAn
XHInICYmIGJ5dGVzW2kgKyAxXSA9PSAnXG4nKSB7CisgICAgICAgICAgICBpICs9IDI7CisgICAg
ICAgICAgICBpZiAoaSA9PSAyKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAg
ICAgZWxzZSBpZiAoYnl0ZXNbaV0gPT0gJ1xuJykKKyAgICAgICAgICAgICAgICAvLyBTdXBwb3J0
IGZvciBEaXJlY3Rvci4gSXQgc2VuZHMgIlxyXG5cbiIgKDM4ODAzODcpLgorICAgICAgICAgICAg
ICAgIHJldHVybiBpICsgMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGVzW2ldID09ICdccicg
JiYgYnl0ZXNbaSArIDFdID09ICdcbicpCisgICAgICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3Ig
Rmxhc2guIEl0IHNlbmRzICJcclxuXHJcbiIgKDM3NTgxMTMpLgorICAgICAgICAgICAgICAgIHJl
dHVybiBpICsgMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3Rh
dGljIGlubGluZSBjb25zdCBjaGFyKiBmaW5kRU9MKGNvbnN0IGNoYXIqIGJ5dGVzLCB1bnNpZ25l
ZCBsZW5ndGgpCit7CisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBIVFRQIHNwZWNpZmljYXRpb24g
RU9MIGlzIGRlZmluZWQgYXMKKyAgICAvLyBhIENSTEYgcGFpci4gVW5mb3J0dW5hdGVseSwgc29t
ZSBzZXJ2ZXJzIHdpbGwgdXNlIExGCisgICAgLy8gaW5zdGVhZC4gV29yc2UgeWV0LCBzb21lIHNl
cnZlcnMgd2lsbCB1c2UgYSBjb21iaW5hdGlvbgorICAgIC8vIG9mIGJvdGggKGUuZy4gPGhlYWRl
cj5DUkxGTEY8Ym9keT4pLCBzbyBmaW5kRU9MIG5lZWRzCisgICAgLy8gdG8gYmUgbW9yZSBmb3Jn
aXZpbmcuIEl0IHdpbGwgbm93IGFjY2VwdCBDUkxGLCBMRiBvcgorICAgIC8vIENSLgorICAgIC8v
CisgICAgLy8gSXQgcmV0dXJucyBOVUxMIGlmIEVPTEYgaXMgbm90IGZvdW5kIG9yIGl0IHdpbGwg
cmV0dXJuCisgICAgLy8gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdGluZyBjaGFyYWN0
ZXIuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAg
IGlmIChieXRlc1tpXSA9PSAnXG4nKQorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzICsgaTsKKyAg
ICAgICAgaWYgKGJ5dGVzW2ldID09ICdccicpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIHRvIHNl
ZSBpZiBzcGFubmluZyBidWZmZXIgYm91bmRzCisgICAgICAgICAgICAvLyAoQ1JMRiBpcyBhY3Jv
c3MgcmVhZHMpLiBJZiBzbywgd2FpdCBmb3IKKyAgICAgICAgICAgIC8vIG5leHQgcmVhZC4KKyAg
ICAgICAgICAgIGlmIChpICsgMSA9PSBsZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisK
KyAgICAgICAgICAgIHJldHVybiBieXRlcyArIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBTdHJpbmcgY2FwaXRhbGl6ZVJGQzgyMkhlYWRl
ckZpZWxkTmFtZShjb25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgYm9vbCBjYXBpdGFsaXplQ2hh
cmFjdGVyID0gdHJ1ZTsKKyAgICBTdHJpbmcgcmVzdWx0OworCisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IG5hbWUubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBVQ2hhciBjOworCisgICAg
ICAgIGlmIChjYXBpdGFsaXplQ2hhcmFjdGVyICYmIG5hbWVbaV0gPj0gJ2EnICYmIG5hbWVbaV0g
PD0gJ3onKQorICAgICAgICAgICAgYyA9IHRvQVNDSUlVcHBlcihuYW1lW2ldKTsKKyAgICAgICAg
ZWxzZSBpZiAoIWNhcGl0YWxpemVDaGFyYWN0ZXIgJiYgbmFtZVtpXSA+PSAnQScgJiYgbmFtZVtp
XSA8PSAnWicpCisgICAgICAgICAgICBjID0gdG9BU0NJSUxvd2VyKG5hbWVbaV0pOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBjID0gbmFtZVtpXTsKKworICAgICAgICBpZiAobmFtZVtpXSA9
PSAnLScpCisgICAgICAgICAgICBjYXBpdGFsaXplQ2hhcmFjdGVyID0gdHJ1ZTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgY2FwaXRhbGl6ZUNoYXJhY3RlciA9IGZhbHNlOworCisgICAgICAg
IHJlc3VsdC5hcHBlbmQoYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3Rh
dGljIGlubGluZSBIVFRQSGVhZGVyTWFwIHBhcnNlUkZDODIySGVhZGVyRmllbGRzKGNvbnN0IFZl
Y3RvcjxjaGFyPiYgYnVmZmVyLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgY29uc3QgY2hhciog
Ynl0ZXMgPSBidWZmZXIuZGF0YSgpOworICAgIGNvbnN0IGNoYXIqIGVvbDsKKyAgICBTdHJpbmcg
bGFzdEtleTsKKyAgICBIVFRQSGVhZGVyTWFwIGhlYWRlckZpZWxkczsKKworICAgIC8vIExvb3Ag
b3ZlIHJsaW5lcyB1bnRpbCB3ZSdyZSBwYXN0IHRoZSBoZWFkZXIsIG9yIHdlIGNhbid0IGZpbmQg
YW55IG1vcmUgZW5kLW9mLWxpbmVzCisgICAgd2hpbGUgKChlb2wgPSBmaW5kRU9MKGJ5dGVzLCBs
ZW5ndGgpKSkgeworICAgICAgICBjb25zdCBjaGFyKiBsaW5lID0gYnl0ZXM7CisgICAgICAgIGlu
dCBsaW5lTGVuZ3RoID0gZW9sIC0gYnl0ZXM7CisgICAgICAgIAorICAgICAgICAvLyBNb3ZlIGJ5
dGVzIHRvIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHRlcm1pbmF0b3IgYXMgcmV0dXJuZWQgYnkg
ZmluZEVPTC4KKyAgICAgICAgYnl0ZXMgPSBlb2wgKyAxOworICAgICAgICBpZiAoKCplb2wgPT0g
J1xyJykgJiYgKCpieXRlcyA9PSAnXG4nKSkKKyAgICAgICAgICAgIGJ5dGVzKys7IC8vIFNhZmUg
c2luY2UgZmluZEVPTCB3b24ndCByZXR1cm4gYSBzcGFubmluZyBDUkxGLgorCisgICAgICAgIGxl
bmd0aCAtPSAoYnl0ZXMgLSBsaW5lKTsKKyAgICAgICAgaWYgKGxpbmVMZW5ndGggPT0gMCkKKyAg
ICAgICAgICAgIC8vIEJsYW5rIGxpbmU7IHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlcgor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKCpsaW5lID09ICcgJyB8fCAqbGlu
ZSA9PSAnXHQnKSB7CisgICAgICAgICAgICAvLyBDb250aW51YXRpb24gb2YgdGhlIHByZXZpb3Vz
IGhlYWRlcgorICAgICAgICAgICAgaWYgKGxhc3RLZXkuaXNOdWxsKCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBtYWxmb3JtZWQgaGVhZGVyOyBpZ25vcmUgaXQgYW5kIGNvbnRpbnVlCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAg
IC8vIE1lcmdlIHRoZSBjb250aW51YXRpb24gb2YgdGhlIHByZXZpb3VzIGhlYWRlcgorICAgICAg
ICAgICAgICAgIFN0cmluZyBjdXJyZW50VmFsdWUgPSBoZWFkZXJGaWVsZHMuZ2V0KGxhc3RLZXkp
OworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdWYWx1ZShsaW5lLCBsaW5lTGVuZ3RoKTsKKwor
ICAgICAgICAgICAgICAgIGhlYWRlckZpZWxkcy5zZXQobGFzdEtleSwgY3VycmVudFZhbHVlICsg
bmV3VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
Ly8gQnJhbmQgbmV3IGhlYWRlcgorICAgICAgICAgICAgY29uc3QgY2hhciogY29sb247CisgICAg
ICAgICAgICBmb3IgKGNvbG9uID0gbGluZTsgKmNvbG9uICE9ICc6JyAmJiBjb2xvbiAhPSBlb2w7
IGNvbG9uKyspIHsKKyAgICAgICAgICAgICAgICAvLyBlbXB0eSBsb29wCisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoY29sb24gPT0gZW9sKSAKKyAgICAgICAgICAgICAgICAvLyBtYWxm
b3JtZWQgaGVhZGVyOyBpZ25vcmUgaXQgYW5kIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0S2V5ID0gY2Fw
aXRhbGl6ZVJGQzgyMkhlYWRlckZpZWxkTmFtZShTdHJpbmcobGluZSwgY29sb24gLSBsaW5lKSk7
CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgICAgICAgICAgZm9yIChj
b2xvbisrOyBjb2xvbiAhPSBlb2w7IGNvbG9uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYg
KCpjb2xvbiAhPSAnICcgJiYgKmNvbG9uICE9ICdcdCcpCisgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbG9uID09
IGVvbCkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nKGNvbG9uLCBlb2wgLSBjb2xv
bik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBoZWFkZXJGaWVsZHMuZ2V0
KGxhc3RLZXkpOworICAgICAgICAgICAgICAgIGlmICghb2xkVmFsdWUuaXNOdWxsKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgU3RyaW5nIHRtcCA9IG9sZFZhbHVlOworICAgICAgICAgICAgICAg
ICAgICB0bXAgKz0gIiwgIjsKKyAgICAgICAgICAgICAgICAgICAgdG1wICs9IHZhbHVlOworICAg
ICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRtcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBoZWFkZXJGaWVsZHMuc2V0KGxhc3RLZXksIHZhbHVlKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBoZWFkZXJGaWVsZHM7Cit9CisKK05Q
RXJyb3IgUGx1Z2luVmlldzo6aGFuZGxlUG9zdChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIq
IHRhcmdldCwgdWludDMyIGxlbiwgY29uc3QgY2hhciogYnVmLCBib29sIGZpbGUsIHZvaWQqIG5v
dGlmeURhdGEsIGJvb2wgc2VuZE5vdGlmaWNhdGlvbiwgYm9vbCBhbGxvd0hlYWRlcnMpCit7Cisg
ICAgaWYgKCF1cmwgfHwgIWxlbiB8fCAhYnVmKQorICAgICAgICByZXR1cm4gTlBFUlJfSU5WQUxJ
RF9QQVJBTTsKKworICAgIEZyYW1lTG9hZFJlcXVlc3QgZnJhbWVMb2FkUmVxdWVzdDsKKworICAg
IEhUVFBIZWFkZXJNYXAgaGVhZGVyRmllbGRzOworICAgIFZlY3RvcjxjaGFyPiBidWZmZXI7Cisg
ICAgCisgICAgaWYgKGZpbGUpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lKGJ1ZiwgbGVuKTsK
KworICAgICAgICBpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aCgiZmlsZTovLy8iKSkKKyAgICAgICAg
ICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDgpOworCisgICAgICAgIC8vIEdldCBm
aWxlIGluZm8KKyAgICAgICAgV0lOMzJfRklMRV9BVFRSSUJVVEVfREFUQSBhdHRyczsKKyAgICAg
ICAgaWYgKEdldEZpbGVBdHRyaWJ1dGVzRXhXKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRl
cm1pbmF0aW9uKCksIEdldEZpbGVFeEluZm9TdGFuZGFyZCwgJmF0dHJzKSA9PSAwKQorICAgICAg
ICAgICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgICAgICAgIGlmIChhdHRycy5k
d0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKQorICAgICAgICAgICAg
cmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOworCisgICAgICAgIEhBTkRMRSBmaWxlSGFuZGxl
ID0gQ3JlYXRlRmlsZVcoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwg
RklMRV9SRUFEX0RBVEEsIEZJTEVfU0hBUkVfUkVBRCwgMCwgT1BFTl9FWElTVElORywgMCwgMCk7
CisgICAgICAgIAorICAgICAgICBpZiAoZmlsZUhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxV
RSkKKyAgICAgICAgICAgIHJldHVybiBOUEVSUl9GSUxFX05PVF9GT1VORDsKKworICAgICAgICBi
dWZmZXIucmVzaXplKGF0dHJzLm5GaWxlU2l6ZUxvdyk7CisKKyAgICAgICAgRFdPUkQgYnl0ZXNS
ZWFkOworICAgICAgICBpbnQgcmV0dmFsID0gUmVhZEZpbGUoZmlsZUhhbmRsZSwgYnVmZmVyLmRh
dGEoKSwgYXR0cnMubkZpbGVTaXplTG93LCAmYnl0ZXNSZWFkLCAwKTsKKworICAgICAgICBDbG9z
ZUhhbmRsZShmaWxlSGFuZGxlKTsKKworICAgICAgICBpZiAocmV0dmFsID09IDAgfHwgYnl0ZXNS
ZWFkICE9IGF0dHJzLm5GaWxlU2l6ZUxvdykKKyAgICAgICAgICAgIHJldHVybiBOUEVSUl9GSUxF
X05PVF9GT1VORDsKKyAgICB9IGVsc2UgeworICAgICAgICBidWZmZXIucmVzaXplKGxlbik7Cisg
ICAgICAgIG1lbWNweShidWZmZXIuZGF0YSgpLCBidWYsIGxlbik7CisgICAgfQorCisgICAgY29u
c3QgY2hhciogcG9zdERhdGEgPSBidWZmZXIuZGF0YSgpOworICAgIGludCBwb3N0RGF0YUxlbmd0
aCA9IGJ1ZmZlci5zaXplKCk7CisgICAgCisgICAgaWYgKGFsbG93SGVhZGVycykgeworICAgICAg
ICBpZiAoc3RhcnRzV2l0aEJsYW5rTGluZShidWZmZXIpKSB7CisgICAgICAgICAgICBwb3N0RGF0
YSsrOworICAgICAgICAgICAgcG9zdERhdGFMZW5ndGgtLTsKKyAgICAgICAgfSBlbHNlIHsKKyAg
ICAgICAgICAgIGludCBsb2NhdGlvbiA9IGxvY2F0aW9uQWZ0ZXJGaXJzdEJsYW5rTGluZShidWZm
ZXIpOworICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IC0xKSB7CisgICAgICAgICAgICAgICAg
Ly8gSWYgdGhlIGJsYW5rIGxpbmUgaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGJ1
ZmZlciwgZXZlcnl0aGluZyBiZWZvcmUgaXMgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIGhl
YWRlckZpZWxkcyA9IHBhcnNlUkZDODIySGVhZGVyRmllbGRzKGJ1ZmZlciwgbG9jYXRpb24pOwor
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRhdGFMZW5ndGggPSBidWZmZXIuc2l6ZSgpIC0gbG9j
YXRpb247CisKKyAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgcGx1Z2lucyBsaWtlIHRvIHNl
dCBDb250ZW50LUxlbmd0aCB0aGVtc2VsdmVzIHdoZW4gdGhleSBwb3N0LAorICAgICAgICAgICAg
ICAgIC8vIGJ1dCBXZWJGb3VuZGF0aW9uIGRvZXMgbm90IGxpa2UgdGhhdC4gU28gd2Ugd2lsbCBy
ZW1vdmUgdGhlIGhlYWRlcgorICAgICAgICAgICAgICAgIC8vIGFuZCBpbnN0ZWFkIHRydW5jYXRl
IHRoZSBkYXRhIHRvIHRoZSByZXF1ZXN0ZWQgbGVuZ3RoLgorICAgICAgICAgICAgICAgIFN0cmlu
ZyBjb250ZW50TGVuZ3RoID0gaGVhZGVyRmllbGRzLmdldCgiQ29udGVudC1MZW5ndGgiKTsKKwor
ICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aC5pc051bGwoKSkKKyAgICAgICAgICAg
ICAgICAgICAgZGF0YUxlbmd0aCA9IG1pbihjb250ZW50TGVuZ3RoLnRvSW50KCksIChpbnQpZGF0
YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgaGVhZGVyRmllbGRzLnJlbW92ZSgiQ29udGVudC1M
ZW5ndGgiKTsKKworICAgICAgICAgICAgICAgIHBvc3REYXRhICs9IGxvY2F0aW9uOworICAgICAg
ICAgICAgICAgIHBvc3REYXRhTGVuZ3RoID0gZGF0YUxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgIH0KKworICAgIGZyYW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0KCku
c2V0SFRUUE1ldGhvZCgiUE9TVCIpOworICAgIGZyYW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1
ZXN0KCkuc2V0VVJMKG1ha2VVUkwobV9iYXNlVVJMLCB1cmwpKTsKKyAgICBmcmFtZUxvYWRSZXF1
ZXN0LnJlc291cmNlUmVxdWVzdCgpLmFkZEhUVFBIZWFkZXJGaWVsZHMoaGVhZGVyRmllbGRzKTsK
KyAgICBmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNlUmVxdWVzdCgpLnNldEhUVFBCb2R5KEZvcm1E
YXRhOjpjcmVhdGUocG9zdERhdGEsIHBvc3REYXRhTGVuZ3RoKSk7CisgICAgZnJhbWVMb2FkUmVx
dWVzdC5zZXRGcmFtZU5hbWUodGFyZ2V0KTsKKworICAgIHJldHVybiBsb2FkKGZyYW1lTG9hZFJl
cXVlc3QsIHNlbmROb3RpZmljYXRpb24sIG5vdGlmeURhdGEpOworfQorCitOUEVycm9yIFBsdWdp
blZpZXc6OnBvc3RVUkxOb3RpZnkoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiB0YXJnZXQs
IHVpbnQzMiBsZW4sIGNvbnN0IGNoYXIqIGJ1ZiwgTlBCb29sIGZpbGUsIHZvaWQqIG5vdGlmeURh
dGEpCit7CisgICAgcmV0dXJuIGhhbmRsZVBvc3QodXJsLCB0YXJnZXQsIGxlbiwgYnVmLCBmaWxl
LCBub3RpZnlEYXRhLCB0cnVlLCB0cnVlKTsKK30KKworTlBFcnJvciBQbHVnaW5WaWV3Ojpwb3N0
VVJMKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogdGFyZ2V0LCB1aW50MzIgbGVuLCBjb25z
dCBjaGFyKiBidWYsIE5QQm9vbCBmaWxlKQoreworICAgIC8vIEFzIGRvY3VtZW50ZWQsIG9ubHkg
YWxsb3cgaGVhZGVycyB0byBiZSBzcGVjaWZpZWQgdmlhIE5QUF9Qb3N0VVJMIHdoZW4gdXNpbmcg
YSBmaWxlLgorICAgIHJldHVybiBoYW5kbGVQb3N0KHVybCwgdGFyZ2V0LCBsZW4sIGJ1ZiwgZmls
ZSwgMCwgZmFsc2UsIGZpbGUpOworfQorCitOUEVycm9yIFBsdWdpblZpZXc6Om5ld1N0cmVhbShO
UE1JTUVUeXBlIHR5cGUsIGNvbnN0IGNoYXIqIHRhcmdldCwgTlBTdHJlYW0qKiBzdHJlYW0pCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICAvLyBVbnN1cHBvcnRlZAorICAgIHJldHVybiBO
UEVSUl9HRU5FUklDX0VSUk9SOworfQorCitpbnQzMiBQbHVnaW5WaWV3Ojp3cml0ZShOUFN0cmVh
bSogc3RyZWFtLCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgIC8vIFVuc3VwcG9ydGVkCisgICAgcmV0dXJuIC0xOworfQorCitOUEVycm9yIFBs
dWdpblZpZXc6OmRlc3Ryb3lTdHJlYW0oTlBTdHJlYW0qIHN0cmVhbSwgTlBSZWFzb24gcmVhc29u
KQoreworICAgIFBsdWdpblN0cmVhbSogYnJvd3NlclN0cmVhbSA9IHN0YXRpY19jYXN0PFBsdWdp
blN0cmVhbSo+KHN0cmVhbS0+bmRhdGEpOworCisgICAgaWYgKCFzdHJlYW0gfHwgUGx1Z2luU3Ry
ZWFtOjpvd25lckZvclN0cmVhbShzdHJlYW0pICE9IG1faW5zdGFuY2UpCisgICAgICAgIHJldHVy
biBOUEVSUl9JTlZBTElEX0lOU1RBTkNFX0VSUk9SOworCisgICAgYnJvd3NlclN0cmVhbS0+Y2Fu
Y2VsQW5kRGVzdHJveVN0cmVhbShyZWFzb24pOworICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsK
K30KKworY29uc3QgY2hhciogUGx1Z2luVmlldzo6dXNlckFnZW50KCkKK3sKKyAgICBpZiAobV9w
bHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrV2FudHNNb3ppbGxhVXNlckFnZW50
KSkKKyAgICAgICAgcmV0dXJuIE1vemlsbGFVc2VyQWdlbnQ7CisKKyAgICBpZiAobV91c2VyQWdl
bnQuaXNOdWxsKCkpCisgICAgICAgIG1fdXNlckFnZW50ID0gbV9wYXJlbnRGcmFtZS0+bG9hZGVy
KCktPnVzZXJBZ2VudChtX3VybCkudXRmOCgpOworICAgIHJldHVybiBtX3VzZXJBZ2VudC5kYXRh
KCk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6c3RhdHVzKGNvbnN0IGNoYXIqIG1lc3NhZ2UpCit7
CisgICAgaWYgKFBhZ2UqIHBhZ2UgPSBtX3BhcmVudEZyYW1lLT5wYWdlKCkpCisgICAgICAgIHBh
Z2UtPmNocm9tZSgpLT5zZXRTdGF0dXNiYXJUZXh0KG1fcGFyZW50RnJhbWUsIFN0cmluZyhtZXNz
YWdlKSk7Cit9CisKK05QRXJyb3IgUGx1Z2luVmlldzo6Z2V0VmFsdWUoTlBOVmFyaWFibGUgdmFy
aWFibGUsIHZvaWQqIHZhbHVlKQoreworICAgIHN3aXRjaCAodmFyaWFibGUpIHsKKyAgICAgICAg
Y2FzZSBOUE5WV2luZG93TlBPYmplY3Q6IHsKKyAgICAgICAgICAgIE5QT2JqZWN0KiB3aW5kb3dT
Y3JpcHRPYmplY3QgPSBtX3BhcmVudEZyYW1lLT53aW5kb3dTY3JpcHROUE9iamVjdCgpOworCisg
ICAgICAgICAgICAvLyBSZXR1cm4gdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgcmV0YWluZWQsIGFz
IGRlc2NyaWJlZCBoZXJlOiA8aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9wbHVnaW4v
bnBydW50aW1lLmh0bWw+CisgICAgICAgICAgICBpZiAod2luZG93U2NyaXB0T2JqZWN0KQorICAg
ICAgICAgICAgICAgIF9OUE5fUmV0YWluT2JqZWN0KHdpbmRvd1NjcmlwdE9iamVjdCk7CisKKyAg
ICAgICAgICAgIHZvaWQqKiB2ID0gKHZvaWQqKil2YWx1ZTsKKyAgICAgICAgICAgICp2ID0gd2lu
ZG93U2NyaXB0T2JqZWN0OworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gTlBFUlJf
Tk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE5QTlZQbHVnaW5FbGVtZW50TlBP
YmplY3Q6IHsKKyAgICAgICAgICAgIE5QT2JqZWN0KiBwbHVnaW5TY3JpcHRPYmplY3QgPSAwOwor
CisgICAgICAgICAgICBpZiAobV9lbGVtZW50LT5oYXNUYWdOYW1lKGFwcGxldFRhZykgfHwgbV9l
bGVtZW50LT5oYXNUYWdOYW1lKGVtYmVkVGFnKSB8fCBtX2VsZW1lbnQtPmhhc1RhZ05hbWUob2Jq
ZWN0VGFnKSkKKyAgICAgICAgICAgICAgICBwbHVnaW5TY3JpcHRPYmplY3QgPSBzdGF0aWNfY2Fz
dDxIVE1MUGx1Z0luRWxlbWVudCo+KG1fZWxlbWVudCktPmdldE5QT2JqZWN0KCk7CisKKyAgICAg
ICAgICAgIC8vIFJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSByZXRhaW5lZCwgYXMgZGVz
Y3JpYmVkIGhlcmU6IDxodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2plY3RzL3BsdWdpbi9ucHJ1
bnRpbWUuaHRtbD4KKyAgICAgICAgICAgIGlmIChwbHVnaW5TY3JpcHRPYmplY3QpCisgICAgICAg
ICAgICAgICAgX05QTl9SZXRhaW5PYmplY3QocGx1Z2luU2NyaXB0T2JqZWN0KTsKKworICAgICAg
ICAgICAgdm9pZCoqIHYgPSAodm9pZCoqKXZhbHVlOworICAgICAgICAgICAgKnYgPSBwbHVnaW5T
Y3JpcHRPYmplY3Q7CisKKyAgICAgICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKKyAgICAg
ICAgfQorCisgICAgICAgIGNhc2UgTlBOVm5ldHNjYXBlV2luZG93OiB7CisgICAgICAgICAgICBI
V05EKiB3ID0gcmVpbnRlcnByZXRfY2FzdDxIV05EKj4odmFsdWUpOworCisgICAgICAgICAgICAq
dyA9IGNvbnRhaW5pbmdXaW5kb3coKTsKKworICAgICAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VS
Uk9SOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gTlBF
UlJfR0VORVJJQ19FUlJPUjsKKyAgICB9Cit9CisKK05QRXJyb3IgUGx1Z2luVmlldzo6c2V0VmFs
dWUoTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQqIHZhbHVlKQoreworICAgIHN3aXRjaCAodmFy
aWFibGUpIHsKKyAgICAgICAgY2FzZSBOUFBWcGx1Z2luV2luZG93Qm9vbDoKKyAgICAgICAgICAg
IG1faXNXaW5kb3dlZCA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9S
OworICAgICAgICBjYXNlIE5QUFZwbHVnaW5UcmFuc3BhcmVudEJvb2w6CisgICAgICAgICAgICBt
X2lzVHJhbnNwYXJlbnQgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBOUEVSUl9OT19FUlJP
UjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAg
ICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJQ19FUlJPUjsKKyAgICB9Cit9CisKK3ZvaWQgUGx1
Z2luVmlldzo6aW52YWxpZGF0ZVRpbWVyRmlyZWQoVGltZXI8UGx1Z2luVmlldz4qIHRpbWVyKQor
eworICAgIEFTU0VSVCh0aW1lciA9PSAmbV9pbnZhbGlkYXRlVGltZXIpOworCisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IG1faW52YWxpZFJlY3RzLnNpemUoKTsgaSsrKQorICAgICAgICBX
aWRnZXQ6OmludmFsaWRhdGVSZWN0KG1faW52YWxpZFJlY3RzW2ldKTsKKyAgICBtX2ludmFsaWRS
ZWN0cy5jbGVhcigpOworfQorCisKK3ZvaWQgUGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlY3QoTlBS
ZWN0KiByZWN0KQoreworICAgIGlmICghcmVjdCkgeworICAgICAgICBpbnZhbGlkYXRlKCk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBJbnRSZWN0IHIocmVjdC0+bGVmdCwgcmVjdC0+
dG9wLCByZWN0LT5yaWdodCAtIHJlY3QtPmxlZnQsIHJlY3QtPmJvdHRvbSAtIHJlY3QtPnRvcCk7
CisKKyAgICBpZiAobV9pc1dpbmRvd2VkKSB7CisgICAgICAgIFJFQ1QgaW52YWxpZFJlY3Qocik7
CisgICAgICAgIEludmFsaWRhdGVSZWN0KG1fd2luZG93LCAmaW52YWxpZFJlY3QsIEZBTFNFKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBs
dWdpblF1aXJrVGhyb3R0bGVJbnZhbGlkYXRlKSkgeworICAgICAgICAgICAgbV9pbnZhbGlkUmVj
dHMuYXBwZW5kKHIpOworICAgICAgICAgICAgaWYgKCFtX2ludmFsaWRhdGVUaW1lci5pc0FjdGl2
ZSgpKQorICAgICAgICAgICAgICAgIG1faW52YWxpZGF0ZVRpbWVyLnN0YXJ0T25lU2hvdCgwLjAw
MSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgV2lkZ2V0OjppbnZhbGlkYXRlUmVjdChy
KTsKKyAgICB9Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6aW52YWxpZGF0ZVJlZ2lvbihOUFJlZ2lv
biByZWdpb24pCit7CisgICAgaWYgKG1faXNXaW5kb3dlZCkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUkVDVCByOworCisgICAgaWYgKEdldFJnbkJveChyZWdpb24sICZyKSA9PSAwKSB7CisgICAg
ICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFdpZGdldDo6
aW52YWxpZGF0ZVJlY3Qocik7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6Zm9yY2VSZWRyYXcoKQor
eworICAgIGlmIChtX2lzV2luZG93ZWQpCisgICAgICAgIDo6VXBkYXRlV2luZG93KG1fd2luZG93
KTsKKyAgICBlbHNlCisgICAgICAgIDo6VXBkYXRlV2luZG93KGNvbnRhaW5pbmdXaW5kb3coKSk7
Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6cHVzaFBvcHVwc0VuYWJsZWRTdGF0ZShib29sIHN0YXRl
KQoreworICAgIG1fcG9wdXBTdGF0ZVN0YWNrLmFwcGVuZChzdGF0ZSk7Cit9CisgCit2b2lkIFBs
dWdpblZpZXc6OnBvcFBvcHVwc0VuYWJsZWRTdGF0ZSgpCit7CisgICAgbV9wb3B1cFN0YXRlU3Rh
Y2sucmVtb3ZlTGFzdCgpOworfQorCitib29sIFBsdWdpblZpZXc6OmFyZVBvcHVwc0FsbG93ZWQo
KSBjb25zdAoreworICAgIGlmICghbV9wb3B1cFN0YXRlU3RhY2suaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gbV9wb3B1cFN0YXRlU3RhY2subGFzdCgpOworCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitQYXNzUmVmUHRyPEtKUzo6QmluZGluZ3M6Okluc3RhbmNlPiBQbHVnaW5WaWV3OjpiaW5k
aW5nSW5zdGFuY2UoKQoreworICAgIE5QT2JqZWN0KiBvYmplY3QgPSAwOworCisgICAgaWYgKCFt
X3BsdWdpbiB8fCAhbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmdldHZhbHVlKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIE5QRXJyb3IgbnBFcnI7CisgICAgeworICAgICAgICBLSlM6OkpTTG9j
azo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKKyAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbih0
cnVlKTsKKyAgICAgICAgbnBFcnIgPSBtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUo
bV9pbnN0YW5jZSwgTlBQVnBsdWdpblNjcmlwdGFibGVOUE9iamVjdCwgJm9iamVjdCk7CisgICAg
ICAgIHNldENhbGxpbmdQbHVnaW4oZmFsc2UpOworICAgIH0KKworICAgIGlmIChucEVyciAhPSBO
UEVSUl9OT19FUlJPUiB8fCAhb2JqZWN0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0
cjxLSlM6OkJpbmRpbmdzOjpSb290T2JqZWN0PiByb290ID0gbV9wYXJlbnRGcmFtZS0+Y3JlYXRl
Um9vdE9iamVjdCh0aGlzLCBtX3BhcmVudEZyYW1lLT5zY3JpcHRQcm94eSgpLT5nbG9iYWxPYmpl
Y3QoKSk7CisgICAgUmVmUHRyPEtKUzo6QmluZGluZ3M6Okluc3RhbmNlPiBpbnN0YW5jZSA9IEtK
Uzo6QmluZGluZ3M6OkNJbnN0YW5jZTo6Y3JlYXRlKG9iamVjdCwgcm9vdC5yZWxlYXNlKCkpOwor
CisgICAgX05QTl9SZWxlYXNlT2JqZWN0KG9iamVjdCk7CisKKyAgICByZXR1cm4gaW5zdGFuY2Uu
cmVsZWFzZSgpOworfQorCitQbHVnaW5WaWV3Ojp+UGx1Z2luVmlldygpCit7CisgICAgc3RvcCgp
OworCisgICAgZGVsZXRlQWxsVmFsdWVzKG1fcmVxdWVzdHMpOworCisgICAgZnJlZVN0cmluZ0Fy
cmF5KG1fcGFyYW1OYW1lcywgbV9wYXJhbUNvdW50KTsKKyAgICBmcmVlU3RyaW5nQXJyYXkobV9w
YXJhbVZhbHVlcywgbV9wYXJhbUNvdW50KTsKKworICAgIGlmIChtX3dpbmRvdykKKyAgICAgICAg
RGVzdHJveVdpbmRvdyhtX3dpbmRvdyk7CisKKyAgICBtX3BhcmVudEZyYW1lLT5jbGVhbnVwU2Ny
aXB0T2JqZWN0c0ZvclBsdWdpbih0aGlzKTsKKworICAgIGlmIChtX3BsdWdpbiAmJiAhbV9wbHVn
aW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrRG9udFVubG9hZFBsdWdpbikpCisgICAg
ICAgIG1fcGx1Z2luLT51bmxvYWQoKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpkaXNjb25uZWN0
U3RyZWFtKFBsdWdpblN0cmVhbSogc3RyZWFtKQoreworICAgIEFTU0VSVChtX3N0cmVhbXMuY29u
dGFpbnMoc3RyZWFtKSk7CisKKyAgICBtX3N0cmVhbXMucmVtb3ZlKHN0cmVhbSk7Cit9CisKK3Zv
aWQgUGx1Z2luVmlldzo6c2V0UGFyYW1ldGVycyhjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGFyYW1O
YW1lcywgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtVmFsdWVzKQoreworICAgIEFTU0VSVChw
YXJhbU5hbWVzLnNpemUoKSA9PSBwYXJhbVZhbHVlcy5zaXplKCkpOworCisgICAgdW5zaWduZWQg
c2l6ZSA9IHBhcmFtTmFtZXMuc2l6ZSgpOworICAgIHVuc2lnbmVkIHBhcmFtQ291bnQgPSAwOwor
CisgICAgbV9wYXJhbU5hbWVzID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKio+KGZhc3RNYWxsb2Mo
c2l6ZW9mKGNoYXIqKSAqIHNpemUpKTsKKyAgICBtX3BhcmFtVmFsdWVzID0gcmVpbnRlcnByZXRf
Y2FzdDxjaGFyKio+KGZhc3RNYWxsb2Moc2l6ZW9mKGNoYXIqKSAqIHNpemUpKTsKKworICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKG1fcGx1Z2lu
LT5xdWlya3MoKS5jb250YWlucyhQbHVnaW5RdWlya1JlbW92ZVdpbmRvd2xlc3NWaWRlb1BhcmFt
KSAmJiBlcXVhbElnbm9yaW5nQ2FzZShwYXJhbU5hbWVzW2ldLCAid2luZG93bGVzc3ZpZGVvIikp
CisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtX3BhcmFtTmFtZXNbcGFyYW1Db3Vu
dF0gPSBjcmVhdGVVVEY4U3RyaW5nKHBhcmFtTmFtZXNbaV0pOworICAgICAgICBtX3BhcmFtVmFs
dWVzW3BhcmFtQ291bnRdID0gY3JlYXRlVVRGOFN0cmluZyhwYXJhbVZhbHVlc1tpXSk7CisKKyAg
ICAgICAgcGFyYW1Db3VudCsrOworICAgIH0KKworICAgIG1fcGFyYW1Db3VudCA9IHBhcmFtQ291
bnQ7Cit9CisKK1BsdWdpblZpZXc6OlBsdWdpblZpZXcoRnJhbWUqIHBhcmVudEZyYW1lLCBjb25z
dCBJbnRTaXplJiBzaXplLCBQbHVnaW5QYWNrYWdlKiBwbHVnaW4sIEVsZW1lbnQqIGVsZW1lbnQs
IGNvbnN0IEtVUkwmIHVybCwgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtTmFtZXMsIGNvbnN0
IFZlY3RvcjxTdHJpbmc+JiBwYXJhbVZhbHVlcywgY29uc3QgU3RyaW5nJiBtaW1lVHlwZSwgYm9v
bCBsb2FkTWFudWFsbHkpCisgICAgOiBtX3BhcmVudEZyYW1lKHBhcmVudEZyYW1lKQorICAgICwg
bV9wbHVnaW4ocGx1Z2luKQorICAgICwgbV9lbGVtZW50KGVsZW1lbnQpCisgICAgLCBtX2lzU3Rh
cnRlZChmYWxzZSkKKyAgICAsIG1fdXJsKHVybCkKKyAgICAsIG1fYmFzZVVSTChtX3BhcmVudEZy
YW1lLT5sb2FkZXIoKS0+Y29tcGxldGVVUkwobV9wYXJlbnRGcmFtZS0+ZG9jdW1lbnQoKS0+YmFz
ZVVSTCgpLnN0cmluZygpKSkKKyAgICAsIG1fc3RhdHVzKFBsdWdpblN0YXR1c0xvYWRlZFN1Y2Nl
c3NmdWxseSkKKyAgICAsIG1fcmVxdWVzdFRpbWVyKHRoaXMsICZQbHVnaW5WaWV3OjpyZXF1ZXN0
VGltZXJGaXJlZCkKKyAgICAsIG1faW52YWxpZGF0ZVRpbWVyKHRoaXMsICZQbHVnaW5WaWV3Ojpp
bnZhbGlkYXRlVGltZXJGaXJlZCkKKyAgICAsIG1fcG9wUG9wdXBzU3RhdGVUaW1lcih0aGlzLCAm
UGx1Z2luVmlldzo6cG9wUG9wdXBzU3RhdGVUaW1lckZpcmVkKQorICAgICwgbV9wYXJhbU5hbWVz
KDApCisgICAgLCBtX3BhcmFtVmFsdWVzKDApCisgICAgLCBtX3dpbmRvdygwKQorICAgICwgbV9w
bHVnaW5XbmRQcm9jKDApCisgICAgLCBtX2lzV2luZG93ZWQodHJ1ZSkKKyAgICAsIG1faXNUcmFu
c3BhcmVudChmYWxzZSkKKyAgICAsIG1faXNWaXNpYmxlKGZhbHNlKQorICAgICwgbV9hdHRhY2hl
ZFRvV2luZG93KGZhbHNlKQorICAgICwgbV9oYXZlSW5pdGlhbGl6ZWQoZmFsc2UpCisgICAgLCBt
X2xhc3RNZXNzYWdlKDApCisgICAgLCBtX2lzQ2FsbGluZ1BsdWdpblduZFByb2MoZmFsc2UpCisg
ICAgLCBtX2xvYWRNYW51YWxseShsb2FkTWFudWFsbHkpCisgICAgLCBtX21hbnVhbFN0cmVhbSgw
KQoreworICAgIGlmICghbV9wbHVnaW4pIHsKKyAgICAgICAgbV9zdGF0dXMgPSBQbHVnaW5TdGF0
dXNDYW5Ob3RGaW5kUGx1Z2luOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9pbnN0
YW5jZSA9ICZtX2luc3RhbmNlU3RydWN0OworICAgIG1faW5zdGFuY2UtPm5kYXRhID0gdGhpczsK
KworICAgIG1fbWltZVR5cGUgPSBtaW1lVHlwZS51dGY4KCk7CisKKyAgICBzZXRQYXJhbWV0ZXJz
KHBhcmFtTmFtZXMsIHBhcmFtVmFsdWVzKTsKKworICAgIG1fbW9kZSA9IG1fbG9hZE1hbnVhbGx5
ID8gTlBfRlVMTCA6IE5QX0VNQkVEOworCisgICAgcmVzaXplKHNpemUpOworfQorCit2b2lkIFBs
dWdpblZpZXc6OmluaXQoKQoreworICAgIGlmIChtX2hhdmVJbml0aWFsaXplZCkKKyAgICAgICAg
cmV0dXJuOworICAgIG1faGF2ZUluaXRpYWxpemVkID0gdHJ1ZTsKKworICAgIGlmICghbV9wbHVn
aW4pIHsKKyAgICAgICAgQVNTRVJUKG1fc3RhdHVzID09IFBsdWdpblN0YXR1c0Nhbk5vdEZpbmRQ
bHVnaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX3BsdWdpbi0+bG9h
ZCgpKSB7CisgICAgICAgIG1fcGx1Z2luID0gMDsKKyAgICAgICAgbV9zdGF0dXMgPSBQbHVnaW5T
dGF0dXNDYW5Ob3RMb2FkUGx1Z2luOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KCFzdGFydCgpKSB7CisgICAgICAgIG1fc3RhdHVzID0gUGx1Z2luU3RhdHVzQ2FuTm90TG9hZFBs
dWdpbjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2lzV2luZG93ZWQpIHsK
KyAgICAgICAgcmVnaXN0ZXJQbHVnaW5WaWV3KCk7CisKKyAgICAgICAgRFdPUkQgZmxhZ3MgPSBX
U19DSElMRDsKKyAgICAgICAgaWYgKG1faXNWaXNpYmxlKQorICAgICAgICAgICAgZmxhZ3MgfD0g
V1NfVklTSUJMRTsKKworICAgICAgICBtX3dpbmRvdyA9IENyZWF0ZVdpbmRvd0V4KDAsIGtXZWJQ
bHVnaW5WaWV3ZG93Q2xhc3NOYW1lLCAwLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAwLCAwLCAwLCAwLCBtX3BhcmVudEZyYW1lLT52aWV3KCktPmNvbnRhaW5pbmdX
aW5kb3coKSwgMCwgUGFnZTo6aW5zdGFuY2VIYW5kbGUoKSwgMCk7CisgICAgICAgIAorICAgICAg
ICAvLyBDYWxsaW5nIFNldFdpbmRvd0xvbmdQdHJBIGhlcmUgbWFrZXMgdGhlIHdpbmRvdyBwcm9j
IEFTQ0lJLCB3aGljaCBpcyByZXF1aXJlZCBieSBhdCBsZWFzdAorICAgICAgICAvLyB0aGUgU2hv
Y2t3YXZlIERpcmVjdG9yIHBsdWctaW4uCisgICAgICAgIDo6U2V0V2luZG93TG9uZ1B0ckEobV93
aW5kb3csIEdXTF9XTkRQUk9DLCAoTE9ORylEZWZXaW5kb3dQcm9jQSk7CisKKyAgICAgICAgU2V0
UHJvcChtX3dpbmRvdywga1dlYlBsdWdpblZpZXdQcm9wZXJ0eSwgdGhpcyk7CisKKyAgICAgICAg
bV9ucFdpbmRvdy50eXBlID0gTlBXaW5kb3dUeXBlV2luZG93OworICAgICAgICBtX25wV2luZG93
LndpbmRvdyA9IG1fd2luZG93OworICAgIH0gZWxzZSB7CisgICAgICAgIG1fbnBXaW5kb3cudHlw
ZSA9IE5QV2luZG93VHlwZURyYXdhYmxlOworICAgICAgICBtX25wV2luZG93LndpbmRvdyA9IDA7
CisgICAgfQorCisgICAgaWYgKCFtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVp
cmtEZWZlckZpcnN0U2V0V2luZG93Q2FsbCkpCisgICAgICAgIHNldE5QV2luZG93UmVjdChmcmFt
ZUdlb21ldHJ5KCkpOworCisgICAgbV9zdGF0dXMgPSBQbHVnaW5TdGF0dXNMb2FkZWRTdWNjZXNz
ZnVsbHk7Cit9CisKK3ZvaWQgUGx1Z2luVmlldzo6ZGlkUmVjZWl2ZVJlc3BvbnNlKGNvbnN0IFJl
c291cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIEFTU0VSVChtX2xvYWRNYW51YWxseSk7
CisgICAgQVNTRVJUKCFtX21hbnVhbFN0cmVhbSk7CisKKyAgICBtX21hbnVhbFN0cmVhbSA9IG5l
dyBQbHVnaW5TdHJlYW0odGhpcywgbV9wYXJlbnRGcmFtZSwgbV9wYXJlbnRGcmFtZS0+bG9hZGVy
KCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCktPnJlcXVlc3QoKSwgZmFsc2UsIDAsIHBsdWdpbigp
LT5wbHVnaW5GdW5jcygpLCBpbnN0YW5jZSgpLCBtX3BsdWdpbi0+cXVpcmtzKCkpOworICAgIG1f
bWFudWFsU3RyZWFtLT5zZXRMb2FkTWFudWFsbHkodHJ1ZSk7CisKKyAgICBtX21hbnVhbFN0cmVh
bS0+ZGlkUmVjZWl2ZVJlc3BvbnNlKDAsIHJlc3BvbnNlKTsKK30KKwordm9pZCBQbHVnaW5WaWV3
OjpkaWRSZWNlaXZlRGF0YShjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworICAgIEFT
U0VSVChtX2xvYWRNYW51YWxseSk7CisgICAgQVNTRVJUKG1fbWFudWFsU3RyZWFtKTsKKyAgICAK
KyAgICBtX21hbnVhbFN0cmVhbS0+ZGlkUmVjZWl2ZURhdGEoMCwgZGF0YSwgbGVuZ3RoKTsKK30K
Kwordm9pZCBQbHVnaW5WaWV3OjpkaWRGaW5pc2hMb2FkaW5nKCkKK3sKKyAgICBBU1NFUlQobV9s
b2FkTWFudWFsbHkpOworICAgIEFTU0VSVChtX21hbnVhbFN0cmVhbSk7CisKKyAgICBtX21hbnVh
bFN0cmVhbS0+ZGlkRmluaXNoTG9hZGluZygwKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpkaWRG
YWlsKGNvbnN0IFJlc291cmNlRXJyb3ImIGVycm9yKQoreworICAgIEFTU0VSVChtX2xvYWRNYW51
YWxseSk7CisgICAgQVNTRVJUKG1fbWFudWFsU3RyZWFtKTsKKworICAgIG1fbWFudWFsU3RyZWFt
LT5kaWRGYWlsKDAsIGVycm9yKTsKK30KKwordm9pZCBQbHVnaW5WaWV3OjpzZXRDYWxsaW5nUGx1
Z2luKGJvb2wgYikgY29uc3QKK3sKKyAgICBpZiAoIW1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlu
cyhQbHVnaW5RdWlya0hhc01vZGFsTWVzc2FnZUxvb3ApKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoYikKKyAgICAgICAgKytzX2NhbGxpbmdQbHVnaW47CisgICAgZWxzZQorICAgICAgICAt
LXNfY2FsbGluZ1BsdWdpbjsKKworICAgIEFTU0VSVChzX2NhbGxpbmdQbHVnaW4gPj0gMCk7Cit9
CisKK2Jvb2wgUGx1Z2luVmlldzo6aXNDYWxsaW5nUGx1Z2luKCkKK3sKKyAgICByZXR1cm4gc19j
YWxsaW5nUGx1Z2luID4gMDsKK30KKworUGx1Z2luVmlldyogUGx1Z2luVmlldzo6Y3JlYXRlKEZy
YW1lKiBwYXJlbnRGcmFtZSwgY29uc3QgSW50U2l6ZSYgc2l6ZSwgRWxlbWVudCogZWxlbWVudCwg
Y29uc3QgS1VSTCYgdXJsLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGFyYW1OYW1lcywgY29uc3Qg
VmVjdG9yPFN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBib29s
IGxvYWRNYW51YWxseSkKK3sKKyAgICAvLyBpZiB3ZSBmYWlsIHRvIGZpbmQgYSBwbHVnaW4gZm9y
IHRoaXMgTUlNRSB0eXBlLCBmaW5kUGx1Z2luIHdpbGwgc2VhcmNoIGZvcgorICAgIC8vIGEgcGx1
Z2luIGJ5IHRoZSBmaWxlIGV4dGVuc2lvbiBhbmQgdXBkYXRlIHRoZSBNSU1FIHR5cGUsIHNvIHBh
c3MgYSBtdXRhYmxlIFN0cmluZworICAgIFN0cmluZyBtaW1lVHlwZUNvcHkgPSBtaW1lVHlwZTsK
KyAgICBQbHVnaW5QYWNrYWdlKiBwbHVnaW4gPSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1
Z2lucygpLT5maW5kUGx1Z2luKHVybCwgbWltZVR5cGVDb3B5KTsKKworICAgIC8vIE5vIHBsdWdp
biB3YXMgZm91bmQsIHRyeSByZWZyZXNoaW5nIHRoZSBkYXRhYmFzZSBhbmQgc2VhcmNoaW5nIGFn
YWluCisgICAgaWYgKCFwbHVnaW4gJiYgUGx1Z2luRGF0YWJhc2U6Omluc3RhbGxlZFBsdWdpbnMo
KS0+cmVmcmVzaCgpKSB7CisgICAgICAgIG1pbWVUeXBlQ29weSA9IG1pbWVUeXBlOworICAgICAg
ICBwbHVnaW4gPSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygpLT5maW5kUGx1Z2lu
KHVybCwgbWltZVR5cGVDb3B5KTsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3IFBsdWdpblZpZXco
cGFyZW50RnJhbWUsIHNpemUsIHBsdWdpbiwgZWxlbWVudCwgdXJsLCBwYXJhbU5hbWVzLCBwYXJh
bVZhbHVlcywgbWltZVR5cGVDb3B5LCBsb2FkTWFudWFsbHkpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsdWdpbnMvd2luL1BsdWdpbk1lc3NhZ2VUaHJvdHRs
ZXJXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGx1Z2lucy93aW4vUGx1Z2luTWVzc2Fn
ZVRocm90dGxlcldpbi5jcHAJKHJldmlzaW9uIDMxMDk2KQorKysgV2ViQ29yZS9wbHVnaW5zL3dp
bi9QbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsMTYz
MSArMjUsOTkgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUGx1Z2lu
Vmlldy5oIgorI2luY2x1ZGUgIlBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4uaCIKIAotI2luY2x1
ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKLSNpbmNsdWRlICJF
bGVtZW50LmgiCi0jaW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVy
LmgiCi0jaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lVHJlZS5o
IgotI2luY2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0jaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCi0jaW5jbHVkZSAiSW1hZ2UuaCIKLSNpbmNsdWRlICJIVE1MTmFt
ZXMuaCIKLSNpbmNsdWRlICJIVE1MUGx1Z0luRWxlbWVudC5oIgotI2luY2x1ZGUgIkpTRE9NV2lu
ZG93LmgiCi0jaW5jbHVkZSAiS2V5Ym9hcmRFdmVudC5oIgotI2luY2x1ZGUgIk1JTUVUeXBlUmVn
aXN0cnkuaCIKLSNpbmNsdWRlICJNb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiTm90SW1wbGVtZW50
ZWQuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCi0j
aW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGx1Z2luUGFja2FnZS5o
IgotI2luY2x1ZGUgImtqc19iaW5kaW5nLmgiCi0jaW5jbHVkZSAia2pzX3Byb3h5LmgiCi0jaW5j
bHVkZSAiUGx1Z2luRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJQbHVnaW5EZWJ1Zy5oIgotI2luY2x1
ZGUgIlBsdWdpblBhY2thZ2UuaCIKLSNpbmNsdWRlICJjX2luc3RhbmNlLmgiCi0jaW5jbHVkZSAi
bnBydW50aW1lX2ltcGwuaCIKLSNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKLSNpbmNsdWRlICJT
ZXR0aW5ncy5oIgotI2luY2x1ZGUgInJ1bnRpbWUuaCIKLSNpbmNsdWRlIDxranMvSlNMb2NrLmg+
Ci0jaW5jbHVkZSA8a2pzL3ZhbHVlLmg+CisjaW5jbHVkZSAiUGx1Z2luVmlldy5oIgogI2luY2x1
ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CiAKLXVzaW5nIEtKUzo6RXhlY1N0YXRlOwotdXNpbmcgS0pT
OjpKU0xvY2s7Ci11c2luZyBLSlM6OkpTT2JqZWN0OwotdXNpbmcgS0pTOjpKU1ZhbHVlOwotdXNp
bmcgS0pTOjpVU3RyaW5nOwotCi11c2luZyBzdGQ6Om1pbjsKLQogdXNpbmcgbmFtZXNwYWNlIFdU
RjsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi11c2luZyBuYW1lc3BhY2UgRXZlbnROYW1lczsK
LXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci0KLWNsYXNzIFBsdWdpblJlcXVlc3QgewotcHVi
bGljOgotICAgIFBsdWdpblJlcXVlc3QoY29uc3QgRnJhbWVMb2FkUmVxdWVzdCYgZnJhbWVMb2Fk
UmVxdWVzdCwgYm9vbCBzZW5kTm90aWZpY2F0aW9uLCB2b2lkKiBub3RpZnlEYXRhLCBib29sIHNo
b3VsZEFsbG93UG9wdXBzKQotICAgICAgICA6IG1fZnJhbWVMb2FkUmVxdWVzdChmcmFtZUxvYWRS
ZXF1ZXN0KQotICAgICAgICAsIG1fbm90aWZ5RGF0YShub3RpZnlEYXRhKQotICAgICAgICAsIG1f
c2VuZE5vdGlmaWNhdGlvbihzZW5kTm90aWZpY2F0aW9uKQotICAgICAgICAsIG1fc2hvdWxkQWxs
b3dQb3B1cHMoc2hvdWxkQWxsb3dQb3B1cHMpIHsgfQotcHVibGljOgotICAgIGNvbnN0IEZyYW1l
TG9hZFJlcXVlc3QmIGZyYW1lTG9hZFJlcXVlc3QoKSBjb25zdCB7IHJldHVybiBtX2ZyYW1lTG9h
ZFJlcXVlc3Q7IH0KLSAgICB2b2lkKiBub3RpZnlEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9ub3Rp
ZnlEYXRhOyB9Ci0gICAgYm9vbCBzZW5kTm90aWZpY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9z
ZW5kTm90aWZpY2F0aW9uOyB9Ci0gICAgYm9vbCBzaG91bGRBbGxvd1BvcHVwcygpIGNvbnN0IHsg
cmV0dXJuIG1fc2hvdWxkQWxsb3dQb3B1cHM7IH0KLXByaXZhdGU6Ci0gICAgRnJhbWVMb2FkUmVx
dWVzdCBtX2ZyYW1lTG9hZFJlcXVlc3Q7Ci0gICAgdm9pZCogbV9ub3RpZnlEYXRhOwotICAgIGJv
b2wgbV9zZW5kTm90aWZpY2F0aW9uOwotICAgIGJvb2wgbV9zaG91bGRBbGxvd1BvcHVwczsKLX07
Ci0KIHN0YXRpYyBjb25zdCBkb3VibGUgTWVzc2FnZVRocm90dGxlVGltZUludGVydmFsID0gMC4w
MDE7Ci1zdGF0aWMgaW50IHNfY2FsbGluZ1BsdWdpbjsKLQotY2xhc3MgUGx1Z2luTWVzc2FnZVRo
cm90dGxlcldpbiB7Ci1wdWJsaWM6Ci0gICAgUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbihQbHVn
aW5WaWV3KiBwbHVnaW5WaWV3KQotICAgICAgICA6IG1fYmFjaygwKSwgbV9mcm9udCgwKQotICAg
ICAgICAsIG1fcGx1Z2luVmlldyhwbHVnaW5WaWV3KQotICAgICAgICAsIG1fbWVzc2FnZVRocm90
dGxlVGltZXIodGhpcywgJlBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW46Om1lc3NhZ2VUaHJvdHRs
ZVRpbWVyRmlyZWQpCi0gICAgewotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmcmVlIGxpc3Qg
d2l0aCBvdXIgaW5saW5lIG1lc3NhZ2VzCi0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBOdW1JbmxpbmVNZXNzYWdlcyAtIDE7IGkrKykKLSAgICAgICAgICAgIG1faW5saW5lTWVzc2Fn
ZXNbaV0ubmV4dCA9ICZtX2lubGluZU1lc3NhZ2VzW2kgKyAxXTsKLSAgICAgICAgbV9pbmxpbmVN
ZXNzYWdlc1tOdW1JbmxpbmVNZXNzYWdlcyAtIDFdLm5leHQgPSAwOwotICAgICAgICBtX2ZyZWVJ
bmxpbmVNZXNzYWdlcyA9ICZtX2lubGluZU1lc3NhZ2VzWzBdOwotICAgIH0KLQotICAgIH5QbHVn
aW5NZXNzYWdlVGhyb3R0bGVyV2luKCkKLSAgICB7Ci0gICAgICAgIFBsdWdpbk1lc3NhZ2UqIG5l
eHQ7Ci0gICAgCi0gICAgICAgIGZvciAoUGx1Z2luTWVzc2FnZSogbWVzc2FnZSA9IG1fZnJvbnQ7
IG1lc3NhZ2U7IG1lc3NhZ2UgPSBuZXh0KSB7Ci0gICAgICAgICAgICBuZXh0ID0gbWVzc2FnZS0+
bmV4dDsKLSAgICAgICAgICAgIGZyZWVNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICB9ICAgICAg
ICAKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBhcHBlbmRNZXNzYWdlKEhXTkQgaFduZCwgVUlOVCBt
c2csIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pIAotICAgIHsKLSAgICAgICAgUGx1Z2lu
TWVzc2FnZSogbWVzc2FnZSA9IGFsbG9jYXRlTWVzc2FnZSgpOwotCi0gICAgICAgIG1lc3NhZ2Ut
PmhXbmQgPSBoV25kOwotICAgICAgICBtZXNzYWdlLT5tc2cgPSBtc2c7Ci0gICAgICAgIG1lc3Nh
Z2UtPndQYXJhbSA9IHdQYXJhbTsKLSAgICAgICAgbWVzc2FnZS0+bFBhcmFtID0gbFBhcmFtOwot
ICAgICAgICBtZXNzYWdlLT5uZXh0ID0gMDsKLQotICAgICAgICBpZiAobV9iYWNrKQotICAgICAg
ICAgICAgbV9iYWNrLT5uZXh0ID0gbWVzc2FnZTsKLSAgICAgICAgbV9iYWNrID0gbWVzc2FnZTsK
LSAgICAgICAgaWYgKCFtX2Zyb250KQotICAgICAgICAgICAgbV9mcm9udCA9IG1lc3NhZ2U7Ci0K
LSAgICAgICAgaWYgKCFtX21lc3NhZ2VUaHJvdHRsZVRpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAg
ICAgICBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyLnN0YXJ0T25lU2hvdChNZXNzYWdlVGhyb3R0bGVU
aW1lSW50ZXJ2YWwpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgUGx1Z2luTWVzc2Fn
ZSB7Ci0gICAgICAgIEhXTkQgaFduZDsKLSAgICAgICAgVUlOVCBtc2c7Ci0gICAgICAgIFdQQVJB
TSB3UGFyYW07Ci0gICAgICAgIExQQVJBTSBsUGFyYW07Ci0KLSAgICAgICAgc3RydWN0IFBsdWdp
bk1lc3NhZ2UqIG5leHQ7Ci0gICAgfTsKLSAgICAKLSAgICB2b2lkIG1lc3NhZ2VUaHJvdHRsZVRp
bWVyRmlyZWQoVGltZXI8UGx1Z2luTWVzc2FnZVRocm90dGxlcldpbj4qKQotICAgIHsKLSAgICAg
ICAgUGx1Z2luTWVzc2FnZSogbWVzc2FnZSA9IG1fZnJvbnQ7Ci0gICAgICAgIG1fZnJvbnQgPSBt
X2Zyb250LT5uZXh0OwotICAgICAgICBpZiAobWVzc2FnZSA9PSBtX2JhY2spCi0gICAgICAgICAg
ICBtX2JhY2sgPSAwOwotCi0gICAgICAgIDo6Q2FsbFdpbmRvd1Byb2MobV9wbHVnaW5WaWV3LT5w
bHVnaW5XbmRQcm9jKCksIG1lc3NhZ2UtPmhXbmQsIG1lc3NhZ2UtPm1zZywgbWVzc2FnZS0+d1Bh
cmFtLCBtZXNzYWdlLT5sUGFyYW0pOwogCi0gICAgICAgIGZyZWVNZXNzYWdlKG1lc3NhZ2UpOwot
Ci0gICAgICAgIGlmIChtX2Zyb250KQotICAgICAgICAgICAgbV9tZXNzYWdlVGhyb3R0bGVUaW1l
ci5zdGFydE9uZVNob3QoTWVzc2FnZVRocm90dGxlVGltZUludGVydmFsKTsKLSAgICB9Ci0KLSAg
ICBQbHVnaW5NZXNzYWdlKiBhbGxvY2F0ZU1lc3NhZ2UoKQotICAgIHsKLSAgICAgICAgUGx1Z2lu
TWVzc2FnZSAqbWVzc2FnZTsKLQotICAgICAgICBpZiAobV9mcmVlSW5saW5lTWVzc2FnZXMpIHsK
LSAgICAgICAgICAgIG1lc3NhZ2UgPSBtX2ZyZWVJbmxpbmVNZXNzYWdlczsKLSAgICAgICAgICAg
IG1fZnJlZUlubGluZU1lc3NhZ2VzID0gbWVzc2FnZS0+bmV4dDsKLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBtZXNzYWdlID0gbmV3IFBsdWdpbk1lc3NhZ2U7Ci0KLSAgICAgICAgcmV0dXJu
IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgYm9vbCBpc0lubGluZU1lc3NhZ2UoUGx1Z2luTWVzc2Fn
ZSogbWVzc2FnZSkgCi0gICAgewotICAgICAgICByZXR1cm4gbWVzc2FnZSA+PSAmbV9pbmxpbmVN
ZXNzYWdlc1swXSAmJiBtZXNzYWdlIDw9ICZtX2lubGluZU1lc3NhZ2VzW051bUlubGluZU1lc3Nh
Z2VzIC0gMV07Ci0gICAgfQotCi0gICAgdm9pZCBmcmVlTWVzc2FnZShQbHVnaW5NZXNzYWdlKiBt
ZXNzYWdlKSAKLSAgICB7Ci0gICAgICAgIGlmIChpc0lubGluZU1lc3NhZ2UobWVzc2FnZSkpIHsK
LSAgICAgICAgICAgIG1lc3NhZ2UtPm5leHQgPSBtX2ZyZWVJbmxpbmVNZXNzYWdlczsKLSAgICAg
ICAgICAgIG1fZnJlZUlubGluZU1lc3NhZ2VzID0gbWVzc2FnZTsKLSAgICAgICAgfSBlbHNlCi0g
ICAgICAgICAgICBkZWxldGUgbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBQbHVnaW5WaWV3KiBtX3Bs
dWdpblZpZXc7Ci0gICAgUGx1Z2luTWVzc2FnZSogbV9iYWNrOwotICAgIFBsdWdpbk1lc3NhZ2Uq
IG1fZnJvbnQ7Ci0KLSAgICBzdGF0aWMgY29uc3QgaW50IE51bUlubGluZU1lc3NhZ2VzID0gNDsK
LSAgICBQbHVnaW5NZXNzYWdlIG1faW5saW5lTWVzc2FnZXNbTnVtSW5saW5lTWVzc2FnZXNdOwot
ICAgIFBsdWdpbk1lc3NhZ2UqIG1fZnJlZUlubGluZU1lc3NhZ2VzOwotCi0gICAgVGltZXI8UGx1
Z2luTWVzc2FnZVRocm90dGxlcldpbj4gbV9tZXNzYWdlVGhyb3R0bGVUaW1lcjsKLX07Ci0KLXN0
YXRpYyBTdHJpbmcgc2NyaXB0U3RyaW5nSWZKYXZhU2NyaXB0VVJMKGNvbnN0IEtVUkwmIHVybCkK
K1BsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW46OlBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4oUGx1
Z2luVmlldyogcGx1Z2luVmlldykKKyAgICA6IG1fYmFjaygwKSwgbV9mcm9udCgwKQorICAgICwg
bV9wbHVnaW5WaWV3KHBsdWdpblZpZXcpCisgICAgLCBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyKHRo
aXMsICZQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luOjptZXNzYWdlVGhyb3R0bGVUaW1lckZpcmVk
KQogewotICAgIGlmICghdXJsLnByb3RvY29sSXMoImphdmFzY3JpcHQiKSkKLSAgICAgICAgcmV0
dXJuIFN0cmluZygpOwotCi0gICAgLy8gVGhpcyByZXR1cm5zIGFuIHVuZXNjYXBlZCBzdHJpbmcK
LSAgICByZXR1cm4gZGVjb2RlVVJMRXNjYXBlU2VxdWVuY2VzKHVybC5zdHJpbmcoKS5zdWJzdHJp
bmcoMTEpKTsKKyAgICAvLyBJbml0aWFsaXplIHRoZSBmcmVlIGxpc3Qgd2l0aCBvdXIgaW5saW5l
IG1lc3NhZ2VzCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUlubGluZU1lc3NhZ2Vz
IC0gMTsgaSsrKQorICAgICAgICBtX2lubGluZU1lc3NhZ2VzW2ldLm5leHQgPSAmbV9pbmxpbmVN
ZXNzYWdlc1tpICsgMV07CisgICAgbV9pbmxpbmVNZXNzYWdlc1tOdW1JbmxpbmVNZXNzYWdlcyAt
IDFdLm5leHQgPSAwOworICAgIG1fZnJlZUlubGluZU1lc3NhZ2VzID0gJm1faW5saW5lTWVzc2Fn
ZXNbMF07CiB9CiAKLVBsdWdpblZpZXcqIFBsdWdpblZpZXc6OnNfY3VycmVudFBsdWdpblZpZXcg
PSAwOwotCi1jb25zdCBMUENXU1RSIGtXZWJQbHVnaW5WaWV3ZG93Q2xhc3NOYW1lID0gTCJXZWJQ
bHVnaW5WaWV3IjsKLWNvbnN0IExQQ1dTVFIga1dlYlBsdWdpblZpZXdQcm9wZXJ0eSA9IEwiV2Vi
UGx1Z2luVmlld1Byb3BlcnR5IjsKLQotc3RhdGljIGNvbnN0IGNoYXIqIE1vemlsbGFVc2VyQWdl
bnQgPSAiTW96aWxsYS81LjAgKFdpbmRvd3M7IFU7IFdpbmRvd3MgTlQgNS4xOyBlbi1VUzsgcnY6
MS44LjEpIEdlY2tvLzIwMDYxMDEwIEZpcmVmb3gvMi4wIjsKLQotc3RhdGljIExSRVNVTFQgQ0FM
TEJBQ0sgUGx1Z2luVmlld1duZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3
UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotCi1zdGF0aWMgYm9vbCByZWdpc3RlclBsdWdpblZpZXco
KQorUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjo6flBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4o
KQogewotICAgIHN0YXRpYyBib29sIGhhdmVSZWdpc3RlcmVkV2luZG93Q2xhc3MgPSBmYWxzZTsK
LSAgICBpZiAoaGF2ZVJlZ2lzdGVyZWRXaW5kb3dDbGFzcykKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICBoYXZlUmVnaXN0ZXJlZFdpbmRvd0NsYXNzID0gdHJ1ZTsKLQotICAgIEFTU0VSVChQ
YWdlOjppbnN0YW5jZUhhbmRsZSgpKTsKLQotICAgIFdORENMQVNTRVggd2NleDsKLQotICAgIHdj
ZXguY2JTaXplID0gc2l6ZW9mKFdORENMQVNTRVgpOwotCi0gICAgd2NleC5zdHlsZSAgICAgICAg
ICA9IENTX0RCTENMS1M7Ci0gICAgd2NleC5scGZuV25kUHJvYyAgICA9IERlZldpbmRvd1Byb2M7
Ci0gICAgd2NleC5jYkNsc0V4dHJhICAgICA9IDA7Ci0gICAgd2NleC5jYlduZEV4dHJhICAgICA9
IDA7Ci0gICAgd2NleC5oSW5zdGFuY2UgICAgICA9IFBhZ2U6Omluc3RhbmNlSGFuZGxlKCk7Ci0g
ICAgd2NleC5oSWNvbiAgICAgICAgICA9IDA7Ci0gICAgd2NleC5oQ3Vyc29yICAgICAgICA9IExv
YWRDdXJzb3IoMCwgSURDX0FSUk9XKTsKLSAgICB3Y2V4LmhickJhY2tncm91bmQgID0gKEhCUlVT
SClDT0xPUl9XSU5ET1c7Ci0gICAgd2NleC5scHN6TWVudU5hbWUgICA9IDA7Ci0gICAgd2NleC5s
cHN6Q2xhc3NOYW1lICA9IGtXZWJQbHVnaW5WaWV3ZG93Q2xhc3NOYW1lOwotICAgIHdjZXguaElj
b25TbSAgICAgICAgPSAwOwotCi0gICAgcmV0dXJuICEhUmVnaXN0ZXJDbGFzc0V4KCZ3Y2V4KTsK
LX0KLQotc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgUGx1Z2luVmlld1duZFByb2MoSFdORCBoV25k
LCBVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgUGx1
Z2luVmlldyogcGx1Z2luVmlldyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGx1Z2luVmlldyo+KEdldFBy
b3AoaFduZCwga1dlYlBsdWdpblZpZXdQcm9wZXJ0eSkpOwotCi0gICAgcmV0dXJuIHBsdWdpblZp
ZXctPnduZFByb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotfQotCi12b2lkIFBs
dWdpblZpZXc6OnBvcFBvcHVwc1N0YXRlVGltZXJGaXJlZChUaW1lcjxQbHVnaW5WaWV3PiopCi17
Ci0gICAgcG9wUG9wdXBzRW5hYmxlZFN0YXRlKCk7Ci19Ci0KLQotc3RhdGljIGJvb2wgaXNXaW5k
b3dzTWVzc2FnZVVzZXJHZXN0dXJlKFVJTlQgbWVzc2FnZSkKLXsKLSAgICBzd2l0Y2ggKG1lc3Nh
Z2UpIHsKLSAgICAgICAgY2FzZSBXTV9MQlVUVE9OVVA6Ci0gICAgICAgIGNhc2UgV01fTUJVVFRP
TlVQOgotICAgICAgICBjYXNlIFdNX1JCVVRUT05VUDoKLSAgICAgICAgY2FzZSBXTV9LRVlVUDoK
LSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotTFJFU1VMVAotUGx1Z2luVmlldzo6d25kUHJvYyhI
V05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKLXsK
LSAgICAvLyA8cmRhcjovLzU3MTExMzY+IFNvbWV0aW1lcyBGbGFzaCB3aWxsIGNhbGwgU2V0Q2Fw
dHVyZSBiZWZvcmUgY3JlYXRpbmcKLSAgICAvLyBhIGZ1bGwtc2NyZWVuIHdpbmRvdyBhbmQgd2ls
bCBub3QgcmVsZWFzZSBpdCwgd2hpY2ggY2F1c2VzIHRoZQotICAgIC8vIGZ1bGwtc2NyZWVuIHdp
bmRvdyB0byBuZXZlciByZWNlaXZlIG1vdXNlIGV2ZW50cy4gV2Ugc2V0L3JlbGVhc2UgY2FwdHVy
ZQotICAgIC8vIG9uIG1vdXNlIGRvd24vdXAgYmVmb3JlIHNlbmRpbmcgdGhlIGV2ZW50IHRvIHRo
ZSBwbHVnLWluIHRvIHByZXZlbnQgdGhhdC4KLSAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsKLSAgICAg
ICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoKLSAgICAgICAgY2FzZSBXTV9NQlVUVE9ORE9XTjoKLSAg
ICAgICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoKLSAgICAgICAgICAgIDo6U2V0Q2FwdHVyZShoV25k
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdNX0xCVVRUT05VUDoKLSAgICAg
ICAgY2FzZSBXTV9NQlVUVE9OVVA6Ci0gICAgICAgIGNhc2UgV01fUkJVVFRPTlVQOgotICAgICAg
ICAgICAgOjpSZWxlYXNlQ2FwdHVyZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0g
ICAgaWYgKG1lc3NhZ2UgPT0gbV9sYXN0TWVzc2FnZSAmJgotICAgICAgICBtX3BsdWdpbi0+cXVp
cmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtEb250Q2FsbFduZFByb2NGb3JTYW1lTWVzc2FnZVJl
Y3Vyc2l2ZWx5KSAmJiAKLSAgICAgICAgbV9pc0NhbGxpbmdQbHVnaW5XbmRQcm9jKQotICAgICAg
ICByZXR1cm4gMTsKLQotICAgIGlmIChtZXNzYWdlID09IFdNX1VTRVIgKyAxICYmCi0gICAgICAg
IG1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlucyhQbHVnaW5RdWlya1Rocm90dGxlV01Vc2VyUGx1
c09uZU1lc3NhZ2VzKSkgewotICAgICAgICBpZiAoIW1fbWVzc2FnZVRocm90dGxlcikKLSAgICAg
ICAgICAgIG1fbWVzc2FnZVRocm90dGxlci5zZXQobmV3IFBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJX
aW4odGhpcykpOwotCi0gICAgICAgIG1fbWVzc2FnZVRocm90dGxlci0+YXBwZW5kTWVzc2FnZSho
V25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0K
LQotICAgIG1fbGFzdE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIG1faXNDYWxsaW5nUGx1Z2luV25k
UHJvYyA9IHRydWU7Ci0KLSAgICAvLyBJZiB0aGUgcGx1Zy1pbiBkb2Vzbid0IGV4cGxpY2l0bHkg
c3VwcG9ydCBjaGFuZ2luZyB0aGUgcG9wLXVwIHN0YXRlLCB3ZSBlbmFibGUKLSAgICAvLyBwb3B1
cHMgZm9yIGFsbCB1c2VyIGdlc3R1cmVzLgotICAgIC8vIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHBv
cCB0aGUgc3RhdGUgaW4gYSB0aW1lciwgYmVjYXVzZSB0aGUgRmxhc2ggcGx1Zy1pbiAKLSAgICAv
LyBwb3BzIHVwIHdpbmRvd3MgaW4gcmVzcG9uc2UgdG8gYSBwb3N0ZWQgbWVzc2FnZS4KLSAgICBp
ZiAobV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnZlcnNpb24gPCBOUFZFUlNfSEFTX1BPUFVQU19F
TkFCTEVEX1NUQVRFICYmCi0gICAgICAgIGlzV2luZG93c01lc3NhZ2VVc2VyR2VzdHVyZShtZXNz
YWdlKSAmJiAhbV9wb3BQb3B1cHNTdGF0ZVRpbWVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgCi0g
ICAgICAgIHB1c2hQb3B1cHNFbmFibGVkU3RhdGUodHJ1ZSk7Ci0KLSAgICAgICAgbV9wb3BQb3B1
cHNTdGF0ZVRpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLSAgICB9Ci0KLSAgICAvLyBDYWxsIHRoZSBw
bHVnLWluJ3Mgd2luZG93IHByb2MuCi0gICAgTFJFU1VMVCByZXN1bHQgPSA6OkNhbGxXaW5kb3dQ
cm9jKG1fcGx1Z2luV25kUHJvYywgaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwotCi0g
ICAgbV9pc0NhbGxpbmdQbHVnaW5XbmRQcm9jID0gZmFsc2U7Ci0KLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi12b2lkIFBsdWdpblZpZXc6OnVwZGF0ZVdpbmRvdygpIGNvbnN0Ci17Ci0gICAgaWYg
KCFwYXJlbnQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKHBhcmVudCgpLT5pc0Zy
YW1lVmlldygpKTsKLSAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1l
Vmlldyo+KHBhcmVudCgpKTsKLQotICAgIEludFJlY3Qgb2xkV2luZG93UmVjdCA9IG1fd2luZG93
UmVjdDsKLSAgICBJbnRSZWN0IG9sZENsaXBSZWN0ID0gbV9jbGlwUmVjdDsKLQotICAgIG1fd2lu
ZG93UmVjdCA9IEludFJlY3QoZnJhbWVWaWV3LT5jb250ZW50c1RvV2luZG93KGZyYW1lR2VvbWV0
cnkoKS5sb2NhdGlvbigpKSwgZnJhbWVHZW9tZXRyeSgpLnNpemUoKSk7Ci0gICAgbV9jbGlwUmVj
dCA9IHdpbmRvd0NsaXBSZWN0KCk7Ci0gICAgbV9jbGlwUmVjdC5tb3ZlKC1tX3dpbmRvd1JlY3Qu
eCgpLCAtbV93aW5kb3dSZWN0LnkoKSk7CisgICAgUGx1Z2luTWVzc2FnZSogbmV4dDsKIAotICAg
IGlmIChtX3dpbmRvdyAmJiAobV93aW5kb3dSZWN0ICE9IG9sZFdpbmRvd1JlY3QgfHwgbV9jbGlw
UmVjdCAhPSBvbGRDbGlwUmVjdCkpIHsKLSAgICAgICAgSFJHTiByZ247Ci0KLSAgICAgICAgc2V0
Q2FsbGluZ1BsdWdpbih0cnVlKTsKLQotICAgICAgICAvLyBUbyBwcmV2ZW50IGZsYXNoZXMgd2hp
bGUgc2Nyb2xsaW5nLCB3ZSBkaXNhYmxlIGRyYXdpbmcgZHVyaW5nIHRoZSB3aW5kb3cKLSAgICAg
ICAgLy8gdXBkYXRlIHByb2Nlc3MgYnkgY2xpcHBpbmcgdGhlIHdpbmRvdyB0byB0aGUgemVybyBy
ZWN0LgotCi0gICAgICAgIGJvb2wgY2xpcFRvWmVyb1JlY3QgPSAhbV9wbHVnaW4tPnF1aXJrcygp
LmNvbnRhaW5zKFBsdWdpblF1aXJrRG9udENsaXBUb1plcm9SZWN0V2hlblNjcm9sbGluZyk7Ci0K
LSAgICAgICAgaWYgKGNsaXBUb1plcm9SZWN0KSB7Ci0gICAgICAgICAgICByZ24gPSA6OkNyZWF0
ZVJlY3RSZ24oMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICA6OlNldFdpbmRvd1JnbihtX3dpbmRv
dywgcmduLCBGQUxTRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZ24gPSA6OkNy
ZWF0ZVJlY3RSZ24obV9jbGlwUmVjdC54KCksIG1fY2xpcFJlY3QueSgpLCBtX2NsaXBSZWN0LnJp
Z2h0KCksIG1fY2xpcFJlY3QuYm90dG9tKCkpOwotICAgICAgICAgICAgOjpTZXRXaW5kb3dSZ24o
bV93aW5kb3csIHJnbiwgVFJVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV93aW5kb3dS
ZWN0ICE9IG9sZFdpbmRvd1JlY3QpCi0gICAgICAgICAgICA6Ok1vdmVXaW5kb3cobV93aW5kb3cs
IG1fd2luZG93UmVjdC54KCksIG1fd2luZG93UmVjdC55KCksIG1fd2luZG93UmVjdC53aWR0aCgp
LCBtX3dpbmRvd1JlY3QuaGVpZ2h0KCksIFRSVUUpOwotCi0gICAgICAgIGlmIChjbGlwVG9aZXJv
UmVjdCkgewotICAgICAgICAgICAgcmduID0gOjpDcmVhdGVSZWN0UmduKG1fY2xpcFJlY3QueCgp
LCBtX2NsaXBSZWN0LnkoKSwgbV9jbGlwUmVjdC5yaWdodCgpLCBtX2NsaXBSZWN0LmJvdHRvbSgp
KTsKLSAgICAgICAgICAgIDo6U2V0V2luZG93UmduKG1fd2luZG93LCByZ24sIFRSVUUpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Ci0gICAgfQorICAgIGZv
ciAoUGx1Z2luTWVzc2FnZSogbWVzc2FnZSA9IG1fZnJvbnQ7IG1lc3NhZ2U7IG1lc3NhZ2UgPSBu
ZXh0KSB7CisgICAgICAgIG5leHQgPSBtZXNzYWdlLT5uZXh0OworICAgICAgICBmcmVlTWVzc2Fn
ZShtZXNzYWdlKTsKKyAgICB9ICAgICAgICAKIH0KLQotSW50UmVjdCBQbHVnaW5WaWV3Ojp3aW5k
b3dDbGlwUmVjdCgpIGNvbnN0Ci17Ci0gICAgLy8gU3RhcnQgYnkgY2xpcHBpbmcgdG8gb3VyIGJv
dW5kcy4KLSAgICBJbnRSZWN0IGNsaXBSZWN0KG1fd2luZG93UmVjdCk7CiAgICAgCi0gICAgLy8g
VGFrZSBvdXIgZWxlbWVudCBhbmQgZ2V0IHRoZSBjbGlwIHJlY3QgZnJvbSB0aGUgZW5jbG9zaW5n
IGxheWVyIGFuZCBmcmFtZSB2aWV3LgotICAgIFJlbmRlckxheWVyKiBsYXllciA9IG1fZWxlbWVu
dC0+cmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKTsKLSAgICBGcmFtZVZpZXcqIHBhcmVudFZp
ZXcgPSBtX2VsZW1lbnQtPmRvY3VtZW50KCktPnZpZXcoKTsKLSAgICBjbGlwUmVjdC5pbnRlcnNl
Y3QocGFyZW50Vmlldy0+d2luZG93Q2xpcFJlY3RGb3JMYXllcihsYXllciwgdHJ1ZSkpOwotCi0g
ICAgcmV0dXJuIGNsaXBSZWN0OwotfQotCi12b2lkIFBsdWdpblZpZXc6OnNldEZyYW1lR2VvbWV0
cnkoY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAobV9lbGVtZW50LT5kb2N1bWVudCgp
LT5wcmludGluZygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAocmVjdCAhPSBmcmFtZUdl
b21ldHJ5KCkpCi0gICAgICAgIFdpZGdldDo6c2V0RnJhbWVHZW9tZXRyeShyZWN0KTsKLQotICAg
IHVwZGF0ZVdpbmRvdygpOwotICAgIHNldE5QV2luZG93UmVjdChyZWN0KTsKLX0KLQotdm9pZCBQ
bHVnaW5WaWV3OjpnZW9tZXRyeUNoYW5nZWQoKSBjb25zdAordm9pZCBQbHVnaW5NZXNzYWdlVGhy
b3R0bGVyV2luOjphcHBlbmRNZXNzYWdlKEhXTkQgaFduZCwgVUlOVCBtc2csIFdQQVJBTSB3UGFy
YW0sIExQQVJBTSBsUGFyYW0pIAogewotICAgIHVwZGF0ZVdpbmRvdygpOwotfQotCi12b2lkIFBs
dWdpblZpZXc6OnNldEZvY3VzKCkKLXsKLSAgICBpZiAobV93aW5kb3cpCi0gICAgICAgIFNldEZv
Y3VzKG1fd2luZG93KTsKLQotICAgIFdpZGdldDo6c2V0Rm9jdXMoKTsKLX0KLQotdm9pZCBQbHVn
aW5WaWV3OjpzaG93KCkKLXsKLSAgICBtX2lzVmlzaWJsZSA9IHRydWU7Ci0KLSAgICBpZiAobV9h
dHRhY2hlZFRvV2luZG93ICYmIG1fd2luZG93KQotICAgICAgICBTaG93V2luZG93KG1fd2luZG93
LCBTV19TSE9XTkEpOwotCi0gICAgV2lkZ2V0OjpzaG93KCk7Ci19Ci0KLXZvaWQgUGx1Z2luVmll
dzo6aGlkZSgpCi17Ci0gICAgbV9pc1Zpc2libGUgPSBmYWxzZTsKLQotICAgIGlmIChtX2F0dGFj
aGVkVG9XaW5kb3cgJiYgbV93aW5kb3cpCi0gICAgICAgIFNob3dXaW5kb3cobV93aW5kb3csIFNX
X0hJREUpOwotCi0gICAgV2lkZ2V0OjpoaWRlKCk7Ci19Ci0KLXZvaWQgUGx1Z2luVmlldzo6cGFp
bnRNaXNzaW5nUGx1Z2luSWNvbihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJl
Y3QmIHJlY3QpCi17Ci0gICAgc3RhdGljIEltYWdlKiBudWxsUGx1Z2luSW1hZ2U7Ci0gICAgaWYg
KCFudWxsUGx1Z2luSW1hZ2UpCi0gICAgICAgIG51bGxQbHVnaW5JbWFnZSA9IEltYWdlOjpsb2Fk
UGxhdGZvcm1SZXNvdXJjZSgibnVsbFBsdWdpbiIpOwotCi0gICAgSW50UmVjdCBpbWFnZVJlY3Qo
ZnJhbWVHZW9tZXRyeSgpLngoKSwgZnJhbWVHZW9tZXRyeSgpLnkoKSwgbnVsbFBsdWdpbkltYWdl
LT53aWR0aCgpLCBudWxsUGx1Z2luSW1hZ2UtPmhlaWdodCgpKTsKLQotICAgIGludCB4T2Zmc2V0
ID0gKGZyYW1lR2VvbWV0cnkoKS53aWR0aCgpIC0gaW1hZ2VSZWN0LndpZHRoKCkpIC8gMjsKLSAg
ICBpbnQgeU9mZnNldCA9IChmcmFtZUdlb21ldHJ5KCkuaGVpZ2h0KCkgLSBpbWFnZVJlY3QuaGVp
Z2h0KCkpIC8gMjsKLQotICAgIGltYWdlUmVjdC5tb3ZlKHhPZmZzZXQsIHlPZmZzZXQpOwotCi0g
ICAgaWYgKCFyZWN0LmludGVyc2VjdHMoaW1hZ2VSZWN0KSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgY29udGV4dC0+c2F2ZSgpOwotICAgIGNvbnRleHQtPmNsaXAod2luZG93Q2xpcFJlY3QoKSk7
Ci0gICAgY29udGV4dC0+ZHJhd0ltYWdlKG51bGxQbHVnaW5JbWFnZSwgaW1hZ2VSZWN0LmxvY2F0
aW9uKCkpOwotICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKLX0KLQotYm9vbCBQbHVnaW5WaWV3Ojpk
aXNwYXRjaE5QRXZlbnQoTlBFdmVudCYgbnBFdmVudCkKLXsKLSAgICBpZiAoIW1fcGx1Z2luLT5w
bHVnaW5GdW5jcygpLT5ldmVudCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBib29sIHNo
b3VsZFBvcCA9IGZhbHNlOwotCi0gICAgaWYgKG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT52ZXJz
aW9uIDwgTlBWRVJTX0hBU19QT1BVUFNfRU5BQkxFRF9TVEFURSAmJiBpc1dpbmRvd3NNZXNzYWdl
VXNlckdlc3R1cmUobnBFdmVudC5ldmVudCkpIHsKLSAgICAgICAgcHVzaFBvcHVwc0VuYWJsZWRT
dGF0ZSh0cnVlKTsKLSAgICAgICAgc2hvdWxkUG9wID0gdHJ1ZTsKLSAgICB9CisgICAgUGx1Z2lu
TWVzc2FnZSogbWVzc2FnZSA9IGFsbG9jYXRlTWVzc2FnZSgpOwogCi0gICAgS0pTOjpKU0xvY2s6
OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsK
LSAgICBib29sIHJlc3VsdCA9IG1fcGx1Z2luLT5wbHVnaW5GdW5jcygpLT5ldmVudChtX2luc3Rh
bmNlLCAmbnBFdmVudCk7Ci0gICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7CisgICAgbWVzc2Fn
ZS0+aFduZCA9IGhXbmQ7CisgICAgbWVzc2FnZS0+bXNnID0gbXNnOworICAgIG1lc3NhZ2UtPndQ
YXJhbSA9IHdQYXJhbTsKKyAgICBtZXNzYWdlLT5sUGFyYW0gPSBsUGFyYW07CisgICAgbWVzc2Fn
ZS0+bmV4dCA9IDA7CiAKLSAgICBpZiAoc2hvdWxkUG9wKSAKLSAgICAgICAgcG9wUG9wdXBzRW5h
YmxlZFN0YXRlKCk7CisgICAgaWYgKG1fYmFjaykKKyAgICAgICAgbV9iYWNrLT5uZXh0ID0gbWVz
c2FnZTsKKyAgICBtX2JhY2sgPSBtZXNzYWdlOworICAgIGlmICghbV9mcm9udCkKKyAgICAgICAg
bV9mcm9udCA9IG1lc3NhZ2U7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGlmICghbV9tZXNz
YWdlVGhyb3R0bGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX21lc3NhZ2VUaHJvdHRsZVRp
bWVyLnN0YXJ0T25lU2hvdChNZXNzYWdlVGhyb3R0bGVUaW1lSW50ZXJ2YWwpOwogfQogCi12b2lk
IFBsdWdpblZpZXc6OnBhaW50KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVj
dCYgcmVjdCkKK3ZvaWQgUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjo6bWVzc2FnZVRocm90dGxl
VGltZXJGaXJlZChUaW1lcjxQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luPiopCiB7Ci0gICAgaWYg
KCFtX2lzU3RhcnRlZCkgewotICAgICAgICAvLyBEcmF3IHRoZSAibWlzc2luZyBwbHVnaW4iIGlt
YWdlCi0gICAgICAgIHBhaW50TWlzc2luZ1BsdWdpbkljb24oY29udGV4dCwgcmVjdCk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobV9pc1dpbmRvd2VkIHx8IGNvbnRleHQtPnBh
aW50aW5nRGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNTRVJUKHBhcmVudCgp
LT5pc0ZyYW1lVmlldygpKTsKLSAgICBJbnRSZWN0IHJlY3RJbldpbmRvdyA9IHN0YXRpY19jYXN0
PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZUdlb21ldHJ5KCkp
OwotICAgIEhEQyBoZGMgPSBjb250ZXh0LT5nZXRXaW5kb3dzQ29udGV4dChyZWN0SW5XaW5kb3cs
IG1faXNUcmFuc3BhcmVudCk7Ci0gICAgTlBFdmVudCBucEV2ZW50OwotCi0gICAgaWYgKCFjb250
ZXh0LT5pblRyYW5zcGFyZW5jeUxheWVyKCkpIHsKLSAgICAgICAgLy8gVGhlIHBsdWdpbiBleHBl
Y3RzIHRoYXQgdGhlIHBhc3NlZCBpbiBEQyBoYXMgd2luZG93IGNvb3JkaW5hdGVzLgotICAgICAg
ICBYRk9STSB0cmFuc2Zvcm07Ci0gICAgICAgIEdldFdvcmxkVHJhbnNmb3JtKGhkYywgJnRyYW5z
Zm9ybSk7Ci0gICAgICAgIHRyYW5zZm9ybS5lRHggPSAwOwotICAgICAgICB0cmFuc2Zvcm0uZUR5
ID0gMDsKLSAgICAgICAgU2V0V29ybGRUcmFuc2Zvcm0oaGRjLCAmdHJhbnNmb3JtKTsKLSAgICB9
CisgICAgUGx1Z2luTWVzc2FnZSogbWVzc2FnZSA9IG1fZnJvbnQ7CisgICAgbV9mcm9udCA9IG1f
ZnJvbnQtPm5leHQ7CisgICAgaWYgKG1lc3NhZ2UgPT0gbV9iYWNrKQorICAgICAgICBtX2JhY2sg
PSAwOwogCi0gICAgbV9ucFdpbmRvdy50eXBlID0gTlBXaW5kb3dUeXBlRHJhd2FibGU7Ci0gICAg
bV9ucFdpbmRvdy53aW5kb3cgPSBoZGM7CisgICAgOjpDYWxsV2luZG93UHJvYyhtX3BsdWdpblZp
ZXctPnBsdWdpblduZFByb2MoKSwgbWVzc2FnZS0+aFduZCwgbWVzc2FnZS0+bXNnLCBtZXNzYWdl
LT53UGFyYW0sIG1lc3NhZ2UtPmxQYXJhbSk7CiAKLSAgICBJbnRQb2ludCBwID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5jb250ZW50c1RvV2luZG93KGZyYW1lR2VvbWV0cnko
KS5sb2NhdGlvbigpKTsKLSAgICAKLSAgICBXSU5ET1dQT1Mgd2luZG93cG9zOwotICAgIG1lbXNl
dCgmd2luZG93cG9zLCAwLCBzaXplb2Yod2luZG93cG9zKSk7Ci0KLSAgICB3aW5kb3dwb3MueCA9
IHAueCgpOwotICAgIHdpbmRvd3Bvcy55ID0gcC55KCk7Ci0gICAgd2luZG93cG9zLmN4ID0gZnJh
bWVHZW9tZXRyeSgpLndpZHRoKCk7Ci0gICAgd2luZG93cG9zLmN5ID0gZnJhbWVHZW9tZXRyeSgp
LmhlaWdodCgpOwotCi0gICAgbnBFdmVudC5ldmVudCA9IFdNX1dJTkRPV1BPU0NIQU5HRUQ7Ci0g
ICAgbnBFdmVudC5sUGFyYW0gPSByZWludGVycHJldF9jYXN0PHVpbnQzMj4oJndpbmRvd3Bvcyk7
Ci0gICAgbnBFdmVudC53UGFyYW0gPSAwOwotCi0gICAgZGlzcGF0Y2hOUEV2ZW50KG5wRXZlbnQp
OwotCi0gICAgc2V0TlBXaW5kb3dSZWN0KGZyYW1lR2VvbWV0cnkoKSk7Ci0KLSAgICBucEV2ZW50
LmV2ZW50ID0gV01fUEFJTlQ7Ci0gICAgbnBFdmVudC53UGFyYW0gPSByZWludGVycHJldF9jYXN0
PHVpbnQzMj4oaGRjKTsKKyAgICBmcmVlTWVzc2FnZShtZXNzYWdlKTsKIAotICAgIC8vIFRoaXMg
aXMgc3VwcG9zZWQgdG8gYmUgYSBwb2ludGVyIHRvIHRoZSBkaXJ0eSByZWN0LCBidXQgaXQgc2Vl
bXMgdGhhdCB0aGUgRmxhc2ggcGx1Z2luCi0gICAgLy8gaWdub3JlcyBpdCBzbyB3ZSBqdXN0IHBh
c3MgbnVsbC4KLSAgICBucEV2ZW50LmxQYXJhbSA9IDA7Ci0KLSAgICBkaXNwYXRjaE5QRXZlbnQo
bnBFdmVudCk7Ci0KLSAgICBjb250ZXh0LT5yZWxlYXNlV2luZG93c0NvbnRleHQoaGRjLCBmcmFt
ZUdlb21ldHJ5KCksIG1faXNUcmFuc3BhcmVudCk7CisgICAgaWYgKG1fZnJvbnQpCisgICAgICAg
IG1fbWVzc2FnZVRocm90dGxlVGltZXIuc3RhcnRPbmVTaG90KE1lc3NhZ2VUaHJvdHRsZVRpbWVJ
bnRlcnZhbCk7CiB9CiAKLXZvaWQgUGx1Z2luVmlldzo6aGFuZGxlS2V5Ym9hcmRFdmVudChLZXli
b2FyZEV2ZW50KiBldmVudCkKK1BsdWdpbk1lc3NhZ2UqIFBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJX
aW46OmFsbG9jYXRlTWVzc2FnZSgpCiB7Ci0gICAgTlBFdmVudCBucEV2ZW50OwotCi0gICAgbnBF
dmVudC53UGFyYW0gPSBldmVudC0+a2V5Q29kZSgpOyAgICAKLQotICAgIGlmIChldmVudC0+dHlw
ZSgpID09IGtleWRvd25FdmVudCkgewotICAgICAgICBucEV2ZW50LmV2ZW50ID0gV01fS0VZRE9X
TjsKLSAgICAgICAgbnBFdmVudC5sUGFyYW0gPSAwOwotICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5
cGUoKSA9PSBrZXl1cEV2ZW50KSB7Ci0gICAgICAgIG5wRXZlbnQuZXZlbnQgPSBXTV9LRVlVUDsK
LSAgICAgICAgbnBFdmVudC5sUGFyYW0gPSAweDgwMDA7Ci0gICAgfQotCi0gICAgS0pTOjpKU0xv
Y2s6OkRyb3BBbGxMb2NrczsKLSAgICBpZiAoIWRpc3BhdGNoTlBFdmVudChucEV2ZW50KSkKLSAg
ICAgICAgZXZlbnQtPnNldERlZmF1bHRIYW5kbGVkKCk7Ci19Ci0KLWV4dGVybiBIQ1VSU09SIGxh
c3RTZXRDdXJzb3I7Ci1leHRlcm4gYm9vbCBpZ25vcmVOZXh0U2V0Q3Vyc29yOworICAgIFBsdWdp
bk1lc3NhZ2UgKm1lc3NhZ2U7CiAKLXZvaWQgUGx1Z2luVmlldzo6aGFuZGxlTW91c2VFdmVudChN
b3VzZUV2ZW50KiBldmVudCkKLXsKLSAgICBOUEV2ZW50IG5wRXZlbnQ7Ci0KLSAgICBJbnRQb2lu
dCBwID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5jb250ZW50c1RvV2luZG93
KEludFBvaW50KGV2ZW50LT5wYWdlWCgpLCBldmVudC0+cGFnZVkoKSkpOwotCi0gICAgbnBFdmVu
dC5sUGFyYW0gPSBNQUtFTFBBUkFNKHAueCgpLCBwLnkoKSk7Ci0gICAgbnBFdmVudC53UGFyYW0g
PSAwOwotCi0gICAgaWYgKGV2ZW50LT5jdHJsS2V5KCkpCi0gICAgICAgIG5wRXZlbnQud1BhcmFt
IHw9IE1LX0NPTlRST0w7Ci0gICAgaWYgKGV2ZW50LT5zaGlmdEtleSgpKQotICAgICAgICBucEV2
ZW50LndQYXJhbSB8PSBNS19TSElGVDsKLQotICAgIGlmIChldmVudC0+dHlwZSgpID09IG1vdXNl
bW92ZUV2ZW50IHx8Ci0gICAgICAgIGV2ZW50LT50eXBlKCkgPT0gbW91c2VvdXRFdmVudCB8fCAK
LSAgICAgICAgZXZlbnQtPnR5cGUoKSA9PSBtb3VzZW92ZXJFdmVudCkgewotICAgICAgICBucEV2
ZW50LmV2ZW50ID0gV01fTU9VU0VNT1ZFOwotICAgICAgICBpZiAoZXZlbnQtPmJ1dHRvbkRvd24o
KSkKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQtPmJ1dHRvbigpKSB7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBMZWZ0QnV0dG9uOgotICAgICAgICAgICAgICAgICAgICBucEV2ZW50LndQYXJhbSB8
PSBNS19MQlVUVE9OOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg
ICBjYXNlIE1pZGRsZUJ1dHRvbjoKLSAgICAgICAgICAgICAgICAgICAgbnBFdmVudC53UGFyYW0g
fD0gTUtfTUJVVFRPTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAg
ICAgY2FzZSBSaWdodEJ1dHRvbjoKLSAgICAgICAgICAgICAgICAgICAgbnBFdmVudC53UGFyYW0g
fD0gTUtfUkJVVFRPTjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAg
ICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBtb3VzZWRvd25FdmVudCkgewotICAg
ICAgICAvLyBGb2N1cyB0aGUgcGx1Z2luCi0gICAgICAgIGlmIChQYWdlKiBwYWdlID0gbV9wYXJl
bnRGcmFtZS0+cGFnZSgpKQotICAgICAgICAgICAgcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPnNl
dEZvY3VzZWRGcmFtZShtX3BhcmVudEZyYW1lKTsKLSAgICAgICAgbV9wYXJlbnRGcmFtZS0+ZG9j
dW1lbnQoKS0+c2V0Rm9jdXNlZE5vZGUobV9lbGVtZW50KTsKLSAgICAgICAgc3dpdGNoIChldmVu
dC0+YnV0dG9uKCkpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBucEV2
ZW50LmV2ZW50ID0gV01fTEJVVFRPTkRPV047Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgbnBFdmVudC5ldmVudCA9IFdNX01CVVRU
T05ET1dOOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOgotICAg
ICAgICAgICAgICAgIG5wRXZlbnQuZXZlbnQgPSBXTV9SQlVUVE9ORE9XTjsKLSAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZXZlbnQtPnR5cGUoKSA9PSBt
b3VzZXVwRXZlbnQpIHsKLSAgICAgICAgc3dpdGNoIChldmVudC0+YnV0dG9uKCkpIHsKLSAgICAg
ICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBucEV2ZW50LmV2ZW50ID0gV01fTEJVVFRP
TlVQOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAg
ICAgICAgICAgIG5wRXZlbnQuZXZlbnQgPSBXTV9NQlVUVE9OVVA7Ci0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgbnBFdmVudC5ldmVu
dCA9IFdNX1JCVVRUT05VUDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAg
IGlmIChtX2ZyZWVJbmxpbmVNZXNzYWdlcykgeworICAgICAgICBtZXNzYWdlID0gbV9mcmVlSW5s
aW5lTWVzc2FnZXM7CisgICAgICAgIG1fZnJlZUlubGluZU1lc3NhZ2VzID0gbWVzc2FnZS0+bmV4
dDsKICAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuOwotCi0gICAgSENVUlNPUiBjdXJyZW50Q3Vy
c29yID0gOjpHZXRDdXJzb3IoKTsKLQotICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3M7Ci0g
ICAgaWYgKCFkaXNwYXRjaE5QRXZlbnQobnBFdmVudCkpCi0gICAgICAgIGV2ZW50LT5zZXREZWZh
dWx0SGFuZGxlZCgpOwotCi0gICAgLy8gQ3VycmVudGx5LCBXaWRnZXQ6OnNldEN1cnNvciBpcyBh
bHdheXMgY2FsbGVkIGFmdGVyIHRoaXMgZnVuY3Rpb24gaW4gRXZlbnRIYW5kbGVyLmNwcAotICAg
IC8vIGFuZCBzaW5jZSB3ZSBkb24ndCB3YW50IHRoYXQgd2Ugc2V0IGlnbm9yZU5leHRTZXRDdXJz
b3IgdG8gdHJ1ZSBoZXJlIHRvIHByZXZlbnQgdGhhdC4KLSAgICBpZ25vcmVOZXh0U2V0Q3Vyc29y
ID0gdHJ1ZTsgICAgIAotICAgIGxhc3RTZXRDdXJzb3IgPSA6OkdldEN1cnNvcigpOwotfQotCi12
b2lkIFBsdWdpblZpZXc6OmhhbmRsZUV2ZW50KEV2ZW50KiBldmVudCkKLXsKLSAgICBpZiAoIW1f
cGx1Z2luIHx8IG1faXNXaW5kb3dlZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGV2ZW50
LT5pc01vdXNlRXZlbnQoKSkKLSAgICAgICAgaGFuZGxlTW91c2VFdmVudChzdGF0aWNfY2FzdDxN
b3VzZUV2ZW50Kj4oZXZlbnQpKTsKLSAgICBlbHNlIGlmIChldmVudC0+aXNLZXlib2FyZEV2ZW50
KCkpCi0gICAgICAgIGhhbmRsZUtleWJvYXJkRXZlbnQoc3RhdGljX2Nhc3Q8S2V5Ym9hcmRFdmVu
dCo+KGV2ZW50KSk7Ci19Ci0KLXZvaWQgUGx1Z2luVmlldzo6c2V0UGFyZW50KFNjcm9sbFZpZXcq
IHBhcmVudCkKLXsKLSAgICBXaWRnZXQ6OnNldFBhcmVudChwYXJlbnQpOwotCi0gICAgaWYgKHBh
cmVudCkKLSAgICAgICAgaW5pdCgpOwotICAgIGVsc2UgewotICAgICAgICBpZiAoIW1fd2luZG93
KQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIElmIHRoZSBwbHVnLWluIHdpbmRv
dyBvciBvbmUgb2YgaXRzIGNoaWxkcmVuIGhhdmUgdGhlIGZvY3VzLCB3ZSBuZWVkIHRvIAotICAg
ICAgICAvLyBjbGVhciBpdCB0byBwcmV2ZW50IHRoZSB3ZWIgdmlldyB3aW5kb3cgZnJvbSBiZWlu
ZyBmb2N1c2VkIGJlY2F1c2UgdGhhdCBjYW4KLSAgICAgICAgLy8gdHJpZ2dlciBhIGxheW91dCB3
aGlsZSB0aGUgcGx1Z2luIGVsZW1lbnQgaXMgYmVpbmcgZGV0YWNoZWQuCi0gICAgICAgIEhXTkQg
Zm9jdXNlZFdpbmRvdyA9IDo6R2V0Rm9jdXMoKTsKLSAgICAgICAgaWYgKG1fd2luZG93ID09IGZv
Y3VzZWRXaW5kb3cgfHwgOjpJc0NoaWxkKG1fd2luZG93LCBmb2N1c2VkV2luZG93KSkKLSAgICAg
ICAgICAgIDo6U2V0Rm9jdXMoMCk7Ci0gICAgfQotCi19Ci0KLXZvaWQgUGx1Z2luVmlldzo6YXR0
YWNoVG9XaW5kb3coKQotewotICAgIGlmIChtX2F0dGFjaGVkVG9XaW5kb3cpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIG1fYXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgaWYgKG1faXNWaXNp
YmxlICYmIG1fd2luZG93KQotICAgICAgICBTaG93V2luZG93KG1fd2luZG93LCBTV19TSE9XTkEp
OwotfQotCi12b2lkIFBsdWdpblZpZXc6OmRldGFjaEZyb21XaW5kb3coKQotewotICAgIGlmICgh
bV9hdHRhY2hlZFRvV2luZG93KQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9pc1Zpc2li
bGUgJiYgbV93aW5kb3cpCi0gICAgICAgIFNob3dXaW5kb3cobV93aW5kb3csIFNXX0hJREUpOwot
ICAgIG1fYXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotfQotCi12b2lkIFBsdWdpblZpZXc6OnNl
dE5QV2luZG93UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmICghbV9pc1N0YXJ0
ZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEludFBvaW50IHAgPSBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPihwYXJlbnQoKSktPmNvbnRlbnRzVG9XaW5kb3cocmVjdC5sb2NhdGlvbigpKTsKLSAg
ICBtX25wV2luZG93LnggPSBwLngoKTsKLSAgICBtX25wV2luZG93LnkgPSBwLnkoKTsKLQotICAg
IG1fbnBXaW5kb3cud2lkdGggPSByZWN0LndpZHRoKCk7Ci0gICAgbV9ucFdpbmRvdy5oZWlnaHQg
PSByZWN0LmhlaWdodCgpOwotCi0gICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5sZWZ0ID0gMDsKLSAg
ICBtX25wV2luZG93LmNsaXBSZWN0LnRvcCA9IDA7Ci0gICAgbV9ucFdpbmRvdy5jbGlwUmVjdC5y
aWdodCA9IHJlY3Qud2lkdGgoKTsKLSAgICBtX25wV2luZG93LmNsaXBSZWN0LmJvdHRvbSA9IHJl
Y3QuaGVpZ2h0KCk7Ci0KLSAgICBpZiAobV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPnNldHdpbmRv
dykgewotICAgICAgICBLSlM6OkpTTG9jazo6RHJvcEFsbExvY2tzIGRyb3BBbGxMb2NrczsKLSAg
ICAgICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsKLSAgICAgICAgbV9wbHVnaW4tPnBsdWdpbkZ1
bmNzKCktPnNldHdpbmRvdyhtX2luc3RhbmNlLCAmbV9ucFdpbmRvdyk7Ci0gICAgICAgIHNldENh
bGxpbmdQbHVnaW4oZmFsc2UpOwotCi0gICAgICAgIGlmICghbV9pc1dpbmRvd2VkKQotICAgICAg
ICAgICAgcmV0dXJuOwotCi0gICAgICAgIEFTU0VSVChtX3dpbmRvdyk7Ci0KLSAgICAgICAgV05E
UFJPQyBjdXJyZW50V25kUHJvYyA9IChXTkRQUk9DKUdldFdpbmRvd0xvbmdQdHIobV93aW5kb3cs
IEdXTFBfV05EUFJPQyk7Ci0gICAgICAgIGlmIChjdXJyZW50V25kUHJvYyAhPSBQbHVnaW5WaWV3
V25kUHJvYykKLSAgICAgICAgICAgIG1fcGx1Z2luV25kUHJvYyA9IChXTkRQUk9DKVNldFdpbmRv
d0xvbmdQdHIobV93aW5kb3csIEdXTFBfV05EUFJPQywgKExPTkcpUGx1Z2luVmlld1duZFByb2Mp
OwotICAgIH0KLX0KLQotYm9vbCBQbHVnaW5WaWV3OjpzdGFydCgpCi17Ci0gICAgaWYgKG1faXNT
dGFydGVkKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBBU1NFUlQobV9wbHVnaW4pOwot
ICAgIEFTU0VSVChtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+bmV3cCk7Ci0KLSAgICBOUEVycm9y
IG5wRXJyOwotICAgIFBsdWdpblZpZXc6OnNldEN1cnJlbnRQbHVnaW5WaWV3KHRoaXMpOwotICAg
IHsKLSAgICAgICAgS0pTOjpKU0xvY2s6OkRyb3BBbGxMb2NrcyBkcm9wQWxsTG9ja3M7Ci0gICAg
ICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7Ci0gICAgICAgIG5wRXJyID0gbV9wbHVnaW4tPnBs
dWdpbkZ1bmNzKCktPm5ld3AoKE5QTUlNRVR5cGUpbV9taW1lVHlwZS5kYXRhKCksIG1faW5zdGFu
Y2UsIG1fbW9kZSwgbV9wYXJhbUNvdW50LCBtX3BhcmFtTmFtZXMsIG1fcGFyYW1WYWx1ZXMsIE5V
TEwpOwotICAgICAgICBzZXRDYWxsaW5nUGx1Z2luKGZhbHNlKTsKLSAgICAgICAgTE9HX05QRVJS
T1IobnBFcnIpOwotICAgIH0KLSAgICBQbHVnaW5WaWV3OjpzZXRDdXJyZW50UGx1Z2luVmlldygw
KTsKLQotICAgIGlmIChucEVyciAhPSBOUEVSUl9OT19FUlJPUikKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgbV9pc1N0YXJ0ZWQgPSB0cnVlOwotCi0gICAgaWYgKCFtX3VybC5pc0VtcHR5
KCkgJiYgIW1fbG9hZE1hbnVhbGx5KSB7Ci0gICAgICAgIEZyYW1lTG9hZFJlcXVlc3QgZnJhbWVM
b2FkUmVxdWVzdDsKLSAgICAgICAgZnJhbWVMb2FkUmVxdWVzdC5yZXNvdXJjZVJlcXVlc3QoKS5z
ZXRIVFRQTWV0aG9kKCJHRVQiKTsKLSAgICAgICAgZnJhbWVMb2FkUmVxdWVzdC5yZXNvdXJjZVJl
cXVlc3QoKS5zZXRVUkwobV91cmwpOwotICAgICAgICBsb2FkKGZyYW1lTG9hZFJlcXVlc3QsIGZh
bHNlLCAwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3
OjpzdG9wKCkKLXsKLSAgICBpZiAoIW1faXNTdGFydGVkKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBIYXNoU2V0PFJlZlB0cjxQbHVnaW5TdHJlYW0+ID4gc3RyZWFtcyA9IG1fc3RyZWFtczsKLSAg
ICBIYXNoU2V0PFJlZlB0cjxQbHVnaW5TdHJlYW0+ID46Oml0ZXJhdG9yIGVuZCA9IHN0cmVhbXMu
ZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFJlZlB0cjxQbHVnaW5TdHJlYW0+ID46Oml0ZXJhdG9y
IGl0ID0gc3RyZWFtcy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgKCppdCkt
PnN0b3AoKTsKLSAgICAgICAgZGlzY29ubmVjdFN0cmVhbSgoKml0KS5nZXQoKSk7Ci0gICAgfQot
Ci0gICAgQVNTRVJUKG1fc3RyZWFtcy5pc0VtcHR5KCkpOwotCi0gICAgbV9pc1N0YXJ0ZWQgPSBm
YWxzZTsKLQotICAgIC8vIFVuc3ViY2xhc3MgdGhlIHdpbmRvdwotICAgIGlmIChtX2lzV2luZG93
ZWQpIHsKLSAgICAgICAgV05EUFJPQyBjdXJyZW50V25kUHJvYyA9IChXTkRQUk9DKUdldFdpbmRv
d0xvbmdQdHIobV93aW5kb3csIEdXTFBfV05EUFJPQyk7Ci0gICAgICAgIAotICAgICAgICBpZiAo
Y3VycmVudFduZFByb2MgPT0gUGx1Z2luVmlld1duZFByb2MpCi0gICAgICAgICAgICBTZXRXaW5k
b3dMb25nUHRyKG1fd2luZG93LCBHV0xQX1dORFBST0MsIChMT05HKW1fcGx1Z2luV25kUHJvYyk7
Ci0gICAgfQotCi0gICAgS0pTOjpKU0xvY2s6OkRyb3BBbGxMb2NrczsKLQotICAgIC8vIENsZWFy
IHRoZSB3aW5kb3cKLSAgICBtX25wV2luZG93LndpbmRvdyA9IDA7Ci0gICAgaWYgKG1fcGx1Z2lu
LT5wbHVnaW5GdW5jcygpLT5zZXR3aW5kb3cgJiYgIW1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlu
cyhQbHVnaW5RdWlya0RvbnRTZXROdWxsV2luZG93SGFuZGxlT25EZXN0cm95KSkgewotICAgICAg
ICBzZXRDYWxsaW5nUGx1Z2luKHRydWUpOwotICAgICAgICBtX3BsdWdpbi0+cGx1Z2luRnVuY3Mo
KS0+c2V0d2luZG93KG1faW5zdGFuY2UsICZtX25wV2luZG93KTsKLSAgICAgICAgc2V0Q2FsbGlu
Z1BsdWdpbihmYWxzZSk7Ci0gICAgfQotCi0gICAgLy8gRGVzdHJveSB0aGUgcGx1Z2luCi0gICAg
TlBTYXZlZERhdGEqIHNhdmVkRGF0YSA9IDA7Ci0gICAgc2V0Q2FsbGluZ1BsdWdpbih0cnVlKTsK
LSAgICBOUEVycm9yIG5wRXJyID0gbV9wbHVnaW4tPnBsdWdpbkZ1bmNzKCktPmRlc3Ryb3kobV9p
bnN0YW5jZSwgJnNhdmVkRGF0YSk7Ci0gICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Ci0gICAg
TE9HX05QRVJST1IobnBFcnIpOwotCi0gICAgaWYgKHNhdmVkRGF0YSkgewotICAgICAgICBpZiAo
c2F2ZWREYXRhLT5idWYpCi0gICAgICAgICAgICBOUE5fTWVtRnJlZShzYXZlZERhdGEtPmJ1Zik7
Ci0gICAgICAgIE5QTl9NZW1GcmVlKHNhdmVkRGF0YSk7Ci0gICAgfQotCi0gICAgbV9pbnN0YW5j
ZS0+cGRhdGEgPSAwOwotfQorICAgICAgICBtZXNzYWdlID0gbmV3IFBsdWdpbk1lc3NhZ2U7CiAK
LXZvaWQgUGx1Z2luVmlldzo6c2V0Q3VycmVudFBsdWdpblZpZXcoUGx1Z2luVmlldyogcGx1Z2lu
VmlldykKLXsKLSAgICBzX2N1cnJlbnRQbHVnaW5WaWV3ID0gcGx1Z2luVmlldzsKLX0KLQotUGx1
Z2luVmlldyogUGx1Z2luVmlldzo6Y3VycmVudFBsdWdpblZpZXcoKQotewotICAgIHJldHVybiBz
X2N1cnJlbnRQbHVnaW5WaWV3OworICAgIHJldHVybiBtZXNzYWdlOwogfQogCi1zdGF0aWMgY2hh
ciogY3JlYXRlVVRGOFN0cmluZyhjb25zdCBTdHJpbmcmIHN0cikKK2Jvb2wgUGx1Z2luTWVzc2Fn
ZVRocm90dGxlcldpbjo6aXNJbmxpbmVNZXNzYWdlKFBsdWdpbk1lc3NhZ2UqIG1lc3NhZ2UpIAog
ewotICAgIENTdHJpbmcgY3N0ciA9IHN0ci51dGY4KCk7Ci0gICAgY2hhciogcmVzdWx0ID0gcmVp
bnRlcnByZXRfY2FzdDxjaGFyKj4oZmFzdE1hbGxvYyhjc3RyLmxlbmd0aCgpICsgMSkpOwotCi0g
ICAgc3RybmNweShyZXN1bHQsIGNzdHIuZGF0YSgpLCBjc3RyLmxlbmd0aCgpICsgMSk7Ci0KLSAg
ICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBtZXNzYWdlID49ICZtX2lubGluZU1lc3NhZ2Vz
WzBdICYmIG1lc3NhZ2UgPD0gJm1faW5saW5lTWVzc2FnZXNbTnVtSW5saW5lTWVzc2FnZXMgLSAx
XTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZVN0cmluZ0FycmF5KGNoYXIqKiBzdHJpbmdBcnJheSwg
aW50IGxlbmd0aCkKK3ZvaWQgUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjo6ZnJlZU1lc3NhZ2Uo
UGx1Z2luTWVzc2FnZSogbWVzc2FnZSkgCiB7Ci0gICAgaWYgKCFzdHJpbmdBcnJheSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAg
ICAgZmFzdEZyZWUoc3RyaW5nQXJyYXlbaV0pOwotCi0gICAgZmFzdEZyZWUoc3RyaW5nQXJyYXkp
OwotfQotCi1zdGF0aWMgYm9vbCBnZXRTdHJpbmcoS0pTUHJveHkqIHByb3h5LCBKU1ZhbHVlKiBy
ZXN1bHQsIFN0cmluZyYgc3RyaW5nKQotewotICAgIGlmICghcHJveHkgfHwgIXJlc3VsdCB8fCBy
ZXN1bHQtPmlzVW5kZWZpbmVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBKU0xvY2sg
bG9jazsKLQotICAgIEV4ZWNTdGF0ZSogZXhlYyA9IHByb3h5LT5nbG9iYWxPYmplY3QoKS0+Z2xv
YmFsRXhlYygpOwotICAgIFVTdHJpbmcgdXN0cmluZyA9IHJlc3VsdC0+dG9TdHJpbmcoZXhlYyk7
Ci0gICAgZXhlYy0+Y2xlYXJFeGNlcHRpb24oKTsKLQotICAgIHN0cmluZyA9IHVzdHJpbmc7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUGx1Z2luVmlldzo6cGVyZm9ybVJlcXVlc3QoUGx1
Z2luUmVxdWVzdCogcmVxdWVzdCkKLXsKLSAgICAvLyBkb24ndCBsZXQgYSBwbHVnaW4gc3RhcnQg
YW55IGxvYWRzIGlmIGl0IGlzIG5vIGxvbmdlciBwYXJ0IG9mIGEgZG9jdW1lbnQgdGhhdCBpcyBi
ZWluZyAKLSAgICAvLyBkaXNwbGF5ZWQgdW5sZXNzIHRoZSBsb2FkcyBhcmUgaW4gdGhlIHNhbWUg
ZnJhbWUgYXMgdGhlIHBsdWdpbi4KLSAgICBjb25zdCBTdHJpbmcmIHRhcmdldEZyYW1lTmFtZSA9
IHJlcXVlc3QtPmZyYW1lTG9hZFJlcXVlc3QoKS5mcmFtZU5hbWUoKTsKLSAgICBpZiAobV9wYXJl
bnRGcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCkgIT0gbV9wYXJlbnRGcmFtZS0+bG9h
ZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCkgJiYKLSAgICAgICAgKHRhcmdldEZyYW1lTmFt
ZS5pc051bGwoKSB8fCBtX3BhcmVudEZyYW1lLT50cmVlKCktPmZpbmQodGFyZ2V0RnJhbWVOYW1l
KSAhPSBtX3BhcmVudEZyYW1lKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgS1VSTCByZXF1ZXN0
VVJMID0gcmVxdWVzdC0+ZnJhbWVMb2FkUmVxdWVzdCgpLnJlc291cmNlUmVxdWVzdCgpLnVybCgp
OwotICAgIFN0cmluZyBqc1N0cmluZyA9IHNjcmlwdFN0cmluZ0lmSmF2YVNjcmlwdFVSTChyZXF1
ZXN0VVJMKTsKLQotICAgIGlmIChqc1N0cmluZy5pc051bGwoKSkgewotICAgICAgICAvLyBpZiB0
aGlzIGlzIG5vdCBhIHRhcmdldGVkIHJlcXVlc3QsIGNyZWF0ZSBhIHN0cmVhbSBmb3IgaXQuIG90
aGVyd2lzZSwKLSAgICAgICAgLy8ganVzdCBwYXNzIGl0IG9mZiB0byB0aGUgbG9hZGVyCi0gICAg
ICAgIGlmICh0YXJnZXRGcmFtZU5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBQbHVnaW5T
dHJlYW0qIHN0cmVhbSA9IG5ldyBQbHVnaW5TdHJlYW0odGhpcywgbV9wYXJlbnRGcmFtZSwgcmVx
dWVzdC0+ZnJhbWVMb2FkUmVxdWVzdCgpLnJlc291cmNlUmVxdWVzdCgpLCByZXF1ZXN0LT5zZW5k
Tm90aWZpY2F0aW9uKCksIHJlcXVlc3QtPm5vdGlmeURhdGEoKSwgcGx1Z2luKCktPnBsdWdpbkZ1
bmNzKCksIGluc3RhbmNlKCksIG1fcGx1Z2luLT5xdWlya3MoKSk7Ci0gICAgICAgICAgICBtX3N0
cmVhbXMuYWRkKHN0cmVhbSk7Ci0gICAgICAgICAgICBzdHJlYW0tPnN0YXJ0KCk7Ci0gICAgICAg
IH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3BhcmVudEZyYW1lLT5sb2FkZXIoKS0+bG9hZChyZXF1
ZXN0LT5mcmFtZUxvYWRSZXF1ZXN0KCkucmVzb3VyY2VSZXF1ZXN0KCksIHRhcmdldEZyYW1lTmFt
ZSk7Ci0gICAgICAKLSAgICAgICAgICAgIC8vIEZJWE1FOiA8cmRhcjovL3Byb2JsZW0vNDgwNzQ2
OT4gVGhpcyBzaG91bGQgYmUgc2VudCB3aGVuIHRoZSBkb2N1bWVudCBoYXMgZmluaXNoZWQgbG9h
ZGluZwotICAgICAgICAgICAgaWYgKHJlcXVlc3QtPnNlbmROb3RpZmljYXRpb24oKSkgewotICAg
ICAgICAgICAgICAgIEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAg
ICAgICAgICAgICAgIHNldENhbGxpbmdQbHVnaW4odHJ1ZSk7Ci0gICAgICAgICAgICAgICAgbV9w
bHVnaW4tPnBsdWdpbkZ1bmNzKCktPnVybG5vdGlmeShtX2luc3RhbmNlLCByZXF1ZXN0VVJMLnN0
cmluZygpLnV0ZjgoKS5kYXRhKCksIE5QUkVTX0RPTkUsIHJlcXVlc3QtPm5vdGlmeURhdGEoKSk7
Ci0gICAgICAgICAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRhcmdldGVkIEph
dmFTY3JpcHQgcmVxdWVzdHMgYXJlIG9ubHkgYWxsb3dlZCBvbiB0aGUgZnJhbWUgdGhhdCBjb250
YWlucyB0aGUgSmF2YVNjcmlwdCBwbHVnaW4KLSAgICAvLyBhbmQgdGhpcyBoYXMgYmVlbiBtYWRl
IHN1cmUgaW4gOjpsb2FkLgotICAgIEFTU0VSVCh0YXJnZXRGcmFtZU5hbWUuaXNFbXB0eSgpIHx8
IG1fcGFyZW50RnJhbWUtPnRyZWUoKS0+ZmluZCh0YXJnZXRGcmFtZU5hbWUpID09IG1fcGFyZW50
RnJhbWUpOwotICAgIAotICAgIC8vIEV4ZWN1dGluZyBhIHNjcmlwdCBjYW4gY2F1c2UgdGhlIHBs
dWdpbiB2aWV3IHRvIGJlIGRlc3Ryb3llZCwgc28gd2Uga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUg
cGFyZW50IGZyYW1lLgotICAgIFJlZlB0cjxGcmFtZT4gcGFyZW50RnJhbWUgPSBtX3BhcmVudEZy
YW1lOwotICAgIEpTVmFsdWUqIHJlc3VsdCA9IG1fcGFyZW50RnJhbWUtPmxvYWRlcigpLT5leGVj
dXRlU2NyaXB0KGpzU3RyaW5nLCByZXF1ZXN0LT5zaG91bGRBbGxvd1BvcHVwcygpKTsKLQotICAg
IGlmICh0YXJnZXRGcmFtZU5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdFN0
cmluZzsKLQotICAgICAgICBDU3RyaW5nIGNzdHI7Ci0gICAgICAgIGlmIChnZXRTdHJpbmcocGFy
ZW50RnJhbWUtPnNjcmlwdFByb3h5KCksIHJlc3VsdCwgcmVzdWx0U3RyaW5nKSkKLSAgICAgICAg
ICAgIGNzdHIgPSByZXN1bHRTdHJpbmcudXRmOCgpOwotCi0gICAgICAgIFJlZlB0cjxQbHVnaW5T
dHJlYW0+IHN0cmVhbSA9IG5ldyBQbHVnaW5TdHJlYW0odGhpcywgbV9wYXJlbnRGcmFtZSwgcmVx
dWVzdC0+ZnJhbWVMb2FkUmVxdWVzdCgpLnJlc291cmNlUmVxdWVzdCgpLCByZXF1ZXN0LT5zZW5k
Tm90aWZpY2F0aW9uKCksIHJlcXVlc3QtPm5vdGlmeURhdGEoKSwgcGx1Z2luKCktPnBsdWdpbkZ1
bmNzKCksIGluc3RhbmNlKCksIG1fcGx1Z2luLT5xdWlya3MoKSk7Ci0gICAgICAgIG1fc3RyZWFt
cy5hZGQoc3RyZWFtKTsKLSAgICAgICAgc3RyZWFtLT5zZW5kSmF2YVNjcmlwdFN0cmVhbShyZXF1
ZXN0VVJMLCBjc3RyKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGx1Z2luVmlldzo6cmVxdWVzdFRpbWVy
RmlyZWQoVGltZXI8UGx1Z2luVmlldz4qIHRpbWVyKQotewotICAgIEFTU0VSVCh0aW1lciA9PSAm
bV9yZXF1ZXN0VGltZXIpOwotICAgIEFTU0VSVChtX3JlcXVlc3RzLnNpemUoKSA+IDApOwotCi0g
ICAgUGx1Z2luUmVxdWVzdCogcmVxdWVzdCA9IG1fcmVxdWVzdHNbMF07Ci0gICAgbV9yZXF1ZXN0
cy5yZW1vdmUoMCk7Ci0gICAgCi0gICAgLy8gU2NoZWR1bGUgYSBuZXcgcmVxdWVzdCBiZWZvcmUg
Y2FsbGluZyBwZXJmb3JtUmVxdWVzdCBzaW5jZSB0aGUgY2FsbCB0bwotICAgIC8vIHBlcmZvcm1S
ZXF1ZXN0IGNhbiBjYXVzZSB0aGUgcGx1Z2luIHZpZXcgdG8gYmUgZGVsZXRlZC4KLSAgICBpZiAo
bV9yZXF1ZXN0cy5zaXplKCkgPiAwKQotICAgICAgICBtX3JlcXVlc3RUaW1lci5zdGFydE9uZVNo
b3QoMCk7Ci0KLSAgICBwZXJmb3JtUmVxdWVzdChyZXF1ZXN0KTsKLSAgICBkZWxldGUgcmVxdWVz
dDsKLX0KLQotdm9pZCBQbHVnaW5WaWV3OjpzY2hlZHVsZVJlcXVlc3QoUGx1Z2luUmVxdWVzdCog
cmVxdWVzdCkKLXsKLSAgICBtX3JlcXVlc3RzLmFwcGVuZChyZXF1ZXN0KTsKLSAgICBtX3JlcXVl
c3RUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0KLU5QRXJyb3IgUGx1Z2luVmlldzo6bG9hZChj
b25zdCBGcmFtZUxvYWRSZXF1ZXN0JiBmcmFtZUxvYWRSZXF1ZXN0LCBib29sIHNlbmROb3RpZmlj
YXRpb24sIHZvaWQqIG5vdGlmeURhdGEpCi17Ci0gICAgQVNTRVJUKGZyYW1lTG9hZFJlcXVlc3Qu
cmVzb3VyY2VSZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09ICJHRVQiIHx8IGZyYW1lTG9hZFJlcXVl
c3QucmVzb3VyY2VSZXF1ZXN0KCkuaHR0cE1ldGhvZCgpID09ICJQT1NUIik7Ci0KLSAgICBLVVJM
IHVybCA9IGZyYW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0KCkudXJsKCk7Ci0gICAgCi0g
ICAgaWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBOUEVSUl9JTlZBTElEX1VSTDsK
LQotICAgIGNvbnN0IFN0cmluZyYgdGFyZ2V0RnJhbWVOYW1lID0gZnJhbWVMb2FkUmVxdWVzdC5m
cmFtZU5hbWUoKTsKLSAgICBTdHJpbmcganNTdHJpbmcgPSBzY3JpcHRTdHJpbmdJZkphdmFTY3Jp
cHRVUkwodXJsKTsKLQotICAgIGlmICghanNTdHJpbmcuaXNOdWxsKCkpIHsKLSAgICAgICAgU2V0
dGluZ3MqIHNldHRpbmdzID0gbV9wYXJlbnRGcmFtZS0+c2V0dGluZ3MoKTsKLSAgICAgICAgaWYg
KCFzZXR0aW5ncyB8fCAhc2V0dGluZ3MtPmlzSmF2YVNjcmlwdEVuYWJsZWQoKSkgewotICAgICAg
ICAgICAgLy8gUmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1IgaWYgSlMgaXMgZGlzYWJsZWQuIFRo
aXMgaXMgd2hhdCBNb3ppbGxhIGRvZXMuCi0gICAgICAgICAgICByZXR1cm4gTlBFUlJfR0VORVJJ
Q19FUlJPUjsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIGlmICghdGFyZ2V0RnJhbWVO
YW1lLmlzTnVsbCgpICYmIG1fcGFyZW50RnJhbWUtPnRyZWUoKS0+ZmluZCh0YXJnZXRGcmFtZU5h
bWUpICE9IG1fcGFyZW50RnJhbWUpIHsKLSAgICAgICAgICAgIC8vIEZvciBzZWN1cml0eSByZWFz
b25zLCBvbmx5IGFsbG93IEpTIHJlcXVlc3RzIHRvIGJlIG1hZGUgb24gdGhlIGZyYW1lIHRoYXQg
Y29udGFpbnMgdGhlIHBsdWctaW4uCi0gICAgICAgICAgICByZXR1cm4gTlBFUlJfSU5WQUxJRF9Q
QVJBTTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFBsdWdpblJlcXVlc3QqIHJlcXVlc3QgPSBu
ZXcgUGx1Z2luUmVxdWVzdChmcmFtZUxvYWRSZXF1ZXN0LCBzZW5kTm90aWZpY2F0aW9uLCBub3Rp
ZnlEYXRhLCBhcmVQb3B1cHNBbGxvd2VkKCkpOwotICAgIHNjaGVkdWxlUmVxdWVzdChyZXF1ZXN0
KTsKLQotICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKLX0KLQotc3RhdGljIEtVUkwgbWFrZVVS
TChjb25zdCBLVVJMJiBiYXNlVVJMLCBjb25zdCBjaGFyKiByZWxhdGl2ZVVSTFN0cmluZykKLXsK
LSAgICBTdHJpbmcgdXJsU3RyaW5nID0gcmVsYXRpdmVVUkxTdHJpbmc7Ci0KLSAgICAvLyBTdHJp
cCByZXR1cm4gY2hhcmFjdGVycy4KLSAgICB1cmxTdHJpbmcucmVwbGFjZSgnXG4nLCAiIik7Ci0g
ICAgdXJsU3RyaW5nLnJlcGxhY2UoJ1xyJywgIiIpOwotCi0gICAgcmV0dXJuIEtVUkwoYmFzZVVS
TCwgdXJsU3RyaW5nKTsKLX0KLQotTlBFcnJvciBQbHVnaW5WaWV3OjpnZXRVUkxOb3RpZnkoY29u
c3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiB0YXJnZXQsIHZvaWQqIG5vdGlmeURhdGEpCi17Ci0g
ICAgRnJhbWVMb2FkUmVxdWVzdCBmcmFtZUxvYWRSZXF1ZXN0OwotCi0gICAgZnJhbWVMb2FkUmVx
dWVzdC5zZXRGcmFtZU5hbWUodGFyZ2V0KTsKLSAgICBmcmFtZUxvYWRSZXF1ZXN0LnJlc291cmNl
UmVxdWVzdCgpLnNldEhUVFBNZXRob2QoIkdFVCIpOwotICAgIGZyYW1lTG9hZFJlcXVlc3QucmVz
b3VyY2VSZXF1ZXN0KCkuc2V0VVJMKG1ha2VVUkwobV9iYXNlVVJMLCB1cmwpKTsKLQotICAgIHJl
dHVybiBsb2FkKGZyYW1lTG9hZFJlcXVlc3QsIHRydWUsIG5vdGlmeURhdGEpOwotfQotCi1OUEVy
cm9yIFBsdWdpblZpZXc6OmdldFVSTChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIHRhcmdl
dCkKLXsKLSAgICBGcmFtZUxvYWRSZXF1ZXN0IGZyYW1lTG9hZFJlcXVlc3Q7Ci0KLSAgICBmcmFt
ZUxvYWRSZXF1ZXN0LnNldEZyYW1lTmFtZSh0YXJnZXQpOwotICAgIGZyYW1lTG9hZFJlcXVlc3Qu
cmVzb3VyY2VSZXF1ZXN0KCkuc2V0SFRUUE1ldGhvZCgiR0VUIik7Ci0gICAgZnJhbWVMb2FkUmVx
dWVzdC5yZXNvdXJjZVJlcXVlc3QoKS5zZXRVUkwobWFrZVVSTChtX2Jhc2VVUkwsIHVybCkpOwot
Ci0gICAgcmV0dXJuIGxvYWQoZnJhbWVMb2FkUmVxdWVzdCwgZmFsc2UsIDApOwotfQotCi1zdGF0
aWMgaW5saW5lIGJvb2wgc3RhcnRzV2l0aEJsYW5rTGluZShjb25zdCBWZWN0b3I8Y2hhcj4mIGJ1
ZmZlcikKLXsKLSAgICByZXR1cm4gYnVmZmVyLnNpemUoKSA+IDAgJiYgYnVmZmVyWzBdID09ICdc
bic7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGxvY2F0aW9uQWZ0ZXJGaXJzdEJsYW5rTGluZShj
b25zdCBWZWN0b3I8Y2hhcj4mIGJ1ZmZlcikKLXsKLSAgICBjb25zdCBjaGFyKiBieXRlcyA9IGJ1
ZmZlci5kYXRhKCk7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gYnVmZmVyLnNpemUoKTsKLQotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGggLSA0OyBpKyspIHsKLSAgICAgICAgLy8g
U3VwcG9ydCBmb3IgQWNyb2JhdC4gSXQgc2VuZHMgIlxuXG4iLgotICAgICAgICBpZiAoYnl0ZXNb
aV0gPT0gJ1xuJyAmJiBieXRlc1tpICsgMV0gPT0gJ1xuJykKLSAgICAgICAgICAgIHJldHVybiBp
ICsgMjsKLSAgICAgICAgCi0gICAgICAgIC8vIFJldHVybnMgdGhlIHBvc2l0aW9uIGFmdGVyIDIg
Q1JMRidzIG9yIDEgQ1JMRiBpZiBpdCBpcyB0aGUgZmlyc3QgbGluZS4KLSAgICAgICAgaWYgKGJ5
dGVzW2ldID09ICdccicgJiYgYnl0ZXNbaSArIDFdID09ICdcbicpIHsKLSAgICAgICAgICAgIGkg
Kz0gMjsKLSAgICAgICAgICAgIGlmIChpID09IDIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGk7
Ci0gICAgICAgICAgICBlbHNlIGlmIChieXRlc1tpXSA9PSAnXG4nKQotICAgICAgICAgICAgICAg
IC8vIFN1cHBvcnQgZm9yIERpcmVjdG9yLiBJdCBzZW5kcyAiXHJcblxuIiAoMzg4MDM4NykuCi0g
ICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgZWxzZSBpZiAoYnl0ZXNb
aV0gPT0gJ1xyJyAmJiBieXRlc1tpICsgMV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAvLyBT
dXBwb3J0IGZvciBGbGFzaC4gSXQgc2VuZHMgIlxyXG5cclxuIiAoMzc1ODExMykuCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGkgKyAyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC0x
OwotfQotCi1zdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIqIGZpbmRFT0woY29uc3QgY2hhciogYnl0
ZXMsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIEhUVFAgc3Bl
Y2lmaWNhdGlvbiBFT0wgaXMgZGVmaW5lZCBhcwotICAgIC8vIGEgQ1JMRiBwYWlyLiBVbmZvcnR1
bmF0ZWx5LCBzb21lIHNlcnZlcnMgd2lsbCB1c2UgTEYKLSAgICAvLyBpbnN0ZWFkLiBXb3JzZSB5
ZXQsIHNvbWUgc2VydmVycyB3aWxsIHVzZSBhIGNvbWJpbmF0aW9uCi0gICAgLy8gb2YgYm90aCAo
ZS5nLiA8aGVhZGVyPkNSTEZMRjxib2R5PiksIHNvIGZpbmRFT0wgbmVlZHMKLSAgICAvLyB0byBi
ZSBtb3JlIGZvcmdpdmluZy4gSXQgd2lsbCBub3cgYWNjZXB0IENSTEYsIExGIG9yCi0gICAgLy8g
Q1IuCi0gICAgLy8KLSAgICAvLyBJdCByZXR1cm5zIE5VTEwgaWYgRU9MRiBpcyBub3QgZm91bmQg
b3IgaXQgd2lsbCByZXR1cm4KLSAgICAvLyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHRlcm1pbmF0
aW5nIGNoYXJhY3Rlci4KLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysp
IHsKLSAgICAgICAgaWYgKGJ5dGVzW2ldID09ICdcbicpCi0gICAgICAgICAgICByZXR1cm4gYnl0
ZXMgKyBpOwotICAgICAgICBpZiAoYnl0ZXNbaV0gPT0gJ1xyJykgewotICAgICAgICAgICAgLy8g
Q2hlY2sgdG8gc2VlIGlmIHNwYW5uaW5nIGJ1ZmZlciBib3VuZHMKLSAgICAgICAgICAgIC8vIChD
UkxGIGlzIGFjcm9zcyByZWFkcykuIElmIHNvLCB3YWl0IGZvcgotICAgICAgICAgICAgLy8gbmV4
dCByZWFkLgotICAgICAgICAgICAgaWYgKGkgKyAxID09IGxlbmd0aCkKLSAgICAgICAgICAgICAg
ICBicmVhazsKLQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzICsgaTsKLSAgICAgICAgfQotICAg
IH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIFN0cmluZyBjYXBpdGFsaXpl
UkZDODIySGVhZGVyRmllbGROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBib29sIGNh
cGl0YWxpemVDaGFyYWN0ZXIgPSB0cnVlOwotICAgIFN0cmluZyByZXN1bHQ7Ci0KLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIFVDaGFy
IGM7Ci0KLSAgICAgICAgaWYgKGNhcGl0YWxpemVDaGFyYWN0ZXIgJiYgbmFtZVtpXSA+PSAnYScg
JiYgbmFtZVtpXSA8PSAneicpCi0gICAgICAgICAgICBjID0gdG9BU0NJSVVwcGVyKG5hbWVbaV0p
OwotICAgICAgICBlbHNlIGlmICghY2FwaXRhbGl6ZUNoYXJhY3RlciAmJiBuYW1lW2ldID49ICdB
JyAmJiBuYW1lW2ldIDw9ICdaJykKLSAgICAgICAgICAgIGMgPSB0b0FTQ0lJTG93ZXIobmFtZVtp
XSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMgPSBuYW1lW2ldOwotCi0gICAgICAgIGlm
IChuYW1lW2ldID09ICctJykKLSAgICAgICAgICAgIGNhcGl0YWxpemVDaGFyYWN0ZXIgPSB0cnVl
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjYXBpdGFsaXplQ2hhcmFjdGVyID0gZmFsc2U7
Ci0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi1zdGF0aWMgaW5saW5lIEhUVFBIZWFkZXJNYXAgcGFyc2VSRkM4MjJIZWFkZXJGaWVs
ZHMoY29uc3QgVmVjdG9yPGNoYXI+JiBidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCkKLXsKLSAgICBj
b25zdCBjaGFyKiBieXRlcyA9IGJ1ZmZlci5kYXRhKCk7Ci0gICAgY29uc3QgY2hhciogZW9sOwot
ICAgIFN0cmluZyBsYXN0S2V5OwotICAgIEhUVFBIZWFkZXJNYXAgaGVhZGVyRmllbGRzOwotCi0g
ICAgLy8gTG9vcCBvdmUgcmxpbmVzIHVudGlsIHdlJ3JlIHBhc3QgdGhlIGhlYWRlciwgb3Igd2Ug
Y2FuJ3QgZmluZCBhbnkgbW9yZSBlbmQtb2YtbGluZXMKLSAgICB3aGlsZSAoKGVvbCA9IGZpbmRF
T0woYnl0ZXMsIGxlbmd0aCkpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGxpbmUgPSBieXRlczsK
LSAgICAgICAgaW50IGxpbmVMZW5ndGggPSBlb2wgLSBieXRlczsKLSAgICAgICAgCi0gICAgICAg
IC8vIE1vdmUgYnl0ZXMgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgdGVybWluYXRvciBhcyBy
ZXR1cm5lZCBieSBmaW5kRU9MLgotICAgICAgICBieXRlcyA9IGVvbCArIDE7Ci0gICAgICAgIGlm
ICgoKmVvbCA9PSAnXHInKSAmJiAoKmJ5dGVzID09ICdcbicpKQotICAgICAgICAgICAgYnl0ZXMr
KzsgLy8gU2FmZSBzaW5jZSBmaW5kRU9MIHdvbid0IHJldHVybiBhIHNwYW5uaW5nIENSTEYuCi0K
LSAgICAgICAgbGVuZ3RoIC09IChieXRlcyAtIGxpbmUpOwotICAgICAgICBpZiAobGluZUxlbmd0
aCA9PSAwKQotICAgICAgICAgICAgLy8gQmxhbmsgbGluZTsgd2UncmUgYXQgdGhlIGVuZCBvZiB0
aGUgaGVhZGVyCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZWxzZSBpZiAoKmxpbmUgPT0g
JyAnIHx8ICpsaW5lID09ICdcdCcpIHsKLSAgICAgICAgICAgIC8vIENvbnRpbnVhdGlvbiBvZiB0
aGUgcHJldmlvdXMgaGVhZGVyCi0gICAgICAgICAgICBpZiAobGFzdEtleS5pc051bGwoKSkgewot
ICAgICAgICAgICAgICAgIC8vIG1hbGZvcm1lZCBoZWFkZXI7IGlnbm9yZSBpdCBhbmQgY29udGlu
dWUKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgLy8gTWVyZ2UgdGhlIGNvbnRpbnVhdGlvbiBvZiB0aGUgcHJldmlvdXMgaGVh
ZGVyCi0gICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IGhlYWRlckZpZWxkcy5n
ZXQobGFzdEtleSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1ZhbHVlKGxpbmUsIGxpbmVM
ZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaGVhZGVyRmllbGRzLnNldChsYXN0S2V5LCBjdXJy
ZW50VmFsdWUgKyBuZXdWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAvLyBCcmFuZCBuZXcgaGVhZGVyCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBj
b2xvbjsKLSAgICAgICAgICAgIGZvciAoY29sb24gPSBsaW5lOyAqY29sb24gIT0gJzonICYmIGNv
bG9uICE9IGVvbDsgY29sb24rKykgewotICAgICAgICAgICAgICAgIC8vIGVtcHR5IGxvb3AKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb2xvbiA9PSBlb2wpIAotICAgICAgICAgICAg
ICAgIC8vIG1hbGZvcm1lZCBoZWFkZXI7IGlnbm9yZSBpdCBhbmQgY29udGludWUKLSAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxh
c3RLZXkgPSBjYXBpdGFsaXplUkZDODIySGVhZGVyRmllbGROYW1lKFN0cmluZyhsaW5lLCBjb2xv
biAtIGxpbmUpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgICAg
ICAgICBmb3IgKGNvbG9uKys7IGNvbG9uICE9IGVvbDsgY29sb24rKykgewotICAgICAgICAgICAg
ICAgICAgICBpZiAoKmNvbG9uICE9ICcgJyAmJiAqY29sb24gIT0gJ1x0JykKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBp
ZiAoY29sb24gPT0gZW9sKQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwotICAgICAg
ICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmcoY29sb24s
IGVvbCAtIGNvbG9uKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBvbGRWYWx1ZSA9IGhlYWRl
ckZpZWxkcy5nZXQobGFzdEtleSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvbGRWYWx1ZS5pc051
bGwoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG1wID0gb2xkVmFsdWU7Ci0gICAg
ICAgICAgICAgICAgICAgIHRtcCArPSAiLCAiOwotICAgICAgICAgICAgICAgICAgICB0bXAgKz0g
dmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdG1wOwotICAgICAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgICAgIGhlYWRlckZpZWxkcy5zZXQobGFzdEtleSwgdmFsdWUpOwot
ICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGhlYWRlckZpZWxk
czsKLX0KLQotTlBFcnJvciBQbHVnaW5WaWV3OjpoYW5kbGVQb3N0KGNvbnN0IGNoYXIqIHVybCwg
Y29uc3QgY2hhciogdGFyZ2V0LCB1aW50MzIgbGVuLCBjb25zdCBjaGFyKiBidWYsIGJvb2wgZmls
ZSwgdm9pZCogbm90aWZ5RGF0YSwgYm9vbCBzZW5kTm90aWZpY2F0aW9uLCBib29sIGFsbG93SGVh
ZGVycykKLXsKLSAgICBpZiAoIXVybCB8fCAhbGVuIHx8ICFidWYpCi0gICAgICAgIHJldHVybiBO
UEVSUl9JTlZBTElEX1BBUkFNOwotCi0gICAgRnJhbWVMb2FkUmVxdWVzdCBmcmFtZUxvYWRSZXF1
ZXN0OwotCi0gICAgSFRUUEhlYWRlck1hcCBoZWFkZXJGaWVsZHM7Ci0gICAgVmVjdG9yPGNoYXI+
IGJ1ZmZlcjsKLSAgICAKLSAgICBpZiAoZmlsZSkgewotICAgICAgICBTdHJpbmcgZmlsZW5hbWUo
YnVmLCBsZW4pOwotCi0gICAgICAgIGlmIChmaWxlbmFtZS5zdGFydHNXaXRoKCJmaWxlOi8vLyIp
KQotICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoOCk7Ci0KLSAgICAg
ICAgLy8gR2V0IGZpbGUgaW5mbwotICAgICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIGF0
dHJzOwotICAgICAgICBpZiAoR2V0RmlsZUF0dHJpYnV0ZXNFeFcoZmlsZW5hbWUuY2hhcmFjdGVy
c1dpdGhOdWxsVGVybWluYXRpb24oKSwgR2V0RmlsZUV4SW5mb1N0YW5kYXJkLCAmYXR0cnMpID09
IDApCi0gICAgICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7Ci0KLSAgICAgICAg
aWYgKGF0dHJzLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpCi0g
ICAgICAgICAgICByZXR1cm4gTlBFUlJfRklMRV9OT1RfRk9VTkQ7Ci0KLSAgICAgICAgSEFORExF
IGZpbGVIYW5kbGUgPSBDcmVhdGVGaWxlVyhmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpLCBGSUxFX1JFQURfREFUQSwgRklMRV9TSEFSRV9SRUFELCAwLCBPUEVOX0VYSVNU
SU5HLCAwLCAwKTsKLSAgICAgICAgCi0gICAgICAgIGlmIChmaWxlSGFuZGxlID09IElOVkFMSURf
SEFORExFX1ZBTFVFKQotICAgICAgICAgICAgcmV0dXJuIE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOwot
Ci0gICAgICAgIGJ1ZmZlci5yZXNpemUoYXR0cnMubkZpbGVTaXplTG93KTsKLQotICAgICAgICBE
V09SRCBieXRlc1JlYWQ7Ci0gICAgICAgIGludCByZXR2YWwgPSBSZWFkRmlsZShmaWxlSGFuZGxl
LCBidWZmZXIuZGF0YSgpLCBhdHRycy5uRmlsZVNpemVMb3csICZieXRlc1JlYWQsIDApOwotCi0g
ICAgICAgIENsb3NlSGFuZGxlKGZpbGVIYW5kbGUpOwotCi0gICAgICAgIGlmIChyZXR2YWwgPT0g
MCB8fCBieXRlc1JlYWQgIT0gYXR0cnMubkZpbGVTaXplTG93KQotICAgICAgICAgICAgcmV0dXJu
IE5QRVJSX0ZJTEVfTk9UX0ZPVU5EOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlci5yZXNp
emUobGVuKTsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci5kYXRhKCksIGJ1ZiwgbGVuKTsKLSAgICB9
Ci0KLSAgICBjb25zdCBjaGFyKiBwb3N0RGF0YSA9IGJ1ZmZlci5kYXRhKCk7Ci0gICAgaW50IHBv
c3REYXRhTGVuZ3RoID0gYnVmZmVyLnNpemUoKTsKLSAgICAKLSAgICBpZiAoYWxsb3dIZWFkZXJz
KSB7Ci0gICAgICAgIGlmIChzdGFydHNXaXRoQmxhbmtMaW5lKGJ1ZmZlcikpIHsKLSAgICAgICAg
ICAgIHBvc3REYXRhKys7Ci0gICAgICAgICAgICBwb3N0RGF0YUxlbmd0aC0tOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgaW50IGxvY2F0aW9uID0gbG9jYXRpb25BZnRlckZpcnN0Qmxh
bmtMaW5lKGJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobG9jYXRpb24gIT0gLTEpIHsKLSAgICAg
ICAgICAgICAgICAvLyBJZiB0aGUgYmxhbmsgbGluZSBpcyBzb21ld2hlcmUgaW4gdGhlIG1pZGRs
ZSBvZiB0aGUgYnVmZmVyLCBldmVyeXRoaW5nIGJlZm9yZSBpcyB0aGUgaGVhZGVyCi0gICAgICAg
ICAgICAgICAgaGVhZGVyRmllbGRzID0gcGFyc2VSRkM4MjJIZWFkZXJGaWVsZHMoYnVmZmVyLCBs
b2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9IGJ1ZmZlci5z
aXplKCkgLSBsb2NhdGlvbjsKLQotICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyBwbHVnaW5z
IGxpa2UgdG8gc2V0IENvbnRlbnQtTGVuZ3RoIHRoZW1zZWx2ZXMgd2hlbiB0aGV5IHBvc3QsCi0g
ICAgICAgICAgICAgICAgLy8gYnV0IFdlYkZvdW5kYXRpb24gZG9lcyBub3QgbGlrZSB0aGF0LiBT
byB3ZSB3aWxsIHJlbW92ZSB0aGUgaGVhZGVyCi0gICAgICAgICAgICAgICAgLy8gYW5kIGluc3Rl
YWQgdHJ1bmNhdGUgdGhlIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBsZW5ndGguCi0gICAgICAgICAg
ICAgICAgU3RyaW5nIGNvbnRlbnRMZW5ndGggPSBoZWFkZXJGaWVsZHMuZ2V0KCJDb250ZW50LUxl
bmd0aCIpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFjb250ZW50TGVuZ3RoLmlzTnVsbCgpKQot
ICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoID0gbWluKGNvbnRlbnRMZW5ndGgudG9JbnQo
KSwgKGludClkYXRhTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBoZWFkZXJGaWVsZHMucmVtb3Zl
KCJDb250ZW50LUxlbmd0aCIpOwotCi0gICAgICAgICAgICAgICAgcG9zdERhdGEgKz0gbG9jYXRp
b247Ci0gICAgICAgICAgICAgICAgcG9zdERhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnJhbWVMb2FkUmVxdWVzdC5yZXNvdXJj
ZVJlcXVlc3QoKS5zZXRIVFRQTWV0aG9kKCJQT1NUIik7Ci0gICAgZnJhbWVMb2FkUmVxdWVzdC5y
ZXNvdXJjZVJlcXVlc3QoKS5zZXRVUkwobWFrZVVSTChtX2Jhc2VVUkwsIHVybCkpOwotICAgIGZy
YW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0KCkuYWRkSFRUUEhlYWRlckZpZWxkcyhoZWFk
ZXJGaWVsZHMpOwotICAgIGZyYW1lTG9hZFJlcXVlc3QucmVzb3VyY2VSZXF1ZXN0KCkuc2V0SFRU
UEJvZHkoRm9ybURhdGE6OmNyZWF0ZShwb3N0RGF0YSwgcG9zdERhdGFMZW5ndGgpKTsKLSAgICBm
cmFtZUxvYWRSZXF1ZXN0LnNldEZyYW1lTmFtZSh0YXJnZXQpOwotCi0gICAgcmV0dXJuIGxvYWQo
ZnJhbWVMb2FkUmVxdWVzdCwgc2VuZE5vdGlmaWNhdGlvbiwgbm90aWZ5RGF0YSk7Ci19Ci0KLU5Q
RXJyb3IgUGx1Z2luVmlldzo6cG9zdFVSTE5vdGlmeShjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNo
YXIqIHRhcmdldCwgdWludDMyIGxlbiwgY29uc3QgY2hhciogYnVmLCBOUEJvb2wgZmlsZSwgdm9p
ZCogbm90aWZ5RGF0YSkKLXsKLSAgICByZXR1cm4gaGFuZGxlUG9zdCh1cmwsIHRhcmdldCwgbGVu
LCBidWYsIGZpbGUsIG5vdGlmeURhdGEsIHRydWUsIHRydWUpOwotfQotCi1OUEVycm9yIFBsdWdp
blZpZXc6OnBvc3RVUkwoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiB0YXJnZXQsIHVpbnQz
MiBsZW4sIGNvbnN0IGNoYXIqIGJ1ZiwgTlBCb29sIGZpbGUpCi17Ci0gICAgLy8gQXMgZG9jdW1l
bnRlZCwgb25seSBhbGxvdyBoZWFkZXJzIHRvIGJlIHNwZWNpZmllZCB2aWEgTlBQX1Bvc3RVUkwg
d2hlbiB1c2luZyBhIGZpbGUuCi0gICAgcmV0dXJuIGhhbmRsZVBvc3QodXJsLCB0YXJnZXQsIGxl
biwgYnVmLCBmaWxlLCAwLCBmYWxzZSwgZmlsZSk7Ci19Ci0KLU5QRXJyb3IgUGx1Z2luVmlldzo6
bmV3U3RyZWFtKE5QTUlNRVR5cGUgdHlwZSwgY29uc3QgY2hhciogdGFyZ2V0LCBOUFN0cmVhbSoq
IHN0cmVhbSkKLXsKLSAgICBub3RJbXBsZW1lbnRlZCgpOwotICAgIC8vIFVuc3VwcG9ydGVkCi0g
ICAgcmV0dXJuIE5QRVJSX0dFTkVSSUNfRVJST1I7Ci19Ci0KLWludDMyIFBsdWdpblZpZXc6Ondy
aXRlKE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIGxlbiwgdm9pZCogYnVmZmVyKQotewotICAgIG5v
dEltcGxlbWVudGVkKCk7Ci0gICAgLy8gVW5zdXBwb3J0ZWQKLSAgICByZXR1cm4gLTE7Ci19Ci0K
LU5QRXJyb3IgUGx1Z2luVmlldzo6ZGVzdHJveVN0cmVhbShOUFN0cmVhbSogc3RyZWFtLCBOUFJl
YXNvbiByZWFzb24pCi17Ci0gICAgUGx1Z2luU3RyZWFtKiBicm93c2VyU3RyZWFtID0gc3RhdGlj
X2Nhc3Q8UGx1Z2luU3RyZWFtKj4oc3RyZWFtLT5uZGF0YSk7Ci0KLSAgICBpZiAoIXN0cmVhbSB8
fCBQbHVnaW5TdHJlYW06Om93bmVyRm9yU3RyZWFtKHN0cmVhbSkgIT0gbV9pbnN0YW5jZSkKLSAg
ICAgICAgcmV0dXJuIE5QRVJSX0lOVkFMSURfSU5TVEFOQ0VfRVJST1I7Ci0KLSAgICBicm93c2Vy
U3RyZWFtLT5jYW5jZWxBbmREZXN0cm95U3RyZWFtKHJlYXNvbik7Ci0gICAgcmV0dXJuIE5QRVJS
X05PX0VSUk9SOwotfQotCi1jb25zdCBjaGFyKiBQbHVnaW5WaWV3Ojp1c2VyQWdlbnQoKQotewot
ICAgIGlmIChtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtXYW50c01vemls
bGFVc2VyQWdlbnQpKQotICAgICAgICByZXR1cm4gTW96aWxsYVVzZXJBZ2VudDsKLQotICAgIGlm
IChtX3VzZXJBZ2VudC5pc051bGwoKSkKLSAgICAgICAgbV91c2VyQWdlbnQgPSBtX3BhcmVudEZy
YW1lLT5sb2FkZXIoKS0+dXNlckFnZW50KG1fdXJsKS51dGY4KCk7Ci0gICAgcmV0dXJuIG1fdXNl
ckFnZW50LmRhdGEoKTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3OjpzdGF0dXMoY29uc3QgY2hhciog
bWVzc2FnZSkKLXsKLSAgICBpZiAoUGFnZSogcGFnZSA9IG1fcGFyZW50RnJhbWUtPnBhZ2UoKSkK
LSAgICAgICAgcGFnZS0+Y2hyb21lKCktPnNldFN0YXR1c2JhclRleHQobV9wYXJlbnRGcmFtZSwg
U3RyaW5nKG1lc3NhZ2UpKTsKLX0KLQotTlBFcnJvciBQbHVnaW5WaWV3OjpnZXRWYWx1ZShOUE5W
YXJpYWJsZSB2YXJpYWJsZSwgdm9pZCogdmFsdWUpCi17Ci0gICAgc3dpdGNoICh2YXJpYWJsZSkg
ewotICAgICAgICBjYXNlIE5QTlZXaW5kb3dOUE9iamVjdDogewotICAgICAgICAgICAgTlBPYmpl
Y3QqIHdpbmRvd1NjcmlwdE9iamVjdCA9IG1fcGFyZW50RnJhbWUtPndpbmRvd1NjcmlwdE5QT2Jq
ZWN0KCk7Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBy
ZXRhaW5lZCwgYXMgZGVzY3JpYmVkIGhlcmU6IDxodHRwOi8vd3d3Lm1vemlsbGEub3JnL3Byb2pl
Y3RzL3BsdWdpbi9ucHJ1bnRpbWUuaHRtbD4KLSAgICAgICAgICAgIGlmICh3aW5kb3dTY3JpcHRP
YmplY3QpCi0gICAgICAgICAgICAgICAgX05QTl9SZXRhaW5PYmplY3Qod2luZG93U2NyaXB0T2Jq
ZWN0KTsKLQotICAgICAgICAgICAgdm9pZCoqIHYgPSAodm9pZCoqKXZhbHVlOwotICAgICAgICAg
ICAgKnYgPSB3aW5kb3dTY3JpcHRPYmplY3Q7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJl
dHVybiBOUEVSUl9OT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTlBOVlBsdWdp
bkVsZW1lbnROUE9iamVjdDogewotICAgICAgICAgICAgTlBPYmplY3QqIHBsdWdpblNjcmlwdE9i
amVjdCA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChtX2VsZW1lbnQtPmhhc1RhZ05hbWUoYXBwbGV0
VGFnKSB8fCBtX2VsZW1lbnQtPmhhc1RhZ05hbWUoZW1iZWRUYWcpIHx8IG1fZWxlbWVudC0+aGFz
VGFnTmFtZShvYmplY3RUYWcpKQotICAgICAgICAgICAgICAgIHBsdWdpblNjcmlwdE9iamVjdCA9
IHN0YXRpY19jYXN0PEhUTUxQbHVnSW5FbGVtZW50Kj4obV9lbGVtZW50KS0+Z2V0TlBPYmplY3Qo
KTsKLQotICAgICAgICAgICAgLy8gUmV0dXJuIHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIHJldGFp
bmVkLCBhcyBkZXNjcmliZWQgaGVyZTogPGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMv
cGx1Z2luL25wcnVudGltZS5odG1sPgotICAgICAgICAgICAgaWYgKHBsdWdpblNjcmlwdE9iamVj
dCkKLSAgICAgICAgICAgICAgICBfTlBOX1JldGFpbk9iamVjdChwbHVnaW5TY3JpcHRPYmplY3Qp
OwotCi0gICAgICAgICAgICB2b2lkKiogdiA9ICh2b2lkKiopdmFsdWU7Ci0gICAgICAgICAgICAq
diA9IHBsdWdpblNjcmlwdE9iamVjdDsKLQotICAgICAgICAgICAgcmV0dXJuIE5QRVJSX05PX0VS
Uk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBOUE5WbmV0c2NhcGVXaW5kb3c6IHsKLSAg
ICAgICAgICAgIEhXTkQqIHcgPSByZWludGVycHJldF9jYXN0PEhXTkQqPih2YWx1ZSk7Ci0KLSAg
ICAgICAgICAgICp3ID0gY29udGFpbmluZ1dpbmRvdygpOwotCi0gICAgICAgICAgICByZXR1cm4g
TlBFUlJfTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg
IHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotICAgIH0KLX0KLQotTlBFcnJvciBQbHVnaW5W
aWV3OjpzZXRWYWx1ZShOUFBWYXJpYWJsZSB2YXJpYWJsZSwgdm9pZCogdmFsdWUpCi17Ci0gICAg
c3dpdGNoICh2YXJpYWJsZSkgewotICAgICAgICBjYXNlIE5QUFZwbHVnaW5XaW5kb3dCb29sOgot
ICAgICAgICAgICAgbV9pc1dpbmRvd2VkID0gdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gTlBF
UlJfTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgTlBQVnBsdWdpblRyYW5zcGFyZW50Qm9vbDoKLSAg
ICAgICAgICAgIG1faXNUcmFuc3BhcmVudCA9IHZhbHVlOwotICAgICAgICAgICAgcmV0dXJuIE5Q
RVJSX05PX0VSUk9SOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbm90SW1wbGVtZW50
ZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBOUEVSUl9HRU5FUklDX0VSUk9SOwotICAgIH0KLX0K
LQotdm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlVGltZXJGaXJlZChUaW1lcjxQbHVnaW5WaWV3
PiogdGltZXIpCi17Ci0gICAgQVNTRVJUKHRpbWVyID09ICZtX2ludmFsaWRhdGVUaW1lcik7Ci0K
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9pbnZhbGlkUmVjdHMuc2l6ZSgpOyBpKysp
Ci0gICAgICAgIFdpZGdldDo6aW52YWxpZGF0ZVJlY3QobV9pbnZhbGlkUmVjdHNbaV0pOwotICAg
IG1faW52YWxpZFJlY3RzLmNsZWFyKCk7Ci19Ci0KLQotdm9pZCBQbHVnaW5WaWV3OjppbnZhbGlk
YXRlUmVjdChOUFJlY3QqIHJlY3QpCi17Ci0gICAgaWYgKCFyZWN0KSB7Ci0gICAgICAgIGludmFs
aWRhdGUoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEludFJlY3QgcihyZWN0LT5s
ZWZ0LCByZWN0LT50b3AsIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwgcmVjdC0+Ym90dG9tIC0g
cmVjdC0+dG9wKTsKLQotICAgIGlmIChtX2lzV2luZG93ZWQpIHsKLSAgICAgICAgUkVDVCBpbnZh
bGlkUmVjdChyKTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QobV93aW5kb3csICZpbnZhbGlkUmVj
dCwgRkFMU0UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX3BsdWdpbi0+cXVpcmtzKCku
Y29udGFpbnMoUGx1Z2luUXVpcmtUaHJvdHRsZUludmFsaWRhdGUpKSB7Ci0gICAgICAgICAgICBt
X2ludmFsaWRSZWN0cy5hcHBlbmQocik7Ci0gICAgICAgICAgICBpZiAoIW1faW52YWxpZGF0ZVRp
bWVyLmlzQWN0aXZlKCkpCi0gICAgICAgICAgICAgICAgbV9pbnZhbGlkYXRlVGltZXIuc3RhcnRP
bmVTaG90KDAuMDAxKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBXaWRnZXQ6OmludmFs
aWRhdGVSZWN0KHIpOwotICAgIH0KLX0KLQotdm9pZCBQbHVnaW5WaWV3OjppbnZhbGlkYXRlUmVn
aW9uKE5QUmVnaW9uIHJlZ2lvbikKLXsKLSAgICBpZiAobV9pc1dpbmRvd2VkKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBSRUNUIHI7Ci0KLSAgICBpZiAoR2V0UmduQm94KHJlZ2lvbiwgJnIpID09
IDApIHsKLSAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgV2lkZ2V0OjppbnZhbGlkYXRlUmVjdChyKTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3Ojpmb3Jj
ZVJlZHJhdygpCi17Ci0gICAgaWYgKG1faXNXaW5kb3dlZCkKLSAgICAgICAgOjpVcGRhdGVXaW5k
b3cobV93aW5kb3cpOwotICAgIGVsc2UKLSAgICAgICAgOjpVcGRhdGVXaW5kb3coY29udGFpbmlu
Z1dpbmRvdygpKTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3OjpwdXNoUG9wdXBzRW5hYmxlZFN0YXRl
KGJvb2wgc3RhdGUpCi17Ci0gICAgbV9wb3B1cFN0YXRlU3RhY2suYXBwZW5kKHN0YXRlKTsKLX0K
LSAKLXZvaWQgUGx1Z2luVmlldzo6cG9wUG9wdXBzRW5hYmxlZFN0YXRlKCkKLXsKLSAgICBtX3Bv
cHVwU3RhdGVTdGFjay5yZW1vdmVMYXN0KCk7Ci19Ci0KLWJvb2wgUGx1Z2luVmlldzo6YXJlUG9w
dXBzQWxsb3dlZCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFtX3BvcHVwU3RhdGVTdGFjay5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybiBtX3BvcHVwU3RhdGVTdGFjay5sYXN0KCk7Ci0KLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KLVBhc3NSZWZQdHI8S0pTOjpCaW5kaW5nczo6SW5zdGFuY2U+IFBsdWdp
blZpZXc6OmJpbmRpbmdJbnN0YW5jZSgpCi17Ci0gICAgTlBPYmplY3QqIG9iamVjdCA9IDA7Ci0K
LSAgICBpZiAoIW1fcGx1Z2luIHx8ICFtX3BsdWdpbi0+cGx1Z2luRnVuY3MoKS0+Z2V0dmFsdWUp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgTlBFcnJvciBucEVycjsKLSAgICB7Ci0gICAgICAg
IEtKUzo6SlNMb2NrOjpEcm9wQWxsTG9ja3MgZHJvcEFsbExvY2tzOwotICAgICAgICBzZXRDYWxs
aW5nUGx1Z2luKHRydWUpOwotICAgICAgICBucEVyciA9IG1fcGx1Z2luLT5wbHVnaW5GdW5jcygp
LT5nZXR2YWx1ZShtX2luc3RhbmNlLCBOUFBWcGx1Z2luU2NyaXB0YWJsZU5QT2JqZWN0LCAmb2Jq
ZWN0KTsKLSAgICAgICAgc2V0Q2FsbGluZ1BsdWdpbihmYWxzZSk7Ci0gICAgfQotCi0gICAgaWYg
KG5wRXJyICE9IE5QRVJSX05PX0VSUk9SIHx8ICFvYmplY3QpCi0gICAgICAgIHJldHVybiAwOwot
Ci0gICAgUmVmUHRyPEtKUzo6QmluZGluZ3M6OlJvb3RPYmplY3Q+IHJvb3QgPSBtX3BhcmVudEZy
YW1lLT5jcmVhdGVSb290T2JqZWN0KHRoaXMsIG1fcGFyZW50RnJhbWUtPnNjcmlwdFByb3h5KCkt
Pmdsb2JhbE9iamVjdCgpKTsKLSAgICBSZWZQdHI8S0pTOjpCaW5kaW5nczo6SW5zdGFuY2U+IGlu
c3RhbmNlID0gS0pTOjpCaW5kaW5nczo6Q0luc3RhbmNlOjpjcmVhdGUob2JqZWN0LCByb290LnJl
bGVhc2UoKSk7Ci0KLSAgICBfTlBOX1JlbGVhc2VPYmplY3Qob2JqZWN0KTsKLQotICAgIHJldHVy
biBpbnN0YW5jZS5yZWxlYXNlKCk7Ci19Ci0KLVBsdWdpblZpZXc6On5QbHVnaW5WaWV3KCkKLXsK
LSAgICBzdG9wKCk7Ci0KLSAgICBkZWxldGVBbGxWYWx1ZXMobV9yZXF1ZXN0cyk7Ci0KLSAgICBm
cmVlU3RyaW5nQXJyYXkobV9wYXJhbU5hbWVzLCBtX3BhcmFtQ291bnQpOwotICAgIGZyZWVTdHJp
bmdBcnJheShtX3BhcmFtVmFsdWVzLCBtX3BhcmFtQ291bnQpOwotCi0gICAgaWYgKG1fd2luZG93
KQotICAgICAgICBEZXN0cm95V2luZG93KG1fd2luZG93KTsKLQotICAgIG1fcGFyZW50RnJhbWUt
PmNsZWFudXBTY3JpcHRPYmplY3RzRm9yUGx1Z2luKHRoaXMpOwotCi0gICAgaWYgKG1fcGx1Z2lu
ICYmICFtX3BsdWdpbi0+cXVpcmtzKCkuY29udGFpbnMoUGx1Z2luUXVpcmtEb250VW5sb2FkUGx1
Z2luKSkKLSAgICAgICAgbV9wbHVnaW4tPnVubG9hZCgpOwotfQotCi12b2lkIFBsdWdpblZpZXc6
OmRpc2Nvbm5lY3RTdHJlYW0oUGx1Z2luU3RyZWFtKiBzdHJlYW0pCi17Ci0gICAgQVNTRVJUKG1f
c3RyZWFtcy5jb250YWlucyhzdHJlYW0pKTsKLQotICAgIG1fc3RyZWFtcy5yZW1vdmUoc3RyZWFt
KTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFZlY3RvcjxTdHJp
bmc+JiBwYXJhbU5hbWVzLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGFyYW1WYWx1ZXMpCi17Ci0g
ICAgQVNTRVJUKHBhcmFtTmFtZXMuc2l6ZSgpID09IHBhcmFtVmFsdWVzLnNpemUoKSk7Ci0KLSAg
ICB1bnNpZ25lZCBzaXplID0gcGFyYW1OYW1lcy5zaXplKCk7Ci0gICAgdW5zaWduZWQgcGFyYW1D
b3VudCA9IDA7Ci0KLSAgICBtX3BhcmFtTmFtZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqKj4o
ZmFzdE1hbGxvYyhzaXplb2YoY2hhciopICogc2l6ZSkpOwotICAgIG1fcGFyYW1WYWx1ZXMgPSBy
ZWludGVycHJldF9jYXN0PGNoYXIqKj4oZmFzdE1hbGxvYyhzaXplb2YoY2hhciopICogc2l6ZSkp
OwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBp
ZiAobV9wbHVnaW4tPnF1aXJrcygpLmNvbnRhaW5zKFBsdWdpblF1aXJrUmVtb3ZlV2luZG93bGVz
c1ZpZGVvUGFyYW0pICYmIGVxdWFsSWdub3JpbmdDYXNlKHBhcmFtTmFtZXNbaV0sICJ3aW5kb3ds
ZXNzdmlkZW8iKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIG1fcGFyYW1OYW1l
c1twYXJhbUNvdW50XSA9IGNyZWF0ZVVURjhTdHJpbmcocGFyYW1OYW1lc1tpXSk7Ci0gICAgICAg
IG1fcGFyYW1WYWx1ZXNbcGFyYW1Db3VudF0gPSBjcmVhdGVVVEY4U3RyaW5nKHBhcmFtVmFsdWVz
W2ldKTsKLQotICAgICAgICBwYXJhbUNvdW50Kys7Ci0gICAgfQotCi0gICAgbV9wYXJhbUNvdW50
ID0gcGFyYW1Db3VudDsKLX0KLQotUGx1Z2luVmlldzo6UGx1Z2luVmlldyhGcmFtZSogcGFyZW50
RnJhbWUsIGNvbnN0IEludFNpemUmIHNpemUsIFBsdWdpblBhY2thZ2UqIHBsdWdpbiwgRWxlbWVu
dCogZWxlbWVudCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGFyYW1O
YW1lcywgY29uc3QgVmVjdG9yPFN0cmluZz4mIHBhcmFtVmFsdWVzLCBjb25zdCBTdHJpbmcmIG1p
bWVUeXBlLCBib29sIGxvYWRNYW51YWxseSkKLSAgICA6IG1fcGFyZW50RnJhbWUocGFyZW50RnJh
bWUpCi0gICAgLCBtX3BsdWdpbihwbHVnaW4pCi0gICAgLCBtX2VsZW1lbnQoZWxlbWVudCkKLSAg
ICAsIG1faXNTdGFydGVkKGZhbHNlKQotICAgICwgbV91cmwodXJsKQotICAgICwgbV9iYXNlVVJM
KG1fcGFyZW50RnJhbWUtPmxvYWRlcigpLT5jb21wbGV0ZVVSTChtX3BhcmVudEZyYW1lLT5kb2N1
bWVudCgpLT5iYXNlVVJMKCkuc3RyaW5nKCkpKQotICAgICwgbV9zdGF0dXMoUGx1Z2luU3RhdHVz
TG9hZGVkU3VjY2Vzc2Z1bGx5KQotICAgICwgbV9yZXF1ZXN0VGltZXIodGhpcywgJlBsdWdpblZp
ZXc6OnJlcXVlc3RUaW1lckZpcmVkKQotICAgICwgbV9pbnZhbGlkYXRlVGltZXIodGhpcywgJlBs
dWdpblZpZXc6OmludmFsaWRhdGVUaW1lckZpcmVkKQotICAgICwgbV9wb3BQb3B1cHNTdGF0ZVRp
bWVyKHRoaXMsICZQbHVnaW5WaWV3Ojpwb3BQb3B1cHNTdGF0ZVRpbWVyRmlyZWQpCi0gICAgLCBt
X3BhcmFtTmFtZXMoMCkKLSAgICAsIG1fcGFyYW1WYWx1ZXMoMCkKLSAgICAsIG1fd2luZG93KDAp
Ci0gICAgLCBtX3BsdWdpblduZFByb2MoMCkKLSAgICAsIG1faXNXaW5kb3dlZCh0cnVlKQotICAg
ICwgbV9pc1RyYW5zcGFyZW50KGZhbHNlKQotICAgICwgbV9pc1Zpc2libGUoZmFsc2UpCi0gICAg
LCBtX2F0dGFjaGVkVG9XaW5kb3coZmFsc2UpCi0gICAgLCBtX2hhdmVJbml0aWFsaXplZChmYWxz
ZSkKLSAgICAsIG1fbGFzdE1lc3NhZ2UoMCkKLSAgICAsIG1faXNDYWxsaW5nUGx1Z2luV25kUHJv
YyhmYWxzZSkKLSAgICAsIG1fbG9hZE1hbnVhbGx5KGxvYWRNYW51YWxseSkKLSAgICAsIG1fbWFu
dWFsU3RyZWFtKDApCi17Ci0gICAgaWYgKCFtX3BsdWdpbikgewotICAgICAgICBtX3N0YXR1cyA9
IFBsdWdpblN0YXR1c0Nhbk5vdEZpbmRQbHVnaW47Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBtX2luc3RhbmNlID0gJm1faW5zdGFuY2VTdHJ1Y3Q7Ci0gICAgbV9pbnN0YW5jZS0+bmRh
dGEgPSB0aGlzOwotCi0gICAgbV9taW1lVHlwZSA9IG1pbWVUeXBlLnV0ZjgoKTsKLQotICAgIHNl
dFBhcmFtZXRlcnMocGFyYW1OYW1lcywgcGFyYW1WYWx1ZXMpOwotCi0gICAgbV9tb2RlID0gbV9s
b2FkTWFudWFsbHkgPyBOUF9GVUxMIDogTlBfRU1CRUQ7Ci0KLSAgICByZXNpemUoc2l6ZSk7Ci19
Ci0KLXZvaWQgUGx1Z2luVmlldzo6aW5pdCgpCi17Ci0gICAgaWYgKG1faGF2ZUluaXRpYWxpemVk
KQotICAgICAgICByZXR1cm47Ci0gICAgbV9oYXZlSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0gICAg
aWYgKCFtX3BsdWdpbikgewotICAgICAgICBBU1NFUlQobV9zdGF0dXMgPT0gUGx1Z2luU3RhdHVz
Q2FuTm90RmluZFBsdWdpbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIW1f
cGx1Z2luLT5sb2FkKCkpIHsKLSAgICAgICAgbV9wbHVnaW4gPSAwOwotICAgICAgICBtX3N0YXR1
cyA9IFBsdWdpblN0YXR1c0Nhbk5vdExvYWRQbHVnaW47Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICBpZiAoIXN0YXJ0KCkpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBQbHVnaW5TdGF0dXND
YW5Ob3RMb2FkUGx1Z2luOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1faXNX
aW5kb3dlZCkgewotICAgICAgICByZWdpc3RlclBsdWdpblZpZXcoKTsKLQotICAgICAgICBEV09S
RCBmbGFncyA9IFdTX0NISUxEOwotICAgICAgICBpZiAobV9pc1Zpc2libGUpCi0gICAgICAgICAg
ICBmbGFncyB8PSBXU19WSVNJQkxFOwotCi0gICAgICAgIG1fd2luZG93ID0gQ3JlYXRlV2luZG93
RXgoMCwga1dlYlBsdWdpblZpZXdkb3dDbGFzc05hbWUsIDAsIGZsYWdzLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIG1fcGFyZW50RnJhbWUtPnZpZXcoKS0+
Y29udGFpbmluZ1dpbmRvdygpLCAwLCBQYWdlOjppbnN0YW5jZUhhbmRsZSgpLCAwKTsKLSAgICAg
ICAgCi0gICAgICAgIC8vIENhbGxpbmcgU2V0V2luZG93TG9uZ1B0ckEgaGVyZSBtYWtlcyB0aGUg
d2luZG93IHByb2MgQVNDSUksIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGF0IGxlYXN0Ci0gICAgICAg
IC8vIHRoZSBTaG9ja3dhdmUgRGlyZWN0b3IgcGx1Zy1pbi4KLSAgICAgICAgOjpTZXRXaW5kb3dM
b25nUHRyQShtX3dpbmRvdywgR1dMX1dORFBST0MsIChMT05HKURlZldpbmRvd1Byb2NBKTsKLQot
ICAgICAgICBTZXRQcm9wKG1fd2luZG93LCBrV2ViUGx1Z2luVmlld1Byb3BlcnR5LCB0aGlzKTsK
LQotICAgICAgICBtX25wV2luZG93LnR5cGUgPSBOUFdpbmRvd1R5cGVXaW5kb3c7Ci0gICAgICAg
IG1fbnBXaW5kb3cud2luZG93ID0gbV93aW5kb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9u
cFdpbmRvdy50eXBlID0gTlBXaW5kb3dUeXBlRHJhd2FibGU7Ci0gICAgICAgIG1fbnBXaW5kb3cu
d2luZG93ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIW1fcGx1Z2luLT5xdWlya3MoKS5jb250YWlu
cyhQbHVnaW5RdWlya0RlZmVyRmlyc3RTZXRXaW5kb3dDYWxsKSkKLSAgICAgICAgc2V0TlBXaW5k
b3dSZWN0KGZyYW1lR2VvbWV0cnkoKSk7Ci0KLSAgICBtX3N0YXR1cyA9IFBsdWdpblN0YXR1c0xv
YWRlZFN1Y2Nlc3NmdWxseTsKLX0KLQotdm9pZCBQbHVnaW5WaWV3OjpkaWRSZWNlaXZlUmVzcG9u
c2UoY29uc3QgUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9uc2UpCi17Ci0gICAgQVNTRVJUKG1fbG9h
ZE1hbnVhbGx5KTsKLSAgICBBU1NFUlQoIW1fbWFudWFsU3RyZWFtKTsKLQotICAgIG1fbWFudWFs
U3RyZWFtID0gbmV3IFBsdWdpblN0cmVhbSh0aGlzLCBtX3BhcmVudEZyYW1lLCBtX3BhcmVudEZy
YW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKS0+cmVxdWVzdCgpLCBmYWxzZSwg
MCwgcGx1Z2luKCktPnBsdWdpbkZ1bmNzKCksIGluc3RhbmNlKCksIG1fcGx1Z2luLT5xdWlya3Mo
KSk7Ci0gICAgbV9tYW51YWxTdHJlYW0tPnNldExvYWRNYW51YWxseSh0cnVlKTsKLQotICAgIG1f
bWFudWFsU3RyZWFtLT5kaWRSZWNlaXZlUmVzcG9uc2UoMCwgcmVzcG9uc2UpOwotfQotCi12b2lk
IFBsdWdpblZpZXc6OmRpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqIGRhdGEsIGludCBsZW5ndGgp
Ci17Ci0gICAgQVNTRVJUKG1fbG9hZE1hbnVhbGx5KTsKLSAgICBBU1NFUlQobV9tYW51YWxTdHJl
YW0pOwotICAgIAotICAgIG1fbWFudWFsU3RyZWFtLT5kaWRSZWNlaXZlRGF0YSgwLCBkYXRhLCBs
ZW5ndGgpOwotfQotCi12b2lkIFBsdWdpblZpZXc6OmRpZEZpbmlzaExvYWRpbmcoKQotewotICAg
IEFTU0VSVChtX2xvYWRNYW51YWxseSk7Ci0gICAgQVNTRVJUKG1fbWFudWFsU3RyZWFtKTsKLQot
ICAgIG1fbWFudWFsU3RyZWFtLT5kaWRGaW5pc2hMb2FkaW5nKDApOwotfQotCi12b2lkIFBsdWdp
blZpZXc6OmRpZEZhaWwoY29uc3QgUmVzb3VyY2VFcnJvciYgZXJyb3IpCi17Ci0gICAgQVNTRVJU
KG1fbG9hZE1hbnVhbGx5KTsKLSAgICBBU1NFUlQobV9tYW51YWxTdHJlYW0pOwotCi0gICAgbV9t
YW51YWxTdHJlYW0tPmRpZEZhaWwoMCwgZXJyb3IpOwotfQotCi12b2lkIFBsdWdpblZpZXc6OnNl
dENhbGxpbmdQbHVnaW4oYm9vbCBiKSBjb25zdAotewotICAgIGlmICghbV9wbHVnaW4tPnF1aXJr
cygpLmNvbnRhaW5zKFBsdWdpblF1aXJrSGFzTW9kYWxNZXNzYWdlTG9vcCkpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIGlmIChiKQotICAgICAgICArK3NfY2FsbGluZ1BsdWdpbjsKLSAgICBlbHNl
Ci0gICAgICAgIC0tc19jYWxsaW5nUGx1Z2luOwotCi0gICAgQVNTRVJUKHNfY2FsbGluZ1BsdWdp
biA+PSAwKTsKLX0KLQotYm9vbCBQbHVnaW5WaWV3Ojppc0NhbGxpbmdQbHVnaW4oKQotewotICAg
IHJldHVybiBzX2NhbGxpbmdQbHVnaW4gPiAwOwotfQotCi1QbHVnaW5WaWV3KiBQbHVnaW5WaWV3
OjpjcmVhdGUoRnJhbWUqIHBhcmVudEZyYW1lLCBjb25zdCBJbnRTaXplJiBzaXplLCBFbGVtZW50
KiBlbGVtZW50LCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBwYXJhbU5h
bWVzLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgcGFyYW1WYWx1ZXMsIGNvbnN0IFN0cmluZyYgbWlt
ZVR5cGUsIGJvb2wgbG9hZE1hbnVhbGx5KQotewotICAgIC8vIGlmIHdlIGZhaWwgdG8gZmluZCBh
IHBsdWdpbiBmb3IgdGhpcyBNSU1FIHR5cGUsIGZpbmRQbHVnaW4gd2lsbCBzZWFyY2ggZm9yCi0g
ICAgLy8gYSBwbHVnaW4gYnkgdGhlIGZpbGUgZXh0ZW5zaW9uIGFuZCB1cGRhdGUgdGhlIE1JTUUg
dHlwZSwgc28gcGFzcyBhIG11dGFibGUgU3RyaW5nCi0gICAgU3RyaW5nIG1pbWVUeXBlQ29weSA9
IG1pbWVUeXBlOwotICAgIFBsdWdpblBhY2thZ2UqIHBsdWdpbiA9IFBsdWdpbkRhdGFiYXNlOjpp
bnN0YWxsZWRQbHVnaW5zKCktPmZpbmRQbHVnaW4odXJsLCBtaW1lVHlwZUNvcHkpOwotCi0gICAg
Ly8gTm8gcGx1Z2luIHdhcyBmb3VuZCwgdHJ5IHJlZnJlc2hpbmcgdGhlIGRhdGFiYXNlIGFuZCBz
ZWFyY2hpbmcgYWdhaW4KLSAgICBpZiAoIXBsdWdpbiAmJiBQbHVnaW5EYXRhYmFzZTo6aW5zdGFs
bGVkUGx1Z2lucygpLT5yZWZyZXNoKCkpIHsKLSAgICAgICAgbWltZVR5cGVDb3B5ID0gbWltZVR5
cGU7Ci0gICAgICAgIHBsdWdpbiA9IFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCkt
PmZpbmRQbHVnaW4odXJsLCBtaW1lVHlwZUNvcHkpOwotICAgIH0KLQotICAgIHJldHVybiBuZXcg
UGx1Z2luVmlldyhwYXJlbnRGcmFtZSwgc2l6ZSwgcGx1Z2luLCBlbGVtZW50LCB1cmwsIHBhcmFt
TmFtZXMsIHBhcmFtVmFsdWVzLCBtaW1lVHlwZUNvcHksIGxvYWRNYW51YWxseSk7CisgICAgaWYg
KGlzSW5saW5lTWVzc2FnZShtZXNzYWdlKSkgeworICAgICAgICBtZXNzYWdlLT5uZXh0ID0gbV9m
cmVlSW5saW5lTWVzc2FnZXM7CisgICAgICAgIG1fZnJlZUlubGluZU1lc3NhZ2VzID0gbWVzc2Fn
ZTsKKyAgICB9IGVsc2UKKyAgICAgICAgZGVsZXRlIG1lc3NhZ2U7CiB9CiAKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGx1Z2lucy93aW4vUGx1Z2luTWVzc2FnZVRocm90
dGxlcldpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGx1Z2lucy93aW4vUGx1Z2luTWVzc2Fn
ZVRocm90dGxlcldpbi5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbHVnaW5zL3dpbi9QbHVn
aW5NZXNzYWdlVGhyb3R0bGVyV2luLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgUGx1Z2luTWVzc2FnZVRocm90dGxlcldpbl9I
CisjZGVmaW5lIFBsdWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW5fSAorCisjaW5jbHVkZSAiVGltZXIu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIFBsdWdpblZpZXc7CisKKyAgICBz
dHJ1Y3QgUGx1Z2luTWVzc2FnZSB7CisgICAgICAgIEhXTkQgaFduZDsKKyAgICAgICAgVUlOVCBt
c2c7CisgICAgICAgIFdQQVJBTSB3UGFyYW07CisgICAgICAgIExQQVJBTSBsUGFyYW07CisKKyAg
ICAgICAgc3RydWN0IFBsdWdpbk1lc3NhZ2UqIG5leHQ7CisgICAgfTsKKworICAgIGNsYXNzIFBs
dWdpbk1lc3NhZ2VUaHJvdHRsZXJXaW4geworICAgIHB1YmxpYzoKKyAgICAgICAgUGx1Z2luTWVz
c2FnZVRocm90dGxlcldpbihQbHVnaW5WaWV3KiBwbHVnaW5WaWV3KTsKKyAgICAgICAgflBsdWdp
bk1lc3NhZ2VUaHJvdHRsZXJXaW4oKTsKKworICAgICAgICB2b2lkIGFwcGVuZE1lc3NhZ2UoSFdO
RCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CisKKyAgICBw
cml2YXRlOgorICAgICAgICB2b2lkIG1lc3NhZ2VUaHJvdHRsZVRpbWVyRmlyZWQoVGltZXI8UGx1
Z2luTWVzc2FnZVRocm90dGxlcldpbj4qKTsKKyAgICAgICAgUGx1Z2luTWVzc2FnZSogYWxsb2Nh
dGVNZXNzYWdlKCk7CisgICAgICAgIGJvb2wgaXNJbmxpbmVNZXNzYWdlKFBsdWdpbk1lc3NhZ2Uq
IG1lc3NhZ2UpOworICAgICAgICB2b2lkIGZyZWVNZXNzYWdlKFBsdWdpbk1lc3NhZ2UqIG1lc3Nh
Z2UpOworCisgICAgICAgIFBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKKyAgICAgICAgUGx1Z2lu
TWVzc2FnZSogbV9iYWNrOworICAgICAgICBQbHVnaW5NZXNzYWdlKiBtX2Zyb250OworCisgICAg
ICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtSW5saW5lTWVzc2FnZXMgPSA0OworICAgICAgICBQbHVn
aW5NZXNzYWdlIG1faW5saW5lTWVzc2FnZXNbTnVtSW5saW5lTWVzc2FnZXNdOworICAgICAgICBQ
bHVnaW5NZXNzYWdlKiBtX2ZyZWVJbmxpbmVNZXNzYWdlczsKKworICAgICAgICBUaW1lcjxQbHVn
aW5NZXNzYWdlVGhyb3R0bGVyV2luPiBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyOworICAgIH07CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BsdWdpbnMv
d2luL1BsdWdpblZpZXdXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGx1Z2lucy93aW4v
UGx1Z2luVmlld1dpbi5jcHAJKHJldmlzaW9uIDMxMTAyKQorKysgV2ViQ29yZS9wbHVnaW5zL3dp
bi9QbHVnaW5WaWV3V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTcsMTE2ICs5Nyw4IEBAIHBy
aXZhdGU6CiAgICAgYm9vbCBtX3Nob3VsZEFsbG93UG9wdXBzOwogfTsKIAotc3RhdGljIGNvbnN0
IGRvdWJsZSBNZXNzYWdlVGhyb3R0bGVUaW1lSW50ZXJ2YWwgPSAwLjAwMTsKIHN0YXRpYyBpbnQg
c19jYWxsaW5nUGx1Z2luOwogCi1jbGFzcyBQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luIHsKLXB1
YmxpYzoKLSAgICBQbHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luKFBsdWdpblZpZXcqIHBsdWdpblZp
ZXcpCi0gICAgICAgIDogbV9iYWNrKDApLCBtX2Zyb250KDApCi0gICAgICAgICwgbV9wbHVnaW5W
aWV3KHBsdWdpblZpZXcpCi0gICAgICAgICwgbV9tZXNzYWdlVGhyb3R0bGVUaW1lcih0aGlzLCAm
UGx1Z2luTWVzc2FnZVRocm90dGxlcldpbjo6bWVzc2FnZVRocm90dGxlVGltZXJGaXJlZCkKLSAg
ICB7Ci0gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCB3aXRoIG91ciBpbmxpbmUg
bWVzc2FnZXMKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bUlubGluZU1lc3Nh
Z2VzIC0gMTsgaSsrKQotICAgICAgICAgICAgbV9pbmxpbmVNZXNzYWdlc1tpXS5uZXh0ID0gJm1f
aW5saW5lTWVzc2FnZXNbaSArIDFdOwotICAgICAgICBtX2lubGluZU1lc3NhZ2VzW051bUlubGlu
ZU1lc3NhZ2VzIC0gMV0ubmV4dCA9IDA7Ci0gICAgICAgIG1fZnJlZUlubGluZU1lc3NhZ2VzID0g
Jm1faW5saW5lTWVzc2FnZXNbMF07Ci0gICAgfQotCi0gICAgflBsdWdpbk1lc3NhZ2VUaHJvdHRs
ZXJXaW4oKQotICAgIHsKLSAgICAgICAgUGx1Z2luTWVzc2FnZSogbmV4dDsKLSAgICAKLSAgICAg
ICAgZm9yIChQbHVnaW5NZXNzYWdlKiBtZXNzYWdlID0gbV9mcm9udDsgbWVzc2FnZTsgbWVzc2Fn
ZSA9IG5leHQpIHsKLSAgICAgICAgICAgIG5leHQgPSBtZXNzYWdlLT5uZXh0OwotICAgICAgICAg
ICAgZnJlZU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAK
LSAgICB2b2lkIGFwcGVuZE1lc3NhZ2UoSFdORCBoV25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJh
bSwgTFBBUkFNIGxQYXJhbSkgCi0gICAgewotICAgICAgICBQbHVnaW5NZXNzYWdlKiBtZXNzYWdl
ID0gYWxsb2NhdGVNZXNzYWdlKCk7Ci0KLSAgICAgICAgbWVzc2FnZS0+aFduZCA9IGhXbmQ7Ci0g
ICAgICAgIG1lc3NhZ2UtPm1zZyA9IG1zZzsKLSAgICAgICAgbWVzc2FnZS0+d1BhcmFtID0gd1Bh
cmFtOwotICAgICAgICBtZXNzYWdlLT5sUGFyYW0gPSBsUGFyYW07Ci0gICAgICAgIG1lc3NhZ2Ut
Pm5leHQgPSAwOwotCi0gICAgICAgIGlmIChtX2JhY2spCi0gICAgICAgICAgICBtX2JhY2stPm5l
eHQgPSBtZXNzYWdlOwotICAgICAgICBtX2JhY2sgPSBtZXNzYWdlOwotICAgICAgICBpZiAoIW1f
ZnJvbnQpCi0gICAgICAgICAgICBtX2Zyb250ID0gbWVzc2FnZTsKLQotICAgICAgICBpZiAoIW1f
bWVzc2FnZVRocm90dGxlVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIG1fbWVzc2FnZVRo
cm90dGxlVGltZXIuc3RhcnRPbmVTaG90KE1lc3NhZ2VUaHJvdHRsZVRpbWVJbnRlcnZhbCk7Ci0g
ICAgfQotCi1wcml2YXRlOgotICAgIHN0cnVjdCBQbHVnaW5NZXNzYWdlIHsKLSAgICAgICAgSFdO
RCBoV25kOwotICAgICAgICBVSU5UIG1zZzsKLSAgICAgICAgV1BBUkFNIHdQYXJhbTsKLSAgICAg
ICAgTFBBUkFNIGxQYXJhbTsKLQotICAgICAgICBzdHJ1Y3QgUGx1Z2luTWVzc2FnZSogbmV4dDsK
LSAgICB9OwotICAgIAotICAgIHZvaWQgbWVzc2FnZVRocm90dGxlVGltZXJGaXJlZChUaW1lcjxQ
bHVnaW5NZXNzYWdlVGhyb3R0bGVyV2luPiopCi0gICAgewotICAgICAgICBQbHVnaW5NZXNzYWdl
KiBtZXNzYWdlID0gbV9mcm9udDsKLSAgICAgICAgbV9mcm9udCA9IG1fZnJvbnQtPm5leHQ7Ci0g
ICAgICAgIGlmIChtZXNzYWdlID09IG1fYmFjaykKLSAgICAgICAgICAgIG1fYmFjayA9IDA7Ci0K
LSAgICAgICAgOjpDYWxsV2luZG93UHJvYyhtX3BsdWdpblZpZXctPnBsdWdpblduZFByb2MoKSwg
bWVzc2FnZS0+aFduZCwgbWVzc2FnZS0+bXNnLCBtZXNzYWdlLT53UGFyYW0sIG1lc3NhZ2UtPmxQ
YXJhbSk7Ci0KLSAgICAgICAgZnJlZU1lc3NhZ2UobWVzc2FnZSk7Ci0KLSAgICAgICAgaWYgKG1f
ZnJvbnQpCi0gICAgICAgICAgICBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyLnN0YXJ0T25lU2hvdChN
ZXNzYWdlVGhyb3R0bGVUaW1lSW50ZXJ2YWwpOwotICAgIH0KLQotICAgIFBsdWdpbk1lc3NhZ2Uq
IGFsbG9jYXRlTWVzc2FnZSgpCi0gICAgewotICAgICAgICBQbHVnaW5NZXNzYWdlICptZXNzYWdl
OwotCi0gICAgICAgIGlmIChtX2ZyZWVJbmxpbmVNZXNzYWdlcykgewotICAgICAgICAgICAgbWVz
c2FnZSA9IG1fZnJlZUlubGluZU1lc3NhZ2VzOwotICAgICAgICAgICAgbV9mcmVlSW5saW5lTWVz
c2FnZXMgPSBtZXNzYWdlLT5uZXh0OwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1lc3Nh
Z2UgPSBuZXcgUGx1Z2luTWVzc2FnZTsKLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9
Ci0KLSAgICBib29sIGlzSW5saW5lTWVzc2FnZShQbHVnaW5NZXNzYWdlKiBtZXNzYWdlKSAKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBtZXNzYWdlID49ICZtX2lubGluZU1lc3NhZ2VzWzBdICYmIG1l
c3NhZ2UgPD0gJm1faW5saW5lTWVzc2FnZXNbTnVtSW5saW5lTWVzc2FnZXMgLSAxXTsKLSAgICB9
Ci0KLSAgICB2b2lkIGZyZWVNZXNzYWdlKFBsdWdpbk1lc3NhZ2UqIG1lc3NhZ2UpIAotICAgIHsK
LSAgICAgICAgaWYgKGlzSW5saW5lTWVzc2FnZShtZXNzYWdlKSkgewotICAgICAgICAgICAgbWVz
c2FnZS0+bmV4dCA9IG1fZnJlZUlubGluZU1lc3NhZ2VzOwotICAgICAgICAgICAgbV9mcmVlSW5s
aW5lTWVzc2FnZXMgPSBtZXNzYWdlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGRlbGV0
ZSBtZXNzYWdlOwotICAgIH0KLQotICAgIFBsdWdpblZpZXcqIG1fcGx1Z2luVmlldzsKLSAgICBQ
bHVnaW5NZXNzYWdlKiBtX2JhY2s7Ci0gICAgUGx1Z2luTWVzc2FnZSogbV9mcm9udDsKLQotICAg
IHN0YXRpYyBjb25zdCBpbnQgTnVtSW5saW5lTWVzc2FnZXMgPSA0OwotICAgIFBsdWdpbk1lc3Nh
Z2UgbV9pbmxpbmVNZXNzYWdlc1tOdW1JbmxpbmVNZXNzYWdlc107Ci0gICAgUGx1Z2luTWVzc2Fn
ZSogbV9mcmVlSW5saW5lTWVzc2FnZXM7Ci0KLSAgICBUaW1lcjxQbHVnaW5NZXNzYWdlVGhyb3R0
bGVyV2luPiBtX21lc3NhZ2VUaHJvdHRsZVRpbWVyOwotfTsKLQogc3RhdGljIFN0cmluZyBzY3Jp
cHRTdHJpbmdJZkphdmFTY3JpcHRVUkwoY29uc3QgS1VSTCYgdXJsKQogewogICAgIGlmICghdXJs
LnByb3RvY29sSXMoImphdmFzY3JpcHQiKSkK
</data>
<flag name="review"
          id="8681"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
      

    </bug>

</bugzilla>