<?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>37665</bug_id>
          
          <creation_ts>2010-04-15 11:24:35 -0700</creation_ts>
          <short_desc>[Qt] Rename QtLauncher to QtTestBrowser</short_desc>
          <delta_ts>2010-05-15 13:30:49 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35784</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Hausmann">hausmann</reporter>
          <assigned_to name="Simon Hausmann">hausmann</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>jesus</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>212944</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-04-15 11:24:35 -0700</bug_when>
    <thetext>[Qt] Rename QtLauncher to QtTestBrowser</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212948</commentid>
    <comment_count>1</comment_count>
      <attachid>53455</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-04-15 11:27:44 -0700</bug_when>
    <thetext>Created attachment 53455
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212971</commentid>
    <comment_count>2</comment_count>
      <attachid>53461</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-04-15 12:05:17 -0700</bug_when>
    <thetext>Created attachment 53461
Rename</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212973</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-15 12:11:06 -0700</bug_when>
    <thetext>Attachment 53461 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Last 3072 characters of output:
6:  Alphabetical sorting problem.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/webpage.cpp
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/mainwindow.h
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/mainwindow.cpp
WebKitTools/QtTestBrowser/webinspector.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/useragentlist.txt
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/urlloader.h
WebKitTools/QtTestBrowser/webpage.cpp:33:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WebKitTools/QtTestBrowser/webpage.cpp:38:  Alphabetical sorting problem.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/urlloader.cpp
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/locationedit.cpp
WebKitTools/QtTestBrowser/main.cpp:33:  Found other header before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WebKitTools/QtTestBrowser/main.cpp:67:  Alphabetical sorting problem.  [build/include_order] [4]
WebKitTools/QtTestBrowser/locationedit.cpp:28:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WebKitTools/QtTestBrowser/mainwindow.h:37:  Alphabetical sorting problem.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/webview.h
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/utils.cpp
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/webview.cpp
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/locationedit.h
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/QtLauncher.pro
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/QtLauncher.qrc
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/utils.h
WebKitTools/QtTestBrowser/utils.cpp:28:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/main.cpp
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/webinspector.h
WebKitTools/QtTestBrowser/urlloader.cpp:29:  Found header this file implements before WebCore config.h. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
WebKitTools/QtTestBrowser/urlloader.cpp:32:  Alphabetical sorting problem.  [build/include_order] [4]
WARNING: Skipping non-existent file: WebKitTools/QtLauncher/webpage.h
WebKitTools/QtTestBrowser/webview.h:38:  Alphabetical sorting problem.  [build/include_order] [4]
WebKitTools/QtTestBrowser/webview.h:39:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 15 in 22 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>214404</commentid>
    <comment_count>4</comment_count>
      <attachid>53461</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2010-04-19 18:13:58 -0700</bug_when>
    <thetext>Comment on attachment 53461
Rename

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215252</commentid>
    <comment_count>5</comment_count>
      <attachid>53461</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-21 04:49:40 -0700</bug_when>
    <thetext>Comment on attachment 53461
Rename

Rejecting patch 53461 from commit-queue.

Failed to run &quot;[&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, &apos;--reviewer&apos;, &apos;Antti Koivisto&apos;, &apos;--force&apos;]&quot; exit_code: 1
Last 500 characters of output:
Tools/QtLauncher/webview.cpp
rm &apos;WebKitTools/QtLauncher/webview.cpp&apos;
patching file WebKitTools/QtLauncher/webview.h
rm &apos;WebKitTools/QtLauncher/webview.h&apos;
patching file WebKitTools/QtTestBrowser/QtTestBrowser.pro
patching file WebKitTools/QtTestBrowser/main.cpp
Hunk #1 succeeded at 1050 (offset 1 line).
Hunk #2 succeeded at 1069 (offset 1 line).
patching file WebKitTools/QtTestBrowser/useragentlist.txt
patching file WebKitTools/Scripts/run-launcher
patching file WebKitTools/Scripts/webkitdirs.pm

Full output: http://webkit-commit-queue.appspot.com/results/1792019</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225833</commentid>
    <comment_count>6</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-05-14 08:25:41 -0700</bug_when>
    <thetext>Committed r59474: &lt;http://trac.webkit.org/changeset/59474&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>225839</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-05-14 08:35:31 -0700</bug_when>
    <thetext>Revision r59474 cherry-picked into qtwebkit-2.0 with commit 41b8115b256ed43acdf1976447925d5c1c6071a7</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226323</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-05-15 13:30:10 -0700</bug_when>
    <thetext>Committed r59552: &lt;http://trac.webkit.org/changeset/59552&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53455</attachid>
            <date>2010-04-15 11:27:44 -0700</date>
            <delta_ts>2010-04-15 12:05:17 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-37665-20100415202741.patch</filename>
            <type>text/plain</type>
            <size>100926</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDU3NjU4
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDQt
MTUgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gUmVuYW1lIFF0TGF1
bmNoZXIgdG8gUXRUZXN0QnJvd3NlcgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNzY2NQorCisgICAgICAgICogV2ViS2l0LnBybzoKKwogMjAxMC0w
NC0wOSAgU2ltb24gSGF1c21hbm4gIDxzaW1vbi5oYXVzbWFubkBub2tpYS5jb20+CiAKICAgICAg
ICAgVW5yZXZpZXdlZCBjcmFzaCBmaXguCkluZGV4OiBXZWJLaXQucHJvCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC5wcm8JKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0LnBybwkod29ya2luZyBjb3B5
KQpAQCAtOCw3ICs4LDcgQEAgU1VCRElSUyArPSBcCiAgICAgICAgIFdlYkNvcmUKIAogIyBJZiB0
aGUgc291cmNlIGV4aXN0cywgYnVpbHQgaXQKLWV4aXN0cygkJFBXRC9XZWJLaXRUb29scy9RdExh
dW5jaGVyKTogU1VCRElSUyArPSBXZWJLaXRUb29scy9RdExhdW5jaGVyCitleGlzdHMoJCRQV0Qv
V2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlcik6IFNVQkRJUlMgKz0gV2ViS2l0VG9vbHMvUXRUZXN0
QnJvd3NlcgogZXhpc3RzKCQkUFdEL0phdmFTY3JpcHRDb3JlL2pzYy5wcm8pOiBTVUJESVJTICs9
IEphdmFTY3JpcHRDb3JlL2pzYy5wcm8KIGV4aXN0cygkJFBXRC9XZWJLaXQvcXQvdGVzdHMpOiBT
VUJESVJTICs9IFdlYktpdC9xdC90ZXN0cwogZXhpc3RzKCQkUFdEL1dlYktpdFRvb2xzL0R1bXBS
ZW5kZXJUcmVlL3F0L0R1bXBSZW5kZXJUcmVlLnBybyk6IFNVQkRJUlMgKz0gV2ViS2l0VG9vbHMv
RHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWUucHJvCkluZGV4OiBXZWJLaXRUb29scy9D
aGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1
NzY1OCkKKysrIFdlYktpdFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDQxIEBACisyMDEwLTA0LTE1ICBTaW1vbiBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lh
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
UXRdIFJlbmFtZSBRdExhdW5jaGVyIHRvIFF0VGVzdEJyb3dzZXIKKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NjUKKworICAgICAgICAqIFF0TGF1
bmNoZXI6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci9RdExhdW5jaGVyLnBybzogUmVt
b3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL1F0TGF1bmNoZXIucXJjOiBSZW1vdmVkLgorICAg
ICAgICAqIFF0TGF1bmNoZXIvbG9jYXRpb25lZGl0LmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBR
dExhdW5jaGVyL2xvY2F0aW9uZWRpdC5oOiBSZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNoZXIv
bWFpbi5jcHA6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci9tYWlud2luZG93LmNwcDog
UmVtb3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL21haW53aW5kb3cuaDogUmVtb3ZlZC4KKyAg
ICAgICAgKiBRdExhdW5jaGVyL3VybGxvYWRlci5jcHA6IFJlbW92ZWQuCisgICAgICAgICogUXRM
YXVuY2hlci91cmxsb2FkZXIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL3VzZXJh
Z2VudGxpc3QudHh0OiBSZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNoZXIvdXRpbHMuY3BwOiBS
ZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNoZXIvdXRpbHMuaDogUmVtb3ZlZC4KKyAgICAgICAg
KiBRdExhdW5jaGVyL3dlYmluc3BlY3Rvci5oOiBSZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNo
ZXIvd2VicGFnZS5jcHA6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci93ZWJwYWdlLmg6
IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci93ZWJ2aWV3LmNwcDogUmVtb3ZlZC4KKyAg
ICAgICAgKiBRdExhdW5jaGVyL3dlYnZpZXcuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBRdFRlc3RC
cm93c2VyOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyLgorICAgICAgICAqIFF0
VGVzdEJyb3dzZXIvUXRMYXVuY2hlci5wcm86IFJlbW92ZWQuCisgICAgICAgICogUXRUZXN0QnJv
d3Nlci9RdExhdW5jaGVyLnFyYzogUmVtb3ZlZC4KKyAgICAgICAgKiBRdFRlc3RCcm93c2VyL1F0
VGVzdEJyb3dzZXIucHJvOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL1F0TGF1
bmNoZXIucHJvLgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvUXRUZXN0QnJvd3Nlci5xcmM6IENv
cGllZCBmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvUXRMYXVuY2hlci5xcmMuCisgICAgICAg
ICogUXRUZXN0QnJvd3Nlci9tYWluLmNwcDoKKyAgICAgICAgKExhdW5jaGVyQXBwbGljYXRpb246
OkxhdW5jaGVyQXBwbGljYXRpb24pOgorICAgICAgICAoTGF1bmNoZXJBcHBsaWNhdGlvbjo6aGFu
ZGxlVXNlck9wdGlvbnMpOgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvdXNlcmFnZW50bGlzdC50
eHQ6CisgICAgICAgICogU2NyaXB0cy9ydW4tbGF1bmNoZXI6CisgICAgICAgICogU2NyaXB0cy93
ZWJraXRkaXJzLnBtOgorCiAyMDEwLTA0LTE0ICBBbmRlcnMgQ2FybHNzb24gIDxhbmRlcnNjYUBh
cHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBSb2Jlbi4KSW5kZXg6IFdlYktp
dFRvb2xzL1F0TGF1bmNoZXIvUXRMYXVuY2hlci5wcm8KPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9v
bHMvUXRMYXVuY2hlci9RdExhdW5jaGVyLnBybwkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRU
b29scy9RdExhdW5jaGVyL1F0TGF1bmNoZXIucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU2ICsw
LDAgQEAKLVRFTVBMQVRFID0gYXBwCi0KLVNPVVJDRVMgKz0gXAotICAgIGxvY2F0aW9uZWRpdC5j
cHAgXAotICAgIG1haW4uY3BwIFwKLSAgICBtYWlud2luZG93LmNwcCBcCi0gICAgdXJsbG9hZGVy
LmNwcCBcCi0gICAgdXRpbHMuY3BwIFwKLSAgICB3ZWJwYWdlLmNwcCBcCi0gICAgd2Vidmlldy5j
cHAgXAotCi1IRUFERVJTICs9IFwKLSAgICBsb2NhdGlvbmVkaXQuaCBcCi0gICAgbWFpbndpbmRv
dy5oIFwKLSAgICB1cmxsb2FkZXIuaCBcCi0gICAgdXRpbHMuaCBcCi0gICAgd2ViaW5zcGVjdG9y
LmggXAotICAgIHdlYnBhZ2UuaCBcCi0gICAgd2Vidmlldy5oIFwKLQotQ09ORklHIC09IGFwcF9i
dW5kbGUKLUNPTkZJRyArPSB1aXRvb2xzCi0KLWlzRW1wdHkoT1VUUFVUX0RJUik6IE9VVFBVVF9E
SVIgPSAuLi8uLgotaW5jbHVkZSguLi8uLi9XZWJLaXQucHJpKQotCi1ERVNURElSID0gJCRPVVRQ
VVRfRElSL2JpbgotCi1RVCArPSBuZXR3b3JrCi1tYWN4OlFUKz14bWwKLQotbGludXgtKiB7Ci0g
ICAgIyBGcm9tIENyZWF0b3IncyBzcmMvcnBhdGgucHJpOgotICAgICMgRG8gdGhlIHJwYXRoIGJ5
IGhhbmQgc2luY2UgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIE9SSUdJTiBpbiBRTUFLRV9SUEFU
SERJUgotICAgICMgdGhpcyBleHBhbmRzIHRvICRPUklHSU4gKGFmdGVyIHFtYWtlIGFuZCBtYWtl
KSwgaXQgZG9lcyBOT1QgcmVhZCBhIHFtYWtlIHZhci4KLSAgICBRTUFLRV9SUEFUSERJUiA9IFwk
XCRPUklHSU4vLi4vbGliICQkUU1BS0VfUlBBVEhESVIKLSAgICBNWV9SUEFUSCA9ICQkam9pbihR
TUFLRV9SUEFUSERJUiwgIjoiKQotCi0gICAgUU1BS0VfTEZMQUdTICs9IC1XbCwteixvcmlnaW4g
XCctV2wsLXJwYXRoLCQke01ZX1JQQVRIfVwnCi0gICAgUU1BS0VfUlBBVEhESVIgPQotfSBlbHNl
IHsKLSAgICBRTUFLRV9SUEFUSERJUiA9ICQkT1VUUFVUX0RJUi9saWIgJCRRTUFLRV9SUEFUSERJ
UgotfQotCi1zeW1iaWFuIHsKLSAgICBUQVJHRVQuVUlEMyA9IDB4QTAwMEU1NDMKLSAgICBUQVJH
RVQuQ0FQQUJJTElUWSA9IFJlYWRVc2VyRGF0YSBXcml0ZVVzZXJEYXRhIE5ldHdvcmtTZXJ2aWNl
cwotfQotCi1jb250YWlucyhRVF9DT05GSUcsIG9wZW5nbCkgewotICAgIFFUICs9IG9wZW5nbAot
ICAgIERFRklORVMgKz0gUVRfQ09ORklHVVJFRF9XSVRIX09QRU5HTAotfQotCi1SRVNPVVJDRVMg
Kz0gXAotICAgIFF0TGF1bmNoZXIucXJjCkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL1F0
TGF1bmNoZXIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvUXRMYXVu
Y2hlci5xcmMJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9RdExh
dW5jaGVyLnFyYwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICswLDAgQEAKLTxSQ0M+Ci0gICAgPHFy
ZXNvdXJjZSBwcmVmaXg9Ii8iPgotICAgICAgICA8ZmlsZT51c2VyYWdlbnRsaXN0LnR4dDwvZmls
ZT4KLSAgICA8L3FyZXNvdXJjZT4KLTwvUkNDPgpJbmRleDogV2ViS2l0VG9vbHMvUXRMYXVuY2hl
ci9sb2NhdGlvbmVkaXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIv
bG9jYXRpb25lZGl0LmNwcAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5j
aGVyL2xvY2F0aW9uZWRpdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsODAgKzAsMCBAQAotLyoK
LSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNp
ZGlhcnkoLWllcykKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
LSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRl
ICJsb2NhdGlvbmVkaXQuaCIKLQotTG9jYXRpb25FZGl0OjpMb2NhdGlvbkVkaXQoUVdpZGdldCog
cGFyZW50KQotICAgIDogUUxpbmVFZGl0KHBhcmVudCkKLSAgICAsIG1fcHJvZ3Jlc3MoMCkKLXsK
LSAgICBtX2NsZWFyVGltZXIuc2V0U2luZ2xlU2hvdCh0cnVlKTsKLSAgICBjb25uZWN0KCZtX2Ns
ZWFyVGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKHJlc2V0KCkpKTsKLX0KLQot
dm9pZCBMb2NhdGlvbkVkaXQ6OnNldFByb2dyZXNzKGludCBwcm9ncmVzcykKLXsKLSAgICBtX2Ns
ZWFyVGltZXIuc3RvcCgpOwotICAgIG1fcHJvZ3Jlc3MgPSBwcm9ncmVzczsKLSAgICB1cGRhdGUo
KTsKLX0KLQotdm9pZCBMb2NhdGlvbkVkaXQ6OnJlc2V0KCkKLXsKLSAgICBzZXRQcm9ncmVzcygw
KTsKLX0KLQotdm9pZCBMb2NhdGlvbkVkaXQ6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGV2KQot
ewotICAgIFFDb2xvciBiYWNrZ3JvdW5kQ29sb3IgPSBRQXBwbGljYXRpb246OnBhbGV0dGUoKS5j
b2xvcihRUGFsZXR0ZTo6QmFzZSk7Ci0gICAgUUNvbG9yIHByb2dyZXNzQ29sb3IgPSBRQ29sb3Io
MTIwLCAxODAsIDI0MCk7Ci0gICAgUVBhbGV0dGUgcCA9IHBhbGV0dGUoKTsKLQotICAgIGlmICgh
bV9wcm9ncmVzcykKLSAgICAgICAgcC5zZXRCcnVzaChRUGFsZXR0ZTo6QmFzZSwgYmFja2dyb3Vu
ZENvbG9yKTsKLSAgICBlbHNlIHsKLSAgICAgICAgUUxpbmVhckdyYWRpZW50IGdyYWRpZW50KDAs
IDAsIHdpZHRoKCksIDApOwotICAgICAgICBncmFkaWVudC5zZXRDb2xvckF0KDAsIHByb2dyZXNz
Q29sb3IpOwotICAgICAgICBncmFkaWVudC5zZXRDb2xvckF0KCgoZG91YmxlKSBtX3Byb2dyZXNz
KSAvIDEwMCwgcHJvZ3Jlc3NDb2xvcik7Ci0gICAgICAgIGlmIChtX3Byb2dyZXNzICE9IDEwMCkK
LSAgICAgICAgICAgIGdyYWRpZW50LnNldENvbG9yQXQoKGRvdWJsZSkgbV9wcm9ncmVzcyAvIDEw
MCArIDAuMDAxLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICBwLnNldEJydXNoKFFQYWxldHRl
OjpCYXNlLCBncmFkaWVudCk7Ci0gICAgfQotICAgIHNldFBhbGV0dGUocCk7Ci0KLSAgICBRTGlu
ZUVkaXQ6OnBhaW50RXZlbnQoZXYpOwotCi0gICAgaWYgKG1fcHJvZ3Jlc3MgPT0gMTAwKQotICAg
ICAgICBtX2NsZWFyVGltZXIuc3RhcnQoMTAwKTsKLX0KLQotdm9pZCBMb2NhdGlvbkVkaXQ6OmZv
Y3VzSW5FdmVudChRRm9jdXNFdmVudCogZXYpCi17Ci0gICAgUUxpbmVFZGl0Ojpmb2N1c0luRXZl
bnQoZXYpOwotI2lmZGVmIFFfV1NfTUFFTU9fNQotICAgIFFUaW1lcjo6c2luZ2xlU2hvdCgwLCB0
aGlzLCBTTE9UKHNlbGVjdEFsbCgpKSk7Ci0jZW5kaWYKLX0KSW5kZXg6IFdlYktpdFRvb2xzL1F0
TGF1bmNoZXIvbG9jYXRpb25lZGl0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVu
Y2hlci9sb2NhdGlvbmVkaXQuaAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExh
dW5jaGVyL2xvY2F0aW9uZWRpdC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU0ICswLDAgQEAKLS8q
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0g
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0g
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
Ci0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVm
IGxvY2F0aW9uZWRpdF9oCi0jZGVmaW5lIGxvY2F0aW9uZWRpdF9oCi0KLSNpbmNsdWRlIDxRdEd1
aT4KLQotY2xhc3MgTG9jYXRpb25FZGl0IDogcHVibGljIFFMaW5lRWRpdCB7Ci0gICAgUV9PQkpF
Q1QKLQotcHVibGljOgotICAgIExvY2F0aW9uRWRpdChRV2lkZ2V0KiBwYXJlbnQgPSAwKTsKLQot
cHVibGljIHNsb3RzOgotICAgIHZvaWQgc2V0UHJvZ3Jlc3MoaW50IHByb2dyZXNzKTsKLQotcHJp
dmF0ZSBzbG90czoKLSAgICB2b2lkIHJlc2V0KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFs
IHZvaWQgcGFpbnRFdmVudChRUGFpbnRFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBmb2N1c0lu
RXZlbnQoUUZvY3VzRXZlbnQqKTsKLQotcHJpdmF0ZToKLSAgICBpbnQgbV9wcm9ncmVzczsKLSAg
ICBRVGltZXIgbV9jbGVhclRpbWVyOwotfTsKLQotI2VuZGlmCkluZGV4OiBXZWJLaXRUb29scy9R
dExhdW5jaGVyL21haW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIv
bWFpbi5jcHAJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9tYWlu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwxMTk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRi
aWFzLmluPgotICogQ29weXJpZ2h0IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFpa29zQGtk
ZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5v
cmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICog
Q29weXJpZ2h0IChDKSAyMDA2IFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgotICoK
LSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
LSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgPFF0R3VpPgotI2luY2x1
ZGUgPFF0TmV0d29yay9RTmV0d29ya1JlcXVlc3Q+Ci0KLSNpZiBkZWZpbmVkKFFUX0NPTkZJR1VS
RURfV0lUSF9PUEVOR0wpCi0jaW5jbHVkZSA8UXRPcGVuR0wvUUdMV2lkZ2V0PgotI2VuZGlmCi0K
LSNpZiAhZGVmaW5lZChRVF9OT19QUklOVEVSKQotI2luY2x1ZGUgPFFQcmludFByZXZpZXdEaWFs
b2c+Ci0jZW5kaWYKLQotI2lmbmRlZiBRVF9OT19VSVRPT0xTCi0jaW5jbHVkZSA8UXRVaVRvb2xz
L1FVaUxvYWRlcj4KLSNlbmRpZgotCi0jaW5jbHVkZSA8UURlYnVnPgotCi0jaW5jbHVkZSA8Y3N0
ZGlvPgotI2luY2x1ZGUgPHFldmVudC5oPgotI2luY2x1ZGUgPHF3ZWJlbGVtZW50Lmg+Ci0jaW5j
bHVkZSA8cXdlYmZyYW1lLmg+Ci0jaW5jbHVkZSA8cXdlYmluc3BlY3Rvci5oPgotI2luY2x1ZGUg
PHF3ZWJzZXR0aW5ncy5oPgotCi0jaWZkZWYgUV9XU19NQUVNT181Ci0jaW5jbHVkZSA8cXgxMWlu
Zm9feDExLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm1haW53aW5kb3cuaCIKLSNpbmNsdWRlICJ1
cmxsb2FkZXIuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotI2luY2x1ZGUgIndlYmluc3BlY3Rvci5o
IgotI2luY2x1ZGUgIndlYnBhZ2UuaCIKLSNpbmNsdWRlICJ3ZWJ2aWV3LmgiCi0jaW5jbHVkZSAi
Li4vLi4vV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0Lmgi
Ci0KLSNpZmRlZiBRX1dTX01BRU1PXzUKLSNpbmNsdWRlIDxYMTEvWGF0b20uaD4KLSNpbmNsdWRl
IDxYMTEvWGxpYi5oPgotI3VuZGVmIEtleVByZXNzCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IGlu
dCBnRXhpdENsaWNrQXJlYSA9IDgwOwotc3RhdGljIGJvb2wgZ1VzZUdyYXBoaWNzVmlldyA9IGZh
bHNlOwotc3RhdGljIGJvb2wgZ1VzZUNvbXBvc2l0aW5nID0gdHJ1ZTsKLXN0YXRpYyBib29sIGdD
YWNoZVdlYlZpZXcgPSBmYWxzZTsKLXN0YXRpYyBib29sIGdTaG93RnJhbWVSYXRlID0gZmFsc2U7
Ci1zdGF0aWMgUUdyYXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlIGdWaWV3cG9ydFVwZGF0
ZU1vZGUgPSBRR3JhcGhpY3NWaWV3OjpNaW5pbWFsVmlld3BvcnRVcGRhdGU7Ci1zdGF0aWMgUVVy
bCBnSW5zcGVjdG9yVXJsOwotc3RhdGljIGJvb2wgZ1Jlc2l6ZXNUb0NvbnRlbnRzID0gZmFsc2U7
Ci1zdGF0aWMgYm9vbCBnVXNlVGlsZWRCYWNraW5nU3RvcmUgPSBmYWxzZTsKLQotI2lmIGRlZmlu
ZWQoUV9XU19NQUVNT181KSB8fCBkZWZpbmVkKFFfV1NfUzYwKQotc3RhdGljIGJvb2wgZ1VzZUZy
YW1lRmxhdHRlbmluZyA9IHRydWU7Ci0jZWxzZQotc3RhdGljIGJvb2wgZ1VzZUZyYW1lRmxhdHRl
bmluZyA9IGZhbHNlOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFUX0NPTkZJR1VSRURfV0lUSF9P
UEVOR0wpCi1zdGF0aWMgYm9vbCBnVXNlUUdMV2lkZ2V0Vmlld3BvcnQgPSBmYWxzZTsKLSNlbmRp
ZgotCi0KLWNsYXNzIExhdW5jaGVyV2luZG93IDogcHVibGljIE1haW5XaW5kb3cgewotICAgIFFf
T0JKRUNUCi0KLXB1YmxpYzoKLSAgICBMYXVuY2hlcldpbmRvdyhMYXVuY2hlcldpbmRvdyogb3Ro
ZXIgPSAwLCBib29sIHNoYXJlU2NlbmUgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCB+TGF1bmNoZXJX
aW5kb3coKTsKLQotICAgIHZpcnR1YWwgdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZXZl
bnQpOwotICAgIHZvaWQgZ3JhYlpvb21LZXlzKGJvb2wgZ3JhYik7Ci0KLSNpZiBRVF9WRVJTSU9O
ID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKLSAgICB2b2lkIHNlbmRUb3VjaEV2ZW50KCk7
Ci0jZW5kaWYKLQotICAgIGJvb2wgZXZlbnRGaWx0ZXIoUU9iamVjdCogb2JqLCBRRXZlbnQqIGV2
ZW50KTsKLQotcHJvdGVjdGVkIHNsb3RzOgotICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKLSAgICB2
b2lkIGxvYWRGaW5pc2hlZCgpOwotCi0gICAgdm9pZCBzaG93TGlua0hvdmVyKGNvbnN0IFFTdHJp
bmcgJmxpbmssIGNvbnN0IFFTdHJpbmcgJnRvb2xUaXApOwotCi0gICAgdm9pZCB6b29tSW4oKTsK
LSAgICB2b2lkIHpvb21PdXQoKTsKLSAgICB2b2lkIHJlc2V0Wm9vbSgpOwotICAgIHZvaWQgdG9n
Z2xlWm9vbVRleHRPbmx5KGJvb2wgb24pOwotICAgIHZvaWQgem9vbUFuaW1hdGlvbkZpbmlzaGVk
KCk7Ci0KLSAgICB2b2lkIHByaW50KCk7Ci0gICAgdm9pZCBzY3JlZW5zaG90KCk7Ci0KLSAgICB2
b2lkIHNldEVkaXRhYmxlKGJvb2wgb24pOwotCi0gICAgLyogdm9pZCBkdW1wUGx1Z2lucygpICov
Ci0gICAgdm9pZCBkdW1wSHRtbCgpOwotCi0gICAgdm9pZCBzZWxlY3RFbGVtZW50cygpOwotCi0g
ICAgdm9pZCBzZXRUb3VjaE1vY2tpbmcoYm9vbCBvbik7Ci0gICAgdm9pZCB0b2dnbGVBY2NlbGVy
YXRlZENvbXBvc2l0aW5nKGJvb2wgdG9nZ2xlKTsKLSAgICB2b2lkIHRvZ2dsZVRpbGVkQmFja2lu
Z1N0b3JlKGJvb2wgdG9nZ2xlKTsKLSAgICB2b2lkIHRvZ2dsZVJlc2l6ZXNUb0NvbnRlbnRzKGJv
b2wgdG9nZ2xlKTsKLQotICAgIHZvaWQgdG9nZ2xlV2ViR0woYm9vbCB0b2dnbGUpOwotICAgIHZv
aWQgaW5pdGlhbGl6ZVZpZXcoYm9vbCB1c2VHcmFwaGljc1ZpZXcgPSBmYWxzZSk7Ci0gICAgdm9p
ZCB0b2dnbGVTcGF0aWFsTmF2aWdhdGlvbihib29sIGIpOwotICAgIHZvaWQgdG9nZ2xlRnVsbFNj
cmVlbk1vZGUoYm9vbCBlbmFibGUpOwotICAgIHZvaWQgc2hvd0ZQUyhib29sIGVuYWJsZSk7Ci0g
ICAgdm9pZCBjaGFuZ2VWaWV3cG9ydFVwZGF0ZU1vZGUoaW50IG1vZGUpOwotICAgIHZvaWQgdG9n
Z2xlRnJhbWVGbGF0dGVuaW5nKGJvb2wgdG9nZ2xlKTsKLQotI2lmIGRlZmluZWQoUVRfQ09ORklH
VVJFRF9XSVRIX09QRU5HTCkKLSAgICB2b2lkIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0KGJvb2wg
ZW5hYmxlKTsKLSNlbmRpZgotCi0gICAgdm9pZCBzaG93VXNlckFnZW50RGlhbG9nKCk7Ci0KLXB1
YmxpYyBzbG90czoKLSAgICB2b2lkIG5ld1dpbmRvdygpOwotICAgIHZvaWQgY2xvbmVXaW5kb3co
KTsKLSAgICB2b2lkIHVwZGF0ZUZQUyhpbnQgZnBzKTsKLQotc2lnbmFsczoKLSAgICB2b2lkIGVu
dGVyZWRGdWxsU2NyZWVuTW9kZShib29sIG9uKTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIGNyZWF0
ZUNocm9tZSgpOwotICAgIHZvaWQgYXBwbHlab29tKCk7Ci0KLXByaXZhdGU6Ci0gICAgUVZlY3Rv
cjxpbnQ+IG1fem9vbUxldmVsczsKLSAgICBpbnQgbV9jdXJyZW50Wm9vbTsKLQotICAgIFFXaWRn
ZXQqIG1fdmlldzsKLSAgICBXZWJJbnNwZWN0b3IqIG1faW5zcGVjdG9yOwotCi0gICAgUUFjdGlv
biogbV9mb3JtYXRNZW51QWN0aW9uOwotICAgIFFBY3Rpb24qIG1fZmxpcEFuaW1hdGVkOwotICAg
IFFBY3Rpb24qIG1fZmxpcFlBbmltYXRlZDsKLQotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lP
Tl9DSEVDSyg0LCA2LCAwKQotICAgIFFQcm9wZXJ0eUFuaW1hdGlvbiogbV96b29tQW5pbWF0aW9u
OwotICAgIFFMaXN0PFFUb3VjaEV2ZW50OjpUb3VjaFBvaW50PiBtX3RvdWNoUG9pbnRzOwotICAg
IGJvb2wgbV90b3VjaE1vY2tpbmc7Ci0jZW5kaWYKLQotICAgIHZvaWQgaW5pdChib29sIHVzZUdy
YXBoaWNzVmlldyA9IGZhbHNlKTsKLSAgICBib29sIGlzR3JhcGhpY3NCYXNlZCgpIGNvbnN0Owot
ICAgIHZvaWQgYXBwbHlQcmVmcyhMYXVuY2hlcldpbmRvdyogb3RoZXIgPSAwKTsKLX07Ci0KLUxh
dW5jaGVyV2luZG93OjpMYXVuY2hlcldpbmRvdyhMYXVuY2hlcldpbmRvdyogb3RoZXIsIGJvb2wg
c2hhcmVTY2VuZSkKLSAgICA6IE1haW5XaW5kb3coKQotICAgICwgbV9jdXJyZW50Wm9vbSgxMDAp
Ci0gICAgLCBtX3ZpZXcoMCkKLSAgICAsIG1faW5zcGVjdG9yKDApCi0gICAgLCBtX2Zvcm1hdE1l
bnVBY3Rpb24oMCkKLSAgICAsIG1fZmxpcEFuaW1hdGVkKDApCi0gICAgLCBtX2ZsaXBZQW5pbWF0
ZWQoMCkKLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKLSAgICAs
IG1fem9vbUFuaW1hdGlvbigwKQotI2VuZGlmCi17Ci0gICAgaWYgKG90aGVyKSB7Ci0gICAgICAg
IGluaXQob3RoZXItPmlzR3JhcGhpY3NCYXNlZCgpKTsKLSAgICAgICAgYXBwbHlQcmVmcyhvdGhl
cik7Ci0gICAgICAgIGlmIChzaGFyZVNjZW5lICYmIG90aGVyLT5pc0dyYXBoaWNzQmFzZWQoKSkg
ewotICAgICAgICAgICAgUUdyYXBoaWNzVmlldyogb3RoZXJWaWV3ID0gc3RhdGljX2Nhc3Q8UUdy
YXBoaWNzVmlldyo+KG90aGVyLT5tX3ZpZXcpOwotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUdy
YXBoaWNzVmlldyo+KG1fdmlldyktPnNldFNjZW5lKG90aGVyVmlldy0+c2NlbmUoKSk7Ci0gICAg
ICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpbml0KGdVc2VHcmFwaGljc1ZpZXcpOwotICAg
ICAgICBhcHBseVByZWZzKCk7Ci0gICAgfQotCi0gICAgY3JlYXRlQ2hyb21lKCk7Ci19Ci0KLUxh
dW5jaGVyV2luZG93Ojp+TGF1bmNoZXJXaW5kb3coKQotewotICAgIGdyYWJab29tS2V5cyhmYWxz
ZSk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmluaXQoYm9vbCB1c2VHcmFwaGljc1ZpZXcp
Ci17Ci0gICAgUVNwbGl0dGVyKiBzcGxpdHRlciA9IG5ldyBRU3BsaXR0ZXIoUXQ6OlZlcnRpY2Fs
LCB0aGlzKTsKLSAgICBzZXRDZW50cmFsV2lkZ2V0KHNwbGl0dGVyKTsKLQotI2lmIGRlZmluZWQo
UV9XU19TNjApCi0gICAgc2V0V2luZG93U3RhdGUoUXQ6OldpbmRvd01heGltaXplZCk7Ci0jZWxz
ZQotICAgIHNldFdpbmRvd1N0YXRlKFF0OjpXaW5kb3dOb1N0YXRlKTsKLSAgICByZXNpemUoODAw
LCA2MDApOwotI2VuZGlmCi0KLSAgICBpbml0aWFsaXplVmlldyh1c2VHcmFwaGljc1ZpZXcpOwot
Ci0gICAgY29ubmVjdChwYWdlKCksIFNJR05BTChsb2FkU3RhcnRlZCgpKSwgdGhpcywgU0xPVChs
b2FkU3RhcnRlZCgpKSk7Ci0gICAgY29ubmVjdChwYWdlKCksIFNJR05BTChsb2FkRmluaXNoZWQo
Ym9vbCkpLCB0aGlzLCBTTE9UKGxvYWRGaW5pc2hlZCgpKSk7Ci0gICAgY29ubmVjdChwYWdlKCks
IFNJR05BTChsaW5rSG92ZXJlZChjb25zdCBRU3RyaW5nJiwgY29uc3QgUVN0cmluZyYsIGNvbnN0
IFFTdHJpbmcmKSksCi0gICAgICAgICAgICB0aGlzLCBTTE9UKHNob3dMaW5rSG92ZXIoY29uc3Qg
UVN0cmluZyYsIGNvbnN0IFFTdHJpbmcmKSkpOwotICAgIGNvbm5lY3QodGhpcywgU0lHTkFMKGVu
dGVyZWRGdWxsU2NyZWVuTW9kZShib29sKSksIHRoaXMsIFNMT1QodG9nZ2xlRnVsbFNjcmVlbk1v
ZGUoYm9vbCkpKTsKLQotICAgIGlmICghZ0luc3BlY3RvclVybC5pc0VtcHR5KCkpCi0gICAgICBw
YWdlKCktPnNldHRpbmdzKCktPnNldEluc3BlY3RvclVybChnSW5zcGVjdG9yVXJsKTsKLQotICAg
IG1faW5zcGVjdG9yID0gbmV3IFdlYkluc3BlY3RvcihzcGxpdHRlcik7Ci0gICAgbV9pbnNwZWN0
b3ItPnNldFBhZ2UocGFnZSgpKTsKLSAgICBtX2luc3BlY3Rvci0+aGlkZSgpOwotICAgIGNvbm5l
Y3QodGhpcywgU0lHTkFMKGRlc3Ryb3llZCgpKSwgbV9pbnNwZWN0b3IsIFNMT1QoZGVsZXRlTGF0
ZXIoKSkpOwotCi0gICAgLy8gdGhlIHpvb20gdmFsdWVzIGFyZSBjaG9zZW4gdG8gYmUgbGlrZSBp
biBNb3ppbGxhIEZpcmVmb3ggMwotICAgIG1fem9vbUxldmVscyA8PCAzMCA8PCA1MCA8PCA2NyA8
PCA4MCA8PCA5MDsKLSAgICBtX3pvb21MZXZlbHMgPDwgMTAwOwotICAgIG1fem9vbUxldmVscyA8
PCAxMTAgPDwgMTIwIDw8IDEzMyA8PCAxNTAgPDwgMTcwIDw8IDIwMCA8PCAyNDAgPDwgMzAwOwot
Ci0gICAgZ3JhYlpvb21LZXlzKHRydWUpOwotfQotCi1ib29sIExhdW5jaGVyV2luZG93Ojppc0dy
YXBoaWNzQmFzZWQoKSBjb25zdAotewotICAgIHJldHVybiBib29sKHFvYmplY3RfY2FzdDxRR3Jh
cGhpY3NWaWV3Kj4obV92aWV3KSk7Ci19Ci0KLWlubGluZSB2b2lkIGFwcGx5U2V0dGluZyhRV2Vi
U2V0dGluZ3M6OldlYkF0dHJpYnV0ZSB0eXBlLCBRV2ViU2V0dGluZ3MqIHNldHRpbmdzLCBRV2Vi
U2V0dGluZ3MqIG90aGVyLCBib29sIGRlZmF1bHRWYWx1ZSkKLXsKLSAgICBzZXR0aW5ncy0+c2V0
QXR0cmlidXRlKHR5cGUsIG90aGVyID8gb3RoZXItPnRlc3RBdHRyaWJ1dGUodHlwZSkgOiBkZWZh
dWx0VmFsdWUpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjphcHBseVByZWZzKExhdW5jaGVy
V2luZG93KiBzb3VyY2UpCi17Ci0gICAgUVdlYlNldHRpbmdzKiBvdGhlciA9IHNvdXJjZSA/IHNv
dXJjZS0+cGFnZSgpLT5zZXR0aW5ncygpIDogMDsKLSAgICBRV2ViU2V0dGluZ3MqIHNldHRpbmdz
ID0gcGFnZSgpLT5zZXR0aW5ncygpOwotCi0gICAgYXBwbHlTZXR0aW5nKFFXZWJTZXR0aW5nczo6
QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0VuYWJsZWQsIHNldHRpbmdzLCBvdGhlciwgZ1VzZUNvbXBv
c2l0aW5nKTsKLSAgICBhcHBseVNldHRpbmcoUVdlYlNldHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9y
ZUVuYWJsZWQsIHNldHRpbmdzLCBvdGhlciwgZ1VzZVRpbGVkQmFja2luZ1N0b3JlKTsKLSAgICBh
cHBseVNldHRpbmcoUVdlYlNldHRpbmdzOjpXZWJHTEVuYWJsZWQsIHNldHRpbmdzLCBvdGhlciwg
ZmFsc2UpOwotICAgIGFwcGx5U2V0dGluZyhRV2ViU2V0dGluZ3M6OkZyYW1lRmxhdHRlbmluZ0Vu
YWJsZWQsIHNldHRpbmdzLCBvdGhlciwgZ1VzZUZyYW1lRmxhdHRlbmluZyk7Ci0KLSAgICBpZiAo
IWlzR3JhcGhpY3NCYXNlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBXZWJWaWV3R3JhcGhp
Y3NCYXNlZCogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGljc0Jhc2VkKj4obV92aWV3
KTsKLSAgICBXZWJWaWV3R3JhcGhpY3NCYXNlZCogb3RoZXJWaWV3ID0gc291cmNlID8gcW9iamVj
dF9jYXN0PFdlYlZpZXdHcmFwaGljc0Jhc2VkKj4oc291cmNlLT5tX3ZpZXcpIDogMDsKLQotICAg
IHZpZXctPnNldFZpZXdwb3J0VXBkYXRlTW9kZShvdGhlclZpZXcgPyBvdGhlclZpZXctPnZpZXdw
b3J0VXBkYXRlTW9kZSgpIDogZ1ZpZXdwb3J0VXBkYXRlTW9kZSk7Ci0gICAgdmlldy0+c2V0RnJh
bWVSYXRlTWVhc3VyZW1lbnRFbmFibGVkKG90aGVyVmlldyA/IG90aGVyVmlldy0+ZnJhbWVSYXRl
TWVhc3VyZW1lbnRFbmFibGVkKCkgOiBnU2hvd0ZyYW1lUmF0ZSk7Ci0KLSAgICBpZiAob3RoZXJW
aWV3KQotICAgICAgICB2aWV3LT5zZXRJdGVtQ2FjaGVNb2RlKG90aGVyVmlldy0+aXRlbUNhY2hl
TW9kZSgpKTsKLSAgICBlbHNlCi0gICAgICAgIHZpZXctPnNldEl0ZW1DYWNoZU1vZGUoZ0NhY2hl
V2ViVmlldyA/IFFHcmFwaGljc0l0ZW06OkRldmljZUNvb3JkaW5hdGVDYWNoZSA6IFFHcmFwaGlj
c0l0ZW06Ok5vQ2FjaGUpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjprZXlQcmVzc0V2ZW50
KFFLZXlFdmVudCogZXZlbnQpCi17Ci0jaWZkZWYgUV9XU19NQUVNT181Ci0gICAgc3dpdGNoIChl
dmVudC0+a2V5KCkpIHsKLSAgICBjYXNlIFF0OjpLZXlfRjc6Ci0gICAgICAgIHpvb21JbigpOwot
ICAgICAgICBldmVudC0+YWNjZXB0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUXQ6Oktl
eV9GODoKLSAgICAgICAgem9vbU91dCgpOwotICAgICAgICBldmVudC0+YWNjZXB0KCk7Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotICAgIE1haW5XaW5kb3c6OmtleVByZXNzRXZlbnQo
ZXZlbnQpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpncmFiWm9vbUtleXMoYm9vbCBncmFi
KQotewotI2lmZGVmIFFfV1NfTUFFTU9fNQotICAgIGlmICghd2luSWQoKSkgewotICAgICAgICBx
V2FybmluZygiQ2FuJ3QgZ3JhYiBrZXlzIHVubGVzcyB3ZSBoYXZlIGEgd2luZG93IGlkIik7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBdG9tIGF0b20gPSBYSW50ZXJuQXRvbShRWDEx
SW5mbzo6ZGlzcGxheSgpLCAiX0hJTERPTl9aT09NX0tFWV9BVE9NIiwgRmFsc2UpOwotICAgIGlm
ICghYXRvbSkgewotICAgICAgICBxV2FybmluZygiVW5hYmxlIHRvIG9idGFpbiBfSElMRE9OX1pP
T01fS0VZX0FUT00iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVuc2lnbmVkIGxv
bmcgdmFsID0gKGdyYWIpID8gMSA6IDA7Ci0gICAgWENoYW5nZVByb3BlcnR5KFFYMTFJbmZvOjpk
aXNwbGF5KCksIHdpbklkKCksIGF0b20sIFhBX0lOVEVHRVIsIDMyLCBQcm9wTW9kZVJlcGxhY2Us
IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZ2YWwpLCAxKTsKLSNlbmRpZgotfQot
Ci0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCi12b2lkIExhdW5j
aGVyV2luZG93OjpzZW5kVG91Y2hFdmVudCgpCi17Ci0gICAgaWYgKG1fdG91Y2hQb2ludHMuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRRXZlbnQ6OlR5cGUgdHlwZSA9IFFFdmVu
dDo6VG91Y2hVcGRhdGU7Ci0gICAgaWYgKG1fdG91Y2hQb2ludHMuc2l6ZSgpID09IDEpIHsKLSAg
ICAgICAgaWYgKG1fdG91Y2hQb2ludHNbMF0uc3RhdGUoKSA9PSBRdDo6VG91Y2hQb2ludFJlbGVh
c2VkKQotICAgICAgICAgICAgdHlwZSA9IFFFdmVudDo6VG91Y2hFbmQ7Ci0gICAgICAgIGVsc2Ug
aWYgKG1fdG91Y2hQb2ludHNbMF0uc3RhdGUoKSA9PSBRdDo6VG91Y2hQb2ludFByZXNzZWQpCi0g
ICAgICAgICAgICB0eXBlID0gUUV2ZW50OjpUb3VjaEJlZ2luOwotICAgIH0KLQotICAgIFFUb3Vj
aEV2ZW50IHRvdWNoRXYodHlwZSk7Ci0gICAgdG91Y2hFdi5zZXRUb3VjaFBvaW50cyhtX3RvdWNo
UG9pbnRzKTsKLSAgICBRQ29yZUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQocGFnZSgpLCAmdG91Y2hF
dik7Ci0KLSAgICAvLyBBZnRlciBzZW5kaW5nIHRoZSBldmVudCwgcmVtb3ZlIGFsbCB0b3VjaHBv
aW50cyB0aGF0IHdlcmUgcmVsZWFzZWQKLSAgICBpZiAobV90b3VjaFBvaW50c1swXS5zdGF0ZSgp
ID09IFF0OjpUb3VjaFBvaW50UmVsZWFzZWQpCi0gICAgICAgIG1fdG91Y2hQb2ludHMucmVtb3Zl
QXQoMCk7Ci0gICAgaWYgKG1fdG91Y2hQb2ludHMuc2l6ZSgpID4gMSAmJiBtX3RvdWNoUG9pbnRz
WzFdLnN0YXRlKCkgPT0gUXQ6OlRvdWNoUG9pbnRSZWxlYXNlZCkKLSAgICAgICAgbV90b3VjaFBv
aW50cy5yZW1vdmVBdCgxKTsKLX0KLSNlbmRpZiAvLyBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05f
Q0hFQ0soNCwgNiwgMCkKLQotYm9vbCBMYXVuY2hlcldpbmRvdzo6ZXZlbnRGaWx0ZXIoUU9iamVj
dCogb2JqLCBRRXZlbnQqIGV2ZW50KQotewotICAgIC8vIElmIGNsaWNrIHBvcyBpcyB0aGUgYm90
dG9tIHJpZ2h0IGNvcm5lciAoc3F1YXJlIHdpdGggc2l6ZSBkZWZpbmVkIGJ5IGdFeGl0Q2xpY2tB
cmVhKQotICAgIC8vIGFuZCB0aGUgd2luZG93IGlzIG9uIEZ1bGxTY3JlZW4sIHRoZSB3aW5kb3cg
bXVzdCByZXR1cm4gdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgotICAgIGlmIChldmVudC0+dHlwZSgp
ID09IFFFdmVudDo6TW91c2VCdXR0b25SZWxlYXNlKSB7Ci0gICAgICAgIFFNb3VzZUV2ZW50KiBl
diA9IHN0YXRpY19jYXN0PFFNb3VzZUV2ZW50Kj4oZXZlbnQpOwotICAgICAgICBpZiAod2luZG93
U3RhdGUoKSA9PSBRdDo6V2luZG93RnVsbFNjcmVlbgotICAgICAgICAgICAgJiYgZXYtPnBvcygp
LngoKSA+ICh3aWR0aCgpIC0gZ0V4aXRDbGlja0FyZWEpCi0gICAgICAgICAgICAmJiBldi0+cG9z
KCkueSgpID4gKGhlaWdodCgpIC0gZ0V4aXRDbGlja0FyZWEpKSB7Ci0KLSAgICAgICAgICAgIGVt
aXQgZW50ZXJlZEZ1bGxTY3JlZW5Nb2RlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotI2lm
IFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgIGlmICghbV90b3Vj
aE1vY2tpbmcgfHwgb2JqICE9IG1fdmlldykKLSAgICAgICAgcmV0dXJuIFFPYmplY3Q6OmV2ZW50
RmlsdGVyKG9iaiwgZXZlbnQpOwotCi0gICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpN
b3VzZUJ1dHRvblByZXNzCi0gICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpNb3Vz
ZUJ1dHRvblJlbGVhc2UKLSAgICAgICAgfHwgZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNl
QnV0dG9uRGJsQ2xpY2sKLSAgICAgICAgfHwgZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNl
TW92ZSkgewotCi0gICAgICAgIFFNb3VzZUV2ZW50KiBldiA9IHN0YXRpY19jYXN0PFFNb3VzZUV2
ZW50Kj4oZXZlbnQpOwotICAgICAgICBpZiAoZXYtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlTW92
ZQotICAgICAgICAgICAgJiYgIShldi0+YnV0dG9ucygpICYgUXQ6OkxlZnRCdXR0b24pKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFFUb3VjaEV2ZW50OjpUb3VjaFBvaW50
IHRvdWNoUG9pbnQ7Ci0gICAgICAgIHRvdWNoUG9pbnQuc2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRN
b3ZlZCk7Ci0gICAgICAgIGlmICgoZXYtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJl
c3MKLSAgICAgICAgICAgICB8fCBldi0+dHlwZSgpID09IFFFdmVudDo6TW91c2VCdXR0b25EYmxD
bGljaykpCi0gICAgICAgICAgICB0b3VjaFBvaW50LnNldFN0YXRlKFF0OjpUb3VjaFBvaW50UHJl
c3NlZCk7Ci0gICAgICAgIGVsc2UgaWYgKGV2LT50eXBlKCkgPT0gUUV2ZW50OjpNb3VzZUJ1dHRv
blJlbGVhc2UpCi0gICAgICAgICAgICB0b3VjaFBvaW50LnNldFN0YXRlKFF0OjpUb3VjaFBvaW50
UmVsZWFzZWQpOwotCi0gICAgICAgIHRvdWNoUG9pbnQuc2V0SWQoMCk7Ci0gICAgICAgIHRvdWNo
UG9pbnQuc2V0U2NyZWVuUG9zKGV2LT5nbG9iYWxQb3MoKSk7Ci0gICAgICAgIHRvdWNoUG9pbnQu
c2V0UG9zKGV2LT5wb3MoKSk7Ci0gICAgICAgIHRvdWNoUG9pbnQuc2V0UHJlc3N1cmUoMSk7Ci0K
LSAgICAgICAgLy8gSWYgdGhlIHBvaW50IGFscmVhZHkgZXhpc3RzLCB1cGRhdGUgaXQuIE90aGVy
d2lzZSBjcmVhdGUgaXQuCi0gICAgICAgIGlmIChtX3RvdWNoUG9pbnRzLnNpemUoKSA+IDAgJiYg
IW1fdG91Y2hQb2ludHNbMF0uaWQoKSkKLSAgICAgICAgICAgIG1fdG91Y2hQb2ludHNbMF0gPSB0
b3VjaFBvaW50OwotICAgICAgICBlbHNlIGlmIChtX3RvdWNoUG9pbnRzLnNpemUoKSA+IDEgJiYg
IW1fdG91Y2hQb2ludHNbMV0uaWQoKSkKLSAgICAgICAgICAgIG1fdG91Y2hQb2ludHNbMV0gPSB0
b3VjaFBvaW50OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX3RvdWNoUG9pbnRzLmFwcGVu
ZCh0b3VjaFBvaW50KTsKLQotICAgICAgICBzZW5kVG91Y2hFdmVudCgpOwotICAgIH0gZWxzZSBp
ZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OktleVByZXNzCi0gICAgICAgICYmIHN0YXRpY19j
YXN0PFFLZXlFdmVudCo+KGV2ZW50KS0+a2V5KCkgPT0gUXQ6OktleV9GCi0gICAgICAgICYmIHN0
YXRpY19jYXN0PFFLZXlFdmVudCo+KGV2ZW50KS0+bW9kaWZpZXJzKCkgPT0gUXQ6OkNvbnRyb2xN
b2RpZmllcikgewotCi0gICAgICAgIC8vIElmIHRoZSBrZXlib2FyZCBwb2ludCBpcyBhbHJlYWR5
IHByZXNzZWQsIHJlbGVhc2UgaXQuCi0gICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgaXQgYW5k
IGFwcGVuZCB0byBtX3RvdWNoUG9pbnRzLgotICAgICAgICBpZiAobV90b3VjaFBvaW50cy5zaXpl
KCkgPiAwICYmIG1fdG91Y2hQb2ludHNbMF0uaWQoKSA9PSAxKSB7Ci0gICAgICAgICAgICBtX3Rv
dWNoUG9pbnRzWzBdLnNldFN0YXRlKFF0OjpUb3VjaFBvaW50UmVsZWFzZWQpOwotICAgICAgICAg
ICAgc2VuZFRvdWNoRXZlbnQoKTsKLSAgICAgICAgfSBlbHNlIGlmIChtX3RvdWNoUG9pbnRzLnNp
emUoKSA+IDEgJiYgbV90b3VjaFBvaW50c1sxXS5pZCgpID09IDEpIHsKLSAgICAgICAgICAgIG1f
dG91Y2hQb2ludHNbMV0uc2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRSZWxlYXNlZCk7Ci0gICAgICAg
ICAgICBzZW5kVG91Y2hFdmVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUVRv
dWNoRXZlbnQ6OlRvdWNoUG9pbnQgdG91Y2hQb2ludDsKLSAgICAgICAgICAgIHRvdWNoUG9pbnQu
c2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRQcmVzc2VkKTsKLSAgICAgICAgICAgIHRvdWNoUG9pbnQu
c2V0SWQoMSk7Ci0gICAgICAgICAgICB0b3VjaFBvaW50LnNldFNjcmVlblBvcyhRQ3Vyc29yOjpw
b3MoKSk7Ci0gICAgICAgICAgICB0b3VjaFBvaW50LnNldFBvcyhtX3ZpZXctPm1hcEZyb21HbG9i
YWwoUUN1cnNvcjo6cG9zKCkpKTsKLSAgICAgICAgICAgIHRvdWNoUG9pbnQuc2V0UHJlc3N1cmUo
MSk7Ci0gICAgICAgICAgICBtX3RvdWNoUG9pbnRzLmFwcGVuZCh0b3VjaFBvaW50KTsKLSAgICAg
ICAgICAgIHNlbmRUb3VjaEV2ZW50KCk7Ci0KLSAgICAgICAgICAgIC8vIEFmdGVyIHNlbmRpbmcg
dGhlIGV2ZW50LCBjaGFuZ2UgdGhlIHRvdWNocG9pbnQgc3RhdGUgdG8gc3RhdGlvbmFyeQotICAg
ICAgICAgICAgbV90b3VjaFBvaW50cy5sYXN0KCkuc2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRTdGF0
aW9uYXJ5KTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBRVF9WRVJTSU9OID49IFFUX1ZF
UlNJT05fQ0hFQ0soNCwgNiwgMCkKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBMYXVu
Y2hlcldpbmRvdzo6bG9hZFN0YXJ0ZWQoKQotewotICAgIG1fdmlldy0+c2V0Rm9jdXMoUXQ6Ok90
aGVyRm9jdXNSZWFzb24pOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojpsb2FkRmluaXNoZWQo
KQotewotICAgIFFVcmwgdXJsID0gcGFnZSgpLT5tYWluRnJhbWUoKS0+dXJsKCk7Ci0gICAgc2V0
QWRkcmVzc1VybCh1cmwudG9TdHJpbmcoKSk7Ci0gICAgYWRkQ29tcGxldGVyRW50cnkodXJsKTsK
LX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6c2hvd0xpbmtIb3Zlcihjb25zdCBRU3RyaW5nICZs
aW5rLCBjb25zdCBRU3RyaW5nICZ0b29sVGlwKQotewotI2lmbmRlZiBRX1dTX01BRU1PXzUKLSAg
ICBzdGF0dXNCYXIoKS0+c2hvd01lc3NhZ2UobGluayk7Ci0jZW5kaWYKLSNpZm5kZWYgUVRfTk9f
VE9PTFRJUAotICAgIGlmICghdG9vbFRpcC5pc0VtcHR5KCkpCi0gICAgICAgIFFUb29sVGlwOjpz
aG93VGV4dChRQ3Vyc29yOjpwb3MoKSwgdG9vbFRpcCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBMYXVu
Y2hlcldpbmRvdzo6em9vbUFuaW1hdGlvbkZpbmlzaGVkKCkKLXsKLSAgICBpZiAoIWlzR3JhcGhp
Y3NCYXNlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgUUdyYXBoaWNzV2ViVmlldyogdmlldyA9
IHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGljc0Jhc2VkKj4obV92aWV3KS0+Z3JhcGhpY3NXZWJW
aWV3KCk7Ci0gICAgdmlldy0+c2V0VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4oZmFsc2UpOwotfQot
Ci12b2lkIExhdW5jaGVyV2luZG93OjphcHBseVpvb20oKQotewotI2lmIFFUX1ZFUlNJT04gPj0g
UVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgIGlmIChpc0dyYXBoaWNzQmFzZWQoKSAmJiBw
YWdlKCktPnNldHRpbmdzKCktPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpUaWxlZEJhY2tp
bmdTdG9yZUVuYWJsZWQpKSB7Ci0gICAgICAgIFFHcmFwaGljc1dlYlZpZXcqIHZpZXcgPSBzdGF0
aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmlldyktPmdyYXBoaWNzV2ViVmlldygp
OwotICAgICAgICB2aWV3LT5zZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbih0cnVlKTsKLSAgICAg
ICAgaWYgKCFtX3pvb21BbmltYXRpb24pIHsKLSAgICAgICAgICAgIG1fem9vbUFuaW1hdGlvbiA9
IG5ldyBRUHJvcGVydHlBbmltYXRpb24odmlldywgInNjYWxlIik7Ci0gICAgICAgICAgICBtX3pv
b21BbmltYXRpb24tPnNldFN0YXJ0VmFsdWUodmlldy0+c2NhbGUoKSk7Ci0gICAgICAgICAgICBj
b25uZWN0KG1fem9vbUFuaW1hdGlvbiwgU0lHTkFMKGZpbmlzaGVkKCkpLCB0aGlzLCBTTE9UKHpv
b21BbmltYXRpb25GaW5pc2hlZCgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBt
X3pvb21BbmltYXRpb24tPnN0b3AoKTsKLSAgICAgICAgICAgIG1fem9vbUFuaW1hdGlvbi0+c2V0
U3RhcnRWYWx1ZShtX3pvb21BbmltYXRpb24tPmN1cnJlbnRWYWx1ZSgpKTsKLSAgICAgICAgfQot
Ci0gICAgICAgIG1fem9vbUFuaW1hdGlvbi0+c2V0RHVyYXRpb24oMzAwKTsKLSAgICAgICAgbV96
b29tQW5pbWF0aW9uLT5zZXRFbmRWYWx1ZShxcmVhbChtX2N1cnJlbnRab29tKSAvIDEwMC4pOwot
ICAgICAgICBtX3pvb21BbmltYXRpb24tPnN0YXJ0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0jZW5kaWYKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5zZXRab29tRmFjdG9yKHFyZWFsKG1f
Y3VycmVudFpvb20pIC8gMTAwLjApOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp6b29tSW4o
KQotewotICAgIGludCBpID0gbV96b29tTGV2ZWxzLmluZGV4T2YobV9jdXJyZW50Wm9vbSk7Ci0g
ICAgUV9BU1NFUlQoaSA+PSAwKTsKLSAgICBpZiAoaSA8IG1fem9vbUxldmVscy5jb3VudCgpIC0g
MSkKLSAgICAgICAgbV9jdXJyZW50Wm9vbSA9IG1fem9vbUxldmVsc1tpICsgMV07Ci0KLSAgICBh
cHBseVpvb20oKTsKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6em9vbU91dCgpCi17Ci0gICAg
aW50IGkgPSBtX3pvb21MZXZlbHMuaW5kZXhPZihtX2N1cnJlbnRab29tKTsKLSAgICBRX0FTU0VS
VChpID49IDApOwotICAgIGlmIChpID4gMCkKLSAgICAgICAgbV9jdXJyZW50Wm9vbSA9IG1fem9v
bUxldmVsc1tpIC0gMV07Ci0KLSAgICBhcHBseVpvb20oKTsKLX0KLQotdm9pZCBMYXVuY2hlcldp
bmRvdzo6cmVzZXRab29tKCkKLXsKLSAgICBtX2N1cnJlbnRab29tID0gMTAwOwotICAgIHBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnNldFpvb21GYWN0b3IoMS4wKTsKLX0KLQotdm9pZCBMYXVuY2hlcldp
bmRvdzo6dG9nZ2xlWm9vbVRleHRPbmx5KGJvb2wgYikKLXsKLSAgICBwYWdlKCktPnNldHRpbmdz
KCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6Olpvb21UZXh0T25seSwgYik7Ci19Ci0KLXZv
aWQgTGF1bmNoZXJXaW5kb3c6OnByaW50KCkKLXsKLSNpZiAhZGVmaW5lZChRVF9OT19QUklOVEVS
KQotICAgIFFQcmludFByZXZpZXdEaWFsb2cgZGxnKHRoaXMpOwotICAgIGNvbm5lY3QoJmRsZywg
U0lHTkFMKHBhaW50UmVxdWVzdGVkKFFQcmludGVyKikpLAotICAgICAgICAgICAgcGFnZSgpLT5t
YWluRnJhbWUoKSwgU0xPVChwcmludChRUHJpbnRlciopKSk7Ci0gICAgZGxnLmV4ZWMoKTsKLSNl
bmRpZgotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpzY3JlZW5zaG90KCkKLXsKLSAgICBRUGl4
bWFwIHBpeG1hcCA9IFFQaXhtYXA6OmdyYWJXaWRnZXQobV92aWV3KTsKLSAgICBRTGFiZWwqIGxh
YmVsID0gbmV3IFFMYWJlbDsKLSAgICBsYWJlbC0+c2V0QXR0cmlidXRlKFF0OjpXQV9EZWxldGVP
bkNsb3NlKTsKLSAgICBsYWJlbC0+c2V0V2luZG93VGl0bGUoIlNjcmVlbnNob3QgLSBQcmV2aWV3
Iik7Ci0gICAgbGFiZWwtPnNldFBpeG1hcChwaXhtYXApOwotICAgIGxhYmVsLT5zaG93KCk7Ci0K
LSAgICBRU3RyaW5nIGZpbGVOYW1lID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZShsYWJl
bCwgIlNjcmVlbnNob3QiKTsKLSAgICBpZiAoIWZpbGVOYW1lLmlzRW1wdHkoKSkgewotICAgICAg
ICBwaXhtYXAuc2F2ZShmaWxlTmFtZSwgInBuZyIpOwotICAgICAgICBsYWJlbC0+c2V0V2luZG93
VGl0bGUoUVN0cmluZygiU2NyZWVuc2hvdCAtIFNhdmVkIGF0ICUxIikuYXJnKGZpbGVOYW1lKSk7
Ci0gICAgfQotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpzZXRFZGl0YWJsZShib29sIG9uKQot
ewotICAgIHBhZ2UoKS0+c2V0Q29udGVudEVkaXRhYmxlKG9uKTsKLSAgICBtX2Zvcm1hdE1lbnVB
Y3Rpb24tPnNldFZpc2libGUob24pOwotfQotCi0vKgotdm9pZCBMYXVuY2hlcldpbmRvdzo6ZHVt
cFBsdWdpbnMoKSB7Ci0gICAgUUxpc3Q8UVdlYlBsdWdpbkluZm8+IHBsdWdpbnMgPSBRV2ViU2V0
dGluZ3M6OnBsdWdpbkRhdGFiYXNlKCktPnBsdWdpbnMoKTsKLSAgICBmb3JlYWNoIChjb25zdCBR
V2ViUGx1Z2luSW5mbyBwbHVnaW4sIHBsdWdpbnMpIHsKLSAgICAgICAgcURlYnVnKCkgPDwgIlBs
dWdpbjoiIDw8IHBsdWdpbi5uYW1lKCk7Ci0gICAgICAgIGZvcmVhY2ggKGNvbnN0IFFXZWJQbHVn
aW5JbmZvOjpNaW1lVHlwZSBtaW1lLCBwbHVnaW4ubWltZVR5cGVzKCkpIHsKLSAgICAgICAgICAg
IHFEZWJ1ZygpIDw8ICIgICAiIDw8IG1pbWUubmFtZTsKLSAgICAgICAgfQotICAgIH0KLX0KLSov
Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmR1bXBIdG1sKCkKLXsKLSAgICBxRGVidWcoKSA8PCAi
SFRNTDogIiA8PCBwYWdlKCktPm1haW5GcmFtZSgpLT50b0h0bWwoKTsKLX0KLQotdm9pZCBMYXVu
Y2hlcldpbmRvdzo6c2VsZWN0RWxlbWVudHMoKQotewotICAgIGJvb2wgb2s7Ci0gICAgUVN0cmlu
ZyBzdHIgPSBRSW5wdXREaWFsb2c6OmdldFRleHQodGhpcywgIlNlbGVjdCBlbGVtZW50cyIsICJD
aG9vc2UgZWxlbWVudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IFFMaW5lRWRpdDo6Tm9ybWFsLCAiYSIsICZvayk7Ci0KLSAgICBpZiAob2sgJiYgIXN0ci5pc0Vt
cHR5KCkpIHsKLSAgICAgICAgUVdlYkVsZW1lbnRDb2xsZWN0aW9uIHJlc3VsdCA9ICBwYWdlKCkt
Pm1haW5GcmFtZSgpLT5maW5kQWxsRWxlbWVudHMoc3RyKTsKLSAgICAgICAgZm9yZWFjaCAoUVdl
YkVsZW1lbnQgZSwgcmVzdWx0KQotICAgICAgICAgICAgZS5zZXRTdHlsZVByb3BlcnR5KCJiYWNr
Z3JvdW5kLWNvbG9yIiwgInllbGxvdyIpOwotI2lmbmRlZiBRX1dTX01BRU1PXzUKLSAgICAgICAg
c3RhdHVzQmFyKCktPnNob3dNZXNzYWdlKFFTdHJpbmcoIiUxIGVsZW1lbnQocykgc2VsZWN0ZWQi
KS5hcmcocmVzdWx0LmNvdW50KCkpLCA1MDAwKTsKLSNlbmRpZgotICAgIH0KLX0KLQotdm9pZCBM
YXVuY2hlcldpbmRvdzo6c2V0VG91Y2hNb2NraW5nKGJvb2wgb24pCi17Ci0jaWYgUVRfVkVSU0lP
TiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCi0gICAgbV90b3VjaE1vY2tpbmcgPSBvbjsK
LSNlbmRpZgotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVBY2NlbGVyYXRlZENvbXBv
c2l0aW5nKGJvb2wgdG9nZ2xlKQotewotICAgIGdVc2VDb21wb3NpdGluZyA9IHRvZ2dsZTsKLSAg
ICBwYWdlKCktPnNldHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJh
dGVkQ29tcG9zaXRpbmdFbmFibGVkLCB0b2dnbGUpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93
Ojp0b2dnbGVUaWxlZEJhY2tpbmdTdG9yZShib29sIHRvZ2dsZSkKLXsKLSAgICBwYWdlKCktPnNl
dHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OlRpbGVkQmFja2luZ1N0b3JlRW5h
YmxlZCwgdG9nZ2xlKTsKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlUmVzaXplc1Rv
Q29udGVudHMoYm9vbCB0b2dnbGUpCi17Ci0gICAgc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNz
QmFzZWQqPihtX3ZpZXcpLT5zZXRSZXNpemVzVG9Db250ZW50cyh0b2dnbGUpOwotfQotCi12b2lk
IExhdW5jaGVyV2luZG93Ojp0b2dnbGVXZWJHTChib29sIHRvZ2dsZSkKLXsKLSAgICBwYWdlKCkt
PnNldHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OldlYkdMRW5hYmxlZCwgdG9n
Z2xlKTsKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6aW5pdGlhbGl6ZVZpZXcoYm9vbCB1c2VH
cmFwaGljc1ZpZXcpCi17Ci0gICAgZGVsZXRlIG1fdmlldzsKLQotICAgIFFTcGxpdHRlciogc3Bs
aXR0ZXIgPSBzdGF0aWNfY2FzdDxRU3BsaXR0ZXIqPihjZW50cmFsV2lkZ2V0KCkpOwotCi0gICAg
aWYgKCF1c2VHcmFwaGljc1ZpZXcpIHsKLSAgICAgICAgV2ViVmlld1RyYWRpdGlvbmFsKiB2aWV3
ID0gbmV3IFdlYlZpZXdUcmFkaXRpb25hbChzcGxpdHRlcik7Ci0gICAgICAgIHZpZXctPnNldFBh
Z2UocGFnZSgpKTsKLQotICAgICAgICB2aWV3LT5pbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7Ci0K
LSAgICAgICAgbV92aWV3ID0gdmlldzsKLSAgICB9IGVsc2UgewotICAgICAgICBXZWJWaWV3R3Jh
cGhpY3NCYXNlZCogdmlldyA9IG5ldyBXZWJWaWV3R3JhcGhpY3NCYXNlZChzcGxpdHRlcik7Ci0g
ICAgICAgIHZpZXctPnNldFBhZ2UocGFnZSgpKTsKLQotICAgICAgICBpZiAobV9mbGlwQW5pbWF0
ZWQpCi0gICAgICAgICAgICBjb25uZWN0KG1fZmxpcEFuaW1hdGVkLCBTSUdOQUwodHJpZ2dlcmVk
KCkpLCB2aWV3LCBTTE9UKGFuaW1hdGVkRmxpcCgpKSk7Ci0KLSAgICAgICAgaWYgKG1fZmxpcFlB
bmltYXRlZCkKLSAgICAgICAgICAgIGNvbm5lY3QobV9mbGlwWUFuaW1hdGVkLCBTSUdOQUwodHJp
Z2dlcmVkKCkpLCB2aWV3LCBTTE9UKGFuaW1hdGVkWUZsaXAoKSkpOwotCi0gICAgICAgIGNvbm5l
Y3QodmlldywgU0lHTkFMKGN1cnJlbnRGUFNVcGRhdGVkKGludCkpLCB0aGlzLCBTTE9UKHVwZGF0
ZUZQUyhpbnQpKSk7Ci0KLSAgICAgICAgLy8gVGhlIGltcGxlbWVudGF0aW9uIG9mIFFBYnN0cmFj
dFNjcm9sbEFyZWE6OmV2ZW50RmlsdGVyIG1ha2VzIHVzIG5lZWQKLSAgICAgICAgLy8gdG8gaW5z
dGFsbCB0aGUgZXZlbnQgZmlsdGVyIG9uIHRoZSB2aWV3cG9ydCBvZiBhIFFHcmFwaGljc1ZpZXcu
Ci0gICAgICAgIHZpZXctPnZpZXdwb3J0KCktPmluc3RhbGxFdmVudEZpbHRlcih0aGlzKTsKLQot
ICAgICAgICBtX3ZpZXcgPSB2aWV3OwotICAgIH0KLQotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVS
U0lPTl9DSEVDSyg0LCA2LCAwKQotICAgIG1fdG91Y2hNb2NraW5nID0gZmFsc2U7Ci0jZW5kaWYK
LX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlU3BhdGlhbE5hdmlnYXRpb24oYm9vbCBi
KQotewotICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6
U3BhdGlhbE5hdmlnYXRpb25FbmFibGVkLCBiKTsKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6
dG9nZ2xlRnVsbFNjcmVlbk1vZGUoYm9vbCBlbmFibGUpCi17Ci0gICAgaWYgKGVuYWJsZSkKLSAg
ICAgICAgc2V0V2luZG93U3RhdGUoUXQ6OldpbmRvd0Z1bGxTY3JlZW4pOwotICAgIGVsc2Ugewot
I2lmIGRlZmluZWQoUV9XU19TNjApCi0gICAgICAgIHNldFdpbmRvd1N0YXRlKFF0OjpXaW5kb3dN
YXhpbWl6ZWQpOwotI2Vsc2UKLSAgICAgICAgc2V0V2luZG93U3RhdGUoUXQ6OldpbmRvd05vU3Rh
dGUpOwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpzaG93RlBTKGJv
b2wgZW5hYmxlKQotewotICAgIGlmICghaXNHcmFwaGljc0Jhc2VkKCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGdTaG93RnJhbWVSYXRlID0gZW5hYmxlOwotICAgIFdlYlZpZXdHcmFwaGljc0Jh
c2VkKiB2aWV3ID0gc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFzZWQqPihtX3ZpZXcpOwot
ICAgIHZpZXctPnNldEZyYW1lUmF0ZU1lYXN1cmVtZW50RW5hYmxlZChlbmFibGUpOwotCi0gICAg
aWYgKCFlbmFibGUpIHsKLSNpZiBkZWZpbmVkKFFfV1NfTUFFTU9fNSkgJiYgZGVmaW5lZChRX1dT
X1M2MCkKLSAgICAgICAgc2V0V2luZG93VGl0bGUoIiIpOwotI2Vsc2UKLSAgICAgICAgc3RhdHVz
QmFyKCktPmNsZWFyTWVzc2FnZSgpOwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIExhdW5jaGVy
V2luZG93OjpjaGFuZ2VWaWV3cG9ydFVwZGF0ZU1vZGUoaW50IG1vZGUpCi17Ci0gICAgZ1ZpZXdw
b3J0VXBkYXRlTW9kZSA9IFFHcmFwaGljc1ZpZXc6OlZpZXdwb3J0VXBkYXRlTW9kZShtb2RlKTsK
LQotICAgIGlmICghaXNHcmFwaGljc0Jhc2VkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFdl
YlZpZXdHcmFwaGljc0Jhc2VkKiB2aWV3ID0gc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFz
ZWQqPihtX3ZpZXcpOwotICAgIHZpZXctPnNldFZpZXdwb3J0VXBkYXRlTW9kZShnVmlld3BvcnRV
cGRhdGVNb2RlKTsKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlRnJhbWVGbGF0dGVu
aW5nKGJvb2wgdG9nZ2xlKQotewotICAgIGdVc2VGcmFtZUZsYXR0ZW5pbmcgPSB0b2dnbGU7Ci0g
ICAgcGFnZSgpLT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpGcmFtZUZs
YXR0ZW5pbmdFbmFibGVkLCB0b2dnbGUpOwotfQotCi0jaWYgZGVmaW5lZChRVF9DT05GSUdVUkVE
X1dJVEhfT1BFTkdMKQotdm9pZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlUUdMV2lkZ2V0Vmlld3Bv
cnQoYm9vbCBlbmFibGUpCi17Ci0gICAgaWYgKCFpc0dyYXBoaWNzQmFzZWQoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgZ1VzZVFHTFdpZGdldFZpZXdwb3J0ID0gZW5hYmxlOwotICAgIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkKiB2aWV3ID0gc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFzZWQq
PihtX3ZpZXcpOwotCi0gICAgdmlldy0+c2V0Vmlld3BvcnQoZW5hYmxlID8gbmV3IFFHTFdpZGdl
dCgpIDogMCk7Ci19Ci0jZW5kaWYKLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6c2hvd1VzZXJBZ2Vu
dERpYWxvZygpCi17Ci0gICAgUVN0cmluZ0xpc3QgaXRlbXM7Ci0gICAgUUZpbGUgZmlsZSgiOi91
c2VyYWdlbnRsaXN0LnR4dCIpOwotICAgIGlmIChmaWxlLm9wZW4oUUlPRGV2aWNlOjpSZWFkT25s
eSkpIHsKLSAgICAgICAgIHdoaWxlICghZmlsZS5hdEVuZCgpKQotICAgICAgICAgICAgaXRlbXMg
PDwgZmlsZS5yZWFkTGluZSgpLnRyaW1tZWQoKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAg
IH0KLQotICAgIFFTZXR0aW5ncyBzZXR0aW5nczsKLSAgICBRU3RyaW5nIGN1c3RvbVVzZXJBZ2Vu
dCA9IHNldHRpbmdzLnZhbHVlKCJDdXN0b21Vc2VyQWdlbnQiKS50b1N0cmluZygpOwotICAgIGlm
ICghaXRlbXMuY29udGFpbnMoY3VzdG9tVXNlckFnZW50KSAmJiAhY3VzdG9tVXNlckFnZW50Lmlz
RW1wdHkoKSkKLSAgICAgICAgaXRlbXMgPDwgY3VzdG9tVXNlckFnZW50OwotCi0gICAgUURpYWxv
ZyogZGlhbG9nID0gbmV3IFFEaWFsb2codGhpcyk7Ci0gICAgZGlhbG9nLT5zZXRXaW5kb3dUaXRs
ZSgiQ2hhbmdlIFVzZXIgQWdlbnQiKTsKLQotICAgIFFWQm94TGF5b3V0KiBsYXlvdXQgPSBuZXcg
UVZCb3hMYXlvdXQoZGlhbG9nKTsKLSAgICBkaWFsb2ctPnNldExheW91dChsYXlvdXQpOwotCi0g
ICAgUUNvbWJvQm94KiBjb21ibyA9IG5ldyBRQ29tYm9Cb3goZGlhbG9nKTsKLSAgICBjb21iby0+
c2V0TWF4aW11bVdpZHRoKHNpemUoKS53aWR0aCgpICogMC43KTsKLSAgICBjb21iby0+c2V0RWRp
dGFibGUodHJ1ZSk7Ci0gICAgY29tYm8tPmluc2VydEl0ZW1zKDAsIGl0ZW1zKTsKLSAgICBsYXlv
dXQtPmFkZFdpZGdldChjb21ibyk7Ci0KLSAgICBpbnQgaW5kZXggPSBjb21iby0+ZmluZFRleHQo
cGFnZSgpLT51c2VyQWdlbnRGb3JVcmwoUVVybCgpKSk7Ci0gICAgY29tYm8tPnNldEN1cnJlbnRJ
bmRleChpbmRleCk7Ci0KLSAgICBRRGlhbG9nQnV0dG9uQm94KiBidXR0b25Cb3ggPSBuZXcgUURp
YWxvZ0J1dHRvbkJveChRRGlhbG9nQnV0dG9uQm94OjpPawotICAgICAgICAgICAgfCBRRGlhbG9n
QnV0dG9uQm94OjpDYW5jZWwsIFF0OjpIb3Jpem9udGFsLCBkaWFsb2cpOwotICAgIGNvbm5lY3Qo
YnV0dG9uQm94LCBTSUdOQUwoYWNjZXB0ZWQoKSksIGRpYWxvZywgU0xPVChhY2NlcHQoKSkpOwot
ICAgIGNvbm5lY3QoYnV0dG9uQm94LCBTSUdOQUwocmVqZWN0ZWQoKSksIGRpYWxvZywgU0xPVChy
ZWplY3QoKSkpOwotICAgIGxheW91dC0+YWRkV2lkZ2V0KGJ1dHRvbkJveCk7Ci0KLSAgICBpZiAo
ZGlhbG9nLT5leGVjKCkgJiYgIWNvbWJvLT5jdXJyZW50VGV4dCgpLmlzRW1wdHkoKSkgewotICAg
ICAgICBwYWdlKCktPnNldFVzZXJBZ2VudChjb21iby0+Y3VycmVudFRleHQoKSk7Ci0gICAgICAg
IGlmICghaXRlbXMuY29udGFpbnMoY29tYm8tPmN1cnJlbnRUZXh0KCkpKQotICAgICAgICAgICAg
c2V0dGluZ3Muc2V0VmFsdWUoIkN1c3RvbVVzZXJBZ2VudCIsIGNvbWJvLT5jdXJyZW50VGV4dCgp
KTsKLSAgICB9Ci0KLSAgICBkZWxldGUgZGlhbG9nOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93
OjpuZXdXaW5kb3coKQotewotICAgIExhdW5jaGVyV2luZG93KiBtdyA9IG5ldyBMYXVuY2hlcldp
bmRvdyh0aGlzLCBmYWxzZSk7Ci0gICAgbXctPnNob3coKTsKLX0KLQotdm9pZCBMYXVuY2hlcldp
bmRvdzo6Y2xvbmVXaW5kb3coKQotewotICAgIExhdW5jaGVyV2luZG93KiBtdyA9IG5ldyBMYXVu
Y2hlcldpbmRvdyh0aGlzLCB0cnVlKTsKLSAgICBtdy0+c2hvdygpOwotfQotCi12b2lkIExhdW5j
aGVyV2luZG93Ojp1cGRhdGVGUFMoaW50IGZwcykKLXsKLSAgICBRU3RyaW5nIGZwc1N0YXR1c1Rl
eHQgPSBRU3RyaW5nKCJDdXJyZW50IEZQUzogJTEiKS5hcmcoZnBzKTsKLQotI2lmIGRlZmluZWQo
UV9XU19NQUVNT181KSAmJiBkZWZpbmVkKFFfV1NfUzYwKQotICAgIHNldFdpbmRvd1RpdGxlKGZw
c1N0YXR1c1RleHQpOwotI2Vsc2UKLSAgICBzdGF0dXNCYXIoKS0+c2hvd01lc3NhZ2UoZnBzU3Rh
dHVzVGV4dCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBMYXVuY2hlcldpbmRvdzo6Y3JlYXRlQ2hyb21l
KCkKLXsKLSAgICBRTWVudSogZmlsZU1lbnUgPSBtZW51QmFyKCktPmFkZE1lbnUoIiZGaWxlIik7
Ci0gICAgZmlsZU1lbnUtPmFkZEFjdGlvbigiTmV3IFdpbmRvdyIsIHRoaXMsIFNMT1QobmV3V2lu
ZG93KCkpLCBRS2V5U2VxdWVuY2U6Ok5ldyk7Ci0gICAgZmlsZU1lbnUtPmFkZEFjdGlvbih0cigi
T3BlbiBGaWxlLi4uIiksIHRoaXMsIFNMT1Qob3BlbkZpbGUoKSksIFFLZXlTZXF1ZW5jZTo6T3Bl
bik7Ci0gICAgZmlsZU1lbnUtPmFkZEFjdGlvbigiQ2xvc2UgV2luZG93IiwgdGhpcywgU0xPVChj
bG9zZSgpKSwgUUtleVNlcXVlbmNlOjpDbG9zZSk7Ci0gICAgZmlsZU1lbnUtPmFkZFNlcGFyYXRv
cigpOwotICAgIGZpbGVNZW51LT5hZGRBY3Rpb24oIlRha2UgU2NyZWVuIFNob3QuLi4iLCB0aGlz
LCBTTE9UKHNjcmVlbnNob3QoKSkpOwotICAgIGZpbGVNZW51LT5hZGRBY3Rpb24odHIoIlByaW50
Li4uIiksIHRoaXMsIFNMT1QocHJpbnQoKSksIFFLZXlTZXF1ZW5jZTo6UHJpbnQpOwotICAgIGZp
bGVNZW51LT5hZGRTZXBhcmF0b3IoKTsKLSAgICBmaWxlTWVudS0+YWRkQWN0aW9uKCJRdWl0Iiwg
UUFwcGxpY2F0aW9uOjppbnN0YW5jZSgpLCBTTE9UKGNsb3NlQWxsV2luZG93cygpKSwgUUtleVNl
cXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9RKSk7Ci0KLSAgICBRTWVudSogZWRpdE1lbnUgPSBt
ZW51QmFyKCktPmFkZE1lbnUoIiZFZGl0Iik7Ci0gICAgZWRpdE1lbnUtPmFkZEFjdGlvbihwYWdl
KCktPmFjdGlvbihRV2ViUGFnZTo6VW5kbykpOwotICAgIGVkaXRNZW51LT5hZGRBY3Rpb24ocGFn
ZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlJlZG8pKTsKLSAgICBlZGl0TWVudS0+YWRkU2VwYXJhdG9y
KCk7Ci0gICAgZWRpdE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6Q3V0
KSk7Ci0gICAgZWRpdE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6Q29w
eSkpOwotICAgIGVkaXRNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlBh
c3RlKSk7Ci0gICAgZWRpdE1lbnUtPmFkZFNlcGFyYXRvcigpOwotICAgIFFBY3Rpb24qIHNldEVk
aXRhYmxlID0gZWRpdE1lbnUtPmFkZEFjdGlvbigiU2V0IEVkaXRhYmxlIiwgdGhpcywgU0xPVChz
ZXRFZGl0YWJsZShib29sKSkpOwotICAgIHNldEVkaXRhYmxlLT5zZXRDaGVja2FibGUodHJ1ZSk7
Ci0KLSAgICBRTWVudSogdmlld01lbnUgPSBtZW51QmFyKCktPmFkZE1lbnUoIiZWaWV3Iik7Ci0g
ICAgdmlld01lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6U3RvcCkpOwot
ICAgIHZpZXdNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCkp
OwotICAgIHZpZXdNZW51LT5hZGRTZXBhcmF0b3IoKTsKLSAgICBRQWN0aW9uKiB6b29tSW4gPSB2
aWV3TWVudS0+YWRkQWN0aW9uKCJab29tICZJbiIsIHRoaXMsIFNMT1Qoem9vbUluKCkpKTsKLSAg
ICBRQWN0aW9uKiB6b29tT3V0ID0gdmlld01lbnUtPmFkZEFjdGlvbigiWm9vbSAmT3V0IiwgdGhp
cywgU0xPVCh6b29tT3V0KCkpKTsKLSAgICBRQWN0aW9uKiByZXNldFpvb20gPSB2aWV3TWVudS0+
YWRkQWN0aW9uKCJSZXNldCBab29tIiwgdGhpcywgU0xPVChyZXNldFpvb20oKSkpOwotICAgIFFB
Y3Rpb24qIHpvb21UZXh0T25seSA9IHZpZXdNZW51LT5hZGRBY3Rpb24oIlpvb20gVGV4dCBPbmx5
IiwgdGhpcywgU0xPVCh0b2dnbGVab29tVGV4dE9ubHkoYm9vbCkpKTsKLSAgICB6b29tVGV4dE9u
bHktPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICB6b29tVGV4dE9ubHktPnNldENoZWNrZWQoZmFs
c2UpOwotICAgIHZpZXdNZW51LT5hZGRTZXBhcmF0b3IoKTsKLSAgICB2aWV3TWVudS0+YWRkQWN0
aW9uKCJEdW1wIEhUTUwiLCB0aGlzLCBTTE9UKGR1bXBIdG1sKCkpKTsKLSAgICAvLyB2aWV3TWVu
dS0+YWRkQWN0aW9uKCJEdW1wIHBsdWdpbnMiLCB0aGlzLCBTTE9UKGR1bXBQbHVnaW5zKCkpKTsK
LQotICAgIFFNZW51KiBmb3JtYXRNZW51ID0gbmV3IFFNZW51KCJGJm9ybWF0IiwgdGhpcyk7Ci0g
ICAgbV9mb3JtYXRNZW51QWN0aW9uID0gbWVudUJhcigpLT5hZGRNZW51KGZvcm1hdE1lbnUpOwot
ICAgIG1fZm9ybWF0TWVudUFjdGlvbi0+c2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgZm9ybWF0TWVu
dS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVCb2xkKSk7Ci0gICAg
Zm9ybWF0TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVJdGFs
aWMpKTsKLSAgICBmb3JtYXRNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6
OlRvZ2dsZVVuZGVybGluZSkpOwotICAgIFFNZW51KiB3cml0aW5nTWVudSA9IGZvcm1hdE1lbnUt
PmFkZE1lbnUodHIoIldyaXRpbmcgRGlyZWN0aW9uIikpOwotICAgIHdyaXRpbmdNZW51LT5hZGRB
Y3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25EZWZhdWx0KSk7
Ci0gICAgd3JpdGluZ01lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6U2V0
VGV4dERpcmVjdGlvbkxlZnRUb1JpZ2h0KSk7Ci0gICAgd3JpdGluZ01lbnUtPmFkZEFjdGlvbihw
YWdlKCktPmFjdGlvbihRV2ViUGFnZTo6U2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0KSk7Ci0K
LSAgICB6b29tSW4tPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpLZXlf
UGx1cykpOwotICAgIHpvb21PdXQtPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8
IFF0OjpLZXlfTWludXMpKTsKLSAgICByZXNldFpvb20tPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5j
ZShRdDo6Q1RSTCB8IFF0OjpLZXlfMCkpOwotCi0gICAgUU1lbnUqIHdpbmRvd01lbnUgPSBtZW51
QmFyKCktPmFkZE1lbnUoIiZXaW5kb3ciKTsKLSAgICBRQWN0aW9uKiB0b2dnbGVGdWxsU2NyZWVu
ID0gd2luZG93TWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgRnVsbFNjcmVlbiIsIHRoaXMsIFNJR05B
TChlbnRlcmVkRnVsbFNjcmVlbk1vZGUoYm9vbCkpKTsKLSAgICB0b2dnbGVGdWxsU2NyZWVuLT5z
ZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgdG9nZ2xlRnVsbFNjcmVlbi0+c2V0Q2hlY2tlZChmYWxz
ZSk7Ci0KLSAgICAvLyB3aGVuIGV4aXQgZnVsbHNjcmVlbiBtb2RlIGJ5IGNsaWNraW5nIG9uIHRo
ZSBleGl0IGFyZWEgKGJvdHRvbSByaWdodCBjb3JuZXIpIHdlIG11c3QKLSAgICAvLyB1bmNoZWNr
IHRoZSBUb2dnbGUgRnVsbFNjcmVlbiBhY3Rpb24KLSAgICB0b2dnbGVGdWxsU2NyZWVuLT5jb25u
ZWN0KHRoaXMsIFNJR05BTChlbnRlcmVkRnVsbFNjcmVlbk1vZGUoYm9vbCkpLCBTTE9UKHNldENo
ZWNrZWQoYm9vbCkpKTsKLQotICAgIFFNZW51KiB0b29sc01lbnUgPSBtZW51QmFyKCktPmFkZE1l
bnUoIiZEZXZlbG9wIik7Ci0gICAgdG9vbHNNZW51LT5hZGRBY3Rpb24oIlNlbGVjdCBFbGVtZW50
cy4uLiIsIHRoaXMsIFNMT1Qoc2VsZWN0RWxlbWVudHMoKSkpOwotICAgIFFBY3Rpb24qIHNob3dJ
bnNwZWN0b3JBY3Rpb24gPSB0b29sc01lbnUtPmFkZEFjdGlvbigiU2hvdyBXZWIgSW5zcGVjdG9y
IiwgbV9pbnNwZWN0b3IsIFNMT1Qoc2V0VmlzaWJsZShib29sKSksIFFLZXlTZXF1ZW5jZShRdDo6
Q1RSTCB8IFF0OjpBTFQgfCBRdDo6S2V5X0kpKTsKLSAgICBzaG93SW5zcGVjdG9yQWN0aW9uLT5z
ZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgc2hvd0luc3BlY3RvckFjdGlvbi0+Y29ubmVjdChtX2lu
c3BlY3RvciwgU0lHTkFMKHZpc2libGVDaGFuZ2VkKGJvb2wpKSwgU0xPVChzZXRDaGVja2VkKGJv
b2wpKSk7Ci0KLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKLSAg
ICBRQWN0aW9uKiB0b3VjaE1vY2tBY3Rpb24gPSB0b29sc01lbnUtPmFkZEFjdGlvbigiVG9nZ2xl
IG11bHRpdG91Y2ggbW9ja2luZyIsIHRoaXMsIFNMT1Qoc2V0VG91Y2hNb2NraW5nKGJvb2wpKSk7
Ci0gICAgdG91Y2hNb2NrQWN0aW9uLT5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgdG91Y2hNb2Nr
QWN0aW9uLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6QUxUIHwgUXQ6
OktleV9UKSk7Ci0jZW5kaWYKLQotICAgIFFXZWJTZXR0aW5ncyogc2V0dGluZ3MgPSBwYWdlKCkt
PnNldHRpbmdzKCk7Ci0KLSAgICBRTWVudSogZ3JhcGhpY3NWaWV3TWVudSA9IHRvb2xzTWVudS0+
YWRkTWVudSgiUUdyYXBoaWNzVmlldyIpOwotICAgIFFBY3Rpb24qIHRvZ2dsZUdyYXBoaWNzVmll
dyA9IGdyYXBoaWNzVmlld01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIHVzZSBvZiBRR3JhcGhpY3NW
aWV3IiwgdGhpcywgU0xPVChpbml0aWFsaXplVmlldyhib29sKSkpOwotICAgIHRvZ2dsZUdyYXBo
aWNzVmlldy0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIHRvZ2dsZUdyYXBoaWNzVmlldy0+c2V0
Q2hlY2tlZChpc0dyYXBoaWNzQmFzZWQoKSk7Ci0KLSAgICBRQWN0aW9uKiB0b2dnbGVXZWJHTCA9
IHRvb2xzTWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgV2ViR0wiLCB0aGlzLCBTTE9UKHRvZ2dsZVdl
YkdMKGJvb2wpKSk7Ci0gICAgdG9nZ2xlV2ViR0wtPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICB0
b2dnbGVXZWJHTC0+c2V0Q2hlY2tlZChzZXR0aW5ncy0+dGVzdEF0dHJpYnV0ZShRV2ViU2V0dGlu
Z3M6OldlYkdMRW5hYmxlZCkpOwotCi0gICAgUUFjdGlvbiogdG9nZ2xlQWNjZWxlcmF0ZWRDb21w
b3NpdGluZyA9IGdyYXBoaWNzVmlld01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIEFjY2VsZXJhdGVk
IENvbXBvc2l0aW5nIiwgdGhpcywgU0xPVCh0b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nKGJv
b2wpKSk7Ci0gICAgdG9nZ2xlQWNjZWxlcmF0ZWRDb21wb3NpdGluZy0+c2V0Q2hlY2thYmxlKHRy
dWUpOwotICAgIHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmctPnNldENoZWNrZWQoc2V0dGlu
Z3MtPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpBY2NlbGVyYXRlZENvbXBvc2l0aW5nRW5h
YmxlZCkpOwotICAgIHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmctPnNldEVuYWJsZWQoaXNH
cmFwaGljc0Jhc2VkKCkpOwotICAgIHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmctPmNvbm5l
Y3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0RW5h
YmxlZChib29sKSkpOwotCi0gICAgUUFjdGlvbiogdG9nZ2xlUmVzaXplc1RvQ29udGVudHMgPSBn
cmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSBSZXNpemVzIFRvIENvbnRlbnRzIE1v
ZGUiLCB0aGlzLCBTTE9UKHRvZ2dsZVJlc2l6ZXNUb0NvbnRlbnRzKGJvb2wpKSk7Ci0gICAgdG9n
Z2xlUmVzaXplc1RvQ29udGVudHMtPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICB0b2dnbGVSZXNp
emVzVG9Db250ZW50cy0+c2V0Q2hlY2tlZChmYWxzZSk7Ci0gICAgdG9nZ2xlUmVzaXplc1RvQ29u
dGVudHMtPnNldEVuYWJsZWQoZmFsc2UpOwotICAgIHRvZ2dsZVJlc2l6ZXNUb0NvbnRlbnRzLT5j
b25uZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNl
dEVuYWJsZWQoYm9vbCkpKTsKLQotICAgIFFBY3Rpb24qIHRvZ2dsZVRpbGVkQmFja2luZ1N0b3Jl
ID0gZ3JhcGhpY3NWaWV3TWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgVGlsZWQgQmFja2luZyBTdG9y
ZSIsIHRoaXMsIFNMT1QodG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUoYm9vbCkpKTsKLSAgICB0b2dn
bGVUaWxlZEJhY2tpbmdTdG9yZS0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIHRvZ2dsZVRpbGVk
QmFja2luZ1N0b3JlLT5zZXRDaGVja2VkKGZhbHNlKTsKLSAgICB0b2dnbGVUaWxlZEJhY2tpbmdT
dG9yZS0+c2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgdG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUtPmNv
bm5lY3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0
RW5hYmxlZChib29sKSkpOwotCi0gICAgUUFjdGlvbiogc3BhdGlhbE5hdmlnYXRpb25BY3Rpb24g
PSB0b29sc01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIFNwYXRpYWwgTmF2aWdhdGlvbiIsIHRoaXMs
IFNMT1QodG9nZ2xlU3BhdGlhbE5hdmlnYXRpb24oYm9vbCkpKTsKLSAgICBzcGF0aWFsTmF2aWdh
dGlvbkFjdGlvbi0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIHNwYXRpYWxOYXZpZ2F0aW9uQWN0
aW9uLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6U0hJRlQgfCBRdDo6
S2V5X1MpKTsKLQotICAgIFFBY3Rpb24qIHRvZ2dsZUZyYW1lRmxhdHRlbmluZyA9IHRvb2xzTWVu
dS0+YWRkQWN0aW9uKCJUb2dnbGUgRnJhbWUgRmxhdHRlbmluZyIsIHRoaXMsIFNMT1QodG9nZ2xl
RnJhbWVGbGF0dGVuaW5nKGJvb2wpKSk7Ci0gICAgdG9nZ2xlRnJhbWVGbGF0dGVuaW5nLT5zZXRD
aGVja2FibGUodHJ1ZSk7Ci0gICAgdG9nZ2xlRnJhbWVGbGF0dGVuaW5nLT5zZXRDaGVja2VkKHNl
dHRpbmdzLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6RnJhbWVGbGF0dGVuaW5nRW5hYmxl
ZCkpOwotCi0jaWYgZGVmaW5lZChRVF9DT05GSUdVUkVEX1dJVEhfT1BFTkdMKQotICAgIFFBY3Rp
b24qIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0ID0gZ3JhcGhpY3NWaWV3TWVudS0+YWRkQWN0aW9u
KCJUb2dnbGUgdXNlIG9mIFFHTFdpZGdldCBWaWV3cG9ydCIsIHRoaXMsIFNMT1QodG9nZ2xlUUdM
V2lkZ2V0Vmlld3BvcnQoYm9vbCkpKTsKLSAgICB0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydC0+c2V0
Q2hlY2thYmxlKHRydWUpOwotICAgIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0LT5zZXRDaGVja2Vk
KGdVc2VRR0xXaWRnZXRWaWV3cG9ydCk7Ci0gICAgdG9nZ2xlUUdMV2lkZ2V0Vmlld3BvcnQtPnNl
dEVuYWJsZWQoaXNHcmFwaGljc0Jhc2VkKCkpOwotICAgIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0
LT5jb25uZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9U
KHNldEVuYWJsZWQoYm9vbCkpKTsKLSNlbmRpZgotCi0gICAgUUFjdGlvbiogdXNlckFnZW50QWN0
aW9uID0gdG9vbHNNZW51LT5hZGRBY3Rpb24oIkNoYW5nZSBVc2VyIEFnZW50IiwgdGhpcywgU0xP
VChzaG93VXNlckFnZW50RGlhbG9nKCkpKTsKLSAgICB1c2VyQWdlbnRBY3Rpb24tPnNldFNob3J0
Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpTSElGVCB8IFF0OjpLZXlfVSkpOwotCi0g
ICAgZ3JhcGhpY3NWaWV3TWVudS0+YWRkU2VwYXJhdG9yKCk7Ci0KLSAgICBtX2ZsaXBBbmltYXRl
ZCA9IGdyYXBoaWNzVmlld01lbnUtPmFkZEFjdGlvbigiQW5pbWF0ZWQgRmxpcCIpOwotICAgIG1f
ZmxpcEFuaW1hdGVkLT5jb25uZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQo
Ym9vbCkpLCBTTE9UKHNldEVuYWJsZWQoYm9vbCkpKTsKLSAgICBtX2ZsaXBBbmltYXRlZC0+c2V0
RW5hYmxlZChpc0dyYXBoaWNzQmFzZWQoKSk7Ci0KLSAgICBtX2ZsaXBZQW5pbWF0ZWQgPSBncmFw
aGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIkFuaW1hdGVkIFktRmxpcCIpOwotICAgIG1fZmxpcFlB
bmltYXRlZC0+Y29ubmVjdCh0b2dnbGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wp
KSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7Ci0gICAgbV9mbGlwWUFuaW1hdGVkLT5zZXRFbmFi
bGVkKGlzR3JhcGhpY3NCYXNlZCgpKTsKLQotICAgIGlmIChpc0dyYXBoaWNzQmFzZWQoKSkgewot
ICAgICAgICBXZWJWaWV3R3JhcGhpY3NCYXNlZCogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZpZXdH
cmFwaGljc0Jhc2VkKj4obV92aWV3KTsKLSAgICAgICAgY29ubmVjdChtX2ZsaXBBbmltYXRlZCwg
U0lHTkFMKHRyaWdnZXJlZCgpKSwgdmlldywgU0xPVChhbmltYXRlZEZsaXAoKSkpOwotICAgICAg
ICBjb25uZWN0KG1fZmxpcFlBbmltYXRlZCwgU0lHTkFMKHRyaWdnZXJlZCgpKSwgdmlldywgU0xP
VChhbmltYXRlZFlGbGlwKCkpKTsKLSAgICB9Ci0KLSAgICBncmFwaGljc1ZpZXdNZW51LT5hZGRT
ZXBhcmF0b3IoKTsKLQotICAgIFFBY3Rpb24qIGNsb25lV2luZG93ID0gZ3JhcGhpY3NWaWV3TWVu
dS0+YWRkQWN0aW9uKCJDbG9uZSBXaW5kb3ciLCB0aGlzLCBTTE9UKGNsb25lV2luZG93KCkpKTsK
LSAgICBjbG9uZVdpbmRvdy0+Y29ubmVjdCh0b2dnbGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dn
bGVkKGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7Ci0gICAgY2xvbmVXaW5kb3ctPnNl
dEVuYWJsZWQoaXNHcmFwaGljc0Jhc2VkKCkpOwotCi0gICAgUUFjdGlvbiogc2hvd0ZQUyA9IGdy
YXBoaWNzVmlld01lbnUtPmFkZEFjdGlvbigiU2hvdyBGUFMiLCB0aGlzLCBTTE9UKHNob3dGUFMo
Ym9vbCkpKTsKLSAgICBzaG93RlBTLT5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgc2hvd0ZQUy0+
c2V0RW5hYmxlZChpc0dyYXBoaWNzQmFzZWQoKSk7Ci0gICAgc2hvd0ZQUy0+Y29ubmVjdCh0b2dn
bGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJv
b2wpKSk7Ci0gICAgc2hvd0ZQUy0+c2V0Q2hlY2tlZChnU2hvd0ZyYW1lUmF0ZSk7Ci0KLSAgICBR
TWVudSogdmlld3BvcnRVcGRhdGVNZW51ID0gZ3JhcGhpY3NWaWV3TWVudS0+YWRkTWVudSgiQ2hh
bmdlIFZpZXdwb3J0IFVwZGF0ZSBNb2RlIik7Ci0gICAgdmlld3BvcnRVcGRhdGVNZW51LT5zZXRF
bmFibGVkKGlzR3JhcGhpY3NCYXNlZCgpKTsKLSAgICB2aWV3cG9ydFVwZGF0ZU1lbnUtPmNvbm5l
Y3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0RW5h
YmxlZChib29sKSkpOwotCi0gICAgUUFjdGlvbiogZnVsbFVwZGF0ZSA9IHZpZXdwb3J0VXBkYXRl
TWVudS0+YWRkQWN0aW9uKCJGdWxsVmlld3BvcnRVcGRhdGUiKTsKLSAgICBmdWxsVXBkYXRlLT5z
ZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgZnVsbFVwZGF0ZS0+c2V0Q2hlY2tlZCgoZ1ZpZXdwb3J0
VXBkYXRlTW9kZSA9PSBRR3JhcGhpY3NWaWV3OjpGdWxsVmlld3BvcnRVcGRhdGUpID8gdHJ1ZSA6
IGZhbHNlKTsKLQotICAgIFFBY3Rpb24qIG1pbmltYWxVcGRhdGUgPSB2aWV3cG9ydFVwZGF0ZU1l
bnUtPmFkZEFjdGlvbigiTWluaW1hbFZpZXdwb3J0VXBkYXRlIik7Ci0gICAgbWluaW1hbFVwZGF0
ZS0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIG1pbmltYWxVcGRhdGUtPnNldENoZWNrZWQoKGdW
aWV3cG9ydFVwZGF0ZU1vZGUgPT0gUUdyYXBoaWNzVmlldzo6TWluaW1hbFZpZXdwb3J0VXBkYXRl
KSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICBRQWN0aW9uKiBzbWFydFVwZGF0ZSA9IHZpZXdwb3J0
VXBkYXRlTWVudS0+YWRkQWN0aW9uKCJTbWFydFZpZXdwb3J0VXBkYXRlIik7Ci0gICAgc21hcnRV
cGRhdGUtPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICBzbWFydFVwZGF0ZS0+c2V0Q2hlY2tlZCgo
Z1ZpZXdwb3J0VXBkYXRlTW9kZSA9PSBRR3JhcGhpY3NWaWV3OjpTbWFydFZpZXdwb3J0VXBkYXRl
KSA/IHRydWUgOiBmYWxzZSk7Ci0KLSAgICBRQWN0aW9uKiBib3VuZGluZ1JlY3RVcGRhdGUgPSB2
aWV3cG9ydFVwZGF0ZU1lbnUtPmFkZEFjdGlvbigiQm91bmRpbmdSZWN0Vmlld3BvcnRVcGRhdGUi
KTsKLSAgICBib3VuZGluZ1JlY3RVcGRhdGUtPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICBib3Vu
ZGluZ1JlY3RVcGRhdGUtPnNldENoZWNrZWQoKGdWaWV3cG9ydFVwZGF0ZU1vZGUgPT0gUUdyYXBo
aWNzVmlldzo6Qm91bmRpbmdSZWN0Vmlld3BvcnRVcGRhdGUpID8gdHJ1ZSA6IGZhbHNlKTsKLQot
ICAgIFFBY3Rpb24qIG5vVXBkYXRlID0gdmlld3BvcnRVcGRhdGVNZW51LT5hZGRBY3Rpb24oIk5v
Vmlld3BvcnRVcGRhdGUiKTsKLSAgICBub1VwZGF0ZS0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAg
IG5vVXBkYXRlLT5zZXRDaGVja2VkKChnVmlld3BvcnRVcGRhdGVNb2RlID09IFFHcmFwaGljc1Zp
ZXc6Ok5vVmlld3BvcnRVcGRhdGUpID8gdHJ1ZSA6IGZhbHNlKTsKLQotICAgIFFTaWduYWxNYXBw
ZXIqIHNpZ25hbE1hcHBlciA9IG5ldyBRU2lnbmFsTWFwcGVyKHZpZXdwb3J0VXBkYXRlTWVudSk7
Ci0gICAgc2lnbmFsTWFwcGVyLT5zZXRNYXBwaW5nKGZ1bGxVcGRhdGUsIFFHcmFwaGljc1ZpZXc6
OkZ1bGxWaWV3cG9ydFVwZGF0ZSk7Ci0gICAgc2lnbmFsTWFwcGVyLT5zZXRNYXBwaW5nKG1pbmlt
YWxVcGRhdGUsIFFHcmFwaGljc1ZpZXc6Ok1pbmltYWxWaWV3cG9ydFVwZGF0ZSk7Ci0gICAgc2ln
bmFsTWFwcGVyLT5zZXRNYXBwaW5nKHNtYXJ0VXBkYXRlLCBRR3JhcGhpY3NWaWV3OjpTbWFydFZp
ZXdwb3J0VXBkYXRlKTsKLSAgICBzaWduYWxNYXBwZXItPnNldE1hcHBpbmcoYm91bmRpbmdSZWN0
VXBkYXRlLCBRR3JhcGhpY3NWaWV3OjpCb3VuZGluZ1JlY3RWaWV3cG9ydFVwZGF0ZSk7Ci0gICAg
c2lnbmFsTWFwcGVyLT5zZXRNYXBwaW5nKG5vVXBkYXRlLCBRR3JhcGhpY3NWaWV3OjpOb1ZpZXdw
b3J0VXBkYXRlKTsKLQotICAgIGNvbm5lY3QoZnVsbFVwZGF0ZSwgU0lHTkFMKHRyaWdnZXJlZCgp
KSwgc2lnbmFsTWFwcGVyLCBTTE9UKG1hcCgpKSk7Ci0gICAgY29ubmVjdChtaW5pbWFsVXBkYXRl
LCBTSUdOQUwodHJpZ2dlcmVkKCkpLCBzaWduYWxNYXBwZXIsIFNMT1QobWFwKCkpKTsKLSAgICBj
b25uZWN0KHNtYXJ0VXBkYXRlLCBTSUdOQUwodHJpZ2dlcmVkKCkpLCBzaWduYWxNYXBwZXIsIFNM
T1QobWFwKCkpKTsKLSAgICBjb25uZWN0KGJvdW5kaW5nUmVjdFVwZGF0ZSwgU0lHTkFMKHRyaWdn
ZXJlZCgpKSwgc2lnbmFsTWFwcGVyLCBTTE9UKG1hcCgpKSk7Ci0gICAgY29ubmVjdChub1VwZGF0
ZSwgU0lHTkFMKHRyaWdnZXJlZCgpKSwgc2lnbmFsTWFwcGVyLCBTTE9UKG1hcCgpKSk7Ci0KLSAg
ICBjb25uZWN0KHNpZ25hbE1hcHBlciwgU0lHTkFMKG1hcHBlZChpbnQpKSwgdGhpcywgU0xPVChj
aGFuZ2VWaWV3cG9ydFVwZGF0ZU1vZGUoaW50KSkpOwotCi0gICAgUUFjdGlvbkdyb3VwKiB2aWV3
cG9ydFVwZGF0ZU1vZGVBY3Rpb25zID0gbmV3IFFBY3Rpb25Hcm91cCh2aWV3cG9ydFVwZGF0ZU1l
bnUpOwotICAgIHZpZXdwb3J0VXBkYXRlTW9kZUFjdGlvbnMtPmFkZEFjdGlvbihmdWxsVXBkYXRl
KTsKLSAgICB2aWV3cG9ydFVwZGF0ZU1vZGVBY3Rpb25zLT5hZGRBY3Rpb24obWluaW1hbFVwZGF0
ZSk7Ci0gICAgdmlld3BvcnRVcGRhdGVNb2RlQWN0aW9ucy0+YWRkQWN0aW9uKHNtYXJ0VXBkYXRl
KTsKLSAgICB2aWV3cG9ydFVwZGF0ZU1vZGVBY3Rpb25zLT5hZGRBY3Rpb24oYm91bmRpbmdSZWN0
VXBkYXRlKTsKLSAgICB2aWV3cG9ydFVwZGF0ZU1vZGVBY3Rpb25zLT5hZGRBY3Rpb24obm9VcGRh
dGUpOwotfQotCi1RV2ViUGFnZSogV2ViUGFnZTo6Y3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJX
aW5kb3dUeXBlIHR5cGUpCi17Ci0gICAgTGF1bmNoZXJXaW5kb3cqIG13ID0gbmV3IExhdW5jaGVy
V2luZG93OwotICAgIGlmICh0eXBlID09IFdlYk1vZGFsRGlhbG9nKQotICAgICAgICBtdy0+c2V0
V2luZG93TW9kYWxpdHkoUXQ6OkFwcGxpY2F0aW9uTW9kYWwpOwotICAgIG13LT5zaG93KCk7Ci0g
ICAgcmV0dXJuIG13LT5wYWdlKCk7Ci19Ci0KLVFPYmplY3QqIFdlYlBhZ2U6OmNyZWF0ZVBsdWdp
bihjb25zdCBRU3RyaW5nICZjbGFzc0lkLCBjb25zdCBRVXJsJiwgY29uc3QgUVN0cmluZ0xpc3Qm
LCBjb25zdCBRU3RyaW5nTGlzdCYpCi17Ci0gICAgaWYgKGNsYXNzSWQgPT0gImFsaWVuX1FMYWJl
bCIpIHsKLSAgICAgICAgUUxhYmVsKiBsID0gbmV3IFFMYWJlbDsKLSAgICAgICAgbC0+d2luSWQo
KTsKLSAgICAgICAgcmV0dXJuIGw7Ci0gICAgfQotCi0jaWZuZGVmIFFUX05PX1VJVE9PTFMKLSAg
ICBRVWlMb2FkZXIgbG9hZGVyOwotICAgIHJldHVybiBsb2FkZXIuY3JlYXRlV2lkZ2V0KGNsYXNz
SWQsIHZpZXcoKSk7Ci0jZWxzZQotICAgIFFfVU5VU0VEKGNsYXNzSWQpOwotICAgIHJldHVybiAw
OwotI2VuZGlmCi19Ci0KLQotaW50IGxhdW5jaGVyTWFpbihjb25zdCBRQXBwbGljYXRpb24mIGFw
cCkKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgaW50IHJldFZhbCA9IGFwcC5leGVjKCk7Ci0gICAg
RHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ6OmdhcmJhZ2VDb2xsZWN0b3JDb2xsZWN0KCk7Ci0gICAg
UVdlYlNldHRpbmdzOjpjbGVhck1lbW9yeUNhY2hlcygpOwotICAgIHJldHVybiByZXRWYWw7Ci0j
ZWxzZQotICAgIHJldHVybiBhcHAuZXhlYygpOwotI2VuZGlmCi19Ci0KLWNsYXNzIExhdW5jaGVy
QXBwbGljYXRpb24gOiBwdWJsaWMgUUFwcGxpY2F0aW9uIHsKLSAgICBRX09CSkVDVAotCi1wdWJs
aWM6Ci0gICAgTGF1bmNoZXJBcHBsaWNhdGlvbihpbnQmIGFyZ2MsIGNoYXIqKiBhcmd2KTsKLSAg
ICBRU3RyaW5nTGlzdCB1cmxzKCkgY29uc3QgeyByZXR1cm4gbV91cmxzOyB9Ci0gICAgYm9vbCBp
c1JvYm90aXplZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNSb2JvdGl6ZWQ7IH0KLQotcHJpdmF0ZToK
LSAgICB2b2lkIGhhbmRsZVVzZXJPcHRpb25zKCk7Ci0gICAgdm9pZCBhcHBseURlZmF1bHRTZXR0
aW5ncygpOwotCi1wcml2YXRlOgotICAgIGJvb2wgbV9pc1JvYm90aXplZDsKLSAgICBRU3RyaW5n
TGlzdCBtX3VybHM7Ci19OwotCi12b2lkIExhdW5jaGVyQXBwbGljYXRpb246OmFwcGx5RGVmYXVs
dFNldHRpbmdzKCkKLXsKLSAgICBRV2ViU2V0dGluZ3M6OnNldE1heGltdW1QYWdlc0luQ2FjaGUo
NCk7Ci0KLSAgICBRV2ViU2V0dGluZ3M6OnNldE9iamVjdENhY2hlQ2FwYWNpdGllcygoMTYqMTAy
NCoxMDI0KSAvIDgsICgxNioxMDI0KjEwMjQpIC8gOCwgMTYqMTAyNCoxMDI0KTsKLQotICAgIFFX
ZWJTZXR0aW5nczo6Z2xvYmFsU2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6
UGx1Z2luc0VuYWJsZWQsIHRydWUpOwotICAgIFFXZWJTZXR0aW5nczo6Z2xvYmFsU2V0dGluZ3Mo
KS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCwgdHJ1
ZSk7Ci0gICAgUVdlYlNldHRpbmdzOjplbmFibGVQZXJzaXN0ZW50U3RvcmFnZSgpOwotfQotCi1M
YXVuY2hlckFwcGxpY2F0aW9uOjpMYXVuY2hlckFwcGxpY2F0aW9uKGludCYgYXJnYywgY2hhcioq
IGFyZ3YpCi0gICAgOiBRQXBwbGljYXRpb24oYXJnYywgYXJndiwgUUFwcGxpY2F0aW9uOjpHdWlT
ZXJ2ZXIpCi0gICAgLCBtX2lzUm9ib3RpemVkKGZhbHNlKQotewotICAgIC8vIFRvIGFsbG93IFFX
ZWJJbnNwZWN0b3IncyBjb25maWd1cmF0aW9uIHBlcnNpc3RlbmNlCi0gICAgc2V0T3JnYW5pemF0
aW9uTmFtZSgiTm9raWEiKTsKLSAgICBzZXRBcHBsaWNhdGlvbk5hbWUoIlF0TGF1bmNoZXIiKTsK
LSAgICBzZXRBcHBsaWNhdGlvblZlcnNpb24oIjAuMSIpOwotCi0gICAgYXBwbHlEZWZhdWx0U2V0
dGluZ3MoKTsKLQotICAgIGhhbmRsZVVzZXJPcHRpb25zKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJl
cXVpcmVzR3JhcGhpY3NWaWV3KGNvbnN0IFFTdHJpbmcmIG9wdGlvbikKLXsKLSAgICBpZiAoZ1Vz
ZUdyYXBoaWNzVmlldykKLSAgICAgICAgcmV0dXJuOwotICAgIGFwcFF1aXQoMSwgUVN0cmluZygi
JTEgb25seSB3b3JrcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSAtZ3JhcGhpY3NiYXNlZCBvcHRp
b24iKS5hcmcob3B0aW9uKSk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJBcHBsaWNhdGlvbjo6aGFuZGxl
VXNlck9wdGlvbnMoKQotewotICAgIFFTdHJpbmdMaXN0IGFyZ3MgPSBhcmd1bWVudHMoKTsKLSAg
ICBRRmlsZUluZm8gcHJvZ3JhbShhcmdzLmF0KDApKTsKLSAgICBRU3RyaW5nIHByb2dyYW1OYW1l
KCJRdExhdW5jaGVyIik7Ci0gICAgaWYgKHByb2dyYW0uZXhpc3RzKCkpCi0gICAgICAgIHByb2dy
YW1OYW1lID0gcHJvZ3JhbS5iYXNlTmFtZSgpOwotCi0gICAgUUxpc3Q8UVN0cmluZz4gdXBkYXRl
TW9kZXMoZW51bVRvS2V5cyhRR3JhcGhpY3NWaWV3OjpzdGF0aWNNZXRhT2JqZWN0LAotICAgICAg
ICAgICAgIlZpZXdwb3J0VXBkYXRlTW9kZSIsICJWaWV3cG9ydFVwZGF0ZSIpKTsKLQotICAgIGlm
IChhcmdzLmNvbnRhaW5zKCItaGVscCIpKSB7Ci0gICAgICAgIHFEZWJ1ZygpIDw8ICJVc2FnZToi
IDw8IHByb2dyYW1OYW1lLnRvTGF0aW4xKCkuZGF0YSgpCi0gICAgICAgICAgICAgPDwgIlstZ3Jh
cGhpY3NiYXNlZF0iCi0gICAgICAgICAgICAgPDwgIlstbm8tY29tcG9zaXRpbmddIgotICAgICAg
ICAgICAgIDw8IFFTdHJpbmcoIlstdmlld3BvcnQtdXBkYXRlLW1vZGUgJTFdIikuYXJnKGZvcm1h
dEtleXModXBkYXRlTW9kZXMpKS50b0xhdGluMSgpLmRhdGEoKQotICAgICAgICAgICAgIDw8ICJb
LWNhY2hlLXdlYnZpZXddIgotICAgICAgICAgICAgIDw8ICJbLXNob3ctZnBzXSIKLSAgICAgICAg
ICAgICA8PCAiWy1yIGxpc3RdIgotICAgICAgICAgICAgIDw8ICJbLWluc3BlY3Rvci11cmwgbG9j
YXRpb25dIgotICAgICAgICAgICAgIDw8ICJbLXRpbGVkLWJhY2tpbmctc3RvcmVdIgotICAgICAg
ICAgICAgIDw8ICJbLXJlc2l6ZXMtdG8tY29udGVudHNdIgotICAgICAgICAgICAgIDw8ICJVUkxz
IjsKLSAgICAgICAgYXBwUXVpdCgwKTsKLSAgICB9Ci0KLSAgICBpZiAoYXJncy5jb250YWlucygi
LWdyYXBoaWNzYmFzZWQiKSkKLSAgICAgICAgZ1VzZUdyYXBoaWNzVmlldyA9IHRydWU7Ci0KLSAg
ICBpZiAoYXJncy5jb250YWlucygiLW5vLWNvbXBvc2l0aW5nIikpIHsKLSAgICAgICAgcmVxdWly
ZXNHcmFwaGljc1ZpZXcoIi1uby1jb21wb3NpdGluZyIpOwotICAgICAgICBnVXNlQ29tcG9zaXRp
bmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoYXJncy5jb250YWlucygiLXNob3ctZnBzIikp
IHsKLSAgICAgICAgcmVxdWlyZXNHcmFwaGljc1ZpZXcoIi1zaG93LWZwcyIpOwotICAgICAgICBn
U2hvd0ZyYW1lUmF0ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGFyZ3MuY29udGFpbnMoIi1j
YWNoZS13ZWJ2aWV3IikpIHsKLSAgICAgICAgcmVxdWlyZXNHcmFwaGljc1ZpZXcoIi1jYWNoZS13
ZWJ2aWV3Iik7Ci0gICAgICAgIGdDYWNoZVdlYlZpZXcgPSB0cnVlOwotICAgIH0KLQotICAgIGlm
IChhcmdzLmNvbnRhaW5zKCItdGlsZWQtYmFja2luZy1zdG9yZSIpKSB7Ci0gICAgICAgIHJlcXVp
cmVzR3JhcGhpY3NWaWV3KCItdGlsZWQtYmFja2luZy1zdG9yZSIpOwotICAgICAgICBnVXNlVGls
ZWRCYWNraW5nU3RvcmUgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChhcmdzLmNvbnRhaW5zKCIt
cmVzaXplcy10by1jb250ZW50cyIpKSB7Ci0gICAgICAgIHJlcXVpcmVzR3JhcGhpY3NWaWV3KCIt
cmVzaXplcy10by1jb250ZW50cyIpOwotICAgICAgICBnUmVzaXplc1RvQ29udGVudHMgPSB0cnVl
OwotICAgIH0KLQotICAgIFFTdHJpbmcgYXJnMSgiLXZpZXdwb3J0LXVwZGF0ZS1tb2RlIik7Ci0g
ICAgaW50IG1vZGVJbmRleCA9IGFyZ3MuaW5kZXhPZihhcmcxKTsKLSAgICBpZiAobW9kZUluZGV4
ICE9IC0xKSB7Ci0gICAgICAgIHJlcXVpcmVzR3JhcGhpY3NWaWV3KGFyZzEpOwotCi0gICAgICAg
IFFTdHJpbmcgbW9kZSA9IHRha2VPcHRpb25WYWx1ZSgmYXJncywgbW9kZUluZGV4KTsKLSAgICAg
ICAgaWYgKG1vZGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgYXBwUXVpdCgxLCBRU3RyaW5nKCIl
MSBuZWVkcyBhIHZhbHVlIG9mIG9uZSBvZiBbJTJdIikuYXJnKGFyZzEpLmFyZyhmb3JtYXRLZXlz
KHVwZGF0ZU1vZGVzKSkpOwotICAgICAgICBpbnQgaWR4ID0gdXBkYXRlTW9kZXMuaW5kZXhPZiht
b2RlKTsKLSAgICAgICAgaWYgKGlkeCA9PSAtMSkKLSAgICAgICAgICAgIGFwcFF1aXQoMSwgUVN0
cmluZygiJTEgdmFsdWUgaGFzIHRvIGJlIG9uZSBvZiBbJTJdIikuYXJnKGFyZzEpLmFyZyhmb3Jt
YXRLZXlzKHVwZGF0ZU1vZGVzKSkpOwotCi0gICAgICAgIGdWaWV3cG9ydFVwZGF0ZU1vZGUgPSBz
dGF0aWNfY2FzdDxRR3JhcGhpY3NWaWV3OjpWaWV3cG9ydFVwZGF0ZU1vZGU+KGlkeCk7Ci0gICAg
fQotCi0gICAgUVN0cmluZyBpbnNwZWN0b3JVcmxBcmcoIi1pbnNwZWN0b3ItdXJsIik7Ci0gICAg
aW50IGluc3BlY3RvclVybEluZGV4ID0gYXJncy5pbmRleE9mKGluc3BlY3RvclVybEFyZyk7Ci0g
ICAgaWYgKGluc3BlY3RvclVybEluZGV4ICE9IC0xKQotICAgICAgIGdJbnNwZWN0b3JVcmwgPSB0
YWtlT3B0aW9uVmFsdWUoJmFyZ3MsIGluc3BlY3RvclVybEluZGV4KTsKLQotICAgIGludCByb2Jv
dEluZGV4ID0gYXJncy5pbmRleE9mKCItciIpOwotICAgIGlmIChyb2JvdEluZGV4ICE9IC0xKSB7
Ci0gICAgICAgIFFTdHJpbmcgbGlzdEZpbGUgPSB0YWtlT3B0aW9uVmFsdWUoJmFyZ3MsIHJvYm90
SW5kZXgpOwotICAgICAgICBpZiAobGlzdEZpbGUuaXNFbXB0eSgpKQotICAgICAgICAgICAgYXBw
UXVpdCgxLCAiLXIgbmVlZHMgYSBsaXN0IGZpbGUgdG8gc3RhcnQgaW4gcm9ib3RpemVkIG1vZGUi
KTsKLSAgICAgICAgaWYgKCFRRmlsZTo6ZXhpc3RzKGxpc3RGaWxlKSkKLSAgICAgICAgICAgIGFw
cFF1aXQoMSwgIlRoZSBsaXN0IGZpbGUgc3VwcGxpZWQgdG8gLXIgZG9lcyBub3QgZXhpc3QuIik7
Ci0KLSAgICAgICAgbV9pc1JvYm90aXplZCA9IHRydWU7Ci0gICAgICAgIG1fdXJscyA9IFFTdHJp
bmdMaXN0KGxpc3RGaWxlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBsYXN0
QXJnID0gYXJncy5sYXN0SW5kZXhPZihRUmVnRXhwKCJeLS4qIikpOwotICAgIG1fdXJscyA9IChs
YXN0QXJnICE9IC0xKSA/IGFyZ3MubWlkKCsrbGFzdEFyZykgOiBhcmdzLm1pZCgxKTsKLX0KLQot
Ci1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgTGF1bmNoZXJBcHBsaWNh
dGlvbiBhcHAoYXJnYywgYXJndik7Ci0KLSAgICBpZiAoYXBwLmlzUm9ib3RpemVkKCkpIHsKLSAg
ICAgICAgTGF1bmNoZXJXaW5kb3cqIHdpbmRvdyA9IG5ldyBMYXVuY2hlcldpbmRvdygpOwotICAg
ICAgICBVcmxMb2FkZXIgbG9hZGVyKHdpbmRvdy0+cGFnZSgpLT5tYWluRnJhbWUoKSwgYXBwLnVy
bHMoKS5hdCgwKSk7Ci0gICAgICAgIFFPYmplY3Q6OmNvbm5lY3Qod2luZG93LT5wYWdlKCktPm1h
aW5GcmFtZSgpLCBTSUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSwgJmxvYWRlciwgU0xPVChsb2Fk
TmV4dCgpKSk7Ci0gICAgICAgIGxvYWRlci5sb2FkTmV4dCgpOwotICAgICAgICB3aW5kb3ctPnNo
b3coKTsKLSAgICAgICAgcmV0dXJuIGxhdW5jaGVyTWFpbihhcHApOwotICAgIH0KLQotICAgIFFT
dHJpbmdMaXN0IHVybHMgPSBhcHAudXJscygpOwotCi0gICAgaWYgKHVybHMuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIFFTdHJpbmcgZGVmYXVsdFVybCA9IFFTdHJpbmcoImZpbGU6Ly8lMS8lMiIpLmFy
ZyhRRGlyOjpob21lUGF0aCgpKS5hcmcoUUxhdGluMVN0cmluZygiaW5kZXguaHRtbCIpKTsKLSAg
ICAgICAgaWYgKFFEaXIoZGVmYXVsdFVybCkuZXhpc3RzKCkpCi0gICAgICAgICAgICB1cmxzLmFw
cGVuZChkZWZhdWx0VXJsKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdXJscy5hcHBlbmQo
IiIpOwotICAgIH0KLQotICAgIExhdW5jaGVyV2luZG93KiB3aW5kb3cgPSAwOwotICAgIGZvcmVh
Y2ggKFFTdHJpbmcgdXJsLCB1cmxzKSB7Ci0gICAgICAgIGlmICghd2luZG93KQotICAgICAgICAg
ICAgd2luZG93ID0gbmV3IExhdW5jaGVyV2luZG93KCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAg
ICAgIHdpbmRvdy0+bmV3V2luZG93KCk7Ci0KLSAgICAgICAgd2luZG93LT5sb2FkKHVybCk7Ci0g
ICAgfQotCi0gICAgd2luZG93LT5zaG93KCk7Ci0gICAgcmV0dXJuIGxhdW5jaGVyTWFpbihhcHAp
OwotfQotCi0jaW5jbHVkZSAibWFpbi5tb2MiCkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVy
L21haW53aW5kb3cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFp
bndpbmRvdy5jcHAJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9t
YWlud2luZG93LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHaXJpc2ggUmFtYWtyaXNobmFuIDxnaXJpc2hA
Zm9yd2FyZGJpYXMuaW4+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlrb3MgPHN0
YWlrb3NAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBEaXJrIE11ZWxsZXIgPG11ZWxs
ZXJAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBaYWNrIFJ1c2luIDx6YWNrQGtkZS5v
cmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ltb24gSGF1c21hbm4gPGhhdXNtYW5uQGtkZS5v
cmc+Ci0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
LSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAibWFpbndp
bmRvdy5oIgotCi0jaW5jbHVkZSAibG9jYXRpb25lZGl0LmgiCi0jaW5jbHVkZSAidXRpbHMuaCIK
LQotTWFpbldpbmRvdzo6TWFpbldpbmRvdyhjb25zdCBRU3RyaW5nJiB1cmwpCi0gICAgOiBtX3Bh
Z2UobmV3IFdlYlBhZ2UodGhpcykpCi17Ci0gICAgc2V0QXR0cmlidXRlKFF0OjpXQV9EZWxldGVP
bkNsb3NlKTsKLSAgICBpZiAocWdldGVudigiUVRMQVVOQ0hFUl9VU0VfQVJHQl9WSVNVQUxTIiku
dG9JbnQoKSA9PSAxKQotICAgICAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX1RyYW5zbHVjZW50QmFj
a2dyb3VuZCk7Ci0KLSAgICBidWlsZFVJKCk7Ci19Ci0KLXZvaWQgTWFpbldpbmRvdzo6YnVpbGRV
SSgpCi17Ci0gICAgUVRvb2xCYXIqIGJhciA9IGFkZFRvb2xCYXIoIk5hdmlnYXRpb24iKTsKLSNp
ZiBkZWZpbmVkKFFfV1NfUzYwKQotICAgIGJhci0+c2V0SWNvblNpemUoUVNpemUoMTYsIDE2KSk7
Ci0jZW5kaWYKLSAgICBiYXItPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6QmFj
aykpOwotICAgIGJhci0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJk
KSk7Ci0gICAgYmFyLT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCkp
OwotICAgIGJhci0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpTdG9wKSk7Ci0K
LSAgICB1cmxFZGl0ID0gbmV3IExvY2F0aW9uRWRpdCh0aGlzKTsKLSAgICB1cmxFZGl0LT5zZXRT
aXplUG9saWN5KFFTaXplUG9saWN5OjpFeHBhbmRpbmcsIHVybEVkaXQtPnNpemVQb2xpY3koKS52
ZXJ0aWNhbFBvbGljeSgpKTsKLSAgICBjb25uZWN0KHVybEVkaXQsIFNJR05BTChyZXR1cm5QcmVz
c2VkKCkpLCBTTE9UKGNoYW5nZUxvY2F0aW9uKCkpKTsKLSAgICBRQ29tcGxldGVyKiBjb21wbGV0
ZXIgPSBuZXcgUUNvbXBsZXRlcih0aGlzKTsKLSAgICB1cmxFZGl0LT5zZXRDb21wbGV0ZXIoY29t
cGxldGVyKTsKLSAgICBjb21wbGV0ZXItPnNldE1vZGVsKCZ1cmxNb2RlbCk7Ci0jaWYgZGVmaW5l
ZChRX1dTX1M2MCkKLSAgICBhZGRUb29sQmFyQnJlYWsoKTsKLSAgICBhZGRUb29sQmFyKCJMb2Nh
dGlvbiIpLT5hZGRXaWRnZXQodXJsRWRpdCk7Ci0jZWxzZQotICAgIGJhci0+YWRkV2lkZ2V0KHVy
bEVkaXQpOwotI2VuZGlmCi0KLSAgICBjb25uZWN0KHBhZ2UoKS0+bWFpbkZyYW1lKCksIFNJR05B
TCh0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyYpKSwKLSAgICAgICAgICAgIHRoaXMsIFNMT1Qo
c2V0V2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYpKSk7Ci0gICAgY29ubmVjdChwYWdlKCksIFNJ
R05BTChsb2FkUHJvZ3Jlc3MoaW50KSksIHVybEVkaXQsIFNMT1Qoc2V0UHJvZ3Jlc3MoaW50KSkp
OwotICAgIGNvbm5lY3QocGFnZSgpLCBTSUdOQUwod2luZG93Q2xvc2VSZXF1ZXN0ZWQoKSksIHRo
aXMsIFNMT1QoY2xvc2UoKSkpOwotCi0gICAgLy8gc2hvcnQtY3V0cwotICAgIHBhZ2UoKS0+YWN0
aW9uKFFXZWJQYWdlOjpCYWNrKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlOjpCYWNrKTsKLSAg
ICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6U3RvcCktPnNldFNob3J0Y3V0KFF0OjpLZXlfRXNj
YXBlKTsKLSAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCktPnNldFNob3J0Y3V0
KFFLZXlTZXF1ZW5jZTo6Rm9yd2FyZCk7Ci0gICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlJl
bG9hZCktPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZTo6UmVmcmVzaCk7Ci0gICAgcGFnZSgpLT5h
Y3Rpb24oUVdlYlBhZ2U6OlVuZG8pLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OlVuZG8pOwot
ICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpSZWRvKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVl
bmNlOjpSZWRvKTsKLSAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6Q3V0KS0+c2V0U2hvcnRj
dXQoUUtleVNlcXVlbmNlOjpDdXQpOwotICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpDb3B5
KS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlOjpDb3B5KTsKLSAgICBwYWdlKCktPmFjdGlvbihR
V2ViUGFnZTo6UGFzdGUpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OlBhc3RlKTsKLQotICAg
IHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVCb2xkKS0+c2V0U2hvcnRjdXQoUUtleVNl
cXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9CKSk7Ci0gICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBh
Z2U6OlRvZ2dsZUl0YWxpYyktPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0
OjpLZXlfSSkpOwotICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVVbmRlcmxpbmUp
LT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6S2V5X1UpKTsKLX0KLQot
V2ViUGFnZSogTWFpbldpbmRvdzo6cGFnZSgpCi17Ci0gICAgcmV0dXJuIG1fcGFnZTsKLX0KLQot
dm9pZCBNYWluV2luZG93OjpzZXRBZGRyZXNzVXJsKGNvbnN0IFFTdHJpbmcmIHVybCkKLXsKLSAg
ICB1cmxFZGl0LT5zZXRUZXh0KHVybCk7Ci19Ci0KLXZvaWQgTWFpbldpbmRvdzo6YWRkQ29tcGxl
dGVyRW50cnkoY29uc3QgUVVybCYgdXJsKQotewotICAgIFFVcmw6OkZvcm1hdHRpbmdPcHRpb25z
IG9wdHM7Ci0gICAgb3B0cyB8PSBRVXJsOjpSZW1vdmVTY2hlbWU7Ci0gICAgb3B0cyB8PSBRVXJs
OjpSZW1vdmVVc2VySW5mbzsKLSAgICBvcHRzIHw9IFFVcmw6OlN0cmlwVHJhaWxpbmdTbGFzaDsK
LSAgICBRU3RyaW5nIHMgPSB1cmwudG9TdHJpbmcob3B0cyk7Ci0gICAgcyA9IHMubWlkKDIpOwot
ICAgIGlmIChzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCF1cmxMaXN0
LmNvbnRhaW5zKHMpKQotICAgICAgICB1cmxMaXN0ICs9IHM7Ci0gICAgdXJsTW9kZWwuc2V0U3Ry
aW5nTGlzdCh1cmxMaXN0KTsKLX0KLQotdm9pZCBNYWluV2luZG93Ojpsb2FkKGNvbnN0IFFTdHJp
bmcmIHVybCkKLXsKLSAgICBRVXJsIHF1cmwgPSB1cmxGcm9tVXNlcklucHV0KHVybCk7Ci0gICAg
aWYgKHF1cmwuc2NoZW1lKCkuaXNFbXB0eSgpKQotICAgICAgICBxdXJsID0gUVVybCgiaHR0cDov
LyIgKyB1cmwgKyAiLyIpOwotICAgIGxvYWQocXVybCk7Ci19Ci0KLXZvaWQgTWFpbldpbmRvdzo6
bG9hZChjb25zdCBRVXJsJiB1cmwpCi17Ci0gICAgaWYgKCF1cmwuaXNWYWxpZCgpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBzZXRBZGRyZXNzVXJsKHVybC50b1N0cmluZygpKTsKLSAgICBwYWdl
KCktPm1haW5GcmFtZSgpLT5sb2FkKHVybCk7Ci19Ci0KLXZvaWQgTWFpbldpbmRvdzo6Y2hhbmdl
TG9jYXRpb24oKQotewotICAgIFFTdHJpbmcgc3RyaW5nID0gdXJsRWRpdC0+dGV4dCgpOwotICAg
IGxvYWQoc3RyaW5nKTsKLX0KLQotdm9pZCBNYWluV2luZG93OjpvcGVuRmlsZSgpCi17Ci0gICAg
c3RhdGljIGNvbnN0IFFTdHJpbmcgZmlsdGVyKCJIVE1MIEZpbGVzICgqLmh0bSAqLmh0bWwpOztU
ZXh0IEZpbGVzICgqLnR4dCk7O0ltYWdlIEZpbGVzICgqLmdpZiAqLmpwZyAqLnBuZyk7O0FsbCBG
aWxlcyAoKikiKTsKLQotICAgIFFGaWxlRGlhbG9nIGZpbGVEaWFsb2codGhpcywgdHIoIk9wZW4i
KSwgUVN0cmluZygpLCBmaWx0ZXIpOwotICAgIGZpbGVEaWFsb2cuc2V0QWNjZXB0TW9kZShRRmls
ZURpYWxvZzo6QWNjZXB0T3Blbik7Ci0gICAgZmlsZURpYWxvZy5zZXRGaWxlTW9kZShRRmlsZURp
YWxvZzo6RXhpc3RpbmdGaWxlKTsKLSAgICBmaWxlRGlhbG9nLnNldE9wdGlvbnMoUUZpbGVEaWFs
b2c6OlJlYWRPbmx5KTsKLQotICAgIGlmIChmaWxlRGlhbG9nLmV4ZWMoKSkgewotICAgICAgICBR
U3RyaW5nIHNlbGVjdGVkRmlsZSA9IGZpbGVEaWFsb2cuc2VsZWN0ZWRGaWxlcygpWzBdOwotICAg
ICAgICBpZiAoIXNlbGVjdGVkRmlsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBsb2FkKFFVcmw6
OmZyb21Mb2NhbEZpbGUoc2VsZWN0ZWRGaWxlKSk7Ci0gICAgfQotfQotCkluZGV4OiBXZWJLaXRU
b29scy9RdExhdW5jaGVyL21haW53aW5kb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9R
dExhdW5jaGVyL21haW53aW5kb3cuaAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9R
dExhdW5jaGVyL21haW53aW5kb3cuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2OSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vi
c2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4g
PGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3Rh
aWtvcyA8c3RhaWtvc0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxl
ciA8bXVlbGxlckBrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHph
Y2tAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21h
bm5Aa2RlLm9yZz4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
LSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYg
bWFpbndpbmRvd19oCi0jZGVmaW5lIG1haW53aW5kb3dfaAotCi0jaW5jbHVkZSA8UXRHdWk+Ci0j
aW5jbHVkZSAid2VicGFnZS5oIgotCi1jbGFzcyBMb2NhdGlvbkVkaXQ7Ci0KLWNsYXNzIE1haW5X
aW5kb3cgOiBwdWJsaWMgUU1haW5XaW5kb3cgewotICAgIFFfT0JKRUNUCi0KLXB1YmxpYzoKLSAg
ICBNYWluV2luZG93KGNvbnN0IFFTdHJpbmcmIHVybCA9IFFTdHJpbmcoKSk7Ci0KLSAgICB2b2lk
IHNldEFkZHJlc3NVcmwoY29uc3QgUVN0cmluZyYgdXJsKTsKLSAgICB2b2lkIGFkZENvbXBsZXRl
ckVudHJ5KGNvbnN0IFFVcmwmIHVybCk7Ci0KLSAgICB2b2lkIGxvYWQoY29uc3QgUVN0cmluZyYg
dXJsKTsKLSAgICB2b2lkIGxvYWQoY29uc3QgUVVybCYgdXJsKTsKLQotICAgIFdlYlBhZ2UqIHBh
Z2UoKTsKLQotcHJvdGVjdGVkIHNsb3RzOgotICAgIHZvaWQgb3BlbkZpbGUoKTsKLSAgICB2b2lk
IGNoYW5nZUxvY2F0aW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBidWlsZFVJKCk7Ci0KLSAg
ICBRU3RyaW5nTGlzdE1vZGVsIHVybE1vZGVsOwotICAgIFFTdHJpbmdMaXN0IHVybExpc3Q7Ci0g
ICAgTG9jYXRpb25FZGl0KiB1cmxFZGl0OwotCi0gICAgV2ViUGFnZSogbV9wYWdlOwotfTsKLQot
I2VuZGlmCkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3VybGxvYWRlci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91cmxsb2FkZXIuY3BwCShyZXZpc2lvbiA1
NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0IChDKSAy
MDA5IFVuaXZlcnNpdHkgb2YgU3plZ2VkCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
Ci0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0g
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAq
LwotCi0jaW5jbHVkZSAidXJsbG9hZGVyLmgiCi0KLSNpbmNsdWRlIDxRRmlsZT4KLSNpbmNsdWRl
IDxRRGVidWc+Ci0KLVVybExvYWRlcjo6VXJsTG9hZGVyKFFXZWJGcmFtZSogZnJhbWUsIGNvbnN0
IFFTdHJpbmcmIGlucHV0RmlsZU5hbWUpCi0gICAgOiBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9z
dGRPdXQoc3Rkb3V0KQotICAgICwgbV9sb2FkZWQoMCkKLXsKLSAgICBpbml0KGlucHV0RmlsZU5h
bWUpOwotfQotCi12b2lkIFVybExvYWRlcjo6bG9hZE5leHQoKQotewotICAgIFFTdHJpbmcgcXN0
cjsKLSAgICBpZiAoZ2V0VXJsKHFzdHIpKSB7Ci0gICAgICAgIFFVcmwgdXJsKHFzdHIsIFFVcmw6
OlN0cmljdE1vZGUpOwotICAgICAgICBpZiAodXJsLmlzVmFsaWQoKSkgewotICAgICAgICAgICAg
bV9zdGRPdXQgPDwgIkxvYWRpbmcgIiA8PCBxc3RyIDw8ICIgLi4uLi4uIiA8PCArK21fbG9hZGVk
IDw8IGVuZGw7Ci0gICAgICAgICAgICBtX2ZyYW1lLT5sb2FkKHVybCk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgbG9hZE5leHQoKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZGlzY29ubmVj
dChtX2ZyYW1lLCAwLCB0aGlzLCAwKTsKLX0KLQotdm9pZCBVcmxMb2FkZXI6OmluaXQoY29uc3Qg
UVN0cmluZyYgaW5wdXRGaWxlTmFtZSkKLXsKLSAgICBRRmlsZSBpbnB1dEZpbGUoaW5wdXRGaWxl
TmFtZSk7Ci0gICAgaWYgKGlucHV0RmlsZS5vcGVuKFFJT0RldmljZTo6UmVhZE9ubHkgfCBRSU9E
ZXZpY2U6OlRleHQpKSB7Ci0gICAgICAgIFFUZXh0U3RyZWFtIHN0cmVhbSgmaW5wdXRGaWxlKTsK
LSAgICAgICAgUVN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAg
ICAgbGluZSA9IHN0cmVhbS5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKGxpbmUuaXNOdWxs
KCkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBtX3VybHMuYXBwZW5kKGxp
bmUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcURlYnVnKCkgPDwgIkNhbid0
IG9wZW4gbGlzdCBmaWxlIjsKLSAgICAgICAgZXhpdCgwKTsKLSAgICB9Ci0gICAgbV9pbmRleCA9
IDA7Ci0gICAgaW5wdXRGaWxlLmNsb3NlKCk7Ci19Ci0KLWJvb2wgVXJsTG9hZGVyOjpnZXRVcmwo
UVN0cmluZyYgcXN0cikKLXsKLSAgICBpZiAobV9pbmRleCA9PSBtX3VybHMuc2l6ZSgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBxc3RyID0gbV91cmxzW21faW5kZXgrK107Ci0gICAg
cmV0dXJuIHRydWU7Ci19CkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3VybGxvYWRlci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmgJKHJldmlz
aW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91cmxsb2FkZXIuaAkod29ya2lu
ZyBjb3B5KQpAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0IChD
KSAyMDA5IFVuaXZlcnNpdHkgb2YgU3plZ2VkCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
Ci0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jaWZuZGVmIHVybGxvYWRlcl9oCi0jZGVmaW5lIHVybGxvYWRlcl9oCi0KLSNpbmNs
dWRlICJxd2ViZnJhbWUuaCIKLQotI2luY2x1ZGUgPFFUZXh0U3RyZWFtPgotI2luY2x1ZGUgPFFW
ZWN0b3I+Ci0KLWNsYXNzIFVybExvYWRlciA6IHB1YmxpYyBRT2JqZWN0IHsKLSAgICBRX09CSkVD
VAotCi1wdWJsaWM6Ci0gICAgVXJsTG9hZGVyKFFXZWJGcmFtZSogZnJhbWUsIGNvbnN0IFFTdHJp
bmcmIGlucHV0RmlsZU5hbWUpOwotCi1wdWJsaWMgc2xvdHM6Ci0gICAgdm9pZCBsb2FkTmV4dCgp
OwotCi1wcml2YXRlOgotICAgIHZvaWQgaW5pdChjb25zdCBRU3RyaW5nJiBpbnB1dEZpbGVOYW1l
KTsKLSAgICBib29sIGdldFVybChRU3RyaW5nJiBxc3RyKTsKLQotcHJpdmF0ZToKLSAgICBRVmVj
dG9yPFFTdHJpbmc+IG1fdXJsczsKLSAgICBpbnQgbV9pbmRleDsKLSAgICBRV2ViRnJhbWUqIG1f
ZnJhbWU7Ci0gICAgUVRleHRTdHJlYW0gbV9zdGRPdXQ7Ci0gICAgaW50IG1fbG9hZGVkOwotfTsK
LQotI2VuZGlmCkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3VzZXJhZ2VudGxpc3QudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXNlcmFnZW50bGlzdC50eHQJ
KHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91c2VyYWdlbnRsaXN0
LnR4dAkod29ya2luZyBjb3B5KQpAQCAtMSw5ICswLDAgQEAKLU1vemlsbGEvNS4wIChYMTE7IFU7
IExpbnV4OyBlbi1VUykgQXBwbGVXZWJLaXQvNTMzLjMgKEtIVE1MLCBsaWtlIEdlY2tvKSBRdExh
dW5jaGVyLzAuMSBTYWZhcmkvNTMzLjMKLU1vemlsbGEvNS4wIChTeW1iaWFuT1MvOS40OyBVOyBT
ZXJpZXM2MC81LjA7IGVuLUdCKSBBcHBsZVdlYktpdC81MzMuMyAoS0hUTUwsIGxpa2UgR2Vja28p
IFF0TGF1bmNoZXIvMC4xIE1vYmlsZSBTYWZhcmkvNTMzLjMKLU1vemlsbGEvNS4wIChNYWNpbnRv
c2g7IFU7IFBQQyBNYWMgT1MgWDsgZW4pIEFwcGxlV2ViS2l0LzEyNS4yIChLSFRNTCwgbGlrZSBH
ZWNrbykgU2FmYXJpLzEyNS44Ci1Nb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgMS4xOyBl
bi1nYjsgZHJlYW0pIEFwcGxlV2ViS2l0LzUyNS4xMCsgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJz
aW9uLzMuMC40IE1vYmlsZSBTYWZhcmkvNTIzLjEyLjIKLU1vemlsbGEvNS4wIChpUGhvbmU7IFU7
IENQVSBPUyAzXzIgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIEFwcGxlV2ViS2l0LzUzMS4yMS4xMCAo
S0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wLjQgTW9iaWxlLzdCMzM0YiBTYWZhcmkvNTMx
LjIxLjEwCi1Nb3ppbGxhLzUuMChpUGFkOyBVOyBDUFUgaVBob25lIE9TIDNfMiBsaWtlIE1hYyBP
UyBYOyBlbi11cykgQXBwbGVXZWJLaXQvNTMxLjIxLjEwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVy
c2lvbi80LjAuNCBNb2JpbGUvN0IzMTQgU2FmYXJpLzUzMS4yMS4xMAotT3BlcmEvOS4yNSAoV2lu
ZG93cyBOVCA2LjA7IFU7IGVuKQotTW96aWxsYS81LjAgKFN5bWJpYW5PUy85LjQ7IFU7IFNlcmll
czYwLzUuMCBOb2tpYTU4MDBkLTFiLzIwLjIuMDE0OyBQcm9maWxlL01JRFAtMi4xIENvbmZpZ3Vy
YXRpb24vQ0xEQy0xLjEgKSBBcHBsZVdlYktpdC80MTMgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZh
cmkvNDEzCi1Nb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA4LjA7IFdpbmRvd3MgTlQgNi4y
OyBUcmlkZW50LzQuMDsgU0xDQzI7IC5ORVQgQ0xSIDIuMC41MDcyNzsgLk5FVCBDTFIgMy41LjMw
NzI5OyAuTkVUIENMUiAzLjAuMzA3Mjk7IE1lZGlhIENlbnRlciBQQyA2LjApCkluZGV4OiBXZWJL
aXRUb29scy9RdExhdW5jaGVyL3V0aWxzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9R
dExhdW5jaGVyL3V0aWxzLmNwcAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExh
dW5jaGVyL3V0aWxzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw5MiArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0g
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgInV0
aWxzLmgiCi0KLQotUVN0cmluZyB0YWtlT3B0aW9uVmFsdWUoUVN0cmluZ0xpc3QqIGFyZ3VtZW50
cywgaW50IGluZGV4KQotewotICAgIFFTdHJpbmcgcmVzdWx0OwotCi0gICAgaWYgKCsraW5kZXgg
PCBhcmd1bWVudHMtPmNvdW50KCkgJiYgIWFyZ3VtZW50cy0+YXQoaW5kZXgpLnN0YXJ0c1dpdGgo
Ii0iKSkKLSAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzLT50YWtlQXQoaW5kZXgpOwotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotUVN0cmluZyBmb3JtYXRLZXlzKFFMaXN0PFFTdHJpbmc+IGtl
eXMpCi17Ci0gICAgUVN0cmluZyByZXN1bHQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlz
LmNvdW50KCkgLSAxOyBpKyspCi0gICAgICAgIHJlc3VsdC5hcHBlbmQoa2V5cy5hdChpKSArICJ8
Iik7Ci0gICAgcmVzdWx0LmFwcGVuZChrZXlzLmxhc3QoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotUUxpc3Q8UVN0cmluZz4gZW51bVRvS2V5cyhjb25zdCBRTWV0YU9iamVjdCBvLCBjb25z
dCBRU3RyaW5nJiBuYW1lLCBjb25zdCBRU3RyaW5nJiBzdHJpcCkKLXsKLSAgICBRTGlzdDxRU3Ry
aW5nPiBsaXN0OwotCi0gICAgaW50IGVudW1JbmRleCA9IG8uaW5kZXhPZkVudW1lcmF0b3IobmFt
ZS50b0xhdGluMSgpLmRhdGEoKSk7Ci0gICAgUU1ldGFFbnVtIGVudW1lcmF0b3IgPSBvLmVudW1l
cmF0b3IoZW51bUluZGV4KTsKLQotICAgIGlmIChlbnVtZXJhdG9yLmlzVmFsaWQoKSkgewotICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1lcmF0b3Iua2V5Q291bnQoKTsgaSsrKSB7Ci0g
ICAgICAgICAgICBRU3RyaW5nIGtleShlbnVtZXJhdG9yLnZhbHVlVG9LZXkoaSkpOwotICAgICAg
ICAgICAgbGlzdC5hcHBlbmQoa2V5LnJlbW92ZShzdHJpcCkpOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGxpc3Q7Ci19Ci0KLXZvaWQgYXBwUXVpdChpbnQgZXhpdENvZGUsIGNvbnN0
IFFTdHJpbmcmIG1zZykKLXsKLSAgICBpZiAoIW1zZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgaWYg
KGV4aXRDb2RlID4gMCkKLSAgICAgICAgICAgIHFEZWJ1ZygiRVJST1I6ICVzIiwgbXNnLnRvTGF0
aW4xKCkuZGF0YSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcURlYnVnKCkgPDwgbXNn
OwotICAgIH0KLSAgICBleGl0KGV4aXRDb2RlKTsKLX0KLQotUVVybCB1cmxGcm9tVXNlcklucHV0
KGNvbnN0IFFTdHJpbmcmIHN0cmluZykKLXsKLSAgICBRU3RyaW5nIGlucHV0KHN0cmluZyk7Ci0g
ICAgUUZpbGVJbmZvIGZpKGlucHV0KTsKLSAgICBpZiAoZmkuZXhpc3RzKCkgJiYgZmkuaXNSZWxh
dGl2ZSgpKQotICAgICAgICBpbnB1dCA9IGZpLmFic29sdXRlRmlsZVBhdGgoKTsKLQotI2lmIFFU
X1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgIHJldHVybiBRVXJsOjpm
cm9tVXNlcklucHV0KGlucHV0KTsKLSNlbHNlCi0gICAgcmV0dXJuIFFVcmwoaW5wdXQpOwotI2Vu
ZGlmCi19Ci0KLQpJbmRleDogV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91dGlscy5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXRpbHMuaAkocmV2aXNpb24gNTc2NTQpCisr
KyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3V0aWxzLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNTIg
KzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpZm5kZWYgdXRpbHNfaAotI2RlZmluZSB1dGlsc19oCi0KLSNpbmNsdWRlIDxRdENvcmU+
Ci0KLSNpZm5kZWYgTk9fUkVUVVJOCi0jaWYgZGVmaW5lZChfX0NDX0FSTSkgfHwgZGVmaW5lZChf
X0FSTUNDX18pCi0jZGVmaW5lIE5PX1JFVFVSTiBfX2RlY2xzcGVjKG5vcmV0dXJuKQotI2VsaWYg
ZGVmaW5lZChfX0dOVUNfXykKLSNkZWZpbmUgTk9fUkVUVVJOIF9fYXR0cmlidXRlKChfX25vcmV0
dXJuX18pKQotI2Vsc2UKLSNkZWZpbmUgTk9fUkVUVVJOCi0jZW5kaWYKLSNlbmRpZgotCi0vLyBv
cHRpb25zIGhhbmRsaW5nCi1RU3RyaW5nIHRha2VPcHRpb25WYWx1ZShRU3RyaW5nTGlzdCogYXJn
dW1lbnRzLCBpbnQgaW5kZXgpOwotUVN0cmluZyBmb3JtYXRLZXlzKFFMaXN0PFFTdHJpbmc+IGtl
eXMpOwotUUxpc3Q8UVN0cmluZz4gZW51bVRvS2V5cyhjb25zdCBRTWV0YU9iamVjdCBvLCBjb25z
dCBRU3RyaW5nJiBuYW1lLCBjb25zdCBRU3RyaW5nJiBzdHJpcCk7Ci0KLU5PX1JFVFVSTiB2b2lk
IGFwcFF1aXQoaW50IHN0YXR1cywgY29uc3QgUVN0cmluZyYgbXNnID0gUVN0cmluZygpKTsKLQot
UVVybCB1cmxGcm9tVXNlcklucHV0KGNvbnN0IFFTdHJpbmcmIGlucHV0KTsKLQotI2VuZGlmCklu
ZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYmluc3BlY3Rvci5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2ViaW5zcGVjdG9yLmgJKHJldmlzaW9uIDU3NjU0KQor
KysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJpbnNwZWN0b3IuaAkod29ya2luZyBjb3B5KQpA
QCAtMSw1NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgotICogQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQot
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIHdlYmluc3BlY3Rvcl9oCi0jZGVmaW5lIHdlYmluc3Bl
Y3Rvcl9oCi0KLSNpbmNsdWRlIDxRdEd1aT4KLSNpbmNsdWRlICJxd2ViaW5zcGVjdG9yLmgiCi0K
LWNsYXNzIFdlYkluc3BlY3RvciA6IHB1YmxpYyBRV2ViSW5zcGVjdG9yIHsKLSAgICBRX09CSkVD
VAotCi1wdWJsaWM6Ci0gICAgV2ViSW5zcGVjdG9yKFFXaWRnZXQqIHBhcmVudCkgOiBRV2ViSW5z
cGVjdG9yKHBhcmVudCkge30KLQotc2lnbmFsczoKLSAgICB2b2lkIHZpc2libGVDaGFuZ2VkKGJv
b2wgbm93VmlzaWJsZSk7Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lkIHNob3dFdmVudChRU2hvd0V2
ZW50KiBldmVudCkKLSAgICB7Ci0gICAgICAgIFFXZWJJbnNwZWN0b3I6OnNob3dFdmVudChldmVu
dCk7Ci0gICAgICAgIGVtaXQgdmlzaWJsZUNoYW5nZWQodHJ1ZSk7Ci0gICAgfQotICAgIHZvaWQg
aGlkZUV2ZW50KFFIaWRlRXZlbnQqIGV2ZW50KQotICAgIHsKLSAgICAgICAgUVdlYkluc3BlY3Rv
cjo6aGlkZUV2ZW50KGV2ZW50KTsKLSAgICAgICAgZW1pdCB2aXNpYmxlQ2hhbmdlZChmYWxzZSk7
Ci0gICAgfQotfTsKLQotI2VuZGlmCkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnBh
Z2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2VicGFnZS5jcHAJ
KHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJwYWdlLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAw
OS0yMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICog
Q29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlh
cy5pbj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUu
b3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3Jn
PgotICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KLSAqIENv
cHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KLSAqCi0g
KiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJ3ZWJwYWdlLmgiCi0KLSNp
bmNsdWRlIDxRRGVza3RvcFNlcnZpY2VzPgotI2luY2x1ZGUgPFF0R3VpPgotI2luY2x1ZGUgPFF0
TmV0d29yay9RTmV0d29ya1JlcXVlc3Q+Ci0jaW5jbHVkZSA8UXROZXR3b3JrL1FOZXR3b3JrUHJv
eHk+Ci0KLVdlYlBhZ2U6OldlYlBhZ2UoUU9iamVjdCogcGFyZW50KQotICAgIDogUVdlYlBhZ2Uo
cGFyZW50KQotewotICAgIGFwcGx5UHJveHkoKTsKLX0KLQotdm9pZCBXZWJQYWdlOjphcHBseVBy
b3h5KCkKLXsKLSAgICBRVXJsIHByb3h5VXJsKHFnZXRlbnYoImh0dHBfcHJveHkiKSk7Ci0KLSAg
ICBpZiAocHJveHlVcmwuaXNWYWxpZCgpICYmICFwcm94eVVybC5ob3N0KCkuaXNFbXB0eSgpKSB7
Ci0gICAgICAgIGludCBwcm94eVBvcnQgPSAocHJveHlVcmwucG9ydCgpID4gMCkgPyBwcm94eVVy
bC5wb3J0KCkgOiA4MDgwOwotICAgICAgICBuZXR3b3JrQWNjZXNzTWFuYWdlcigpLT5zZXRQcm94
eShRTmV0d29ya1Byb3h5KFFOZXR3b3JrUHJveHk6Okh0dHBQcm94eSwgcHJveHlVcmwuaG9zdCgp
LCBwcm94eVBvcnQpKTsKLSAgICB9Ci19Ci0KLWJvb2wgV2ViUGFnZTo6c3VwcG9ydHNFeHRlbnNp
b24oUVdlYlBhZ2U6OkV4dGVuc2lvbiBleHRlbnNpb24pIGNvbnN0Ci17Ci0gICAgaWYgKGV4dGVu
c2lvbiA9PSBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uKQotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgV2ViUGFnZTo6ZXh0ZW5zaW9uKEV4dGVu
c2lvbiBleHRlbnNpb24sIGNvbnN0IEV4dGVuc2lvbk9wdGlvbiogb3B0aW9uLCBFeHRlbnNpb25S
ZXR1cm4qIG91dHB1dCkKLXsKLSAgICBjb25zdCBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9u
T3B0aW9uKiBpbmZvID0gc3RhdGljX2Nhc3Q8Y29uc3QgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVu
c2lvbk9wdGlvbio+KG9wdGlvbik7Ci0gICAgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvblJl
dHVybiogZXJyb3JQYWdlID0gc3RhdGljX2Nhc3Q8UVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lv
blJldHVybio+KG91dHB1dCk7Ci0KLSAgICBlcnJvclBhZ2UtPmNvbnRlbnQgPSBRU3RyaW5nKCI8
aHRtbD48aGVhZD48dGl0bGU+RmFpbGVkIGxvYWRpbmcgcGFnZTwvdGl0bGU+PC9oZWFkPjxib2R5
PiUxPC9ib2R5PjwvaHRtbD4iKQotICAgICAgICAuYXJnKGluZm8tPmVycm9yU3RyaW5nKS50b1V0
ZjgoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdlYlBhZ2U6OmFjY2VwdE5hdmln
YXRpb25SZXF1ZXN0KFFXZWJGcmFtZSogZnJhbWUsIGNvbnN0IFFOZXR3b3JrUmVxdWVzdCYgcmVx
dWVzdCwgTmF2aWdhdGlvblR5cGUgdHlwZSkKLXsKLSAgICBRT2JqZWN0KiB2aWV3ID0gcGFyZW50
KCk7Ci0KLSAgICBRVmFyaWFudCB2YWx1ZSA9IHZpZXctPnByb3BlcnR5KCJrZXlib2FyZE1vZGlm
aWVycyIpOwotCi0gICAgaWYgKCF2YWx1ZS5pc051bGwoKSkgewotICAgICAgICBRdDo6S2V5Ym9h
cmRNb2RpZmllcnMgbW9kaWZpZXJzID0gUXQ6OktleWJvYXJkTW9kaWZpZXJzKHZhbHVlLnRvSW50
KCkpOwotCi0gICAgICAgIGlmIChtb2RpZmllcnMgJiBRdDo6U2hpZnRNb2RpZmllcikgewotICAg
ICAgICAgICAgUVdlYlBhZ2UqIHBhZ2UgPSBjcmVhdGVXaW5kb3coUVdlYlBhZ2U6OldlYkJyb3dz
ZXJXaW5kb3cpOwotICAgICAgICAgICAgcGFnZS0+bWFpbkZyYW1lKCktPmxvYWQocmVxdWVzdCk7
Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9k
aWZpZXJzICYgUXQ6OkFsdE1vZGlmaWVyKSB7Ci0gICAgICAgICAgICBvcGVuVXJsSW5EZWZhdWx0
QnJvd3NlcihyZXF1ZXN0LnVybCgpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHJldHVybiBRV2ViUGFnZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVl
c3QoZnJhbWUsIHJlcXVlc3QsIHR5cGUpOwotfQotCi12b2lkIFdlYlBhZ2U6Om9wZW5VcmxJbkRl
ZmF1bHRCcm93c2VyKGNvbnN0IFFVcmwmIHVybCkKLXsKLSAgICBpZiAoUUFjdGlvbiogYWN0aW9u
ID0gcW9iamVjdF9jYXN0PFFBY3Rpb24qPihzZW5kZXIoKSkpCi0gICAgICAgIFFEZXNrdG9wU2Vy
dmljZXM6Om9wZW5VcmwoYWN0aW9uLT5kYXRhKCkudG9VcmwoKSk7Ci0gICAgZWxzZQotICAgICAg
ICBRRGVza3RvcFNlcnZpY2VzOjpvcGVuVXJsKHVybCk7Ci19Ci0KLVFTdHJpbmcgV2ViUGFnZTo6
dXNlckFnZW50Rm9yVXJsKGNvbnN0IFFVcmwmIHVybCkgY29uc3QKLXsKLSAgICBpZiAoIW1fdXNl
ckFnZW50LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIG1fdXNlckFnZW50OwotICAgIHJldHVy
biBRV2ViUGFnZTo6dXNlckFnZW50Rm9yVXJsKHVybCk7Ci19CkluZGV4OiBXZWJLaXRUb29scy9R
dExhdW5jaGVyL3dlYnBhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdExhdW5jaGVy
L3dlYnBhZ2UuaAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dl
YnBhZ2UuaAkod29ya2luZyBjb3B5KQpAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQot
ICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJk
Ymlhcy5pbj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0Br
ZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUu
b3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KLSAq
IENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KLSAq
Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0g
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgd2VicGFnZV9oCi0jZGVm
aW5lIHdlYnBhZ2VfaAotCi0jaW5jbHVkZSA8cXdlYmZyYW1lLmg+Ci0jaW5jbHVkZSA8cXdlYnBh
Z2UuaD4KLQotY2xhc3MgV2ViUGFnZSA6IHB1YmxpYyBRV2ViUGFnZSB7Ci0gICAgUV9PQkpFQ1QK
LQotcHVibGljOgotICAgIFdlYlBhZ2UoUU9iamVjdCogcGFyZW50ID0gMCk7Ci0KLSAgICB2aXJ0
dWFsIFFXZWJQYWdlKiBjcmVhdGVXaW5kb3coUVdlYlBhZ2U6OldlYldpbmRvd1R5cGUpOwotICAg
IHZpcnR1YWwgUU9iamVjdCogY3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJpbmcmLCBjb25zdCBRVXJs
JiwgY29uc3QgUVN0cmluZ0xpc3QmLCBjb25zdCBRU3RyaW5nTGlzdCYpOwotICAgIHZpcnR1YWwg
Ym9vbCBzdXBwb3J0c0V4dGVuc2lvbihRV2ViUGFnZTo6RXh0ZW5zaW9uIGV4dGVuc2lvbikgY29u
c3Q7Ci0gICAgdmlydHVhbCBib29sIGV4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uLCBjb25z
dCBFeHRlbnNpb25PcHRpb24qIG9wdGlvbiwgRXh0ZW5zaW9uUmV0dXJuKiBvdXRwdXQpOwotCi0g
ICAgdmlydHVhbCBib29sIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZSogZnJhbWUs
IGNvbnN0IFFOZXR3b3JrUmVxdWVzdCYgcmVxdWVzdCwgTmF2aWdhdGlvblR5cGUgdHlwZSk7Ci0K
LSAgICBRU3RyaW5nIHVzZXJBZ2VudEZvclVybChjb25zdCBRVXJsJiB1cmwpIGNvbnN0OwotCi1w
dWJsaWMgc2xvdHM6Ci0gICAgdm9pZCBvcGVuVXJsSW5EZWZhdWx0QnJvd3Nlcihjb25zdCBRVXJs
JiB1cmwgPSBRVXJsKCkpOwotICAgIHZvaWQgc2V0VXNlckFnZW50KGNvbnN0IFFTdHJpbmcmIHVh
KSB7IG1fdXNlckFnZW50ID0gdWE7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGx5UHJveHko
KTsKLSAgICBRU3RyaW5nIG1fdXNlckFnZW50OwotfTsKLQotI2VuZGlmCkluZGV4OiBXZWJLaXRU
b29scy9RdExhdW5jaGVyL3dlYnZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0
TGF1bmNoZXIvd2Vidmlldy5jcHAJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRM
YXVuY2hlci93ZWJ2aWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSwyMDcgKzAsMCBAQAotLyoK
LSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNp
ZGlhcnkoLWllcykKLSAqIENvcHlyaWdodCAoQykgMjAwOSBHaXJpc2ggUmFtYWtyaXNobmFuIDxn
aXJpc2hAZm9yd2FyZGJpYXMuaW4+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlr
b3MgPHN0YWlrb3NAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBEaXJrIE11ZWxsZXIg
PG11ZWxsZXJAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBaYWNrIFJ1c2luIDx6YWNr
QGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ltb24gSGF1c21hbm4gPGhhdXNtYW5u
QGtkZS5vcmc+Ci0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
LSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0g
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAi
d2Vidmlldy5oIgotCi0jaW5jbHVkZSA8UXRHdWk+Ci0jaW5jbHVkZSA8UUdyYXBoaWNzU2NlbmU+
Ci0KLVdlYlZpZXdHcmFwaGljc0Jhc2VkOjpXZWJWaWV3R3JhcGhpY3NCYXNlZChRV2lkZ2V0KiBw
YXJlbnQpCi0gICAgOiBRR3JhcGhpY3NWaWV3KHBhcmVudCkKLSAgICAsIG1faXRlbShuZXcgR3Jh
cGhpY3NXZWJWaWV3KQotICAgICwgbV9udW1QYWludHNUb3RhbCgwKQotICAgICwgbV9udW1QYWlu
dHNTaW5jZUxhc3RNZWFzdXJlKDApCi0gICAgLCBtX21lYXN1cmVGcHMoZmFsc2UpCi0gICAgLCBt
X3Jlc2l6ZXNUb0NvbnRlbnRzKGZhbHNlKQotewotICAgIHNldFNjZW5lKG5ldyBRR3JhcGhpY3NT
Y2VuZSh0aGlzKSk7Ci0gICAgc2NlbmUoKS0+YWRkSXRlbShtX2l0ZW0pOwotCi0gICAgc2V0RnJh
bWVTaGFwZShRRnJhbWU6Ok5vRnJhbWUpOwotICAgIHNldEhvcml6b250YWxTY3JvbGxCYXJQb2xp
Y3koUXQ6OlNjcm9sbEJhckFsd2F5c09mZik7Ci0gICAgc2V0VmVydGljYWxTY3JvbGxCYXJQb2xp
Y3koUXQ6OlNjcm9sbEJhckFsd2F5c09mZik7Ci0KLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJ
T05fQ0hFQ0soNCwgNiwgMCkKLSAgICBRU3RhdGVNYWNoaW5lKiBtYWNoaW5lID0gbmV3IFFTdGF0
ZU1hY2hpbmUodGhpcyk7Ci0gICAgUVN0YXRlKiBzMCA9IG5ldyBRU3RhdGUobWFjaGluZSk7Ci0g
ICAgczAtPmFzc2lnblByb3BlcnR5KHRoaXMsICJ5Um90YXRpb24iLCAwKTsKLQotICAgIFFTdGF0
ZSogczEgPSBuZXcgUVN0YXRlKG1hY2hpbmUpOwotICAgIHMxLT5hc3NpZ25Qcm9wZXJ0eSh0aGlz
LCAieVJvdGF0aW9uIiwgOTApOwotCi0gICAgUUFic3RyYWN0VHJhbnNpdGlvbiogdDEgPSBzMC0+
YWRkVHJhbnNpdGlvbih0aGlzLCBTSUdOQUwoeUZsaXBSZXF1ZXN0KCkpLCBzMSk7Ci0gICAgUVBy
b3BlcnR5QW5pbWF0aW9uKiB5Um90YXRpb25BbmltID0gbmV3IFFQcm9wZXJ0eUFuaW1hdGlvbih0
aGlzLCAieVJvdGF0aW9uIiwgdGhpcyk7Ci0gICAgeVJvdGF0aW9uQW5pbS0+c2V0RHVyYXRpb24o
MTAwMCk7Ci0gICAgdDEtPmFkZEFuaW1hdGlvbih5Um90YXRpb25BbmltKTsKLQotICAgIFFTdGF0
ZSogczIgPSBuZXcgUVN0YXRlKG1hY2hpbmUpOwotICAgIHMyLT5hc3NpZ25Qcm9wZXJ0eSh0aGlz
LCAieVJvdGF0aW9uIiwgLTkwKTsKLSAgICBzMS0+YWRkVHJhbnNpdGlvbihzMSwgU0lHTkFMKHBy
b3BlcnRpZXNBc3NpZ25lZCgpKSwgczIpOwotCi0gICAgUUFic3RyYWN0VHJhbnNpdGlvbiogdDIg
PSBzMi0+YWRkVHJhbnNpdGlvbihzMCk7Ci0gICAgdDItPmFkZEFuaW1hdGlvbih5Um90YXRpb25B
bmltKTsKLQotICAgIG1hY2hpbmUtPnNldEluaXRpYWxTdGF0ZShzMCk7Ci0gICAgbWFjaGluZS0+
c3RhcnQoKTsKLSNlbmRpZgotCi0gICAgbV91cGRhdGVUaW1lciA9IG5ldyBRVGltZXIodGhpcyk7
Ci0gICAgbV91cGRhdGVUaW1lci0+c2V0SW50ZXJ2YWwoMTAwMCk7Ci0gICAgY29ubmVjdChtX3Vw
ZGF0ZVRpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVCh1cGRhdGVGcmFtZVJhdGUo
KSkpOwotfQotCi12b2lkIFdlYlZpZXdHcmFwaGljc0Jhc2VkOjpzZXRSZXNpemVzVG9Db250ZW50
cyhib29sIGIpCi17Ci0gICAgbV9yZXNpemVzVG9Db250ZW50cyA9IGI7Ci0gICAgbV9pdGVtLT5z
ZXRSZXNpemVzVG9Db250ZW50cyhtX3Jlc2l6ZXNUb0NvbnRlbnRzKTsKLSAgICBpZiAobV9yZXNp
emVzVG9Db250ZW50cykgewotICAgICAgICBzZXRIb3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5KFF0
OjpTY3JvbGxCYXJBc05lZWRlZCk7Ci0gICAgICAgIHNldFZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5
KFF0OjpTY3JvbGxCYXJBc05lZWRlZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0SG9yaXpv
bnRhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKLSAgICAgICAgc2V0
VmVydGljYWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFsd2F5c09mZik7Ci0gICAgfQot
fQotCi12b2lkIFdlYlZpZXdHcmFwaGljc0Jhc2VkOjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQq
IGV2ZW50KQotewotICAgIFFHcmFwaGljc1ZpZXc6OnJlc2l6ZUV2ZW50KGV2ZW50KTsKLSAgICBp
ZiAobV9yZXNpemVzVG9Db250ZW50cykKLSAgICAgICAgcmV0dXJuOwotICAgIFFSZWN0RiByZWN0
KFFQb2ludCgwLCAwKSwgZXZlbnQtPnNpemUoKSk7Ci0gICAgbV9pdGVtLT5zZXRHZW9tZXRyeShy
ZWN0KTsKLX0KLQotdm9pZCBXZWJWaWV3R3JhcGhpY3NCYXNlZDo6c2V0RnJhbWVSYXRlTWVhc3Vy
ZW1lbnRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBtX21lYXN1cmVGcHMgPSBlbmFibGVk
OwotICAgIGlmIChtX21lYXN1cmVGcHMpIHsKLSAgICAgICAgbV9sYXN0Q29uc3VsdFRpbWUgPSBt
X3N0YXJ0VGltZSA9IFFUaW1lOjpjdXJyZW50VGltZSgpOwotICAgICAgICBtX3VwZGF0ZVRpbWVy
LT5zdGFydCgpOwotICAgIH0gZWxzZQotICAgICAgICBtX3VwZGF0ZVRpbWVyLT5zdG9wKCk7Ci19
Ci0KLXZvaWQgV2ViVmlld0dyYXBoaWNzQmFzZWQ6OnVwZGF0ZUZyYW1lUmF0ZSgpCi17Ci0gICAg
UVRpbWUgbm93ID0gUVRpbWU6OmN1cnJlbnRUaW1lKCk7Ci0KLSAgICBpbnQgaW50ZXJ2YWwgPSBt
X2xhc3RDb25zdWx0VGltZS5tc2Vjc1RvKG5vdyk7Ci0gICAgaW50IHRvdGFsID0gbV9zdGFydFRp
bWUubXNlY3NUbyhub3cpOwotCi0gICAgaW50IGF2ZXJhZ2UgPSB0b3RhbCA/IG1fbnVtUGFpbnRz
VG90YWwgKiAxMDAwIC8gdG90YWwgOiAwOwotICAgIGludCBjdXJyZW50ID0gaW50ZXJ2YWwgPyBt
X251bVBhaW50c1NpbmNlTGFzdE1lYXN1cmUgKiAxMDAwIC8gaW50ZXJ2YWwgOiAwOwotCi0gICAg
ZW1pdCBjdXJyZW50RlBTVXBkYXRlZChjdXJyZW50KTsKLQotICAgIG1fbGFzdENvbnN1bHRUaW1l
ID0gbm93OwotICAgIG1fbnVtUGFpbnRzU2luY2VMYXN0TWVhc3VyZSA9IDA7Ci19Ci0KLXZvaWQg
V2ViVmlld0dyYXBoaWNzQmFzZWQ6OmFuaW1hdGVkRmxpcCgpCi17Ci0jaWYgUVRfVkVSU0lPTiA+
PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCi0gICAgUVNpemVGIGNlbnRlciA9IG1faXRlbS0+
Ym91bmRpbmdSZWN0KCkuc2l6ZSgpIC8gMjsKLSAgICBRUG9pbnRGIGNlbnRlclBvaW50ID0gUVBv
aW50RihjZW50ZXIud2lkdGgoKSwgY2VudGVyLmhlaWdodCgpKTsKLSAgICBtX2l0ZW0tPnNldFRy
YW5zZm9ybU9yaWdpblBvaW50KGNlbnRlclBvaW50KTsKLQotICAgIFFQcm9wZXJ0eUFuaW1hdGlv
biogYW5pbWF0aW9uID0gbmV3IFFQcm9wZXJ0eUFuaW1hdGlvbihtX2l0ZW0sICJyb3RhdGlvbiIs
IHRoaXMpOwotICAgIGFuaW1hdGlvbi0+c2V0RHVyYXRpb24oMTAwMCk7Ci0KLSAgICBpbnQgcm90
YXRpb24gPSBpbnQobV9pdGVtLT5yb3RhdGlvbigpKTsKLQotICAgIGFuaW1hdGlvbi0+c2V0U3Rh
cnRWYWx1ZShyb3RhdGlvbik7Ci0gICAgYW5pbWF0aW9uLT5zZXRFbmRWYWx1ZShyb3RhdGlvbiAr
IDE4MCAtIChyb3RhdGlvbiAlIDE4MCkpOwotCi0gICAgYW5pbWF0aW9uLT5zdGFydChRQWJzdHJh
Y3RBbmltYXRpb246OkRlbGV0ZVdoZW5TdG9wcGVkKTsKLSNlbmRpZgotfQotCi12b2lkIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkOjphbmltYXRlZFlGbGlwKCkKLXsKLSAgICBlbWl0IHlGbGlwUmVxdWVz
dCgpOwotfQotCi12b2lkIFdlYlZpZXdHcmFwaGljc0Jhc2VkOjpwYWludEV2ZW50KFFQYWludEV2
ZW50KiBldmVudCkKLXsKLSAgICBRR3JhcGhpY3NWaWV3OjpwYWludEV2ZW50KGV2ZW50KTsKLSAg
ICBpZiAoIW1fbWVhc3VyZUZwcykKLSAgICAgICAgcmV0dXJuOwotICAgIG1fbnVtUGFpbnRzU2lu
Y2VMYXN0TWVhc3VyZSsrOwotICAgIG1fbnVtUGFpbnRzVG90YWwrKzsKLX0KLQotc3RhdGljIFFN
ZW51KiBjcmVhdGVDb250ZXh0TWVudShRV2ViUGFnZSogcGFnZSwgUVBvaW50IHBvc2l0aW9uKQot
ewotICAgIFFNZW51KiBtZW51ID0gcGFnZS0+Y3JlYXRlU3RhbmRhcmRDb250ZXh0TWVudSgpOwot
Ci0gICAgUVdlYkhpdFRlc3RSZXN1bHQgciA9IHBhZ2UtPm1haW5GcmFtZSgpLT5oaXRUZXN0Q29u
dGVudChwb3NpdGlvbik7Ci0KLSAgICBpZiAoIXIubGlua1VybCgpLmlzRW1wdHkoKSkgewotICAg
ICAgICBXZWJQYWdlKiB3ZWJQYWdlID0gcW9iamVjdF9jYXN0PFdlYlBhZ2UqPihwYWdlKTsKLSAg
ICAgICAgUUFjdGlvbiogbmV3VGFiQWN0aW9uID0gbWVudS0+YWRkQWN0aW9uKCJPcGVuIGluIERl
ZmF1bHQgJkJyb3dzZXIiLCB3ZWJQYWdlLCBTTE9UKG9wZW5VcmxJbkRlZmF1bHRCcm93c2VyKCkp
KTsKLSAgICAgICAgbmV3VGFiQWN0aW9uLT5zZXREYXRhKHIubGlua1VybCgpKTsKLSAgICAgICAg
bWVudS0+aW5zZXJ0QWN0aW9uKG1lbnUtPmFjdGlvbnMoKS5hdCgyKSwgbmV3VGFiQWN0aW9uKTsK
LSAgICB9Ci0gICAgcmV0dXJuIG1lbnU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NXZWJWaWV3Ojptb3Vz
ZVByZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldmVudCkKLXsKLSAgICBzZXRQ
cm9wZXJ0eSgibW91c2VCdXR0b25zIiwgUVZhcmlhbnQ6OmZyb21WYWx1ZShpbnQoZXZlbnQtPmJ1
dHRvbnMoKSkpKTsKLSAgICBzZXRQcm9wZXJ0eSgia2V5Ym9hcmRNb2RpZmllcnMiLCBRVmFyaWFu
dDo6ZnJvbVZhbHVlKGludChldmVudC0+bW9kaWZpZXJzKCkpKSk7Ci0KLSAgICBRR3JhcGhpY3NX
ZWJWaWV3Ojptb3VzZVByZXNzRXZlbnQoZXZlbnQpOwotfQotCi12b2lkIFdlYlZpZXdUcmFkaXRp
b25hbDo6bW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBldmVudCkKLXsKLSAgICBzZXRQcm9w
ZXJ0eSgibW91c2VCdXR0b25zIiwgUVZhcmlhbnQ6OmZyb21WYWx1ZShpbnQoZXZlbnQtPmJ1dHRv
bnMoKSkpKTsKLSAgICBzZXRQcm9wZXJ0eSgia2V5Ym9hcmRNb2RpZmllcnMiLCBRVmFyaWFudDo6
ZnJvbVZhbHVlKGludChldmVudC0+bW9kaWZpZXJzKCkpKSk7Ci0KLSAgICBRV2ViVmlldzo6bW91
c2VQcmVzc0V2ZW50KGV2ZW50KTsKLX0KLQotdm9pZCBHcmFwaGljc1dlYlZpZXc6OmNvbnRleHRN
ZW51RXZlbnQoUUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50KiBldmVudCkKLXsKLSAgICBR
TWVudSogbWVudSA9IGNyZWF0ZUNvbnRleHRNZW51KHBhZ2UoKSwgZXZlbnQtPnBvcygpLnRvUG9p
bnQoKSk7Ci0gICAgbWVudS0+ZXhlYyhtYXBUb1NjZW5lKGV2ZW50LT5wb3MoKSkudG9Qb2ludCgp
KTsKLSAgICBkZWxldGUgbWVudTsKLX0KLQotdm9pZCBXZWJWaWV3VHJhZGl0aW9uYWw6OmNvbnRl
eHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQqIGV2ZW50KQotewotICAgIFFNZW51KiBtZW51
ID0gY3JlYXRlQ29udGV4dE1lbnUocGFnZSgpLCBldmVudC0+cG9zKCkpOwotICAgIG1lbnUtPmV4
ZWMobWFwVG9HbG9iYWwoZXZlbnQtPnBvcygpKSk7Ci0gICAgZGVsZXRlIG1lbnU7Ci19Ci0KSW5k
ZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2Vidmlldy5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dFRvb2xzL1F0TGF1bmNoZXIvd2Vidmlldy5oCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRv
b2xzL1F0TGF1bmNoZXIvd2Vidmlldy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDEyNCArMCwwIEBA
Ci0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2hu
YW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2Ug
U3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVl
bGxlciA8bXVlbGxlckBrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4g
PHphY2tAa2RlLm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1
c21hbm5Aa2RlLm9yZz4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgot
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5k
ZWYgd2Vidmlld19oCi0jZGVmaW5lIHdlYnZpZXdfaAotCi0jaW5jbHVkZSAid2VicGFnZS5oIgot
I2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+Ci0jaW5jbHVkZSA8cWdyYXBoaWNzd2Vidmlldy5oPgotI2lu
Y2x1ZGUgPFFHcmFwaGljc1ZpZXc+Ci0jaW5jbHVkZSA8UUdyYXBoaWNzV2lkZ2V0PgotI2luY2x1
ZGUgPFFUaW1lPgotCi1jbGFzcyBXZWJWaWV3VHJhZGl0aW9uYWwgOiBwdWJsaWMgUVdlYlZpZXcg
ewotICAgIFFfT0JKRUNUCi0KLXB1YmxpYzoKLSAgICBXZWJWaWV3VHJhZGl0aW9uYWwoUVdpZGdl
dCogcGFyZW50KSA6IFFXZWJWaWV3KHBhcmVudCkge30KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1
YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50Kik7Ci0gICAgdmlydHVh
bCB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCopOwotfTsKLQotCi1jbGFzcyBHcmFw
aGljc1dlYlZpZXcgOiBwdWJsaWMgUUdyYXBoaWNzV2ViVmlldyB7Ci0gICAgUV9PQkpFQ1QKLQot
cHVibGljOgotICAgIEdyYXBoaWNzV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKSA6
IFFHcmFwaGljc1dlYlZpZXcocGFyZW50KSB7fTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwg
dm9pZCBjb250ZXh0TWVudUV2ZW50KFFHcmFwaGljc1NjZW5lQ29udGV4dE1lbnVFdmVudCopOwot
ICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50
Kik7Ci19OwotCi0KLWNsYXNzIFdlYlZpZXdHcmFwaGljc0Jhc2VkIDogcHVibGljIFFHcmFwaGlj
c1ZpZXcgewotICAgIFFfT0JKRUNUCi0gICAgUV9QUk9QRVJUWShxcmVhbCB5Um90YXRpb24gUkVB
RCB5Um90YXRpb24gV1JJVEUgc2V0WVJvdGF0aW9uKQotCi1wdWJsaWM6Ci0gICAgV2ViVmlld0dy
YXBoaWNzQmFzZWQoUVdpZGdldCogcGFyZW50KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXZl
bnQoUVJlc2l6ZUV2ZW50Kik7Ci0gICAgdm9pZCBzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKSB7IG1f
aXRlbS0+c2V0UGFnZShwYWdlKTsgfQotICAgIHZvaWQgc2V0SXRlbUNhY2hlTW9kZShRR3JhcGhp
Y3NJdGVtOjpDYWNoZU1vZGUgbW9kZSkgeyBtX2l0ZW0tPnNldENhY2hlTW9kZShtb2RlKTsgfQot
ICAgIFFHcmFwaGljc0l0ZW06OkNhY2hlTW9kZSBpdGVtQ2FjaGVNb2RlKCkgeyByZXR1cm4gbV9p
dGVtLT5jYWNoZU1vZGUoKTsgfQotCi0gICAgdm9pZCBzZXRGcmFtZVJhdGVNZWFzdXJlbWVudEVu
YWJsZWQoYm9vbCBlbmFibGVkKTsKLSAgICBib29sIGZyYW1lUmF0ZU1lYXN1cmVtZW50RW5hYmxl
ZCgpIGNvbnN0IHsgcmV0dXJuIG1fbWVhc3VyZUZwczsgfQotCi0gICAgdmlydHVhbCB2b2lkIHBh
aW50RXZlbnQoUVBhaW50RXZlbnQqIGV2ZW50KTsKLQotICAgIHZvaWQgc2V0UmVzaXplc1RvQ29u
dGVudHMoYm9vbCBiKTsKLQotICAgIHZvaWQgc2V0WVJvdGF0aW9uKHFyZWFsIGFuZ2xlKQotICAg
IHsKLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKLSAgICAgICAg
UVJlY3RGIHIgPSBtX2l0ZW0tPmJvdW5kaW5nUmVjdCgpOwotICAgICAgICBtX2l0ZW0tPnNldFRy
YW5zZm9ybShRVHJhbnNmb3JtKCkKLSAgICAgICAgICAgIC50cmFuc2xhdGUoci53aWR0aCgpIC8g
Miwgci5oZWlnaHQoKSAvIDIpCi0gICAgICAgICAgICAucm90YXRlKGFuZ2xlLCBRdDo6WUF4aXMp
Ci0gICAgICAgICAgICAudHJhbnNsYXRlKC1yLndpZHRoKCkgLyAyLCAtci5oZWlnaHQoKSAvIDIp
KTsKLSNlbmRpZgotICAgICAgICBtX3lSb3RhdGlvbiA9IGFuZ2xlOwotICAgIH0KLSAgICBxcmVh
bCB5Um90YXRpb24oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1feVJvdGF0aW9uOwot
ICAgIH0KLQotICAgIEdyYXBoaWNzV2ViVmlldyogZ3JhcGhpY3NXZWJWaWV3KCkgY29uc3QgeyBy
ZXR1cm4gbV9pdGVtOyB9Ci0KLXB1YmxpYyBzbG90czoKLSAgICB2b2lkIHVwZGF0ZUZyYW1lUmF0
ZSgpOwotICAgIHZvaWQgYW5pbWF0ZWRGbGlwKCk7Ci0gICAgdm9pZCBhbmltYXRlZFlGbGlwKCk7
Ci0KLXNpZ25hbHM6Ci0gICAgdm9pZCB5RmxpcFJlcXVlc3QoKTsKLSAgICB2b2lkIGN1cnJlbnRG
UFNVcGRhdGVkKGludCBmcHMpOwotCi1wcml2YXRlOgotICAgIEdyYXBoaWNzV2ViVmlldyogbV9p
dGVtOwotICAgIGludCBtX251bVBhaW50c1RvdGFsOwotICAgIGludCBtX251bVBhaW50c1NpbmNl
TGFzdE1lYXN1cmU7Ci0gICAgUVRpbWUgbV9zdGFydFRpbWU7Ci0gICAgUVRpbWUgbV9sYXN0Q29u
c3VsdFRpbWU7Ci0gICAgUVRpbWVyKiBtX3VwZGF0ZVRpbWVyOwotICAgIGJvb2wgbV9tZWFzdXJl
RnBzOwotICAgIHFyZWFsIG1feVJvdGF0aW9uOwotICAgIGJvb2wgbV9yZXNpemVzVG9Db250ZW50
czsKLX07Ci0KLSNlbmRpZgpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdExhdW5j
aGVyLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0TGF1bmNo
ZXIucHJvCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRM
YXVuY2hlci5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTEsNTYgKzAsMCBAQAotVEVNUExBVEUgPSBh
cHAKLQotU09VUkNFUyArPSBcCi0gICAgbG9jYXRpb25lZGl0LmNwcCBcCi0gICAgbWFpbi5jcHAg
XAotICAgIG1haW53aW5kb3cuY3BwIFwKLSAgICB1cmxsb2FkZXIuY3BwIFwKLSAgICB1dGlscy5j
cHAgXAotICAgIHdlYnBhZ2UuY3BwIFwKLSAgICB3ZWJ2aWV3LmNwcCBcCi0KLUhFQURFUlMgKz0g
XAotICAgIGxvY2F0aW9uZWRpdC5oIFwKLSAgICBtYWlud2luZG93LmggXAotICAgIHVybGxvYWRl
ci5oIFwKLSAgICB1dGlscy5oIFwKLSAgICB3ZWJpbnNwZWN0b3IuaCBcCi0gICAgd2VicGFnZS5o
IFwKLSAgICB3ZWJ2aWV3LmggXAotCi1DT05GSUcgLT0gYXBwX2J1bmRsZQotQ09ORklHICs9IHVp
dG9vbHMKLQotaXNFbXB0eShPVVRQVVRfRElSKTogT1VUUFVUX0RJUiA9IC4uLy4uCi1pbmNsdWRl
KC4uLy4uL1dlYktpdC5wcmkpCi0KLURFU1RESVIgPSAkJE9VVFBVVF9ESVIvYmluCi0KLVFUICs9
IG5ldHdvcmsKLW1hY3g6UVQrPXhtbAotCi1saW51eC0qIHsKLSAgICAjIEZyb20gQ3JlYXRvcidz
IHNyYy9ycGF0aC5wcmk6Ci0gICAgIyBEbyB0aGUgcnBhdGggYnkgaGFuZCBzaW5jZSBpdCdzIG5v
dCBwb3NzaWJsZSB0byB1c2UgT1JJR0lOIGluIFFNQUtFX1JQQVRIRElSCi0gICAgIyB0aGlzIGV4
cGFuZHMgdG8gJE9SSUdJTiAoYWZ0ZXIgcW1ha2UgYW5kIG1ha2UpLCBpdCBkb2VzIE5PVCByZWFk
IGEgcW1ha2UgdmFyLgotICAgIFFNQUtFX1JQQVRIRElSID0gXCRcJE9SSUdJTi8uLi9saWIgJCRR
TUFLRV9SUEFUSERJUgotICAgIE1ZX1JQQVRIID0gJCRqb2luKFFNQUtFX1JQQVRIRElSLCAiOiIp
Ci0KLSAgICBRTUFLRV9MRkxBR1MgKz0gLVdsLC16LG9yaWdpbiBcJy1XbCwtcnBhdGgsJCR7TVlf
UlBBVEh9XCcKLSAgICBRTUFLRV9SUEFUSERJUiA9Ci19IGVsc2UgewotICAgIFFNQUtFX1JQQVRI
RElSID0gJCRPVVRQVVRfRElSL2xpYiAkJFFNQUtFX1JQQVRIRElSCi19Ci0KLXN5bWJpYW4gewot
ICAgIFRBUkdFVC5VSUQzID0gMHhBMDAwRTU0MwotICAgIFRBUkdFVC5DQVBBQklMSVRZID0gUmVh
ZFVzZXJEYXRhIFdyaXRlVXNlckRhdGEgTmV0d29ya1NlcnZpY2VzCi19Ci0KLWNvbnRhaW5zKFFU
X0NPTkZJRywgb3BlbmdsKSB7Ci0gICAgUVQgKz0gb3BlbmdsCi0gICAgREVGSU5FUyArPSBRVF9D
T05GSUdVUkVEX1dJVEhfT1BFTkdMCi19Ci0KLVJFU09VUkNFUyArPSBcCi0gICAgUXRMYXVuY2hl
ci5xcmMKSW5kZXg6IFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRMYXVuY2hlci5xcmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdExhdW5jaGVyLnFyYwkocmV2
aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0TGF1bmNoZXIucXJj
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzAsMCBAQAotPFJDQz4KLSAgICA8cXJlc291cmNlIHBy
ZWZpeD0iLyI+Ci0gICAgICAgIDxmaWxlPnVzZXJhZ2VudGxpc3QudHh0PC9maWxlPgotICAgIDwv
cXJlc291cmNlPgotPC9SQ0M+CkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0VGVz
dEJyb3dzZXIucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRU
ZXN0QnJvd3Nlci5wcm8JKHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29scy9RdExhdW5j
aGVyL1F0TGF1bmNoZXIucHJvOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9R
dFRlc3RCcm93c2VyLnBybwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACitURU1QTEFU
RSA9IGFwcAorCitTT1VSQ0VTICs9IFwKKyAgICBsb2NhdGlvbmVkaXQuY3BwIFwKKyAgICBtYWlu
LmNwcCBcCisgICAgbWFpbndpbmRvdy5jcHAgXAorICAgIHVybGxvYWRlci5jcHAgXAorICAgIHV0
aWxzLmNwcCBcCisgICAgd2VicGFnZS5jcHAgXAorICAgIHdlYnZpZXcuY3BwIFwKKworSEVBREVS
UyArPSBcCisgICAgbG9jYXRpb25lZGl0LmggXAorICAgIG1haW53aW5kb3cuaCBcCisgICAgdXJs
bG9hZGVyLmggXAorICAgIHV0aWxzLmggXAorICAgIHdlYmluc3BlY3Rvci5oIFwKKyAgICB3ZWJw
YWdlLmggXAorICAgIHdlYnZpZXcuaCBcCisKK0NPTkZJRyAtPSBhcHBfYnVuZGxlCitDT05GSUcg
Kz0gdWl0b29scworCitpc0VtcHR5KE9VVFBVVF9ESVIpOiBPVVRQVVRfRElSID0gLi4vLi4KK2lu
Y2x1ZGUoLi4vLi4vV2ViS2l0LnByaSkKKworREVTVERJUiA9ICQkT1VUUFVUX0RJUi9iaW4KKwor
UVQgKz0gbmV0d29yaworbWFjeDpRVCs9eG1sCisKK2xpbnV4LSogeworICAgICMgRnJvbSBDcmVh
dG9yJ3Mgc3JjL3JwYXRoLnByaToKKyAgICAjIERvIHRoZSBycGF0aCBieSBoYW5kIHNpbmNlIGl0
J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBPUklHSU4gaW4gUU1BS0VfUlBBVEhESVIKKyAgICAjIHRo
aXMgZXhwYW5kcyB0byAkT1JJR0lOIChhZnRlciBxbWFrZSBhbmQgbWFrZSksIGl0IGRvZXMgTk9U
IHJlYWQgYSBxbWFrZSB2YXIuCisgICAgUU1BS0VfUlBBVEhESVIgPSBcJFwkT1JJR0lOLy4uL2xp
YiAkJFFNQUtFX1JQQVRIRElSCisgICAgTVlfUlBBVEggPSAkJGpvaW4oUU1BS0VfUlBBVEhESVIs
ICI6IikKKworICAgIFFNQUtFX0xGTEFHUyArPSAtV2wsLXosb3JpZ2luIFwnLVdsLC1ycGF0aCwk
JHtNWV9SUEFUSH1cJworICAgIFFNQUtFX1JQQVRIRElSID0KK30gZWxzZSB7CisgICAgUU1BS0Vf
UlBBVEhESVIgPSAkJE9VVFBVVF9ESVIvbGliICQkUU1BS0VfUlBBVEhESVIKK30KKworc3ltYmlh
biB7CisgICAgVEFSR0VULlVJRDMgPSAweEEwMDBFNTQzCisgICAgVEFSR0VULkNBUEFCSUxJVFkg
PSBSZWFkVXNlckRhdGEgV3JpdGVVc2VyRGF0YSBOZXR3b3JrU2VydmljZXMKK30KKworY29udGFp
bnMoUVRfQ09ORklHLCBvcGVuZ2wpIHsKKyAgICBRVCArPSBvcGVuZ2wKKyAgICBERUZJTkVTICs9
IFFUX0NPTkZJR1VSRURfV0lUSF9PUEVOR0wKK30KKworUkVTT1VSQ0VTICs9IFwKKyAgICBRdExh
dW5jaGVyLnFyYwpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdFRlc3RCcm93c2Vy
LnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0VGVzdEJyb3dz
ZXIucHJvCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRU
ZXN0QnJvd3Nlci5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTUzLDQgKzUzLDQgQEAgY29udGFpbnMo
UVRfQ09ORklHLCBvcGVuZ2wpIHsKIH0KIAogUkVTT1VSQ0VTICs9IFwKLSAgICBRdExhdW5jaGVy
LnFyYworICAgIFF0VGVzdEJyb3dzZXIucXJjCkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RCcm93
c2VyL1F0VGVzdEJyb3dzZXIucXJjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0VGVzdEJy
b3dzZXIvUXRUZXN0QnJvd3Nlci5xcmMJKHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29s
cy9RdExhdW5jaGVyL1F0TGF1bmNoZXIucXJjOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0
QnJvd3Nlci9RdFRlc3RCcm93c2VyLnFyYwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUgQEAK
KzxSQ0M+CisgICAgPHFyZXNvdXJjZSBwcmVmaXg9Ii8iPgorICAgICAgICA8ZmlsZT51c2VyYWdl
bnRsaXN0LnR4dDwvZmlsZT4KKyAgICA8L3FyZXNvdXJjZT4KKzwvUkNDPgpJbmRleDogV2ViS2l0
VG9vbHMvUXRUZXN0QnJvd3Nlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9R
dFRlc3RCcm93c2VyL21haW4uY3BwCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0
VGVzdEJyb3dzZXIvbWFpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEwNDksNyArMTA0OSw3IEBA
IExhdW5jaGVyQXBwbGljYXRpb246OkxhdW5jaGVyQXBwbGljYXRpb24KIHsKICAgICAvLyBUbyBh
bGxvdyBRV2ViSW5zcGVjdG9yJ3MgY29uZmlndXJhdGlvbiBwZXJzaXN0ZW5jZQogICAgIHNldE9y
Z2FuaXphdGlvbk5hbWUoIk5va2lhIik7Ci0gICAgc2V0QXBwbGljYXRpb25OYW1lKCJRdExhdW5j
aGVyIik7CisgICAgc2V0QXBwbGljYXRpb25OYW1lKCJRdFRlc3RCcm93c2VyIik7CiAgICAgc2V0
QXBwbGljYXRpb25WZXJzaW9uKCIwLjEiKTsKIAogICAgIGFwcGx5RGVmYXVsdFNldHRpbmdzKCk7
CkBAIC0xMDY4LDcgKzEwNjgsNyBAQCB2b2lkIExhdW5jaGVyQXBwbGljYXRpb246OmhhbmRsZVVz
ZXJPcHRpCiB7CiAgICAgUVN0cmluZ0xpc3QgYXJncyA9IGFyZ3VtZW50cygpOwogICAgIFFGaWxl
SW5mbyBwcm9ncmFtKGFyZ3MuYXQoMCkpOwotICAgIFFTdHJpbmcgcHJvZ3JhbU5hbWUoIlF0TGF1
bmNoZXIiKTsKKyAgICBRU3RyaW5nIHByb2dyYW1OYW1lKCJRdFRlc3RCcm93c2VyIik7CiAgICAg
aWYgKHByb2dyYW0uZXhpc3RzKCkpCiAgICAgICAgIHByb2dyYW1OYW1lID0gcHJvZ3JhbS5iYXNl
TmFtZSgpOwogCkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL3VzZXJhZ2VudGxpc3Qu
dHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvdXNlcmFnZW50bGlz
dC50eHQJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci91c2Vy
YWdlbnRsaXN0LnR4dAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDUgQEAKLU1vemlsbGEvNS4w
IChYMTE7IFU7IExpbnV4OyBlbi1VUykgQXBwbGVXZWJLaXQvNTMzLjMgKEtIVE1MLCBsaWtlIEdl
Y2tvKSBRdExhdW5jaGVyLzAuMSBTYWZhcmkvNTMzLjMKLU1vemlsbGEvNS4wIChTeW1iaWFuT1Mv
OS40OyBVOyBTZXJpZXM2MC81LjA7IGVuLUdCKSBBcHBsZVdlYktpdC81MzMuMyAoS0hUTUwsIGxp
a2UgR2Vja28pIFF0TGF1bmNoZXIvMC4xIE1vYmlsZSBTYWZhcmkvNTMzLjMKK01vemlsbGEvNS4w
IChYMTE7IFU7IExpbnV4OyBlbi1VUykgQXBwbGVXZWJLaXQvNTMzLjMgKEtIVE1MLCBsaWtlIEdl
Y2tvKSBRdFRlc3RCcm93c2VyLzAuMSBTYWZhcmkvNTMzLjMKK01vemlsbGEvNS4wIChTeW1iaWFu
T1MvOS40OyBVOyBTZXJpZXM2MC81LjA7IGVuLUdCKSBBcHBsZVdlYktpdC81MzMuMyAoS0hUTUws
IGxpa2UgR2Vja28pIFF0VGVzdEJyb3dzZXIvMC4xIE1vYmlsZSBTYWZhcmkvNTMzLjMKIE1vemls
bGEvNS4wIChNYWNpbnRvc2g7IFU7IFBQQyBNYWMgT1MgWDsgZW4pIEFwcGxlV2ViS2l0LzEyNS4y
IChLSFRNTCwgbGlrZSBHZWNrbykgU2FmYXJpLzEyNS44CiBNb3ppbGxhLzUuMCAoTGludXg7IFU7
IEFuZHJvaWQgMS4xOyBlbi1nYjsgZHJlYW0pIEFwcGxlV2ViS2l0LzUyNS4xMCsgKEtIVE1MLCBs
aWtlIEdlY2tvKSBWZXJzaW9uLzMuMC40IE1vYmlsZSBTYWZhcmkvNTIzLjEyLjIKIE1vemlsbGEv
NS4wIChpUGhvbmU7IFU7IENQVSBPUyAzXzIgbGlrZSBNYWMgT1MgWDsgZW4tdXMpIEFwcGxlV2Vi
S2l0LzUzMS4yMS4xMCAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wLjQgTW9iaWxlLzdC
MzM0YiBTYWZhcmkvNTMxLjIxLjEwCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3J1bi1sYXVu
Y2hlcgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3J1bi1sYXVuY2hlcgkocmV2
aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3J1bi1sYXVuY2hlcgkod29ya2lu
ZyBjb3B5KQpAQCAtNDcsNyArNDcsNyBAQCBjaGVja0ZyYW1ld29ya3MoKTsKICMgU2V0IHBhdGhz
IGFjY29yZGluZyB0byB0aGUgYnVpbGQgc3lzdGVtIHVzZWQKIGlmIChpc1F0KCkpIHsKICAgICBt
eSAkbGliRGlyID0gY2F0ZGlyKHByb2R1Y3REaXIoKSwgJ2xpYicpOwotICAgICRsYXVuY2hlclBh
dGggPSBjYXRkaXIoJGxhdW5jaGVyUGF0aCwgImJpbiIsICJRdExhdW5jaGVyIik7CisgICAgJGxh
dW5jaGVyUGF0aCA9IGNhdGRpcigkbGF1bmNoZXJQYXRoLCAiYmluIiwgIlF0VGVzdEJyb3dzZXIi
KTsKIAogICAgICRFTlZ7UVRXRUJLSVRfUExVR0lOX1BBVEh9ID0gY2F0ZGlyKCRsaWJEaXIsICdw
bHVnaW5zJyk7CiAKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0ZGlycy5wbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdGRpcnMucG0JKHJldmlzaW9uIDU3
NjU0KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRkaXJzLnBtCSh3b3JraW5nIGNvcHkp
CkBAIC04OTEsNyArODkxLDcgQEAgc3ViIGxhdW5jaGVyTmFtZSgpCiAgICAgaWYgKGlzR3RrKCkp
IHsKICAgICAgICAgcmV0dXJuICJHdGtMYXVuY2hlciI7CiAgICAgfSBlbHNpZiAoaXNRdCgpKSB7
Ci0gICAgICAgIHJldHVybiAiUXRMYXVuY2hlciI7CisgICAgICAgIHJldHVybiAiUXRUZXN0QnJv
d3NlciI7CiAgICAgfSBlbHNpZiAoaXNXeCgpKSB7CiAgICAgICAgIHJldHVybiAid3hCcm93c2Vy
IjsKICAgICB9IGVsc2lmIChpc0FwcGxlV2ViS2l0KCkpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>53461</attachid>
            <date>2010-04-15 12:05:17 -0700</date>
            <delta_ts>2010-04-21 04:49:39 -0700</delta_ts>
            <desc>Rename</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>190045</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDU3NjYx
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDQt
MTUgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gUmVuYW1lIFF0TGF1
bmNoZXIgdG8gUXRUZXN0QnJvd3NlcgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0zNzY2NQorCisgICAgICAgICogV2ViS2l0LnBybzoKKwogMjAxMC0w
NC0wOSAgU2ltb24gSGF1c21hbm4gIDxzaW1vbi5oYXVzbWFubkBub2tpYS5jb20+CiAKICAgICAg
ICAgVW5yZXZpZXdlZCBjcmFzaCBmaXguCkluZGV4OiBXZWJLaXQucHJvCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC5wcm8JKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0LnBybwkod29ya2luZyBjb3B5
KQpAQCAtOCw3ICs4LDcgQEAgU1VCRElSUyArPSBcCiAgICAgICAgIFdlYkNvcmUKIAogIyBJZiB0
aGUgc291cmNlIGV4aXN0cywgYnVpbHQgaXQKLWV4aXN0cygkJFBXRC9XZWJLaXRUb29scy9RdExh
dW5jaGVyKTogU1VCRElSUyArPSBXZWJLaXRUb29scy9RdExhdW5jaGVyCitleGlzdHMoJCRQV0Qv
V2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlcik6IFNVQkRJUlMgKz0gV2ViS2l0VG9vbHMvUXRUZXN0
QnJvd3NlcgogZXhpc3RzKCQkUFdEL0phdmFTY3JpcHRDb3JlL2pzYy5wcm8pOiBTVUJESVJTICs9
IEphdmFTY3JpcHRDb3JlL2pzYy5wcm8KIGV4aXN0cygkJFBXRC9XZWJLaXQvcXQvdGVzdHMpOiBT
VUJESVJTICs9IFdlYktpdC9xdC90ZXN0cwogZXhpc3RzKCQkUFdEL1dlYktpdFRvb2xzL0R1bXBS
ZW5kZXJUcmVlL3F0L0R1bXBSZW5kZXJUcmVlLnBybyk6IFNVQkRJUlMgKz0gV2ViS2l0VG9vbHMv
RHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWUucHJvCkluZGV4OiBXZWJLaXRUb29scy9D
aGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1
NzY2MSkKKysrIFdlYktpdFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDUxIEBACisyMDEwLTA0LTE1ICBTaW1vbiBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lh
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
UXRdIFJlbmFtZSBRdExhdW5jaGVyIHRvIFF0VGVzdEJyb3dzZXIKKworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mzc2NjUKKworICAgICAgICAqIFF0TGF1
bmNoZXIvUXRMYXVuY2hlci5wcm86IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci9RdExh
dW5jaGVyLnFyYzogUmVtb3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL2xvY2F0aW9uZWRpdC5j
cHA6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci9sb2NhdGlvbmVkaXQuaDogUmVtb3Zl
ZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL21haW4uY3BwOiBSZW1vdmVkLgorICAgICAgICAqIFF0
TGF1bmNoZXIvbWFpbndpbmRvdy5jcHA6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci9t
YWlud2luZG93Lmg6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci91cmxsb2FkZXIuY3Bw
OiBSZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNoZXIvdXJsbG9hZGVyLmg6IFJlbW92ZWQuCisg
ICAgICAgICogUXRMYXVuY2hlci91c2VyYWdlbnRsaXN0LnR4dDogUmVtb3ZlZC4KKyAgICAgICAg
KiBRdExhdW5jaGVyL3V0aWxzLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL3V0
aWxzLmg6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci93ZWJpbnNwZWN0b3IuaDogUmVt
b3ZlZC4KKyAgICAgICAgKiBRdExhdW5jaGVyL3dlYnBhZ2UuY3BwOiBSZW1vdmVkLgorICAgICAg
ICAqIFF0TGF1bmNoZXIvd2VicGFnZS5oOiBSZW1vdmVkLgorICAgICAgICAqIFF0TGF1bmNoZXIv
d2Vidmlldy5jcHA6IFJlbW92ZWQuCisgICAgICAgICogUXRMYXVuY2hlci93ZWJ2aWV3Lmg6IFJl
bW92ZWQuCisgICAgICAgICogUXRUZXN0QnJvd3NlcjogQWRkZWQuCisgICAgICAgICogUXRUZXN0
QnJvd3Nlci9RdFRlc3RCcm93c2VyLnBybzogQ29waWVkIGZyb20gV2ViS2l0VG9vbHMvUXRMYXVu
Y2hlci9RdExhdW5jaGVyLnByby4KKyAgICAgICAgKiBRdFRlc3RCcm93c2VyL1F0VGVzdEJyb3dz
ZXIucXJjOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL1F0TGF1bmNoZXIucXJj
LgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvbG9jYXRpb25lZGl0LmNwcDogQ29waWVkIGZyb20g
V2ViS2l0VG9vbHMvUXRMYXVuY2hlci9sb2NhdGlvbmVkaXQuY3BwLgorICAgICAgICAqIFF0VGVz
dEJyb3dzZXIvbG9jYXRpb25lZGl0Lmg6IENvcGllZCBmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNo
ZXIvbG9jYXRpb25lZGl0LmguCisgICAgICAgICogUXRUZXN0QnJvd3Nlci9tYWluLmNwcDogQ29w
aWVkIGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9tYWluLmNwcC4KKyAgICAgICAgKExhdW5j
aGVyQXBwbGljYXRpb246OkxhdW5jaGVyQXBwbGljYXRpb24pOgorICAgICAgICAoTGF1bmNoZXJB
cHBsaWNhdGlvbjo6aGFuZGxlVXNlck9wdGlvbnMpOgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIv
bWFpbndpbmRvdy5jcHA6IENvcGllZCBmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFpbndp
bmRvdy5jcHAuCisgICAgICAgICogUXRUZXN0QnJvd3Nlci9tYWlud2luZG93Lmg6IENvcGllZCBm
cm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFpbndpbmRvdy5oLgorICAgICAgICAqIFF0VGVz
dEJyb3dzZXIvdXJsbG9hZGVyLmNwcDogQ29waWVkIGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hl
ci91cmxsb2FkZXIuY3BwLgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvdXJsbG9hZGVyLmg6IENv
cGllZCBmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmguCisgICAgICAgICog
UXRUZXN0QnJvd3Nlci91c2VyYWdlbnRsaXN0LnR4dDogQ29waWVkIGZyb20gV2ViS2l0VG9vbHMv
UXRMYXVuY2hlci91c2VyYWdlbnRsaXN0LnR4dC4KKyAgICAgICAgKiBRdFRlc3RCcm93c2VyL3V0
aWxzLmNwcDogQ29waWVkIGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91dGlscy5jcHAuCisg
ICAgICAgICogUXRUZXN0QnJvd3Nlci91dGlscy5oOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9R
dExhdW5jaGVyL3V0aWxzLmguCisgICAgICAgICogUXRUZXN0QnJvd3Nlci93ZWJpbnNwZWN0b3Iu
aDogQ29waWVkIGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJpbnNwZWN0b3IuaC4KKyAg
ICAgICAgKiBRdFRlc3RCcm93c2VyL3dlYnBhZ2UuY3BwOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29s
cy9RdExhdW5jaGVyL3dlYnBhZ2UuY3BwLgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvd2VicGFn
ZS5oOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnBhZ2UuaC4KKyAgICAg
ICAgKiBRdFRlc3RCcm93c2VyL3dlYnZpZXcuY3BwOiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9R
dExhdW5jaGVyL3dlYnZpZXcuY3BwLgorICAgICAgICAqIFF0VGVzdEJyb3dzZXIvd2Vidmlldy5o
OiBDb3BpZWQgZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnZpZXcuaC4KKyAgICAgICAg
KiBTY3JpcHRzL3J1bi1sYXVuY2hlcjoKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdGRpcnMucG06
CisKIDIwMTAtMDQtMTQgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpJbmRleDogV2ViS2l0VG9vbHMvUXRMYXVu
Y2hlci9RdExhdW5jaGVyLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdExhdW5jaGVy
L1F0TGF1bmNoZXIucHJvCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNo
ZXIvUXRMYXVuY2hlci5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTEsNTYgKzAsMCBAQAotVEVNUExB
VEUgPSBhcHAKLQotU09VUkNFUyArPSBcCi0gICAgbG9jYXRpb25lZGl0LmNwcCBcCi0gICAgbWFp
bi5jcHAgXAotICAgIG1haW53aW5kb3cuY3BwIFwKLSAgICB1cmxsb2FkZXIuY3BwIFwKLSAgICB1
dGlscy5jcHAgXAotICAgIHdlYnBhZ2UuY3BwIFwKLSAgICB3ZWJ2aWV3LmNwcCBcCi0KLUhFQURF
UlMgKz0gXAotICAgIGxvY2F0aW9uZWRpdC5oIFwKLSAgICBtYWlud2luZG93LmggXAotICAgIHVy
bGxvYWRlci5oIFwKLSAgICB1dGlscy5oIFwKLSAgICB3ZWJpbnNwZWN0b3IuaCBcCi0gICAgd2Vi
cGFnZS5oIFwKLSAgICB3ZWJ2aWV3LmggXAotCi1DT05GSUcgLT0gYXBwX2J1bmRsZQotQ09ORklH
ICs9IHVpdG9vbHMKLQotaXNFbXB0eShPVVRQVVRfRElSKTogT1VUUFVUX0RJUiA9IC4uLy4uCi1p
bmNsdWRlKC4uLy4uL1dlYktpdC5wcmkpCi0KLURFU1RESVIgPSAkJE9VVFBVVF9ESVIvYmluCi0K
LVFUICs9IG5ldHdvcmsKLW1hY3g6UVQrPXhtbAotCi1saW51eC0qIHsKLSAgICAjIEZyb20gQ3Jl
YXRvcidzIHNyYy9ycGF0aC5wcmk6Ci0gICAgIyBEbyB0aGUgcnBhdGggYnkgaGFuZCBzaW5jZSBp
dCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgT1JJR0lOIGluIFFNQUtFX1JQQVRIRElSCi0gICAgIyB0
aGlzIGV4cGFuZHMgdG8gJE9SSUdJTiAoYWZ0ZXIgcW1ha2UgYW5kIG1ha2UpLCBpdCBkb2VzIE5P
VCByZWFkIGEgcW1ha2UgdmFyLgotICAgIFFNQUtFX1JQQVRIRElSID0gXCRcJE9SSUdJTi8uLi9s
aWIgJCRRTUFLRV9SUEFUSERJUgotICAgIE1ZX1JQQVRIID0gJCRqb2luKFFNQUtFX1JQQVRIRElS
LCAiOiIpCi0KLSAgICBRTUFLRV9MRkxBR1MgKz0gLVdsLC16LG9yaWdpbiBcJy1XbCwtcnBhdGgs
JCR7TVlfUlBBVEh9XCcKLSAgICBRTUFLRV9SUEFUSERJUiA9Ci19IGVsc2UgewotICAgIFFNQUtF
X1JQQVRIRElSID0gJCRPVVRQVVRfRElSL2xpYiAkJFFNQUtFX1JQQVRIRElSCi19Ci0KLXN5bWJp
YW4gewotICAgIFRBUkdFVC5VSUQzID0gMHhBMDAwRTU0MwotICAgIFRBUkdFVC5DQVBBQklMSVRZ
ID0gUmVhZFVzZXJEYXRhIFdyaXRlVXNlckRhdGEgTmV0d29ya1NlcnZpY2VzCi19Ci0KLWNvbnRh
aW5zKFFUX0NPTkZJRywgb3BlbmdsKSB7Ci0gICAgUVQgKz0gb3BlbmdsCi0gICAgREVGSU5FUyAr
PSBRVF9DT05GSUdVUkVEX1dJVEhfT1BFTkdMCi19Ci0KLVJFU09VUkNFUyArPSBcCi0gICAgUXRM
YXVuY2hlci5xcmMKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvUXRMYXVuY2hlci5xcmMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9RdExhdW5jaGVyLnFyYwkocmV2
aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL1F0TGF1bmNoZXIucXJjCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDUgKzAsMCBAQAotPFJDQz4KLSAgICA8cXJlc291cmNlIHByZWZp
eD0iLyI+Ci0gICAgICAgIDxmaWxlPnVzZXJhZ2VudGxpc3QudHh0PC9maWxlPgotICAgIDwvcXJl
c291cmNlPgotPC9SQ0M+CkluZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL2xvY2F0aW9uZWRp
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9sb2NhdGlvbmVkaXQu
Y3BwCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbG9jYXRpb25l
ZGl0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQot
ICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQot
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
LSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImxvY2F0aW9uZWRp
dC5oIgotCi1Mb2NhdGlvbkVkaXQ6OkxvY2F0aW9uRWRpdChRV2lkZ2V0KiBwYXJlbnQpCi0gICAg
OiBRTGluZUVkaXQocGFyZW50KQotICAgICwgbV9wcm9ncmVzcygwKQotewotICAgIG1fY2xlYXJU
aW1lci5zZXRTaW5nbGVTaG90KHRydWUpOwotICAgIGNvbm5lY3QoJm1fY2xlYXJUaW1lciwgU0lH
TkFMKHRpbWVvdXQoKSksIHRoaXMsIFNMT1QocmVzZXQoKSkpOwotfQotCi12b2lkIExvY2F0aW9u
RWRpdDo6c2V0UHJvZ3Jlc3MoaW50IHByb2dyZXNzKQotewotICAgIG1fY2xlYXJUaW1lci5zdG9w
KCk7Ci0gICAgbV9wcm9ncmVzcyA9IHByb2dyZXNzOwotICAgIHVwZGF0ZSgpOwotfQotCi12b2lk
IExvY2F0aW9uRWRpdDo6cmVzZXQoKQotewotICAgIHNldFByb2dyZXNzKDApOwotfQotCi12b2lk
IExvY2F0aW9uRWRpdDo6cGFpbnRFdmVudChRUGFpbnRFdmVudCogZXYpCi17Ci0gICAgUUNvbG9y
IGJhY2tncm91bmRDb2xvciA9IFFBcHBsaWNhdGlvbjo6cGFsZXR0ZSgpLmNvbG9yKFFQYWxldHRl
OjpCYXNlKTsKLSAgICBRQ29sb3IgcHJvZ3Jlc3NDb2xvciA9IFFDb2xvcigxMjAsIDE4MCwgMjQw
KTsKLSAgICBRUGFsZXR0ZSBwID0gcGFsZXR0ZSgpOwotCi0gICAgaWYgKCFtX3Byb2dyZXNzKQot
ICAgICAgICBwLnNldEJydXNoKFFQYWxldHRlOjpCYXNlLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAg
IGVsc2UgewotICAgICAgICBRTGluZWFyR3JhZGllbnQgZ3JhZGllbnQoMCwgMCwgd2lkdGgoKSwg
MCk7Ci0gICAgICAgIGdyYWRpZW50LnNldENvbG9yQXQoMCwgcHJvZ3Jlc3NDb2xvcik7Ci0gICAg
ICAgIGdyYWRpZW50LnNldENvbG9yQXQoKChkb3VibGUpIG1fcHJvZ3Jlc3MpIC8gMTAwLCBwcm9n
cmVzc0NvbG9yKTsKLSAgICAgICAgaWYgKG1fcHJvZ3Jlc3MgIT0gMTAwKQotICAgICAgICAgICAg
Z3JhZGllbnQuc2V0Q29sb3JBdCgoZG91YmxlKSBtX3Byb2dyZXNzIC8gMTAwICsgMC4wMDEsIGJh
Y2tncm91bmRDb2xvcik7Ci0gICAgICAgIHAuc2V0QnJ1c2goUVBhbGV0dGU6OkJhc2UsIGdyYWRp
ZW50KTsKLSAgICB9Ci0gICAgc2V0UGFsZXR0ZShwKTsKLQotICAgIFFMaW5lRWRpdDo6cGFpbnRF
dmVudChldik7Ci0KLSAgICBpZiAobV9wcm9ncmVzcyA9PSAxMDApCi0gICAgICAgIG1fY2xlYXJU
aW1lci5zdGFydCgxMDApOwotfQotCi12b2lkIExvY2F0aW9uRWRpdDo6Zm9jdXNJbkV2ZW50KFFG
b2N1c0V2ZW50KiBldikKLXsKLSAgICBRTGluZUVkaXQ6OmZvY3VzSW5FdmVudChldik7Ci0jaWZk
ZWYgUV9XU19NQUVNT181Ci0gICAgUVRpbWVyOjpzaW5nbGVTaG90KDAsIHRoaXMsIFNMT1Qoc2Vs
ZWN0QWxsKCkpKTsKLSNlbmRpZgotfQpJbmRleDogV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9sb2Nh
dGlvbmVkaXQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdExhdW5jaGVyL2xvY2F0aW9u
ZWRpdC5oCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbG9jYXRp
b25lZGl0LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
LSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
LSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
Ci0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgbG9jYXRpb25lZGl0
X2gKLSNkZWZpbmUgbG9jYXRpb25lZGl0X2gKLQotI2luY2x1ZGUgPFF0R3VpPgotCi1jbGFzcyBM
b2NhdGlvbkVkaXQgOiBwdWJsaWMgUUxpbmVFZGl0IHsKLSAgICBRX09CSkVDVAotCi1wdWJsaWM6
Ci0gICAgTG9jYXRpb25FZGl0KFFXaWRnZXQqIHBhcmVudCA9IDApOwotCi1wdWJsaWMgc2xvdHM6
Ci0gICAgdm9pZCBzZXRQcm9ncmVzcyhpbnQgcHJvZ3Jlc3MpOwotCi1wcml2YXRlIHNsb3RzOgot
ICAgIHZvaWQgcmVzZXQoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBwYWludEV2
ZW50KFFQYWludEV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNF
dmVudCopOwotCi1wcml2YXRlOgotICAgIGludCBtX3Byb2dyZXNzOwotICAgIFFUaW1lciBtX2Ns
ZWFyVGltZXI7Ci19OwotCi0jZW5kaWYKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFp
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9tYWluLmNwcAkocmV2
aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL21haW4uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDExOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tp
YSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqIENvcHlyaWdodCAo
QykgMjAwOSBHaXJpc2ggUmFtYWtyaXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMuaW4+Ci0gKiBD
b3B5cmlnaHQgKEMpIDIwMDYgR2VvcmdlIFN0YWlrb3MgPHN0YWlrb3NAa2RlLm9yZz4KLSAqIENv
cHlyaWdodCAoQykgMjAwNiBEaXJrIE11ZWxsZXIgPG11ZWxsZXJAa2RlLm9yZz4KLSAqIENvcHly
aWdodCAoQykgMjAwNiBaYWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMp
IDIwMDYgU2ltb24gSGF1c21hbm4gPGhhdXNtYW5uQGtkZS5vcmc+Ci0gKgotICogQWxsIHJpZ2h0
cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoK
LSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAot
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8UXRHdWk+Ci0jaW5jbHVkZSA8UXROZXR3b3Jr
L1FOZXR3b3JrUmVxdWVzdD4KLQotI2lmIGRlZmluZWQoUVRfQ09ORklHVVJFRF9XSVRIX09QRU5H
TCkKLSNpbmNsdWRlIDxRdE9wZW5HTC9RR0xXaWRnZXQ+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVk
KFFUX05PX1BSSU5URVIpCi0jaW5jbHVkZSA8UVByaW50UHJldmlld0RpYWxvZz4KLSNlbmRpZgot
Ci0jaWZuZGVmIFFUX05PX1VJVE9PTFMKLSNpbmNsdWRlIDxRdFVpVG9vbHMvUVVpTG9hZGVyPgot
I2VuZGlmCi0KLSNpbmNsdWRlIDxRRGVidWc+Ci0KLSNpbmNsdWRlIDxjc3RkaW8+Ci0jaW5jbHVk
ZSA8cWV2ZW50Lmg+Ci0jaW5jbHVkZSA8cXdlYmVsZW1lbnQuaD4KLSNpbmNsdWRlIDxxd2ViZnJh
bWUuaD4KLSNpbmNsdWRlIDxxd2ViaW5zcGVjdG9yLmg+Ci0jaW5jbHVkZSA8cXdlYnNldHRpbmdz
Lmg+Ci0KLSNpZmRlZiBRX1dTX01BRU1PXzUKLSNpbmNsdWRlIDxxeDExaW5mb194MTEuaD4KLSNl
bmRpZgotCi0jaW5jbHVkZSAibWFpbndpbmRvdy5oIgotI2luY2x1ZGUgInVybGxvYWRlci5oIgot
I2luY2x1ZGUgInV0aWxzLmgiCi0jaW5jbHVkZSAid2ViaW5zcGVjdG9yLmgiCi0jaW5jbHVkZSAi
d2VicGFnZS5oIgotI2luY2x1ZGUgIndlYnZpZXcuaCIKLSNpbmNsdWRlICIuLi8uLi9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuaCIKLQotI2lmZGVmIFFf
V1NfTUFFTU9fNQotI2luY2x1ZGUgPFgxMS9YYXRvbS5oPgotI2luY2x1ZGUgPFgxMS9YbGliLmg+
Ci0jdW5kZWYgS2V5UHJlc3MKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50IGdFeGl0Q2xpY2tB
cmVhID0gODA7Ci1zdGF0aWMgYm9vbCBnVXNlR3JhcGhpY3NWaWV3ID0gZmFsc2U7Ci1zdGF0aWMg
Ym9vbCBnVXNlQ29tcG9zaXRpbmcgPSB0cnVlOwotc3RhdGljIGJvb2wgZ0NhY2hlV2ViVmlldyA9
IGZhbHNlOwotc3RhdGljIGJvb2wgZ1Nob3dGcmFtZVJhdGUgPSBmYWxzZTsKLXN0YXRpYyBRR3Jh
cGhpY3NWaWV3OjpWaWV3cG9ydFVwZGF0ZU1vZGUgZ1ZpZXdwb3J0VXBkYXRlTW9kZSA9IFFHcmFw
aGljc1ZpZXc6Ok1pbmltYWxWaWV3cG9ydFVwZGF0ZTsKLXN0YXRpYyBRVXJsIGdJbnNwZWN0b3JV
cmw7Ci1zdGF0aWMgYm9vbCBnUmVzaXplc1RvQ29udGVudHMgPSBmYWxzZTsKLXN0YXRpYyBib29s
IGdVc2VUaWxlZEJhY2tpbmdTdG9yZSA9IGZhbHNlOwotCi0jaWYgZGVmaW5lZChRX1dTX01BRU1P
XzUpIHx8IGRlZmluZWQoUV9XU19TNjApCi1zdGF0aWMgYm9vbCBnVXNlRnJhbWVGbGF0dGVuaW5n
ID0gdHJ1ZTsKLSNlbHNlCi1zdGF0aWMgYm9vbCBnVXNlRnJhbWVGbGF0dGVuaW5nID0gZmFsc2U7
Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUVRfQ09ORklHVVJFRF9XSVRIX09QRU5HTCkKLXN0YXRp
YyBib29sIGdVc2VRR0xXaWRnZXRWaWV3cG9ydCA9IGZhbHNlOwotI2VuZGlmCi0KLQotY2xhc3Mg
TGF1bmNoZXJXaW5kb3cgOiBwdWJsaWMgTWFpbldpbmRvdyB7Ci0gICAgUV9PQkpFQ1QKLQotcHVi
bGljOgotICAgIExhdW5jaGVyV2luZG93KExhdW5jaGVyV2luZG93KiBvdGhlciA9IDAsIGJvb2wg
c2hhcmVTY2VuZSA9IGZhbHNlKTsKLSAgICB2aXJ0dWFsIH5MYXVuY2hlcldpbmRvdygpOwotCi0g
ICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldmVudCk7Ci0gICAgdm9p
ZCBncmFiWm9vbUtleXMoYm9vbCBncmFiKTsKLQotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lP
Tl9DSEVDSyg0LCA2LCAwKQotICAgIHZvaWQgc2VuZFRvdWNoRXZlbnQoKTsKLSNlbmRpZgotCi0g
ICAgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiBvYmosIFFFdmVudCogZXZlbnQpOwotCi1wcm90
ZWN0ZWQgc2xvdHM6Ci0gICAgdm9pZCBsb2FkU3RhcnRlZCgpOwotICAgIHZvaWQgbG9hZEZpbmlz
aGVkKCk7Ci0KLSAgICB2b2lkIHNob3dMaW5rSG92ZXIoY29uc3QgUVN0cmluZyAmbGluaywgY29u
c3QgUVN0cmluZyAmdG9vbFRpcCk7Ci0KLSAgICB2b2lkIHpvb21JbigpOwotICAgIHZvaWQgem9v
bU91dCgpOwotICAgIHZvaWQgcmVzZXRab29tKCk7Ci0gICAgdm9pZCB0b2dnbGVab29tVGV4dE9u
bHkoYm9vbCBvbik7Ci0gICAgdm9pZCB6b29tQW5pbWF0aW9uRmluaXNoZWQoKTsKLQotICAgIHZv
aWQgcHJpbnQoKTsKLSAgICB2b2lkIHNjcmVlbnNob3QoKTsKLQotICAgIHZvaWQgc2V0RWRpdGFi
bGUoYm9vbCBvbik7Ci0KLSAgICAvKiB2b2lkIGR1bXBQbHVnaW5zKCkgKi8KLSAgICB2b2lkIGR1
bXBIdG1sKCk7Ci0KLSAgICB2b2lkIHNlbGVjdEVsZW1lbnRzKCk7Ci0KLSAgICB2b2lkIHNldFRv
dWNoTW9ja2luZyhib29sIG9uKTsKLSAgICB2b2lkIHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRp
bmcoYm9vbCB0b2dnbGUpOwotICAgIHZvaWQgdG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUoYm9vbCB0
b2dnbGUpOwotICAgIHZvaWQgdG9nZ2xlUmVzaXplc1RvQ29udGVudHMoYm9vbCB0b2dnbGUpOwot
Ci0gICAgdm9pZCB0b2dnbGVXZWJHTChib29sIHRvZ2dsZSk7Ci0gICAgdm9pZCBpbml0aWFsaXpl
Vmlldyhib29sIHVzZUdyYXBoaWNzVmlldyA9IGZhbHNlKTsKLSAgICB2b2lkIHRvZ2dsZVNwYXRp
YWxOYXZpZ2F0aW9uKGJvb2wgYik7Ci0gICAgdm9pZCB0b2dnbGVGdWxsU2NyZWVuTW9kZShib29s
IGVuYWJsZSk7Ci0gICAgdm9pZCBzaG93RlBTKGJvb2wgZW5hYmxlKTsKLSAgICB2b2lkIGNoYW5n
ZVZpZXdwb3J0VXBkYXRlTW9kZShpbnQgbW9kZSk7Ci0gICAgdm9pZCB0b2dnbGVGcmFtZUZsYXR0
ZW5pbmcoYm9vbCB0b2dnbGUpOwotCi0jaWYgZGVmaW5lZChRVF9DT05GSUdVUkVEX1dJVEhfT1BF
TkdMKQotICAgIHZvaWQgdG9nZ2xlUUdMV2lkZ2V0Vmlld3BvcnQoYm9vbCBlbmFibGUpOwotI2Vu
ZGlmCi0KLSAgICB2b2lkIHNob3dVc2VyQWdlbnREaWFsb2coKTsKLQotcHVibGljIHNsb3RzOgot
ICAgIHZvaWQgbmV3V2luZG93KCk7Ci0gICAgdm9pZCBjbG9uZVdpbmRvdygpOwotICAgIHZvaWQg
dXBkYXRlRlBTKGludCBmcHMpOwotCi1zaWduYWxzOgotICAgIHZvaWQgZW50ZXJlZEZ1bGxTY3Jl
ZW5Nb2RlKGJvb2wgb24pOwotCi1wcml2YXRlOgotICAgIHZvaWQgY3JlYXRlQ2hyb21lKCk7Ci0g
ICAgdm9pZCBhcHBseVpvb20oKTsKLQotcHJpdmF0ZToKLSAgICBRVmVjdG9yPGludD4gbV96b29t
TGV2ZWxzOwotICAgIGludCBtX2N1cnJlbnRab29tOwotCi0gICAgUVdpZGdldCogbV92aWV3Owot
ICAgIFdlYkluc3BlY3RvciogbV9pbnNwZWN0b3I7Ci0KLSAgICBRQWN0aW9uKiBtX2Zvcm1hdE1l
bnVBY3Rpb247Ci0gICAgUUFjdGlvbiogbV9mbGlwQW5pbWF0ZWQ7Ci0gICAgUUFjdGlvbiogbV9m
bGlwWUFuaW1hdGVkOwotCi0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYs
IDApCi0gICAgUVByb3BlcnR5QW5pbWF0aW9uKiBtX3pvb21BbmltYXRpb247Ci0gICAgUUxpc3Q8
UVRvdWNoRXZlbnQ6OlRvdWNoUG9pbnQ+IG1fdG91Y2hQb2ludHM7Ci0gICAgYm9vbCBtX3RvdWNo
TW9ja2luZzsKLSNlbmRpZgotCi0gICAgdm9pZCBpbml0KGJvb2wgdXNlR3JhcGhpY3NWaWV3ID0g
ZmFsc2UpOwotICAgIGJvb2wgaXNHcmFwaGljc0Jhc2VkKCkgY29uc3Q7Ci0gICAgdm9pZCBhcHBs
eVByZWZzKExhdW5jaGVyV2luZG93KiBvdGhlciA9IDApOwotfTsKLQotTGF1bmNoZXJXaW5kb3c6
OkxhdW5jaGVyV2luZG93KExhdW5jaGVyV2luZG93KiBvdGhlciwgYm9vbCBzaGFyZVNjZW5lKQot
ICAgIDogTWFpbldpbmRvdygpCi0gICAgLCBtX2N1cnJlbnRab29tKDEwMCkKLSAgICAsIG1fdmll
dygwKQotICAgICwgbV9pbnNwZWN0b3IoMCkKLSAgICAsIG1fZm9ybWF0TWVudUFjdGlvbigwKQot
ICAgICwgbV9mbGlwQW5pbWF0ZWQoMCkKLSAgICAsIG1fZmxpcFlBbmltYXRlZCgwKQotI2lmIFFU
X1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgICwgbV96b29tQW5pbWF0
aW9uKDApCi0jZW5kaWYKLXsKLSAgICBpZiAob3RoZXIpIHsKLSAgICAgICAgaW5pdChvdGhlci0+
aXNHcmFwaGljc0Jhc2VkKCkpOwotICAgICAgICBhcHBseVByZWZzKG90aGVyKTsKLSAgICAgICAg
aWYgKHNoYXJlU2NlbmUgJiYgb3RoZXItPmlzR3JhcGhpY3NCYXNlZCgpKSB7Ci0gICAgICAgICAg
ICBRR3JhcGhpY3NWaWV3KiBvdGhlclZpZXcgPSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NWaWV3Kj4o
b3RoZXItPm1fdmlldyk7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxRR3JhcGhpY3NWaWV3Kj4o
bV92aWV3KS0+c2V0U2NlbmUob3RoZXJWaWV3LT5zY2VuZSgpKTsKLSAgICAgICAgfQotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGluaXQoZ1VzZUdyYXBoaWNzVmlldyk7Ci0gICAgICAgIGFwcGx5UHJl
ZnMoKTsKLSAgICB9Ci0KLSAgICBjcmVhdGVDaHJvbWUoKTsKLX0KLQotTGF1bmNoZXJXaW5kb3c6
On5MYXVuY2hlcldpbmRvdygpCi17Ci0gICAgZ3JhYlpvb21LZXlzKGZhbHNlKTsKLX0KLQotdm9p
ZCBMYXVuY2hlcldpbmRvdzo6aW5pdChib29sIHVzZUdyYXBoaWNzVmlldykKLXsKLSAgICBRU3Bs
aXR0ZXIqIHNwbGl0dGVyID0gbmV3IFFTcGxpdHRlcihRdDo6VmVydGljYWwsIHRoaXMpOwotICAg
IHNldENlbnRyYWxXaWRnZXQoc3BsaXR0ZXIpOwotCi0jaWYgZGVmaW5lZChRX1dTX1M2MCkKLSAg
ICBzZXRXaW5kb3dTdGF0ZShRdDo6V2luZG93TWF4aW1pemVkKTsKLSNlbHNlCi0gICAgc2V0V2lu
ZG93U3RhdGUoUXQ6OldpbmRvd05vU3RhdGUpOwotICAgIHJlc2l6ZSg4MDAsIDYwMCk7Ci0jZW5k
aWYKLQotICAgIGluaXRpYWxpemVWaWV3KHVzZUdyYXBoaWNzVmlldyk7Ci0KLSAgICBjb25uZWN0
KHBhZ2UoKSwgU0lHTkFMKGxvYWRTdGFydGVkKCkpLCB0aGlzLCBTTE9UKGxvYWRTdGFydGVkKCkp
KTsKLSAgICBjb25uZWN0KHBhZ2UoKSwgU0lHTkFMKGxvYWRGaW5pc2hlZChib29sKSksIHRoaXMs
IFNMT1QobG9hZEZpbmlzaGVkKCkpKTsKLSAgICBjb25uZWN0KHBhZ2UoKSwgU0lHTkFMKGxpbmtI
b3ZlcmVkKGNvbnN0IFFTdHJpbmcmLCBjb25zdCBRU3RyaW5nJiwgY29uc3QgUVN0cmluZyYpKSwK
LSAgICAgICAgICAgIHRoaXMsIFNMT1Qoc2hvd0xpbmtIb3Zlcihjb25zdCBRU3RyaW5nJiwgY29u
c3QgUVN0cmluZyYpKSk7Ci0gICAgY29ubmVjdCh0aGlzLCBTSUdOQUwoZW50ZXJlZEZ1bGxTY3Jl
ZW5Nb2RlKGJvb2wpKSwgdGhpcywgU0xPVCh0b2dnbGVGdWxsU2NyZWVuTW9kZShib29sKSkpOwot
Ci0gICAgaWYgKCFnSW5zcGVjdG9yVXJsLmlzRW1wdHkoKSkKLSAgICAgIHBhZ2UoKS0+c2V0dGlu
Z3MoKS0+c2V0SW5zcGVjdG9yVXJsKGdJbnNwZWN0b3JVcmwpOwotCi0gICAgbV9pbnNwZWN0b3Ig
PSBuZXcgV2ViSW5zcGVjdG9yKHNwbGl0dGVyKTsKLSAgICBtX2luc3BlY3Rvci0+c2V0UGFnZShw
YWdlKCkpOwotICAgIG1faW5zcGVjdG9yLT5oaWRlKCk7Ci0gICAgY29ubmVjdCh0aGlzLCBTSUdO
QUwoZGVzdHJveWVkKCkpLCBtX2luc3BlY3RvciwgU0xPVChkZWxldGVMYXRlcigpKSk7Ci0KLSAg
ICAvLyB0aGUgem9vbSB2YWx1ZXMgYXJlIGNob3NlbiB0byBiZSBsaWtlIGluIE1vemlsbGEgRmly
ZWZveCAzCi0gICAgbV96b29tTGV2ZWxzIDw8IDMwIDw8IDUwIDw8IDY3IDw8IDgwIDw8IDkwOwot
ICAgIG1fem9vbUxldmVscyA8PCAxMDA7Ci0gICAgbV96b29tTGV2ZWxzIDw8IDExMCA8PCAxMjAg
PDwgMTMzIDw8IDE1MCA8PCAxNzAgPDwgMjAwIDw8IDI0MCA8PCAzMDA7Ci0KLSAgICBncmFiWm9v
bUtleXModHJ1ZSk7Ci19Ci0KLWJvb2wgTGF1bmNoZXJXaW5kb3c6OmlzR3JhcGhpY3NCYXNlZCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIGJvb2wocW9iamVjdF9jYXN0PFFHcmFwaGljc1ZpZXcqPiht
X3ZpZXcpKTsKLX0KLQotaW5saW5lIHZvaWQgYXBwbHlTZXR0aW5nKFFXZWJTZXR0aW5nczo6V2Vi
QXR0cmlidXRlIHR5cGUsIFFXZWJTZXR0aW5ncyogc2V0dGluZ3MsIFFXZWJTZXR0aW5ncyogb3Ro
ZXIsIGJvb2wgZGVmYXVsdFZhbHVlKQotewotICAgIHNldHRpbmdzLT5zZXRBdHRyaWJ1dGUodHlw
ZSwgb3RoZXIgPyBvdGhlci0+dGVzdEF0dHJpYnV0ZSh0eXBlKSA6IGRlZmF1bHRWYWx1ZSk7Ci19
Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmFwcGx5UHJlZnMoTGF1bmNoZXJXaW5kb3cqIHNvdXJj
ZSkKLXsKLSAgICBRV2ViU2V0dGluZ3MqIG90aGVyID0gc291cmNlID8gc291cmNlLT5wYWdlKCkt
PnNldHRpbmdzKCkgOiAwOwotICAgIFFXZWJTZXR0aW5ncyogc2V0dGluZ3MgPSBwYWdlKCktPnNl
dHRpbmdzKCk7Ci0KLSAgICBhcHBseVNldHRpbmcoUVdlYlNldHRpbmdzOjpBY2NlbGVyYXRlZENv
bXBvc2l0aW5nRW5hYmxlZCwgc2V0dGluZ3MsIG90aGVyLCBnVXNlQ29tcG9zaXRpbmcpOwotICAg
IGFwcGx5U2V0dGluZyhRV2ViU2V0dGluZ3M6OlRpbGVkQmFja2luZ1N0b3JlRW5hYmxlZCwgc2V0
dGluZ3MsIG90aGVyLCBnVXNlVGlsZWRCYWNraW5nU3RvcmUpOwotICAgIGFwcGx5U2V0dGluZyhR
V2ViU2V0dGluZ3M6OldlYkdMRW5hYmxlZCwgc2V0dGluZ3MsIG90aGVyLCBmYWxzZSk7Ci0gICAg
YXBwbHlTZXR0aW5nKFFXZWJTZXR0aW5nczo6RnJhbWVGbGF0dGVuaW5nRW5hYmxlZCwgc2V0dGlu
Z3MsIG90aGVyLCBnVXNlRnJhbWVGbGF0dGVuaW5nKTsKLQotICAgIGlmICghaXNHcmFwaGljc0Jh
c2VkKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFdlYlZpZXdHcmFwaGljc0Jhc2VkKiB2aWV3
ID0gc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFzZWQqPihtX3ZpZXcpOwotICAgIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkKiBvdGhlclZpZXcgPSBzb3VyY2UgPyBxb2JqZWN0X2Nhc3Q8V2ViVmll
d0dyYXBoaWNzQmFzZWQqPihzb3VyY2UtPm1fdmlldykgOiAwOwotCi0gICAgdmlldy0+c2V0Vmll
d3BvcnRVcGRhdGVNb2RlKG90aGVyVmlldyA/IG90aGVyVmlldy0+dmlld3BvcnRVcGRhdGVNb2Rl
KCkgOiBnVmlld3BvcnRVcGRhdGVNb2RlKTsKLSAgICB2aWV3LT5zZXRGcmFtZVJhdGVNZWFzdXJl
bWVudEVuYWJsZWQob3RoZXJWaWV3ID8gb3RoZXJWaWV3LT5mcmFtZVJhdGVNZWFzdXJlbWVudEVu
YWJsZWQoKSA6IGdTaG93RnJhbWVSYXRlKTsKLQotICAgIGlmIChvdGhlclZpZXcpCi0gICAgICAg
IHZpZXctPnNldEl0ZW1DYWNoZU1vZGUob3RoZXJWaWV3LT5pdGVtQ2FjaGVNb2RlKCkpOwotICAg
IGVsc2UKLSAgICAgICAgdmlldy0+c2V0SXRlbUNhY2hlTW9kZShnQ2FjaGVXZWJWaWV3ID8gUUdy
YXBoaWNzSXRlbTo6RGV2aWNlQ29vcmRpbmF0ZUNhY2hlIDogUUdyYXBoaWNzSXRlbTo6Tm9DYWNo
ZSk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBl
dmVudCkKLXsKLSNpZmRlZiBRX1dTX01BRU1PXzUKLSAgICBzd2l0Y2ggKGV2ZW50LT5rZXkoKSkg
ewotICAgIGNhc2UgUXQ6OktleV9GNzoKLSAgICAgICAgem9vbUluKCk7Ci0gICAgICAgIGV2ZW50
LT5hY2NlcHQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRdDo6S2V5X0Y4OgotICAgICAg
ICB6b29tT3V0KCk7Ci0gICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgfQotI2VuZGlmCi0gICAgTWFpbldpbmRvdzo6a2V5UHJlc3NFdmVudChldmVudCk7Ci19Ci0K
LXZvaWQgTGF1bmNoZXJXaW5kb3c6OmdyYWJab29tS2V5cyhib29sIGdyYWIpCi17Ci0jaWZkZWYg
UV9XU19NQUVNT181Ci0gICAgaWYgKCF3aW5JZCgpKSB7Ci0gICAgICAgIHFXYXJuaW5nKCJDYW4n
dCBncmFiIGtleXMgdW5sZXNzIHdlIGhhdmUgYSB3aW5kb3cgaWQiKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIEF0b20gYXRvbSA9IFhJbnRlcm5BdG9tKFFYMTFJbmZvOjpkaXNwbGF5
KCksICJfSElMRE9OX1pPT01fS0VZX0FUT00iLCBGYWxzZSk7Ci0gICAgaWYgKCFhdG9tKSB7Ci0g
ICAgICAgIHFXYXJuaW5nKCJVbmFibGUgdG8gb2J0YWluIF9ISUxET05fWk9PTV9LRVlfQVRPTSIp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdW5zaWduZWQgbG9uZyB2YWwgPSAoZ3Jh
YikgPyAxIDogMDsKLSAgICBYQ2hhbmdlUHJvcGVydHkoUVgxMUluZm86OmRpc3BsYXkoKSwgd2lu
SWQoKSwgYXRvbSwgWEFfSU5URUdFUiwgMzIsIFByb3BNb2RlUmVwbGFjZSwgcmVpbnRlcnByZXRf
Y2FzdDx1bnNpZ25lZCBjaGFyKj4oJnZhbCksIDEpOwotI2VuZGlmCi19Ci0KLSNpZiBRVF9WRVJT
SU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKLXZvaWQgTGF1bmNoZXJXaW5kb3c6OnNl
bmRUb3VjaEV2ZW50KCkKLXsKLSAgICBpZiAobV90b3VjaFBvaW50cy5pc0VtcHR5KCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIFFFdmVudDo6VHlwZSB0eXBlID0gUUV2ZW50OjpUb3VjaFVwZGF0
ZTsKLSAgICBpZiAobV90b3VjaFBvaW50cy5zaXplKCkgPT0gMSkgewotICAgICAgICBpZiAobV90
b3VjaFBvaW50c1swXS5zdGF0ZSgpID09IFF0OjpUb3VjaFBvaW50UmVsZWFzZWQpCi0gICAgICAg
ICAgICB0eXBlID0gUUV2ZW50OjpUb3VjaEVuZDsKLSAgICAgICAgZWxzZSBpZiAobV90b3VjaFBv
aW50c1swXS5zdGF0ZSgpID09IFF0OjpUb3VjaFBvaW50UHJlc3NlZCkKLSAgICAgICAgICAgIHR5
cGUgPSBRRXZlbnQ6OlRvdWNoQmVnaW47Ci0gICAgfQotCi0gICAgUVRvdWNoRXZlbnQgdG91Y2hF
dih0eXBlKTsKLSAgICB0b3VjaEV2LnNldFRvdWNoUG9pbnRzKG1fdG91Y2hQb2ludHMpOwotICAg
IFFDb3JlQXBwbGljYXRpb246OnNlbmRFdmVudChwYWdlKCksICZ0b3VjaEV2KTsKLQotICAgIC8v
IEFmdGVyIHNlbmRpbmcgdGhlIGV2ZW50LCByZW1vdmUgYWxsIHRvdWNocG9pbnRzIHRoYXQgd2Vy
ZSByZWxlYXNlZAotICAgIGlmIChtX3RvdWNoUG9pbnRzWzBdLnN0YXRlKCkgPT0gUXQ6OlRvdWNo
UG9pbnRSZWxlYXNlZCkKLSAgICAgICAgbV90b3VjaFBvaW50cy5yZW1vdmVBdCgwKTsKLSAgICBp
ZiAobV90b3VjaFBvaW50cy5zaXplKCkgPiAxICYmIG1fdG91Y2hQb2ludHNbMV0uc3RhdGUoKSA9
PSBRdDo6VG91Y2hQb2ludFJlbGVhc2VkKQotICAgICAgICBtX3RvdWNoUG9pbnRzLnJlbW92ZUF0
KDEpOwotfQotI2VuZGlmIC8vIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAw
KQotCi1ib29sIExhdW5jaGVyV2luZG93OjpldmVudEZpbHRlcihRT2JqZWN0KiBvYmosIFFFdmVu
dCogZXZlbnQpCi17Ci0gICAgLy8gSWYgY2xpY2sgcG9zIGlzIHRoZSBib3R0b20gcmlnaHQgY29y
bmVyIChzcXVhcmUgd2l0aCBzaXplIGRlZmluZWQgYnkgZ0V4aXRDbGlja0FyZWEpCi0gICAgLy8g
YW5kIHRoZSB3aW5kb3cgaXMgb24gRnVsbFNjcmVlbiwgdGhlIHdpbmRvdyBtdXN0IHJldHVybiB0
byBpdHMgb3JpZ2luYWwgc3RhdGUuCi0gICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpN
b3VzZUJ1dHRvblJlbGVhc2UpIHsKLSAgICAgICAgUU1vdXNlRXZlbnQqIGV2ID0gc3RhdGljX2Nh
c3Q8UU1vdXNlRXZlbnQqPihldmVudCk7Ci0gICAgICAgIGlmICh3aW5kb3dTdGF0ZSgpID09IFF0
OjpXaW5kb3dGdWxsU2NyZWVuCi0gICAgICAgICAgICAmJiBldi0+cG9zKCkueCgpID4gKHdpZHRo
KCkgLSBnRXhpdENsaWNrQXJlYSkKLSAgICAgICAgICAgICYmIGV2LT5wb3MoKS55KCkgPiAoaGVp
Z2h0KCkgLSBnRXhpdENsaWNrQXJlYSkpIHsKLQotICAgICAgICAgICAgZW1pdCBlbnRlcmVkRnVs
bFNjcmVlbk1vZGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0jaWYgUVRfVkVSU0lPTiA+
PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCi0gICAgaWYgKCFtX3RvdWNoTW9ja2luZyB8fCBv
YmogIT0gbV92aWV3KQotICAgICAgICByZXR1cm4gUU9iamVjdDo6ZXZlbnRGaWx0ZXIob2JqLCBl
dmVudCk7Ci0KLSAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJl
c3MKLSAgICAgICAgfHwgZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFz
ZQotICAgICAgICB8fCBldmVudC0+dHlwZSgpID09IFFFdmVudDo6TW91c2VCdXR0b25EYmxDbGlj
awotICAgICAgICB8fCBldmVudC0+dHlwZSgpID09IFFFdmVudDo6TW91c2VNb3ZlKSB7Ci0KLSAg
ICAgICAgUU1vdXNlRXZlbnQqIGV2ID0gc3RhdGljX2Nhc3Q8UU1vdXNlRXZlbnQqPihldmVudCk7
Ci0gICAgICAgIGlmIChldi0+dHlwZSgpID09IFFFdmVudDo6TW91c2VNb3ZlCi0gICAgICAgICAg
ICAmJiAhKGV2LT5idXR0b25zKCkgJiBRdDo6TGVmdEJ1dHRvbikpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0KLSAgICAgICAgUVRvdWNoRXZlbnQ6OlRvdWNoUG9pbnQgdG91Y2hQb2ludDsK
LSAgICAgICAgdG91Y2hQb2ludC5zZXRTdGF0ZShRdDo6VG91Y2hQb2ludE1vdmVkKTsKLSAgICAg
ICAgaWYgKChldi0+dHlwZSgpID09IFFFdmVudDo6TW91c2VCdXR0b25QcmVzcwotICAgICAgICAg
ICAgIHx8IGV2LT50eXBlKCkgPT0gUUV2ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrKSkKLSAgICAg
ICAgICAgIHRvdWNoUG9pbnQuc2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRQcmVzc2VkKTsKLSAgICAg
ICAgZWxzZSBpZiAoZXYtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZSkKLSAg
ICAgICAgICAgIHRvdWNoUG9pbnQuc2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRSZWxlYXNlZCk7Ci0K
LSAgICAgICAgdG91Y2hQb2ludC5zZXRJZCgwKTsKLSAgICAgICAgdG91Y2hQb2ludC5zZXRTY3Jl
ZW5Qb3MoZXYtPmdsb2JhbFBvcygpKTsKLSAgICAgICAgdG91Y2hQb2ludC5zZXRQb3MoZXYtPnBv
cygpKTsKLSAgICAgICAgdG91Y2hQb2ludC5zZXRQcmVzc3VyZSgxKTsKLQotICAgICAgICAvLyBJ
ZiB0aGUgcG9pbnQgYWxyZWFkeSBleGlzdHMsIHVwZGF0ZSBpdC4gT3RoZXJ3aXNlIGNyZWF0ZSBp
dC4KLSAgICAgICAgaWYgKG1fdG91Y2hQb2ludHMuc2l6ZSgpID4gMCAmJiAhbV90b3VjaFBvaW50
c1swXS5pZCgpKQotICAgICAgICAgICAgbV90b3VjaFBvaW50c1swXSA9IHRvdWNoUG9pbnQ7Ci0g
ICAgICAgIGVsc2UgaWYgKG1fdG91Y2hQb2ludHMuc2l6ZSgpID4gMSAmJiAhbV90b3VjaFBvaW50
c1sxXS5pZCgpKQotICAgICAgICAgICAgbV90b3VjaFBvaW50c1sxXSA9IHRvdWNoUG9pbnQ7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fdG91Y2hQb2ludHMuYXBwZW5kKHRvdWNoUG9pbnQp
OwotCi0gICAgICAgIHNlbmRUb3VjaEV2ZW50KCk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+dHlw
ZSgpID09IFFFdmVudDo6S2V5UHJlc3MKLSAgICAgICAgJiYgc3RhdGljX2Nhc3Q8UUtleUV2ZW50
Kj4oZXZlbnQpLT5rZXkoKSA9PSBRdDo6S2V5X0YKLSAgICAgICAgJiYgc3RhdGljX2Nhc3Q8UUtl
eUV2ZW50Kj4oZXZlbnQpLT5tb2RpZmllcnMoKSA9PSBRdDo6Q29udHJvbE1vZGlmaWVyKSB7Ci0K
LSAgICAgICAgLy8gSWYgdGhlIGtleWJvYXJkIHBvaW50IGlzIGFscmVhZHkgcHJlc3NlZCwgcmVs
ZWFzZSBpdC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlIGNyZWF0ZSBpdCBhbmQgYXBwZW5kIHRvIG1f
dG91Y2hQb2ludHMuCi0gICAgICAgIGlmIChtX3RvdWNoUG9pbnRzLnNpemUoKSA+IDAgJiYgbV90
b3VjaFBvaW50c1swXS5pZCgpID09IDEpIHsKLSAgICAgICAgICAgIG1fdG91Y2hQb2ludHNbMF0u
c2V0U3RhdGUoUXQ6OlRvdWNoUG9pbnRSZWxlYXNlZCk7Ci0gICAgICAgICAgICBzZW5kVG91Y2hF
dmVudCgpOwotICAgICAgICB9IGVsc2UgaWYgKG1fdG91Y2hQb2ludHMuc2l6ZSgpID4gMSAmJiBt
X3RvdWNoUG9pbnRzWzFdLmlkKCkgPT0gMSkgewotICAgICAgICAgICAgbV90b3VjaFBvaW50c1sx
XS5zZXRTdGF0ZShRdDo6VG91Y2hQb2ludFJlbGVhc2VkKTsKLSAgICAgICAgICAgIHNlbmRUb3Vj
aEV2ZW50KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBRVG91Y2hFdmVudDo6VG91
Y2hQb2ludCB0b3VjaFBvaW50OwotICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRTdGF0ZShRdDo6
VG91Y2hQb2ludFByZXNzZWQpOwotICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRJZCgxKTsKLSAg
ICAgICAgICAgIHRvdWNoUG9pbnQuc2V0U2NyZWVuUG9zKFFDdXJzb3I6OnBvcygpKTsKLSAgICAg
ICAgICAgIHRvdWNoUG9pbnQuc2V0UG9zKG1fdmlldy0+bWFwRnJvbUdsb2JhbChRQ3Vyc29yOjpw
b3MoKSkpOwotICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRQcmVzc3VyZSgxKTsKLSAgICAgICAg
ICAgIG1fdG91Y2hQb2ludHMuYXBwZW5kKHRvdWNoUG9pbnQpOwotICAgICAgICAgICAgc2VuZFRv
dWNoRXZlbnQoKTsKLQotICAgICAgICAgICAgLy8gQWZ0ZXIgc2VuZGluZyB0aGUgZXZlbnQsIGNo
YW5nZSB0aGUgdG91Y2hwb2ludCBzdGF0ZSB0byBzdGF0aW9uYXJ5Ci0gICAgICAgICAgICBtX3Rv
dWNoUG9pbnRzLmxhc3QoKS5zZXRTdGF0ZShRdDo6VG91Y2hQb2ludFN0YXRpb25hcnkpOwotICAg
ICAgICB9Ci0gICAgfQotI2VuZGlmIC8vIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0
LCA2LCAwKQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojps
b2FkU3RhcnRlZCgpCi17Ci0gICAgbV92aWV3LT5zZXRGb2N1cyhRdDo6T3RoZXJGb2N1c1JlYXNv
bik7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmxvYWRGaW5pc2hlZCgpCi17Ci0gICAgUVVy
bCB1cmwgPSBwYWdlKCktPm1haW5GcmFtZSgpLT51cmwoKTsKLSAgICBzZXRBZGRyZXNzVXJsKHVy
bC50b1N0cmluZygpKTsKLSAgICBhZGRDb21wbGV0ZXJFbnRyeSh1cmwpOwotfQotCi12b2lkIExh
dW5jaGVyV2luZG93OjpzaG93TGlua0hvdmVyKGNvbnN0IFFTdHJpbmcgJmxpbmssIGNvbnN0IFFT
dHJpbmcgJnRvb2xUaXApCi17Ci0jaWZuZGVmIFFfV1NfTUFFTU9fNQotICAgIHN0YXR1c0Jhcigp
LT5zaG93TWVzc2FnZShsaW5rKTsKLSNlbmRpZgotI2lmbmRlZiBRVF9OT19UT09MVElQCi0gICAg
aWYgKCF0b29sVGlwLmlzRW1wdHkoKSkKLSAgICAgICAgUVRvb2xUaXA6OnNob3dUZXh0KFFDdXJz
b3I6OnBvcygpLCB0b29sVGlwKTsKLSNlbmRpZgotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp6
b29tQW5pbWF0aW9uRmluaXNoZWQoKQotewotICAgIGlmICghaXNHcmFwaGljc0Jhc2VkKCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICBRR3JhcGhpY3NXZWJWaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8
V2ViVmlld0dyYXBoaWNzQmFzZWQqPihtX3ZpZXcpLT5ncmFwaGljc1dlYlZpZXcoKTsKLSAgICB2
aWV3LT5zZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihmYWxzZSk7Ci19Ci0KLXZvaWQgTGF1bmNo
ZXJXaW5kb3c6OmFwcGx5Wm9vbSgpCi17Ci0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NI
RUNLKDQsIDYsIDApCi0gICAgaWYgKGlzR3JhcGhpY3NCYXNlZCgpICYmIHBhZ2UoKS0+c2V0dGlu
Z3MoKS0+dGVzdEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OlRpbGVkQmFja2luZ1N0b3JlRW5hYmxl
ZCkpIHsKLSAgICAgICAgUUdyYXBoaWNzV2ViVmlldyogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZp
ZXdHcmFwaGljc0Jhc2VkKj4obV92aWV3KS0+Z3JhcGhpY3NXZWJWaWV3KCk7Ci0gICAgICAgIHZp
ZXctPnNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKHRydWUpOwotICAgICAgICBpZiAoIW1fem9v
bUFuaW1hdGlvbikgewotICAgICAgICAgICAgbV96b29tQW5pbWF0aW9uID0gbmV3IFFQcm9wZXJ0
eUFuaW1hdGlvbih2aWV3LCAic2NhbGUiKTsKLSAgICAgICAgICAgIG1fem9vbUFuaW1hdGlvbi0+
c2V0U3RhcnRWYWx1ZSh2aWV3LT5zY2FsZSgpKTsKLSAgICAgICAgICAgIGNvbm5lY3QobV96b29t
QW5pbWF0aW9uLCBTSUdOQUwoZmluaXNoZWQoKSksIHRoaXMsIFNMT1Qoem9vbUFuaW1hdGlvbkZp
bmlzaGVkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fem9vbUFuaW1hdGlv
bi0+c3RvcCgpOwotICAgICAgICAgICAgbV96b29tQW5pbWF0aW9uLT5zZXRTdGFydFZhbHVlKG1f
em9vbUFuaW1hdGlvbi0+Y3VycmVudFZhbHVlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbV96
b29tQW5pbWF0aW9uLT5zZXREdXJhdGlvbigzMDApOwotICAgICAgICBtX3pvb21BbmltYXRpb24t
PnNldEVuZFZhbHVlKHFyZWFsKG1fY3VycmVudFpvb20pIC8gMTAwLik7Ci0gICAgICAgIG1fem9v
bUFuaW1hdGlvbi0+c3RhcnQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICAg
IHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldFpvb21GYWN0b3IocXJlYWwobV9jdXJyZW50Wm9vbSkg
LyAxMDAuMCk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6Onpvb21JbigpCi17Ci0gICAgaW50
IGkgPSBtX3pvb21MZXZlbHMuaW5kZXhPZihtX2N1cnJlbnRab29tKTsKLSAgICBRX0FTU0VSVChp
ID49IDApOwotICAgIGlmIChpIDwgbV96b29tTGV2ZWxzLmNvdW50KCkgLSAxKQotICAgICAgICBt
X2N1cnJlbnRab29tID0gbV96b29tTGV2ZWxzW2kgKyAxXTsKLQotICAgIGFwcGx5Wm9vbSgpOwot
fQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp6b29tT3V0KCkKLXsKLSAgICBpbnQgaSA9IG1fem9v
bUxldmVscy5pbmRleE9mKG1fY3VycmVudFpvb20pOwotICAgIFFfQVNTRVJUKGkgPj0gMCk7Ci0g
ICAgaWYgKGkgPiAwKQotICAgICAgICBtX2N1cnJlbnRab29tID0gbV96b29tTGV2ZWxzW2kgLSAx
XTsKLQotICAgIGFwcGx5Wm9vbSgpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpyZXNldFpv
b20oKQotewotICAgIG1fY3VycmVudFpvb20gPSAxMDA7Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUo
KS0+c2V0Wm9vbUZhY3RvcigxLjApOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVa
b29tVGV4dE9ubHkoYm9vbCBiKQotewotICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QXR0cmli
dXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5LCBiKTsKLX0KLQotdm9pZCBMYXVuY2hlcldp
bmRvdzo6cHJpbnQoKQotewotI2lmICFkZWZpbmVkKFFUX05PX1BSSU5URVIpCi0gICAgUVByaW50
UHJldmlld0RpYWxvZyBkbGcodGhpcyk7Ci0gICAgY29ubmVjdCgmZGxnLCBTSUdOQUwocGFpbnRS
ZXF1ZXN0ZWQoUVByaW50ZXIqKSksCi0gICAgICAgICAgICBwYWdlKCktPm1haW5GcmFtZSgpLCBT
TE9UKHByaW50KFFQcmludGVyKikpKTsKLSAgICBkbGcuZXhlYygpOwotI2VuZGlmCi19Ci0KLXZv
aWQgTGF1bmNoZXJXaW5kb3c6OnNjcmVlbnNob3QoKQotewotICAgIFFQaXhtYXAgcGl4bWFwID0g
UVBpeG1hcDo6Z3JhYldpZGdldChtX3ZpZXcpOwotICAgIFFMYWJlbCogbGFiZWwgPSBuZXcgUUxh
YmVsOwotICAgIGxhYmVsLT5zZXRBdHRyaWJ1dGUoUXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOwotICAg
IGxhYmVsLT5zZXRXaW5kb3dUaXRsZSgiU2NyZWVuc2hvdCAtIFByZXZpZXciKTsKLSAgICBsYWJl
bC0+c2V0UGl4bWFwKHBpeG1hcCk7Ci0gICAgbGFiZWwtPnNob3coKTsKLQotICAgIFFTdHJpbmcg
ZmlsZU5hbWUgPSBRRmlsZURpYWxvZzo6Z2V0U2F2ZUZpbGVOYW1lKGxhYmVsLCAiU2NyZWVuc2hv
dCIpOwotICAgIGlmICghZmlsZU5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHBpeG1hcC5zYXZl
KGZpbGVOYW1lLCAicG5nIik7Ci0gICAgICAgIGxhYmVsLT5zZXRXaW5kb3dUaXRsZShRU3RyaW5n
KCJTY3JlZW5zaG90IC0gU2F2ZWQgYXQgJTEiKS5hcmcoZmlsZU5hbWUpKTsKLSAgICB9Ci19Ci0K
LXZvaWQgTGF1bmNoZXJXaW5kb3c6OnNldEVkaXRhYmxlKGJvb2wgb24pCi17Ci0gICAgcGFnZSgp
LT5zZXRDb250ZW50RWRpdGFibGUob24pOwotICAgIG1fZm9ybWF0TWVudUFjdGlvbi0+c2V0Vmlz
aWJsZShvbik7Ci19Ci0KLS8qCi12b2lkIExhdW5jaGVyV2luZG93OjpkdW1wUGx1Z2lucygpIHsK
LSAgICBRTGlzdDxRV2ViUGx1Z2luSW5mbz4gcGx1Z2lucyA9IFFXZWJTZXR0aW5nczo6cGx1Z2lu
RGF0YWJhc2UoKS0+cGx1Z2lucygpOwotICAgIGZvcmVhY2ggKGNvbnN0IFFXZWJQbHVnaW5JbmZv
IHBsdWdpbiwgcGx1Z2lucykgewotICAgICAgICBxRGVidWcoKSA8PCAiUGx1Z2luOiIgPDwgcGx1
Z2luLm5hbWUoKTsKLSAgICAgICAgZm9yZWFjaCAoY29uc3QgUVdlYlBsdWdpbkluZm86Ok1pbWVU
eXBlIG1pbWUsIHBsdWdpbi5taW1lVHlwZXMoKSkgewotICAgICAgICAgICAgcURlYnVnKCkgPDwg
IiAgICIgPDwgbWltZS5uYW1lOwotICAgICAgICB9Ci0gICAgfQotfQotKi8KLQotdm9pZCBMYXVu
Y2hlcldpbmRvdzo6ZHVtcEh0bWwoKQotewotICAgIHFEZWJ1ZygpIDw8ICJIVE1MOiAiIDw8IHBh
Z2UoKS0+bWFpbkZyYW1lKCktPnRvSHRtbCgpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojpz
ZWxlY3RFbGVtZW50cygpCi17Ci0gICAgYm9vbCBvazsKLSAgICBRU3RyaW5nIHN0ciA9IFFJbnB1
dERpYWxvZzo6Z2V0VGV4dCh0aGlzLCAiU2VsZWN0IGVsZW1lbnRzIiwgIkNob29zZSBlbGVtZW50
cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUxpbmVFZGl0OjpO
b3JtYWwsICJhIiwgJm9rKTsKLQotICAgIGlmIChvayAmJiAhc3RyLmlzRW1wdHkoKSkgewotICAg
ICAgICBRV2ViRWxlbWVudENvbGxlY3Rpb24gcmVzdWx0ID0gIHBhZ2UoKS0+bWFpbkZyYW1lKCkt
PmZpbmRBbGxFbGVtZW50cyhzdHIpOwotICAgICAgICBmb3JlYWNoIChRV2ViRWxlbWVudCBlLCBy
ZXN1bHQpCi0gICAgICAgICAgICBlLnNldFN0eWxlUHJvcGVydHkoImJhY2tncm91bmQtY29sb3Ii
LCAieWVsbG93Iik7Ci0jaWZuZGVmIFFfV1NfTUFFTU9fNQotICAgICAgICBzdGF0dXNCYXIoKS0+
c2hvd01lc3NhZ2UoUVN0cmluZygiJTEgZWxlbWVudChzKSBzZWxlY3RlZCIpLmFyZyhyZXN1bHQu
Y291bnQoKSksIDUwMDApOwotI2VuZGlmCi0gICAgfQotfQotCi12b2lkIExhdW5jaGVyV2luZG93
OjpzZXRUb3VjaE1vY2tpbmcoYm9vbCBvbikKLXsKLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJ
T05fQ0hFQ0soNCwgNiwgMCkKLSAgICBtX3RvdWNoTW9ja2luZyA9IG9uOwotI2VuZGlmCi19Ci0K
LXZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCB0
b2dnbGUpCi17Ci0gICAgZ1VzZUNvbXBvc2l0aW5nID0gdG9nZ2xlOwotICAgIHBhZ2UoKS0+c2V0
dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21wb3NpdGlu
Z0VuYWJsZWQsIHRvZ2dsZSk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZVRpbGVk
QmFja2luZ1N0b3JlKGJvb2wgdG9nZ2xlKQotewotICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0
QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6VGlsZWRCYWNraW5nU3RvcmVFbmFibGVkLCB0b2dnbGUp
OwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVSZXNpemVzVG9Db250ZW50cyhib29s
IHRvZ2dsZSkKLXsKLSAgICBzdGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmll
dyktPnNldFJlc2l6ZXNUb0NvbnRlbnRzKHRvZ2dsZSk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5k
b3c6OnRvZ2dsZVdlYkdMKGJvb2wgdG9nZ2xlKQotewotICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+
c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6V2ViR0xFbmFibGVkLCB0b2dnbGUpOwotfQotCi12
b2lkIExhdW5jaGVyV2luZG93Ojppbml0aWFsaXplVmlldyhib29sIHVzZUdyYXBoaWNzVmlldykK
LXsKLSAgICBkZWxldGUgbV92aWV3OwotCi0gICAgUVNwbGl0dGVyKiBzcGxpdHRlciA9IHN0YXRp
Y19jYXN0PFFTcGxpdHRlcio+KGNlbnRyYWxXaWRnZXQoKSk7Ci0KLSAgICBpZiAoIXVzZUdyYXBo
aWNzVmlldykgewotICAgICAgICBXZWJWaWV3VHJhZGl0aW9uYWwqIHZpZXcgPSBuZXcgV2ViVmll
d1RyYWRpdGlvbmFsKHNwbGl0dGVyKTsKLSAgICAgICAgdmlldy0+c2V0UGFnZShwYWdlKCkpOwot
Ci0gICAgICAgIHZpZXctPmluc3RhbGxFdmVudEZpbHRlcih0aGlzKTsKLQotICAgICAgICBtX3Zp
ZXcgPSB2aWV3OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFdlYlZpZXdHcmFwaGljc0Jhc2VkKiB2
aWV3ID0gbmV3IFdlYlZpZXdHcmFwaGljc0Jhc2VkKHNwbGl0dGVyKTsKLSAgICAgICAgdmlldy0+
c2V0UGFnZShwYWdlKCkpOwotCi0gICAgICAgIGlmIChtX2ZsaXBBbmltYXRlZCkKLSAgICAgICAg
ICAgIGNvbm5lY3QobV9mbGlwQW5pbWF0ZWQsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHZpZXcsIFNM
T1QoYW5pbWF0ZWRGbGlwKCkpKTsKLQotICAgICAgICBpZiAobV9mbGlwWUFuaW1hdGVkKQotICAg
ICAgICAgICAgY29ubmVjdChtX2ZsaXBZQW5pbWF0ZWQsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHZp
ZXcsIFNMT1QoYW5pbWF0ZWRZRmxpcCgpKSk7Ci0KLSAgICAgICAgY29ubmVjdCh2aWV3LCBTSUdO
QUwoY3VycmVudEZQU1VwZGF0ZWQoaW50KSksIHRoaXMsIFNMT1QodXBkYXRlRlBTKGludCkpKTsK
LQotICAgICAgICAvLyBUaGUgaW1wbGVtZW50YXRpb24gb2YgUUFic3RyYWN0U2Nyb2xsQXJlYTo6
ZXZlbnRGaWx0ZXIgbWFrZXMgdXMgbmVlZAotICAgICAgICAvLyB0byBpbnN0YWxsIHRoZSBldmVu
dCBmaWx0ZXIgb24gdGhlIHZpZXdwb3J0IG9mIGEgUUdyYXBoaWNzVmlldy4KLSAgICAgICAgdmll
dy0+dmlld3BvcnQoKS0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOwotCi0gICAgICAgIG1fdmll
dyA9IHZpZXc7Ci0gICAgfQotCi0jaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQs
IDYsIDApCi0gICAgbV90b3VjaE1vY2tpbmcgPSBmYWxzZTsKLSNlbmRpZgotfQotCi12b2lkIExh
dW5jaGVyV2luZG93Ojp0b2dnbGVTcGF0aWFsTmF2aWdhdGlvbihib29sIGIpCi17Ci0gICAgcGFn
ZSgpLT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpTcGF0aWFsTmF2aWdh
dGlvbkVuYWJsZWQsIGIpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVGdWxsU2Ny
ZWVuTW9kZShib29sIGVuYWJsZSkKLXsKLSAgICBpZiAoZW5hYmxlKQotICAgICAgICBzZXRXaW5k
b3dTdGF0ZShRdDo6V2luZG93RnVsbFNjcmVlbik7Ci0gICAgZWxzZSB7Ci0jaWYgZGVmaW5lZChR
X1dTX1M2MCkKLSAgICAgICAgc2V0V2luZG93U3RhdGUoUXQ6OldpbmRvd01heGltaXplZCk7Ci0j
ZWxzZQotICAgICAgICBzZXRXaW5kb3dTdGF0ZShRdDo6V2luZG93Tm9TdGF0ZSk7Ci0jZW5kaWYK
LSAgICB9Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OnNob3dGUFMoYm9vbCBlbmFibGUpCi17
Ci0gICAgaWYgKCFpc0dyYXBoaWNzQmFzZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZ1No
b3dGcmFtZVJhdGUgPSBlbmFibGU7Ci0gICAgV2ViVmlld0dyYXBoaWNzQmFzZWQqIHZpZXcgPSBz
dGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmlldyk7Ci0gICAgdmlldy0+c2V0
RnJhbWVSYXRlTWVhc3VyZW1lbnRFbmFibGVkKGVuYWJsZSk7Ci0KLSAgICBpZiAoIWVuYWJsZSkg
ewotI2lmIGRlZmluZWQoUV9XU19NQUVNT181KSAmJiBkZWZpbmVkKFFfV1NfUzYwKQotICAgICAg
ICBzZXRXaW5kb3dUaXRsZSgiIik7Ci0jZWxzZQotICAgICAgICBzdGF0dXNCYXIoKS0+Y2xlYXJN
ZXNzYWdlKCk7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OmNoYW5n
ZVZpZXdwb3J0VXBkYXRlTW9kZShpbnQgbW9kZSkKLXsKLSAgICBnVmlld3BvcnRVcGRhdGVNb2Rl
ID0gUUdyYXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlKG1vZGUpOwotCi0gICAgaWYgKCFp
c0dyYXBoaWNzQmFzZWQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgV2ViVmlld0dyYXBoaWNz
QmFzZWQqIHZpZXcgPSBzdGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmlldyk7
Ci0gICAgdmlldy0+c2V0Vmlld3BvcnRVcGRhdGVNb2RlKGdWaWV3cG9ydFVwZGF0ZU1vZGUpOwot
fQotCi12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVGcmFtZUZsYXR0ZW5pbmcoYm9vbCB0b2dn
bGUpCi17Ci0gICAgZ1VzZUZyYW1lRmxhdHRlbmluZyA9IHRvZ2dsZTsKLSAgICBwYWdlKCktPnNl
dHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkZyYW1lRmxhdHRlbmluZ0VuYWJs
ZWQsIHRvZ2dsZSk7Ci19Ci0KLSNpZiBkZWZpbmVkKFFUX0NPTkZJR1VSRURfV0lUSF9PUEVOR0wp
Ci12b2lkIExhdW5jaGVyV2luZG93Ojp0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydChib29sIGVuYWJs
ZSkKLXsKLSAgICBpZiAoIWlzR3JhcGhpY3NCYXNlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBnVXNlUUdMV2lkZ2V0Vmlld3BvcnQgPSBlbmFibGU7Ci0gICAgV2ViVmlld0dyYXBoaWNzQmFz
ZWQqIHZpZXcgPSBzdGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmlldyk7Ci0K
LSAgICB2aWV3LT5zZXRWaWV3cG9ydChlbmFibGUgPyBuZXcgUUdMV2lkZ2V0KCkgOiAwKTsKLX0K
LSNlbmRpZgotCi12b2lkIExhdW5jaGVyV2luZG93OjpzaG93VXNlckFnZW50RGlhbG9nKCkKLXsK
LSAgICBRU3RyaW5nTGlzdCBpdGVtczsKLSAgICBRRmlsZSBmaWxlKCI6L3VzZXJhZ2VudGxpc3Qu
dHh0Iik7Ci0gICAgaWYgKGZpbGUub3BlbihRSU9EZXZpY2U6OlJlYWRPbmx5KSkgewotICAgICAg
ICAgd2hpbGUgKCFmaWxlLmF0RW5kKCkpCi0gICAgICAgICAgICBpdGVtcyA8PCBmaWxlLnJlYWRM
aW5lKCkudHJpbW1lZCgpOwotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgUVNl
dHRpbmdzIHNldHRpbmdzOwotICAgIFFTdHJpbmcgY3VzdG9tVXNlckFnZW50ID0gc2V0dGluZ3Mu
dmFsdWUoIkN1c3RvbVVzZXJBZ2VudCIpLnRvU3RyaW5nKCk7Ci0gICAgaWYgKCFpdGVtcy5jb250
YWlucyhjdXN0b21Vc2VyQWdlbnQpICYmICFjdXN0b21Vc2VyQWdlbnQuaXNFbXB0eSgpKQotICAg
ICAgICBpdGVtcyA8PCBjdXN0b21Vc2VyQWdlbnQ7Ci0KLSAgICBRRGlhbG9nKiBkaWFsb2cgPSBu
ZXcgUURpYWxvZyh0aGlzKTsKLSAgICBkaWFsb2ctPnNldFdpbmRvd1RpdGxlKCJDaGFuZ2UgVXNl
ciBBZ2VudCIpOwotCi0gICAgUVZCb3hMYXlvdXQqIGxheW91dCA9IG5ldyBRVkJveExheW91dChk
aWFsb2cpOwotICAgIGRpYWxvZy0+c2V0TGF5b3V0KGxheW91dCk7Ci0KLSAgICBRQ29tYm9Cb3gq
IGNvbWJvID0gbmV3IFFDb21ib0JveChkaWFsb2cpOwotICAgIGNvbWJvLT5zZXRNYXhpbXVtV2lk
dGgoc2l6ZSgpLndpZHRoKCkgKiAwLjcpOwotICAgIGNvbWJvLT5zZXRFZGl0YWJsZSh0cnVlKTsK
LSAgICBjb21iby0+aW5zZXJ0SXRlbXMoMCwgaXRlbXMpOwotICAgIGxheW91dC0+YWRkV2lkZ2V0
KGNvbWJvKTsKLQotICAgIGludCBpbmRleCA9IGNvbWJvLT5maW5kVGV4dChwYWdlKCktPnVzZXJB
Z2VudEZvclVybChRVXJsKCkpKTsKLSAgICBjb21iby0+c2V0Q3VycmVudEluZGV4KGluZGV4KTsK
LQotICAgIFFEaWFsb2dCdXR0b25Cb3gqIGJ1dHRvbkJveCA9IG5ldyBRRGlhbG9nQnV0dG9uQm94
KFFEaWFsb2dCdXR0b25Cb3g6Ok9rCi0gICAgICAgICAgICB8IFFEaWFsb2dCdXR0b25Cb3g6OkNh
bmNlbCwgUXQ6Okhvcml6b250YWwsIGRpYWxvZyk7Ci0gICAgY29ubmVjdChidXR0b25Cb3gsIFNJ
R05BTChhY2NlcHRlZCgpKSwgZGlhbG9nLCBTTE9UKGFjY2VwdCgpKSk7Ci0gICAgY29ubmVjdChi
dXR0b25Cb3gsIFNJR05BTChyZWplY3RlZCgpKSwgZGlhbG9nLCBTTE9UKHJlamVjdCgpKSk7Ci0g
ICAgbGF5b3V0LT5hZGRXaWRnZXQoYnV0dG9uQm94KTsKLQotICAgIGlmIChkaWFsb2ctPmV4ZWMo
KSAmJiAhY29tYm8tPmN1cnJlbnRUZXh0KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHBhZ2UoKS0+
c2V0VXNlckFnZW50KGNvbWJvLT5jdXJyZW50VGV4dCgpKTsKLSAgICAgICAgaWYgKCFpdGVtcy5j
b250YWlucyhjb21iby0+Y3VycmVudFRleHQoKSkpCi0gICAgICAgICAgICBzZXR0aW5ncy5zZXRW
YWx1ZSgiQ3VzdG9tVXNlckFnZW50IiwgY29tYm8tPmN1cnJlbnRUZXh0KCkpOwotICAgIH0KLQot
ICAgIGRlbGV0ZSBkaWFsb2c7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6Om5ld1dpbmRvdygp
Ci17Ci0gICAgTGF1bmNoZXJXaW5kb3cqIG13ID0gbmV3IExhdW5jaGVyV2luZG93KHRoaXMsIGZh
bHNlKTsKLSAgICBtdy0+c2hvdygpOwotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpjbG9uZVdp
bmRvdygpCi17Ci0gICAgTGF1bmNoZXJXaW5kb3cqIG13ID0gbmV3IExhdW5jaGVyV2luZG93KHRo
aXMsIHRydWUpOwotICAgIG13LT5zaG93KCk7Ci19Ci0KLXZvaWQgTGF1bmNoZXJXaW5kb3c6OnVw
ZGF0ZUZQUyhpbnQgZnBzKQotewotICAgIFFTdHJpbmcgZnBzU3RhdHVzVGV4dCA9IFFTdHJpbmco
IkN1cnJlbnQgRlBTOiAlMSIpLmFyZyhmcHMpOwotCi0jaWYgZGVmaW5lZChRX1dTX01BRU1PXzUp
ICYmIGRlZmluZWQoUV9XU19TNjApCi0gICAgc2V0V2luZG93VGl0bGUoZnBzU3RhdHVzVGV4dCk7
Ci0jZWxzZQotICAgIHN0YXR1c0JhcigpLT5zaG93TWVzc2FnZShmcHNTdGF0dXNUZXh0KTsKLSNl
bmRpZgotfQotCi12b2lkIExhdW5jaGVyV2luZG93OjpjcmVhdGVDaHJvbWUoKQotewotICAgIFFN
ZW51KiBmaWxlTWVudSA9IG1lbnVCYXIoKS0+YWRkTWVudSgiJkZpbGUiKTsKLSAgICBmaWxlTWVu
dS0+YWRkQWN0aW9uKCJOZXcgV2luZG93IiwgdGhpcywgU0xPVChuZXdXaW5kb3coKSksIFFLZXlT
ZXF1ZW5jZTo6TmV3KTsKLSAgICBmaWxlTWVudS0+YWRkQWN0aW9uKHRyKCJPcGVuIEZpbGUuLi4i
KSwgdGhpcywgU0xPVChvcGVuRmlsZSgpKSwgUUtleVNlcXVlbmNlOjpPcGVuKTsKLSAgICBmaWxl
TWVudS0+YWRkQWN0aW9uKCJDbG9zZSBXaW5kb3ciLCB0aGlzLCBTTE9UKGNsb3NlKCkpLCBRS2V5
U2VxdWVuY2U6OkNsb3NlKTsKLSAgICBmaWxlTWVudS0+YWRkU2VwYXJhdG9yKCk7Ci0gICAgZmls
ZU1lbnUtPmFkZEFjdGlvbigiVGFrZSBTY3JlZW4gU2hvdC4uLiIsIHRoaXMsIFNMT1Qoc2NyZWVu
c2hvdCgpKSk7Ci0gICAgZmlsZU1lbnUtPmFkZEFjdGlvbih0cigiUHJpbnQuLi4iKSwgdGhpcywg
U0xPVChwcmludCgpKSwgUUtleVNlcXVlbmNlOjpQcmludCk7Ci0gICAgZmlsZU1lbnUtPmFkZFNl
cGFyYXRvcigpOwotICAgIGZpbGVNZW51LT5hZGRBY3Rpb24oIlF1aXQiLCBRQXBwbGljYXRpb246
Omluc3RhbmNlKCksIFNMT1QoY2xvc2VBbGxXaW5kb3dzKCkpLCBRS2V5U2VxdWVuY2UoUXQ6OkNU
UkwgfCBRdDo6S2V5X1EpKTsKLQotICAgIFFNZW51KiBlZGl0TWVudSA9IG1lbnVCYXIoKS0+YWRk
TWVudSgiJkVkaXQiKTsKLSAgICBlZGl0TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFX
ZWJQYWdlOjpVbmRvKSk7Ci0gICAgZWRpdE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihR
V2ViUGFnZTo6UmVkbykpOwotICAgIGVkaXRNZW51LT5hZGRTZXBhcmF0b3IoKTsKLSAgICBlZGl0
TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpDdXQpKTsKLSAgICBlZGl0
TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpDb3B5KSk7Ci0gICAgZWRp
dE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6UGFzdGUpKTsKLSAgICBl
ZGl0TWVudS0+YWRkU2VwYXJhdG9yKCk7Ci0gICAgUUFjdGlvbiogc2V0RWRpdGFibGUgPSBlZGl0
TWVudS0+YWRkQWN0aW9uKCJTZXQgRWRpdGFibGUiLCB0aGlzLCBTTE9UKHNldEVkaXRhYmxlKGJv
b2wpKSk7Ci0gICAgc2V0RWRpdGFibGUtPnNldENoZWNrYWJsZSh0cnVlKTsKLQotICAgIFFNZW51
KiB2aWV3TWVudSA9IG1lbnVCYXIoKS0+YWRkTWVudSgiJlZpZXciKTsKLSAgICB2aWV3TWVudS0+
YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpTdG9wKSk7Ci0gICAgdmlld01lbnUt
PmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKSk7Ci0gICAgdmlld01l
bnUtPmFkZFNlcGFyYXRvcigpOwotICAgIFFBY3Rpb24qIHpvb21JbiA9IHZpZXdNZW51LT5hZGRB
Y3Rpb24oIlpvb20gJkluIiwgdGhpcywgU0xPVCh6b29tSW4oKSkpOwotICAgIFFBY3Rpb24qIHpv
b21PdXQgPSB2aWV3TWVudS0+YWRkQWN0aW9uKCJab29tICZPdXQiLCB0aGlzLCBTTE9UKHpvb21P
dXQoKSkpOwotICAgIFFBY3Rpb24qIHJlc2V0Wm9vbSA9IHZpZXdNZW51LT5hZGRBY3Rpb24oIlJl
c2V0IFpvb20iLCB0aGlzLCBTTE9UKHJlc2V0Wm9vbSgpKSk7Ci0gICAgUUFjdGlvbiogem9vbVRl
eHRPbmx5ID0gdmlld01lbnUtPmFkZEFjdGlvbigiWm9vbSBUZXh0IE9ubHkiLCB0aGlzLCBTTE9U
KHRvZ2dsZVpvb21UZXh0T25seShib29sKSkpOwotICAgIHpvb21UZXh0T25seS0+c2V0Q2hlY2th
YmxlKHRydWUpOwotICAgIHpvb21UZXh0T25seS0+c2V0Q2hlY2tlZChmYWxzZSk7Ci0gICAgdmll
d01lbnUtPmFkZFNlcGFyYXRvcigpOwotICAgIHZpZXdNZW51LT5hZGRBY3Rpb24oIkR1bXAgSFRN
TCIsIHRoaXMsIFNMT1QoZHVtcEh0bWwoKSkpOwotICAgIC8vIHZpZXdNZW51LT5hZGRBY3Rpb24o
IkR1bXAgcGx1Z2lucyIsIHRoaXMsIFNMT1QoZHVtcFBsdWdpbnMoKSkpOwotCi0gICAgUU1lbnUq
IGZvcm1hdE1lbnUgPSBuZXcgUU1lbnUoIkYmb3JtYXQiLCB0aGlzKTsKLSAgICBtX2Zvcm1hdE1l
bnVBY3Rpb24gPSBtZW51QmFyKCktPmFkZE1lbnUoZm9ybWF0TWVudSk7Ci0gICAgbV9mb3JtYXRN
ZW51QWN0aW9uLT5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICBmb3JtYXRNZW51LT5hZGRBY3Rpb24o
cGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZUJvbGQpKTsKLSAgICBmb3JtYXRNZW51LT5h
ZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZUl0YWxpYykpOwotICAgIGZv
cm1hdE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlVW5kZXJs
aW5lKSk7Ci0gICAgUU1lbnUqIHdyaXRpbmdNZW51ID0gZm9ybWF0TWVudS0+YWRkTWVudSh0cigi
V3JpdGluZyBEaXJlY3Rpb24iKSk7Ci0gICAgd3JpdGluZ01lbnUtPmFkZEFjdGlvbihwYWdlKCkt
PmFjdGlvbihRV2ViUGFnZTo6U2V0VGV4dERpcmVjdGlvbkRlZmF1bHQpKTsKLSAgICB3cml0aW5n
TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9u
TGVmdFRvUmlnaHQpKTsKLSAgICB3cml0aW5nTWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9u
KFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQpKTsKLQotICAgIHpvb21Jbi0+
c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9QbHVzKSk7Ci0gICAg
em9vbU91dC0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9NaW51
cykpOwotICAgIHJlc2V0Wm9vbS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwg
UXQ6OktleV8wKSk7Ci0KLSAgICBRTWVudSogd2luZG93TWVudSA9IG1lbnVCYXIoKS0+YWRkTWVu
dSgiJldpbmRvdyIpOwotICAgIFFBY3Rpb24qIHRvZ2dsZUZ1bGxTY3JlZW4gPSB3aW5kb3dNZW51
LT5hZGRBY3Rpb24oIlRvZ2dsZSBGdWxsU2NyZWVuIiwgdGhpcywgU0lHTkFMKGVudGVyZWRGdWxs
U2NyZWVuTW9kZShib29sKSkpOwotICAgIHRvZ2dsZUZ1bGxTY3JlZW4tPnNldENoZWNrYWJsZSh0
cnVlKTsKLSAgICB0b2dnbGVGdWxsU2NyZWVuLT5zZXRDaGVja2VkKGZhbHNlKTsKLQotICAgIC8v
IHdoZW4gZXhpdCBmdWxsc2NyZWVuIG1vZGUgYnkgY2xpY2tpbmcgb24gdGhlIGV4aXQgYXJlYSAo
Ym90dG9tIHJpZ2h0IGNvcm5lcikgd2UgbXVzdAotICAgIC8vIHVuY2hlY2sgdGhlIFRvZ2dsZSBG
dWxsU2NyZWVuIGFjdGlvbgotICAgIHRvZ2dsZUZ1bGxTY3JlZW4tPmNvbm5lY3QodGhpcywgU0lH
TkFMKGVudGVyZWRGdWxsU2NyZWVuTW9kZShib29sKSksIFNMT1Qoc2V0Q2hlY2tlZChib29sKSkp
OwotCi0gICAgUU1lbnUqIHRvb2xzTWVudSA9IG1lbnVCYXIoKS0+YWRkTWVudSgiJkRldmVsb3Ai
KTsKLSAgICB0b29sc01lbnUtPmFkZEFjdGlvbigiU2VsZWN0IEVsZW1lbnRzLi4uIiwgdGhpcywg
U0xPVChzZWxlY3RFbGVtZW50cygpKSk7Ci0gICAgUUFjdGlvbiogc2hvd0luc3BlY3RvckFjdGlv
biA9IHRvb2xzTWVudS0+YWRkQWN0aW9uKCJTaG93IFdlYiBJbnNwZWN0b3IiLCBtX2luc3BlY3Rv
ciwgU0xPVChzZXRWaXNpYmxlKGJvb2wpKSwgUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OkFM
VCB8IFF0OjpLZXlfSSkpOwotICAgIHNob3dJbnNwZWN0b3JBY3Rpb24tPnNldENoZWNrYWJsZSh0
cnVlKTsKLSAgICBzaG93SW5zcGVjdG9yQWN0aW9uLT5jb25uZWN0KG1faW5zcGVjdG9yLCBTSUdO
QUwodmlzaWJsZUNoYW5nZWQoYm9vbCkpLCBTTE9UKHNldENoZWNrZWQoYm9vbCkpKTsKLQotI2lm
IFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgIFFBY3Rpb24qIHRv
dWNoTW9ja0FjdGlvbiA9IHRvb2xzTWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgbXVsdGl0b3VjaCBt
b2NraW5nIiwgdGhpcywgU0xPVChzZXRUb3VjaE1vY2tpbmcoYm9vbCkpKTsKLSAgICB0b3VjaE1v
Y2tBY3Rpb24tPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICB0b3VjaE1vY2tBY3Rpb24tPnNldFNo
b3J0Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpBTFQgfCBRdDo6S2V5X1QpKTsKLSNl
bmRpZgotCi0gICAgUVdlYlNldHRpbmdzKiBzZXR0aW5ncyA9IHBhZ2UoKS0+c2V0dGluZ3MoKTsK
LQotICAgIFFNZW51KiBncmFwaGljc1ZpZXdNZW51ID0gdG9vbHNNZW51LT5hZGRNZW51KCJRR3Jh
cGhpY3NWaWV3Iik7Ci0gICAgUUFjdGlvbiogdG9nZ2xlR3JhcGhpY3NWaWV3ID0gZ3JhcGhpY3NW
aWV3TWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgdXNlIG9mIFFHcmFwaGljc1ZpZXciLCB0aGlzLCBT
TE9UKGluaXRpYWxpemVWaWV3KGJvb2wpKSk7Ci0gICAgdG9nZ2xlR3JhcGhpY3NWaWV3LT5zZXRD
aGVja2FibGUodHJ1ZSk7Ci0gICAgdG9nZ2xlR3JhcGhpY3NWaWV3LT5zZXRDaGVja2VkKGlzR3Jh
cGhpY3NCYXNlZCgpKTsKLQotICAgIFFBY3Rpb24qIHRvZ2dsZVdlYkdMID0gdG9vbHNNZW51LT5h
ZGRBY3Rpb24oIlRvZ2dsZSBXZWJHTCIsIHRoaXMsIFNMT1QodG9nZ2xlV2ViR0woYm9vbCkpKTsK
LSAgICB0b2dnbGVXZWJHTC0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIHRvZ2dsZVdlYkdMLT5z
ZXRDaGVja2VkKHNldHRpbmdzLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6V2ViR0xFbmFi
bGVkKSk7Ci0KLSAgICBRQWN0aW9uKiB0b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nID0gZ3Jh
cGhpY3NWaWV3TWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgQWNjZWxlcmF0ZWQgQ29tcG9zaXRpbmci
LCB0aGlzLCBTTE9UKHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmcoYm9vbCkpKTsKLSAgICB0
b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nLT5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgdG9n
Z2xlQWNjZWxlcmF0ZWRDb21wb3NpdGluZy0+c2V0Q2hlY2tlZChzZXR0aW5ncy0+dGVzdEF0dHJp
YnV0ZShRV2ViU2V0dGluZ3M6OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkKSk7Ci0gICAg
dG9nZ2xlQWNjZWxlcmF0ZWRDb21wb3NpdGluZy0+c2V0RW5hYmxlZChpc0dyYXBoaWNzQmFzZWQo
KSk7Ci0gICAgdG9nZ2xlQWNjZWxlcmF0ZWRDb21wb3NpdGluZy0+Y29ubmVjdCh0b2dnbGVHcmFw
aGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7
Ci0KLSAgICBRQWN0aW9uKiB0b2dnbGVSZXNpemVzVG9Db250ZW50cyA9IGdyYXBoaWNzVmlld01l
bnUtPmFkZEFjdGlvbigiVG9nZ2xlIFJlc2l6ZXMgVG8gQ29udGVudHMgTW9kZSIsIHRoaXMsIFNM
T1QodG9nZ2xlUmVzaXplc1RvQ29udGVudHMoYm9vbCkpKTsKLSAgICB0b2dnbGVSZXNpemVzVG9D
b250ZW50cy0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIHRvZ2dsZVJlc2l6ZXNUb0NvbnRlbnRz
LT5zZXRDaGVja2VkKGZhbHNlKTsKLSAgICB0b2dnbGVSZXNpemVzVG9Db250ZW50cy0+c2V0RW5h
YmxlZChmYWxzZSk7Ci0gICAgdG9nZ2xlUmVzaXplc1RvQ29udGVudHMtPmNvbm5lY3QodG9nZ2xl
R3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0RW5hYmxlZChib29s
KSkpOwotCi0gICAgUUFjdGlvbiogdG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUgPSBncmFwaGljc1Zp
ZXdNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSBUaWxlZCBCYWNraW5nIFN0b3JlIiwgdGhpcywgU0xP
VCh0b2dnbGVUaWxlZEJhY2tpbmdTdG9yZShib29sKSkpOwotICAgIHRvZ2dsZVRpbGVkQmFja2lu
Z1N0b3JlLT5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgdG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUt
PnNldENoZWNrZWQoZmFsc2UpOwotICAgIHRvZ2dsZVRpbGVkQmFja2luZ1N0b3JlLT5zZXRFbmFi
bGVkKGZhbHNlKTsKLSAgICB0b2dnbGVUaWxlZEJhY2tpbmdTdG9yZS0+Y29ubmVjdCh0b2dnbGVH
cmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJvb2wp
KSk7Ci0KLSAgICBRQWN0aW9uKiBzcGF0aWFsTmF2aWdhdGlvbkFjdGlvbiA9IHRvb2xzTWVudS0+
YWRkQWN0aW9uKCJUb2dnbGUgU3BhdGlhbCBOYXZpZ2F0aW9uIiwgdGhpcywgU0xPVCh0b2dnbGVT
cGF0aWFsTmF2aWdhdGlvbihib29sKSkpOwotICAgIHNwYXRpYWxOYXZpZ2F0aW9uQWN0aW9uLT5z
ZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgc3BhdGlhbE5hdmlnYXRpb25BY3Rpb24tPnNldFNob3J0
Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpTSElGVCB8IFF0OjpLZXlfUykpOwotCi0g
ICAgUUFjdGlvbiogdG9nZ2xlRnJhbWVGbGF0dGVuaW5nID0gdG9vbHNNZW51LT5hZGRBY3Rpb24o
IlRvZ2dsZSBGcmFtZSBGbGF0dGVuaW5nIiwgdGhpcywgU0xPVCh0b2dnbGVGcmFtZUZsYXR0ZW5p
bmcoYm9vbCkpKTsKLSAgICB0b2dnbGVGcmFtZUZsYXR0ZW5pbmctPnNldENoZWNrYWJsZSh0cnVl
KTsKLSAgICB0b2dnbGVGcmFtZUZsYXR0ZW5pbmctPnNldENoZWNrZWQoc2V0dGluZ3MtPnRlc3RB
dHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKSk7Ci0KLSNpZiBk
ZWZpbmVkKFFUX0NPTkZJR1VSRURfV0lUSF9PUEVOR0wpCi0gICAgUUFjdGlvbiogdG9nZ2xlUUdM
V2lkZ2V0Vmlld3BvcnQgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSB1c2Ug
b2YgUUdMV2lkZ2V0IFZpZXdwb3J0IiwgdGhpcywgU0xPVCh0b2dnbGVRR0xXaWRnZXRWaWV3cG9y
dChib29sKSkpOwotICAgIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0LT5zZXRDaGVja2FibGUodHJ1
ZSk7Ci0gICAgdG9nZ2xlUUdMV2lkZ2V0Vmlld3BvcnQtPnNldENoZWNrZWQoZ1VzZVFHTFdpZGdl
dFZpZXdwb3J0KTsKLSAgICB0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydC0+c2V0RW5hYmxlZChpc0dy
YXBoaWNzQmFzZWQoKSk7Ci0gICAgdG9nZ2xlUUdMV2lkZ2V0Vmlld3BvcnQtPmNvbm5lY3QodG9n
Z2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0RW5hYmxlZChi
b29sKSkpOwotI2VuZGlmCi0KLSAgICBRQWN0aW9uKiB1c2VyQWdlbnRBY3Rpb24gPSB0b29sc01l
bnUtPmFkZEFjdGlvbigiQ2hhbmdlIFVzZXIgQWdlbnQiLCB0aGlzLCBTTE9UKHNob3dVc2VyQWdl
bnREaWFsb2coKSkpOwotICAgIHVzZXJBZ2VudEFjdGlvbi0+c2V0U2hvcnRjdXQoUUtleVNlcXVl
bmNlKFF0OjpDVFJMIHwgUXQ6OlNISUZUIHwgUXQ6OktleV9VKSk7Ci0KLSAgICBncmFwaGljc1Zp
ZXdNZW51LT5hZGRTZXBhcmF0b3IoKTsKLQotICAgIG1fZmxpcEFuaW1hdGVkID0gZ3JhcGhpY3NW
aWV3TWVudS0+YWRkQWN0aW9uKCJBbmltYXRlZCBGbGlwIik7Ci0gICAgbV9mbGlwQW5pbWF0ZWQt
PmNvbm5lY3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qo
c2V0RW5hYmxlZChib29sKSkpOwotICAgIG1fZmxpcEFuaW1hdGVkLT5zZXRFbmFibGVkKGlzR3Jh
cGhpY3NCYXNlZCgpKTsKLQotICAgIG1fZmxpcFlBbmltYXRlZCA9IGdyYXBoaWNzVmlld01lbnUt
PmFkZEFjdGlvbigiQW5pbWF0ZWQgWS1GbGlwIik7Ci0gICAgbV9mbGlwWUFuaW1hdGVkLT5jb25u
ZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldEVu
YWJsZWQoYm9vbCkpKTsKLSAgICBtX2ZsaXBZQW5pbWF0ZWQtPnNldEVuYWJsZWQoaXNHcmFwaGlj
c0Jhc2VkKCkpOwotCi0gICAgaWYgKGlzR3JhcGhpY3NCYXNlZCgpKSB7Ci0gICAgICAgIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkKiB2aWV3ID0gc3RhdGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFzZWQq
PihtX3ZpZXcpOwotICAgICAgICBjb25uZWN0KG1fZmxpcEFuaW1hdGVkLCBTSUdOQUwodHJpZ2dl
cmVkKCkpLCB2aWV3LCBTTE9UKGFuaW1hdGVkRmxpcCgpKSk7Ci0gICAgICAgIGNvbm5lY3QobV9m
bGlwWUFuaW1hdGVkLCBTSUdOQUwodHJpZ2dlcmVkKCkpLCB2aWV3LCBTTE9UKGFuaW1hdGVkWUZs
aXAoKSkpOwotICAgIH0KLQotICAgIGdyYXBoaWNzVmlld01lbnUtPmFkZFNlcGFyYXRvcigpOwot
Ci0gICAgUUFjdGlvbiogY2xvbmVXaW5kb3cgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24o
IkNsb25lIFdpbmRvdyIsIHRoaXMsIFNMT1QoY2xvbmVXaW5kb3coKSkpOwotICAgIGNsb25lV2lu
ZG93LT5jb25uZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBT
TE9UKHNldEVuYWJsZWQoYm9vbCkpKTsKLSAgICBjbG9uZVdpbmRvdy0+c2V0RW5hYmxlZChpc0dy
YXBoaWNzQmFzZWQoKSk7Ci0KLSAgICBRQWN0aW9uKiBzaG93RlBTID0gZ3JhcGhpY3NWaWV3TWVu
dS0+YWRkQWN0aW9uKCJTaG93IEZQUyIsIHRoaXMsIFNMT1Qoc2hvd0ZQUyhib29sKSkpOwotICAg
IHNob3dGUFMtPnNldENoZWNrYWJsZSh0cnVlKTsKLSAgICBzaG93RlBTLT5zZXRFbmFibGVkKGlz
R3JhcGhpY3NCYXNlZCgpKTsKLSAgICBzaG93RlBTLT5jb25uZWN0KHRvZ2dsZUdyYXBoaWNzVmll
dywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldEVuYWJsZWQoYm9vbCkpKTsKLSAgICBz
aG93RlBTLT5zZXRDaGVja2VkKGdTaG93RnJhbWVSYXRlKTsKLQotICAgIFFNZW51KiB2aWV3cG9y
dFVwZGF0ZU1lbnUgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRNZW51KCJDaGFuZ2UgVmlld3BvcnQg
VXBkYXRlIE1vZGUiKTsKLSAgICB2aWV3cG9ydFVwZGF0ZU1lbnUtPnNldEVuYWJsZWQoaXNHcmFw
aGljc0Jhc2VkKCkpOwotICAgIHZpZXdwb3J0VXBkYXRlTWVudS0+Y29ubmVjdCh0b2dnbGVHcmFw
aGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7
Ci0KLSAgICBRQWN0aW9uKiBmdWxsVXBkYXRlID0gdmlld3BvcnRVcGRhdGVNZW51LT5hZGRBY3Rp
b24oIkZ1bGxWaWV3cG9ydFVwZGF0ZSIpOwotICAgIGZ1bGxVcGRhdGUtPnNldENoZWNrYWJsZSh0
cnVlKTsKLSAgICBmdWxsVXBkYXRlLT5zZXRDaGVja2VkKChnVmlld3BvcnRVcGRhdGVNb2RlID09
IFFHcmFwaGljc1ZpZXc6OkZ1bGxWaWV3cG9ydFVwZGF0ZSkgPyB0cnVlIDogZmFsc2UpOwotCi0g
ICAgUUFjdGlvbiogbWluaW1hbFVwZGF0ZSA9IHZpZXdwb3J0VXBkYXRlTWVudS0+YWRkQWN0aW9u
KCJNaW5pbWFsVmlld3BvcnRVcGRhdGUiKTsKLSAgICBtaW5pbWFsVXBkYXRlLT5zZXRDaGVja2Fi
bGUodHJ1ZSk7Ci0gICAgbWluaW1hbFVwZGF0ZS0+c2V0Q2hlY2tlZCgoZ1ZpZXdwb3J0VXBkYXRl
TW9kZSA9PSBRR3JhcGhpY3NWaWV3OjpNaW5pbWFsVmlld3BvcnRVcGRhdGUpID8gdHJ1ZSA6IGZh
bHNlKTsKLQotICAgIFFBY3Rpb24qIHNtYXJ0VXBkYXRlID0gdmlld3BvcnRVcGRhdGVNZW51LT5h
ZGRBY3Rpb24oIlNtYXJ0Vmlld3BvcnRVcGRhdGUiKTsKLSAgICBzbWFydFVwZGF0ZS0+c2V0Q2hl
Y2thYmxlKHRydWUpOwotICAgIHNtYXJ0VXBkYXRlLT5zZXRDaGVja2VkKChnVmlld3BvcnRVcGRh
dGVNb2RlID09IFFHcmFwaGljc1ZpZXc6OlNtYXJ0Vmlld3BvcnRVcGRhdGUpID8gdHJ1ZSA6IGZh
bHNlKTsKLQotICAgIFFBY3Rpb24qIGJvdW5kaW5nUmVjdFVwZGF0ZSA9IHZpZXdwb3J0VXBkYXRl
TWVudS0+YWRkQWN0aW9uKCJCb3VuZGluZ1JlY3RWaWV3cG9ydFVwZGF0ZSIpOwotICAgIGJvdW5k
aW5nUmVjdFVwZGF0ZS0+c2V0Q2hlY2thYmxlKHRydWUpOwotICAgIGJvdW5kaW5nUmVjdFVwZGF0
ZS0+c2V0Q2hlY2tlZCgoZ1ZpZXdwb3J0VXBkYXRlTW9kZSA9PSBRR3JhcGhpY3NWaWV3OjpCb3Vu
ZGluZ1JlY3RWaWV3cG9ydFVwZGF0ZSkgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgUUFjdGlvbiog
bm9VcGRhdGUgPSB2aWV3cG9ydFVwZGF0ZU1lbnUtPmFkZEFjdGlvbigiTm9WaWV3cG9ydFVwZGF0
ZSIpOwotICAgIG5vVXBkYXRlLT5zZXRDaGVja2FibGUodHJ1ZSk7Ci0gICAgbm9VcGRhdGUtPnNl
dENoZWNrZWQoKGdWaWV3cG9ydFVwZGF0ZU1vZGUgPT0gUUdyYXBoaWNzVmlldzo6Tm9WaWV3cG9y
dFVwZGF0ZSkgPyB0cnVlIDogZmFsc2UpOwotCi0gICAgUVNpZ25hbE1hcHBlciogc2lnbmFsTWFw
cGVyID0gbmV3IFFTaWduYWxNYXBwZXIodmlld3BvcnRVcGRhdGVNZW51KTsKLSAgICBzaWduYWxN
YXBwZXItPnNldE1hcHBpbmcoZnVsbFVwZGF0ZSwgUUdyYXBoaWNzVmlldzo6RnVsbFZpZXdwb3J0
VXBkYXRlKTsKLSAgICBzaWduYWxNYXBwZXItPnNldE1hcHBpbmcobWluaW1hbFVwZGF0ZSwgUUdy
YXBoaWNzVmlldzo6TWluaW1hbFZpZXdwb3J0VXBkYXRlKTsKLSAgICBzaWduYWxNYXBwZXItPnNl
dE1hcHBpbmcoc21hcnRVcGRhdGUsIFFHcmFwaGljc1ZpZXc6OlNtYXJ0Vmlld3BvcnRVcGRhdGUp
OwotICAgIHNpZ25hbE1hcHBlci0+c2V0TWFwcGluZyhib3VuZGluZ1JlY3RVcGRhdGUsIFFHcmFw
aGljc1ZpZXc6OkJvdW5kaW5nUmVjdFZpZXdwb3J0VXBkYXRlKTsKLSAgICBzaWduYWxNYXBwZXIt
PnNldE1hcHBpbmcobm9VcGRhdGUsIFFHcmFwaGljc1ZpZXc6Ok5vVmlld3BvcnRVcGRhdGUpOwot
Ci0gICAgY29ubmVjdChmdWxsVXBkYXRlLCBTSUdOQUwodHJpZ2dlcmVkKCkpLCBzaWduYWxNYXBw
ZXIsIFNMT1QobWFwKCkpKTsKLSAgICBjb25uZWN0KG1pbmltYWxVcGRhdGUsIFNJR05BTCh0cmln
Z2VyZWQoKSksIHNpZ25hbE1hcHBlciwgU0xPVChtYXAoKSkpOwotICAgIGNvbm5lY3Qoc21hcnRV
cGRhdGUsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHNpZ25hbE1hcHBlciwgU0xPVChtYXAoKSkpOwot
ICAgIGNvbm5lY3QoYm91bmRpbmdSZWN0VXBkYXRlLCBTSUdOQUwodHJpZ2dlcmVkKCkpLCBzaWdu
YWxNYXBwZXIsIFNMT1QobWFwKCkpKTsKLSAgICBjb25uZWN0KG5vVXBkYXRlLCBTSUdOQUwodHJp
Z2dlcmVkKCkpLCBzaWduYWxNYXBwZXIsIFNMT1QobWFwKCkpKTsKLQotICAgIGNvbm5lY3Qoc2ln
bmFsTWFwcGVyLCBTSUdOQUwobWFwcGVkKGludCkpLCB0aGlzLCBTTE9UKGNoYW5nZVZpZXdwb3J0
VXBkYXRlTW9kZShpbnQpKSk7Ci0KLSAgICBRQWN0aW9uR3JvdXAqIHZpZXdwb3J0VXBkYXRlTW9k
ZUFjdGlvbnMgPSBuZXcgUUFjdGlvbkdyb3VwKHZpZXdwb3J0VXBkYXRlTWVudSk7Ci0gICAgdmll
d3BvcnRVcGRhdGVNb2RlQWN0aW9ucy0+YWRkQWN0aW9uKGZ1bGxVcGRhdGUpOwotICAgIHZpZXdw
b3J0VXBkYXRlTW9kZUFjdGlvbnMtPmFkZEFjdGlvbihtaW5pbWFsVXBkYXRlKTsKLSAgICB2aWV3
cG9ydFVwZGF0ZU1vZGVBY3Rpb25zLT5hZGRBY3Rpb24oc21hcnRVcGRhdGUpOwotICAgIHZpZXdw
b3J0VXBkYXRlTW9kZUFjdGlvbnMtPmFkZEFjdGlvbihib3VuZGluZ1JlY3RVcGRhdGUpOwotICAg
IHZpZXdwb3J0VXBkYXRlTW9kZUFjdGlvbnMtPmFkZEFjdGlvbihub1VwZGF0ZSk7Ci19Ci0KLVFX
ZWJQYWdlKiBXZWJQYWdlOjpjcmVhdGVXaW5kb3coUVdlYlBhZ2U6OldlYldpbmRvd1R5cGUgdHlw
ZSkKLXsKLSAgICBMYXVuY2hlcldpbmRvdyogbXcgPSBuZXcgTGF1bmNoZXJXaW5kb3c7Ci0gICAg
aWYgKHR5cGUgPT0gV2ViTW9kYWxEaWFsb2cpCi0gICAgICAgIG13LT5zZXRXaW5kb3dNb2RhbGl0
eShRdDo6QXBwbGljYXRpb25Nb2RhbCk7Ci0gICAgbXctPnNob3coKTsKLSAgICByZXR1cm4gbXct
PnBhZ2UoKTsKLX0KLQotUU9iamVjdCogV2ViUGFnZTo6Y3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJp
bmcgJmNsYXNzSWQsIGNvbnN0IFFVcmwmLCBjb25zdCBRU3RyaW5nTGlzdCYsIGNvbnN0IFFTdHJp
bmdMaXN0JikKLXsKLSAgICBpZiAoY2xhc3NJZCA9PSAiYWxpZW5fUUxhYmVsIikgewotICAgICAg
ICBRTGFiZWwqIGwgPSBuZXcgUUxhYmVsOwotICAgICAgICBsLT53aW5JZCgpOwotICAgICAgICBy
ZXR1cm4gbDsKLSAgICB9Ci0KLSNpZm5kZWYgUVRfTk9fVUlUT09MUwotICAgIFFVaUxvYWRlciBs
b2FkZXI7Ci0gICAgcmV0dXJuIGxvYWRlci5jcmVhdGVXaWRnZXQoY2xhc3NJZCwgdmlldygpKTsK
LSNlbHNlCi0gICAgUV9VTlVTRUQoY2xhc3NJZCk7Ci0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0K
LQotCi1pbnQgbGF1bmNoZXJNYWluKGNvbnN0IFFBcHBsaWNhdGlvbiYgYXBwKQotewotI2lmbmRl
ZiBOREVCVUcKLSAgICBpbnQgcmV0VmFsID0gYXBwLmV4ZWMoKTsKLSAgICBEdW1wUmVuZGVyVHJl
ZVN1cHBvcnRRdDo6Z2FyYmFnZUNvbGxlY3RvckNvbGxlY3QoKTsKLSAgICBRV2ViU2V0dGluZ3M6
OmNsZWFyTWVtb3J5Q2FjaGVzKCk7Ci0gICAgcmV0dXJuIHJldFZhbDsKLSNlbHNlCi0gICAgcmV0
dXJuIGFwcC5leGVjKCk7Ci0jZW5kaWYKLX0KLQotY2xhc3MgTGF1bmNoZXJBcHBsaWNhdGlvbiA6
IHB1YmxpYyBRQXBwbGljYXRpb24gewotICAgIFFfT0JKRUNUCi0KLXB1YmxpYzoKLSAgICBMYXVu
Y2hlckFwcGxpY2F0aW9uKGludCYgYXJnYywgY2hhcioqIGFyZ3YpOwotICAgIFFTdHJpbmdMaXN0
IHVybHMoKSBjb25zdCB7IHJldHVybiBtX3VybHM7IH0KLSAgICBib29sIGlzUm9ib3RpemVkKCkg
Y29uc3QgeyByZXR1cm4gbV9pc1JvYm90aXplZDsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgaGFu
ZGxlVXNlck9wdGlvbnMoKTsKLSAgICB2b2lkIGFwcGx5RGVmYXVsdFNldHRpbmdzKCk7Ci0KLXBy
aXZhdGU6Ci0gICAgYm9vbCBtX2lzUm9ib3RpemVkOwotICAgIFFTdHJpbmdMaXN0IG1fdXJsczsK
LX07Ci0KLXZvaWQgTGF1bmNoZXJBcHBsaWNhdGlvbjo6YXBwbHlEZWZhdWx0U2V0dGluZ3MoKQot
ewotICAgIFFXZWJTZXR0aW5nczo6c2V0TWF4aW11bVBhZ2VzSW5DYWNoZSg0KTsKLQotICAgIFFX
ZWJTZXR0aW5nczo6c2V0T2JqZWN0Q2FjaGVDYXBhY2l0aWVzKCgxNioxMDI0KjEwMjQpIC8gOCwg
KDE2KjEwMjQqMTAyNCkgLyA4LCAxNioxMDI0KjEwMjQpOwotCi0gICAgUVdlYlNldHRpbmdzOjpn
bG9iYWxTZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpQbHVnaW5zRW5hYmxl
ZCwgdHJ1ZSk7Ci0gICAgUVdlYlNldHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpLT5zZXRBdHRyaWJ1
dGUoUVdlYlNldHRpbmdzOjpEZXZlbG9wZXJFeHRyYXNFbmFibGVkLCB0cnVlKTsKLSAgICBRV2Vi
U2V0dGluZ3M6OmVuYWJsZVBlcnNpc3RlbnRTdG9yYWdlKCk7Ci19Ci0KLUxhdW5jaGVyQXBwbGlj
YXRpb246OkxhdW5jaGVyQXBwbGljYXRpb24oaW50JiBhcmdjLCBjaGFyKiogYXJndikKLSAgICA6
IFFBcHBsaWNhdGlvbihhcmdjLCBhcmd2LCBRQXBwbGljYXRpb246Okd1aVNlcnZlcikKLSAgICAs
IG1faXNSb2JvdGl6ZWQoZmFsc2UpCi17Ci0gICAgLy8gVG8gYWxsb3cgUVdlYkluc3BlY3Rvcidz
IGNvbmZpZ3VyYXRpb24gcGVyc2lzdGVuY2UKLSAgICBzZXRPcmdhbml6YXRpb25OYW1lKCJOb2tp
YSIpOwotICAgIHNldEFwcGxpY2F0aW9uTmFtZSgiUXRMYXVuY2hlciIpOwotICAgIHNldEFwcGxp
Y2F0aW9uVmVyc2lvbigiMC4xIik7Ci0KLSAgICBhcHBseURlZmF1bHRTZXR0aW5ncygpOwotCi0g
ICAgaGFuZGxlVXNlck9wdGlvbnMoKTsKLX0KLQotc3RhdGljIHZvaWQgcmVxdWlyZXNHcmFwaGlj
c1ZpZXcoY29uc3QgUVN0cmluZyYgb3B0aW9uKQotewotICAgIGlmIChnVXNlR3JhcGhpY3NWaWV3
KQotICAgICAgICByZXR1cm47Ci0gICAgYXBwUXVpdCgxLCBRU3RyaW5nKCIlMSBvbmx5IHdvcmtz
IGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIC1ncmFwaGljc2Jhc2VkIG9wdGlvbiIpLmFyZyhvcHRp
b24pKTsKLX0KLQotdm9pZCBMYXVuY2hlckFwcGxpY2F0aW9uOjpoYW5kbGVVc2VyT3B0aW9ucygp
Ci17Ci0gICAgUVN0cmluZ0xpc3QgYXJncyA9IGFyZ3VtZW50cygpOwotICAgIFFGaWxlSW5mbyBw
cm9ncmFtKGFyZ3MuYXQoMCkpOwotICAgIFFTdHJpbmcgcHJvZ3JhbU5hbWUoIlF0TGF1bmNoZXIi
KTsKLSAgICBpZiAocHJvZ3JhbS5leGlzdHMoKSkKLSAgICAgICAgcHJvZ3JhbU5hbWUgPSBwcm9n
cmFtLmJhc2VOYW1lKCk7Ci0KLSAgICBRTGlzdDxRU3RyaW5nPiB1cGRhdGVNb2RlcyhlbnVtVG9L
ZXlzKFFHcmFwaGljc1ZpZXc6OnN0YXRpY01ldGFPYmplY3QsCi0gICAgICAgICAgICAiVmlld3Bv
cnRVcGRhdGVNb2RlIiwgIlZpZXdwb3J0VXBkYXRlIikpOwotCi0gICAgaWYgKGFyZ3MuY29udGFp
bnMoIi1oZWxwIikpIHsKLSAgICAgICAgcURlYnVnKCkgPDwgIlVzYWdlOiIgPDwgcHJvZ3JhbU5h
bWUudG9MYXRpbjEoKS5kYXRhKCkKLSAgICAgICAgICAgICA8PCAiWy1ncmFwaGljc2Jhc2VkXSIK
LSAgICAgICAgICAgICA8PCAiWy1uby1jb21wb3NpdGluZ10iCi0gICAgICAgICAgICAgPDwgUVN0
cmluZygiWy12aWV3cG9ydC11cGRhdGUtbW9kZSAlMV0iKS5hcmcoZm9ybWF0S2V5cyh1cGRhdGVN
b2RlcykpLnRvTGF0aW4xKCkuZGF0YSgpCi0gICAgICAgICAgICAgPDwgIlstY2FjaGUtd2Vidmll
d10iCi0gICAgICAgICAgICAgPDwgIlstc2hvdy1mcHNdIgotICAgICAgICAgICAgIDw8ICJbLXIg
bGlzdF0iCi0gICAgICAgICAgICAgPDwgIlstaW5zcGVjdG9yLXVybCBsb2NhdGlvbl0iCi0gICAg
ICAgICAgICAgPDwgIlstdGlsZWQtYmFja2luZy1zdG9yZV0iCi0gICAgICAgICAgICAgPDwgIlst
cmVzaXplcy10by1jb250ZW50c10iCi0gICAgICAgICAgICAgPDwgIlVSTHMiOwotICAgICAgICBh
cHBRdWl0KDApOwotICAgIH0KLQotICAgIGlmIChhcmdzLmNvbnRhaW5zKCItZ3JhcGhpY3NiYXNl
ZCIpKQotICAgICAgICBnVXNlR3JhcGhpY3NWaWV3ID0gdHJ1ZTsKLQotICAgIGlmIChhcmdzLmNv
bnRhaW5zKCItbm8tY29tcG9zaXRpbmciKSkgewotICAgICAgICByZXF1aXJlc0dyYXBoaWNzVmll
dygiLW5vLWNvbXBvc2l0aW5nIik7Ci0gICAgICAgIGdVc2VDb21wb3NpdGluZyA9IGZhbHNlOwot
ICAgIH0KLQotICAgIGlmIChhcmdzLmNvbnRhaW5zKCItc2hvdy1mcHMiKSkgewotICAgICAgICBy
ZXF1aXJlc0dyYXBoaWNzVmlldygiLXNob3ctZnBzIik7Ci0gICAgICAgIGdTaG93RnJhbWVSYXRl
ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoYXJncy5jb250YWlucygiLWNhY2hlLXdlYnZpZXci
KSkgewotICAgICAgICByZXF1aXJlc0dyYXBoaWNzVmlldygiLWNhY2hlLXdlYnZpZXciKTsKLSAg
ICAgICAgZ0NhY2hlV2ViVmlldyA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGFyZ3MuY29udGFp
bnMoIi10aWxlZC1iYWNraW5nLXN0b3JlIikpIHsKLSAgICAgICAgcmVxdWlyZXNHcmFwaGljc1Zp
ZXcoIi10aWxlZC1iYWNraW5nLXN0b3JlIik7Ci0gICAgICAgIGdVc2VUaWxlZEJhY2tpbmdTdG9y
ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGFyZ3MuY29udGFpbnMoIi1yZXNpemVzLXRvLWNv
bnRlbnRzIikpIHsKLSAgICAgICAgcmVxdWlyZXNHcmFwaGljc1ZpZXcoIi1yZXNpemVzLXRvLWNv
bnRlbnRzIik7Ci0gICAgICAgIGdSZXNpemVzVG9Db250ZW50cyA9IHRydWU7Ci0gICAgfQotCi0g
ICAgUVN0cmluZyBhcmcxKCItdmlld3BvcnQtdXBkYXRlLW1vZGUiKTsKLSAgICBpbnQgbW9kZUlu
ZGV4ID0gYXJncy5pbmRleE9mKGFyZzEpOwotICAgIGlmIChtb2RlSW5kZXggIT0gLTEpIHsKLSAg
ICAgICAgcmVxdWlyZXNHcmFwaGljc1ZpZXcoYXJnMSk7Ci0KLSAgICAgICAgUVN0cmluZyBtb2Rl
ID0gdGFrZU9wdGlvblZhbHVlKCZhcmdzLCBtb2RlSW5kZXgpOwotICAgICAgICBpZiAobW9kZS5p
c0VtcHR5KCkpCi0gICAgICAgICAgICBhcHBRdWl0KDEsIFFTdHJpbmcoIiUxIG5lZWRzIGEgdmFs
dWUgb2Ygb25lIG9mIFslMl0iKS5hcmcoYXJnMSkuYXJnKGZvcm1hdEtleXModXBkYXRlTW9kZXMp
KSk7Ci0gICAgICAgIGludCBpZHggPSB1cGRhdGVNb2Rlcy5pbmRleE9mKG1vZGUpOwotICAgICAg
ICBpZiAoaWR4ID09IC0xKQotICAgICAgICAgICAgYXBwUXVpdCgxLCBRU3RyaW5nKCIlMSB2YWx1
ZSBoYXMgdG8gYmUgb25lIG9mIFslMl0iKS5hcmcoYXJnMSkuYXJnKGZvcm1hdEtleXModXBkYXRl
TW9kZXMpKSk7Ci0KLSAgICAgICAgZ1ZpZXdwb3J0VXBkYXRlTW9kZSA9IHN0YXRpY19jYXN0PFFH
cmFwaGljc1ZpZXc6OlZpZXdwb3J0VXBkYXRlTW9kZT4oaWR4KTsKLSAgICB9Ci0KLSAgICBRU3Ry
aW5nIGluc3BlY3RvclVybEFyZygiLWluc3BlY3Rvci11cmwiKTsKLSAgICBpbnQgaW5zcGVjdG9y
VXJsSW5kZXggPSBhcmdzLmluZGV4T2YoaW5zcGVjdG9yVXJsQXJnKTsKLSAgICBpZiAoaW5zcGVj
dG9yVXJsSW5kZXggIT0gLTEpCi0gICAgICAgZ0luc3BlY3RvclVybCA9IHRha2VPcHRpb25WYWx1
ZSgmYXJncywgaW5zcGVjdG9yVXJsSW5kZXgpOwotCi0gICAgaW50IHJvYm90SW5kZXggPSBhcmdz
LmluZGV4T2YoIi1yIik7Ci0gICAgaWYgKHJvYm90SW5kZXggIT0gLTEpIHsKLSAgICAgICAgUVN0
cmluZyBsaXN0RmlsZSA9IHRha2VPcHRpb25WYWx1ZSgmYXJncywgcm9ib3RJbmRleCk7Ci0gICAg
ICAgIGlmIChsaXN0RmlsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICBhcHBRdWl0KDEsICItciBu
ZWVkcyBhIGxpc3QgZmlsZSB0byBzdGFydCBpbiByb2JvdGl6ZWQgbW9kZSIpOwotICAgICAgICBp
ZiAoIVFGaWxlOjpleGlzdHMobGlzdEZpbGUpKQotICAgICAgICAgICAgYXBwUXVpdCgxLCAiVGhl
IGxpc3QgZmlsZSBzdXBwbGllZCB0byAtciBkb2VzIG5vdCBleGlzdC4iKTsKLQotICAgICAgICBt
X2lzUm9ib3RpemVkID0gdHJ1ZTsKLSAgICAgICAgbV91cmxzID0gUVN0cmluZ0xpc3QobGlzdEZp
bGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50IGxhc3RBcmcgPSBhcmdzLmxh
c3RJbmRleE9mKFFSZWdFeHAoIl4tLioiKSk7Ci0gICAgbV91cmxzID0gKGxhc3RBcmcgIT0gLTEp
ID8gYXJncy5taWQoKytsYXN0QXJnKSA6IGFyZ3MubWlkKDEpOwotfQotCi0KLWludCBtYWluKGlu
dCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBMYXVuY2hlckFwcGxpY2F0aW9uIGFwcChhcmdj
LCBhcmd2KTsKLQotICAgIGlmIChhcHAuaXNSb2JvdGl6ZWQoKSkgewotICAgICAgICBMYXVuY2hl
cldpbmRvdyogd2luZG93ID0gbmV3IExhdW5jaGVyV2luZG93KCk7Ci0gICAgICAgIFVybExvYWRl
ciBsb2FkZXIod2luZG93LT5wYWdlKCktPm1haW5GcmFtZSgpLCBhcHAudXJscygpLmF0KDApKTsK
LSAgICAgICAgUU9iamVjdDo6Y29ubmVjdCh3aW5kb3ctPnBhZ2UoKS0+bWFpbkZyYW1lKCksIFNJ
R05BTChsb2FkRmluaXNoZWQoYm9vbCkpLCAmbG9hZGVyLCBTTE9UKGxvYWROZXh0KCkpKTsKLSAg
ICAgICAgbG9hZGVyLmxvYWROZXh0KCk7Ci0gICAgICAgIHdpbmRvdy0+c2hvdygpOwotICAgICAg
ICByZXR1cm4gbGF1bmNoZXJNYWluKGFwcCk7Ci0gICAgfQotCi0gICAgUVN0cmluZ0xpc3QgdXJs
cyA9IGFwcC51cmxzKCk7Ci0KLSAgICBpZiAodXJscy5pc0VtcHR5KCkpIHsKLSAgICAgICAgUVN0
cmluZyBkZWZhdWx0VXJsID0gUVN0cmluZygiZmlsZTovLyUxLyUyIikuYXJnKFFEaXI6OmhvbWVQ
YXRoKCkpLmFyZyhRTGF0aW4xU3RyaW5nKCJpbmRleC5odG1sIikpOwotICAgICAgICBpZiAoUURp
cihkZWZhdWx0VXJsKS5leGlzdHMoKSkKLSAgICAgICAgICAgIHVybHMuYXBwZW5kKGRlZmF1bHRV
cmwpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB1cmxzLmFwcGVuZCgiIik7Ci0gICAgfQot
Ci0gICAgTGF1bmNoZXJXaW5kb3cqIHdpbmRvdyA9IDA7Ci0gICAgZm9yZWFjaCAoUVN0cmluZyB1
cmwsIHVybHMpIHsKLSAgICAgICAgaWYgKCF3aW5kb3cpCi0gICAgICAgICAgICB3aW5kb3cgPSBu
ZXcgTGF1bmNoZXJXaW5kb3coKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd2luZG93LT5u
ZXdXaW5kb3coKTsKLQotICAgICAgICB3aW5kb3ctPmxvYWQodXJsKTsKLSAgICB9Ci0KLSAgICB3
aW5kb3ctPnNob3coKTsKLSAgICByZXR1cm4gbGF1bmNoZXJNYWluKGFwcCk7Ci19Ci0KLSNpbmNs
dWRlICJtYWluLm1vYyIKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFpbndpbmRvdy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9tYWlud2luZG93LmNwcAko
cmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL21haW53aW5kb3cuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAy
MDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29w
eXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5p
bj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3Jn
PgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3JnPgot
ICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KLSAqIENvcHly
aWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KLSAqCi0gKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBh
cmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJtYWlud2luZG93LmgiCi0KLSNp
bmNsdWRlICJsb2NhdGlvbmVkaXQuaCIKLSNpbmNsdWRlICJ1dGlscy5oIgotCi1NYWluV2luZG93
OjpNYWluV2luZG93KGNvbnN0IFFTdHJpbmcmIHVybCkKLSAgICA6IG1fcGFnZShuZXcgV2ViUGFn
ZSh0aGlzKSkKLXsKLSAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOwotICAg
IGlmIChxZ2V0ZW52KCJRVExBVU5DSEVSX1VTRV9BUkdCX1ZJU1VBTFMiKS50b0ludCgpID09IDEp
Ci0gICAgICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfVHJhbnNsdWNlbnRCYWNrZ3JvdW5kKTsKLQot
ICAgIGJ1aWxkVUkoKTsKLX0KLQotdm9pZCBNYWluV2luZG93OjpidWlsZFVJKCkKLXsKLSAgICBR
VG9vbEJhciogYmFyID0gYWRkVG9vbEJhcigiTmF2aWdhdGlvbiIpOwotI2lmIGRlZmluZWQoUV9X
U19TNjApCi0gICAgYmFyLT5zZXRJY29uU2l6ZShRU2l6ZSgxNiwgMTYpKTsKLSNlbmRpZgotICAg
IGJhci0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpCYWNrKSk7Ci0gICAgYmFy
LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OkZvcndhcmQpKTsKLSAgICBiYXIt
PmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKSk7Ci0gICAgYmFyLT5h
ZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlN0b3ApKTsKLQotICAgIHVybEVkaXQg
PSBuZXcgTG9jYXRpb25FZGl0KHRoaXMpOwotICAgIHVybEVkaXQtPnNldFNpemVQb2xpY3koUVNp
emVQb2xpY3k6OkV4cGFuZGluZywgdXJsRWRpdC0+c2l6ZVBvbGljeSgpLnZlcnRpY2FsUG9saWN5
KCkpOwotICAgIGNvbm5lY3QodXJsRWRpdCwgU0lHTkFMKHJldHVyblByZXNzZWQoKSksIFNMT1Qo
Y2hhbmdlTG9jYXRpb24oKSkpOwotICAgIFFDb21wbGV0ZXIqIGNvbXBsZXRlciA9IG5ldyBRQ29t
cGxldGVyKHRoaXMpOwotICAgIHVybEVkaXQtPnNldENvbXBsZXRlcihjb21wbGV0ZXIpOwotICAg
IGNvbXBsZXRlci0+c2V0TW9kZWwoJnVybE1vZGVsKTsKLSNpZiBkZWZpbmVkKFFfV1NfUzYwKQot
ICAgIGFkZFRvb2xCYXJCcmVhaygpOwotICAgIGFkZFRvb2xCYXIoIkxvY2F0aW9uIiktPmFkZFdp
ZGdldCh1cmxFZGl0KTsKLSNlbHNlCi0gICAgYmFyLT5hZGRXaWRnZXQodXJsRWRpdCk7Ci0jZW5k
aWYKLQotICAgIGNvbm5lY3QocGFnZSgpLT5tYWluRnJhbWUoKSwgU0lHTkFMKHRpdGxlQ2hhbmdl
ZChjb25zdCBRU3RyaW5nJikpLAotICAgICAgICAgICAgdGhpcywgU0xPVChzZXRXaW5kb3dUaXRs
ZShjb25zdCBRU3RyaW5nJikpKTsKLSAgICBjb25uZWN0KHBhZ2UoKSwgU0lHTkFMKGxvYWRQcm9n
cmVzcyhpbnQpKSwgdXJsRWRpdCwgU0xPVChzZXRQcm9ncmVzcyhpbnQpKSk7Ci0gICAgY29ubmVj
dChwYWdlKCksIFNJR05BTCh3aW5kb3dDbG9zZVJlcXVlc3RlZCgpKSwgdGhpcywgU0xPVChjbG9z
ZSgpKSk7Ci0KLSAgICAvLyBzaG9ydC1jdXRzCi0gICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6
OkJhY2spLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OkJhY2spOwotICAgIHBhZ2UoKS0+YWN0
aW9uKFFXZWJQYWdlOjpTdG9wKS0+c2V0U2hvcnRjdXQoUXQ6OktleV9Fc2NhcGUpOwotICAgIHBh
Z2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJkKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNl
OjpGb3J3YXJkKTsKLSAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKS0+c2V0U2hv
cnRjdXQoUUtleVNlcXVlbmNlOjpSZWZyZXNoKTsKLSAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFn
ZTo6VW5kbyktPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZTo6VW5kbyk7Ci0gICAgcGFnZSgpLT5h
Y3Rpb24oUVdlYlBhZ2U6OlJlZG8pLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OlJlZG8pOwot
ICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpDdXQpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVu
Y2U6OkN1dCk7Ci0gICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OkNvcHkpLT5zZXRTaG9ydGN1
dChRS2V5U2VxdWVuY2U6OkNvcHkpOwotICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpQYXN0
ZSktPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZTo6UGFzdGUpOwotCi0gICAgcGFnZSgpLT5hY3Rp
b24oUVdlYlBhZ2U6OlRvZ2dsZUJvbGQpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNU
UkwgfCBRdDo6S2V5X0IpKTsKLSAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlSXRh
bGljKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9JKSk7Ci0g
ICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZVVuZGVybGluZSktPnNldFNob3J0Y3V0
KFFLZXlTZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpLZXlfVSkpOwotfQotCi1XZWJQYWdlKiBNYWlu
V2luZG93OjpwYWdlKCkKLXsKLSAgICByZXR1cm4gbV9wYWdlOwotfQotCi12b2lkIE1haW5XaW5k
b3c6OnNldEFkZHJlc3NVcmwoY29uc3QgUVN0cmluZyYgdXJsKQotewotICAgIHVybEVkaXQtPnNl
dFRleHQodXJsKTsKLX0KLQotdm9pZCBNYWluV2luZG93OjphZGRDb21wbGV0ZXJFbnRyeShjb25z
dCBRVXJsJiB1cmwpCi17Ci0gICAgUVVybDo6Rm9ybWF0dGluZ09wdGlvbnMgb3B0czsKLSAgICBv
cHRzIHw9IFFVcmw6OlJlbW92ZVNjaGVtZTsKLSAgICBvcHRzIHw9IFFVcmw6OlJlbW92ZVVzZXJJ
bmZvOwotICAgIG9wdHMgfD0gUVVybDo6U3RyaXBUcmFpbGluZ1NsYXNoOwotICAgIFFTdHJpbmcg
cyA9IHVybC50b1N0cmluZyhvcHRzKTsKLSAgICBzID0gcy5taWQoMik7Ci0gICAgaWYgKHMuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIXVybExpc3QuY29udGFpbnMocykp
Ci0gICAgICAgIHVybExpc3QgKz0gczsKLSAgICB1cmxNb2RlbC5zZXRTdHJpbmdMaXN0KHVybExp
c3QpOwotfQotCi12b2lkIE1haW5XaW5kb3c6OmxvYWQoY29uc3QgUVN0cmluZyYgdXJsKQotewot
ICAgIFFVcmwgcXVybCA9IHVybEZyb21Vc2VySW5wdXQodXJsKTsKLSAgICBpZiAocXVybC5zY2hl
bWUoKS5pc0VtcHR5KCkpCi0gICAgICAgIHF1cmwgPSBRVXJsKCJodHRwOi8vIiArIHVybCArICIv
Iik7Ci0gICAgbG9hZChxdXJsKTsKLX0KLQotdm9pZCBNYWluV2luZG93Ojpsb2FkKGNvbnN0IFFV
cmwmIHVybCkKLXsKLSAgICBpZiAoIXVybC5pc1ZhbGlkKCkpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIHNldEFkZHJlc3NVcmwodXJsLnRvU3RyaW5nKCkpOwotICAgIHBhZ2UoKS0+bWFpbkZyYW1l
KCktPmxvYWQodXJsKTsKLX0KLQotdm9pZCBNYWluV2luZG93OjpjaGFuZ2VMb2NhdGlvbigpCi17
Ci0gICAgUVN0cmluZyBzdHJpbmcgPSB1cmxFZGl0LT50ZXh0KCk7Ci0gICAgbG9hZChzdHJpbmcp
OwotfQotCi12b2lkIE1haW5XaW5kb3c6Om9wZW5GaWxlKCkKLXsKLSAgICBzdGF0aWMgY29uc3Qg
UVN0cmluZyBmaWx0ZXIoIkhUTUwgRmlsZXMgKCouaHRtICouaHRtbCk7O1RleHQgRmlsZXMgKCou
dHh0KTs7SW1hZ2UgRmlsZXMgKCouZ2lmICouanBnICoucG5nKTs7QWxsIEZpbGVzICgqKSIpOwot
Ci0gICAgUUZpbGVEaWFsb2cgZmlsZURpYWxvZyh0aGlzLCB0cigiT3BlbiIpLCBRU3RyaW5nKCks
IGZpbHRlcik7Ci0gICAgZmlsZURpYWxvZy5zZXRBY2NlcHRNb2RlKFFGaWxlRGlhbG9nOjpBY2Nl
cHRPcGVuKTsKLSAgICBmaWxlRGlhbG9nLnNldEZpbGVNb2RlKFFGaWxlRGlhbG9nOjpFeGlzdGlu
Z0ZpbGUpOwotICAgIGZpbGVEaWFsb2cuc2V0T3B0aW9ucyhRRmlsZURpYWxvZzo6UmVhZE9ubHkp
OwotCi0gICAgaWYgKGZpbGVEaWFsb2cuZXhlYygpKSB7Ci0gICAgICAgIFFTdHJpbmcgc2VsZWN0
ZWRGaWxlID0gZmlsZURpYWxvZy5zZWxlY3RlZEZpbGVzKClbMF07Ci0gICAgICAgIGlmICghc2Vs
ZWN0ZWRGaWxlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGxvYWQoUVVybDo6ZnJvbUxvY2FsRmls
ZShzZWxlY3RlZEZpbGUpKTsKLSAgICB9Ci19Ci0KSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNo
ZXIvbWFpbndpbmRvdy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFp
bndpbmRvdy5oCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFp
bndpbmRvdy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndh
cmRiaWFzLmluPgotICogQ29weXJpZ2h0IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFpa29z
QGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtk
ZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgot
ICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgot
ICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQot
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
LSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBtYWlud2luZG93X2gK
LSNkZWZpbmUgbWFpbndpbmRvd19oCi0KLSNpbmNsdWRlIDxRdEd1aT4KLSNpbmNsdWRlICJ3ZWJw
YWdlLmgiCi0KLWNsYXNzIExvY2F0aW9uRWRpdDsKLQotY2xhc3MgTWFpbldpbmRvdyA6IHB1Ymxp
YyBRTWFpbldpbmRvdyB7Ci0gICAgUV9PQkpFQ1QKLQotcHVibGljOgotICAgIE1haW5XaW5kb3co
Y29uc3QgUVN0cmluZyYgdXJsID0gUVN0cmluZygpKTsKLQotICAgIHZvaWQgc2V0QWRkcmVzc1Vy
bChjb25zdCBRU3RyaW5nJiB1cmwpOwotICAgIHZvaWQgYWRkQ29tcGxldGVyRW50cnkoY29uc3Qg
UVVybCYgdXJsKTsKLQotICAgIHZvaWQgbG9hZChjb25zdCBRU3RyaW5nJiB1cmwpOwotICAgIHZv
aWQgbG9hZChjb25zdCBRVXJsJiB1cmwpOwotCi0gICAgV2ViUGFnZSogcGFnZSgpOwotCi1wcm90
ZWN0ZWQgc2xvdHM6Ci0gICAgdm9pZCBvcGVuRmlsZSgpOwotICAgIHZvaWQgY2hhbmdlTG9jYXRp
b24oKTsKLQotcHJpdmF0ZToKLSAgICB2b2lkIGJ1aWxkVUkoKTsKLQotICAgIFFTdHJpbmdMaXN0
TW9kZWwgdXJsTW9kZWw7Ci0gICAgUVN0cmluZ0xpc3QgdXJsTGlzdDsKLSAgICBMb2NhdGlvbkVk
aXQqIHVybEVkaXQ7Ci0KLSAgICBXZWJQYWdlKiBtX3BhZ2U7Ci19OwotCi0jZW5kaWYKSW5kZXg6
IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXRUb29scy9RdExhdW5jaGVyL3VybGxvYWRlci5jcHAJKHJldmlzaW9uIDU3NjU0KQorKysgV2Vi
S2l0VG9vbHMvUXRMYXVuY2hlci91cmxsb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDgz
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5k
L29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVW5pdmVyc2l0
eSBvZiBTemVnZWQKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
LSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRl
ICJ1cmxsb2FkZXIuaCIKLQotI2luY2x1ZGUgPFFGaWxlPgotI2luY2x1ZGUgPFFEZWJ1Zz4KLQot
VXJsTG9hZGVyOjpVcmxMb2FkZXIoUVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgaW5w
dXRGaWxlTmFtZSkKLSAgICA6IG1fZnJhbWUoZnJhbWUpCi0gICAgLCBtX3N0ZE91dChzdGRvdXQp
Ci0gICAgLCBtX2xvYWRlZCgwKQotewotICAgIGluaXQoaW5wdXRGaWxlTmFtZSk7Ci19Ci0KLXZv
aWQgVXJsTG9hZGVyOjpsb2FkTmV4dCgpCi17Ci0gICAgUVN0cmluZyBxc3RyOwotICAgIGlmIChn
ZXRVcmwocXN0cikpIHsKLSAgICAgICAgUVVybCB1cmwocXN0ciwgUVVybDo6U3RyaWN0TW9kZSk7
Ci0gICAgICAgIGlmICh1cmwuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtX3N0ZE91dCA8PCAi
TG9hZGluZyAiIDw8IHFzdHIgPDwgIiAuLi4uLi4iIDw8ICsrbV9sb2FkZWQgPDwgZW5kbDsKLSAg
ICAgICAgICAgIG1fZnJhbWUtPmxvYWQodXJsKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAg
ICBsb2FkTmV4dCgpOwotICAgIH0gZWxzZQotICAgICAgICBkaXNjb25uZWN0KG1fZnJhbWUsIDAs
IHRoaXMsIDApOwotfQotCi12b2lkIFVybExvYWRlcjo6aW5pdChjb25zdCBRU3RyaW5nJiBpbnB1
dEZpbGVOYW1lKQotewotICAgIFFGaWxlIGlucHV0RmlsZShpbnB1dEZpbGVOYW1lKTsKLSAgICBp
ZiAoaW5wdXRGaWxlLm9wZW4oUUlPRGV2aWNlOjpSZWFkT25seSB8IFFJT0RldmljZTo6VGV4dCkp
IHsKLSAgICAgICAgUVRleHRTdHJlYW0gc3RyZWFtKCZpbnB1dEZpbGUpOwotICAgICAgICBRU3Ry
aW5nIGxpbmU7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBsaW5lID0gc3Ry
ZWFtLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAobGluZS5pc051bGwoKSkKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIG1fdXJscy5hcHBlbmQobGluZSk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UgewotICAgICAgICBxRGVidWcoKSA8PCAiQ2FuJ3Qgb3BlbiBsaXN0IGZp
bGUiOwotICAgICAgICBleGl0KDApOwotICAgIH0KLSAgICBtX2luZGV4ID0gMDsKLSAgICBpbnB1
dEZpbGUuY2xvc2UoKTsKLX0KLQotYm9vbCBVcmxMb2FkZXI6OmdldFVybChRU3RyaW5nJiBxc3Ry
KQotewotICAgIGlmIChtX2luZGV4ID09IG1fdXJscy5zaXplKCkpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIHFzdHIgPSBtX3VybHNbbV9pbmRleCsrXTsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91cmxsb2FkZXIuaAkocmV2aXNpb24gNTc2NTQpCisr
KyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3VybGxvYWRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24g
YW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVW5pdmVy
c2l0eSBvZiBTemVnZWQKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgot
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5k
ZWYgdXJsbG9hZGVyX2gKLSNkZWZpbmUgdXJsbG9hZGVyX2gKLQotI2luY2x1ZGUgInF3ZWJmcmFt
ZS5oIgotCi0jaW5jbHVkZSA8UVRleHRTdHJlYW0+Ci0jaW5jbHVkZSA8UVZlY3Rvcj4KLQotY2xh
c3MgVXJsTG9hZGVyIDogcHVibGljIFFPYmplY3QgewotICAgIFFfT0JKRUNUCi0KLXB1YmxpYzoK
LSAgICBVcmxMb2FkZXIoUVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgaW5wdXRGaWxl
TmFtZSk7Ci0KLXB1YmxpYyBzbG90czoKLSAgICB2b2lkIGxvYWROZXh0KCk7Ci0KLXByaXZhdGU6
Ci0gICAgdm9pZCBpbml0KGNvbnN0IFFTdHJpbmcmIGlucHV0RmlsZU5hbWUpOwotICAgIGJvb2wg
Z2V0VXJsKFFTdHJpbmcmIHFzdHIpOwotCi1wcml2YXRlOgotICAgIFFWZWN0b3I8UVN0cmluZz4g
bV91cmxzOwotICAgIGludCBtX2luZGV4OwotICAgIFFXZWJGcmFtZSogbV9mcmFtZTsKLSAgICBR
VGV4dFN0cmVhbSBtX3N0ZE91dDsKLSAgICBpbnQgbV9sb2FkZWQ7Ci19OwotCi0jZW5kaWYKSW5k
ZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXNlcmFnZW50bGlzdC50eHQKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci91c2VyYWdlbnRsaXN0LnR4dAkocmV2aXNpb24gNTc2
NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3VzZXJhZ2VudGxpc3QudHh0CSh3b3JraW5n
IGNvcHkpCkBAIC0xLDkgKzAsMCBAQAotTW96aWxsYS81LjAgKFgxMTsgVTsgTGludXg7IGVuLVVT
KSBBcHBsZVdlYktpdC81MzMuMyAoS0hUTUwsIGxpa2UgR2Vja28pIFF0TGF1bmNoZXIvMC4xIFNh
ZmFyaS81MzMuMwotTW96aWxsYS81LjAgKFN5bWJpYW5PUy85LjQ7IFU7IFNlcmllczYwLzUuMDsg
ZW4tR0IpIEFwcGxlV2ViS2l0LzUzMy4zIChLSFRNTCwgbGlrZSBHZWNrbykgUXRMYXVuY2hlci8w
LjEgTW9iaWxlIFNhZmFyaS81MzMuMwotTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgUFBDIE1h
YyBPUyBYOyBlbikgQXBwbGVXZWJLaXQvMTI1LjIgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkv
MTI1LjgKLU1vemlsbGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCAxLjE7IGVuLWdiOyBkcmVhbSkg
QXBwbGVXZWJLaXQvNTI1LjEwKyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMy4wLjQgTW9i
aWxlIFNhZmFyaS81MjMuMTIuMgotTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIE9TIDNfMiBs
aWtlIE1hYyBPUyBYOyBlbi11cykgQXBwbGVXZWJLaXQvNTMxLjIxLjEwIChLSFRNTCwgbGlrZSBH
ZWNrbykgVmVyc2lvbi80LjAuNCBNb2JpbGUvN0IzMzRiIFNhZmFyaS81MzEuMjEuMTAKLU1vemls
bGEvNS4wKGlQYWQ7IFU7IENQVSBpUGhvbmUgT1MgM18yIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSBB
cHBsZVdlYktpdC81MzEuMjEuMTAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMC40IE1v
YmlsZS83QjMxNCBTYWZhcmkvNTMxLjIxLjEwCi1PcGVyYS85LjI1IChXaW5kb3dzIE5UIDYuMDsg
VTsgZW4pCi1Nb3ppbGxhLzUuMCAoU3ltYmlhbk9TLzkuNDsgVTsgU2VyaWVzNjAvNS4wIE5va2lh
NTgwMGQtMWIvMjAuMi4wMTQ7IFByb2ZpbGUvTUlEUC0yLjEgQ29uZmlndXJhdGlvbi9DTERDLTEu
MSApIEFwcGxlV2ViS2l0LzQxMyAoS0hUTUwsIGxpa2UgR2Vja28pIFNhZmFyaS80MTMKLU1vemls
bGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDguMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNC4w
OyBTTENDMjsgLk5FVCBDTFIgMi4wLjUwNzI3OyAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQgQ0xS
IDMuMC4zMDcyOTsgTWVkaWEgQ2VudGVyIFBDIDYuMCkKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1
bmNoZXIvdXRpbHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXRp
bHMuY3BwCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvdXRpbHMu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgot
ICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwot
ICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotCi1R
U3RyaW5nIHRha2VPcHRpb25WYWx1ZShRU3RyaW5nTGlzdCogYXJndW1lbnRzLCBpbnQgaW5kZXgp
Ci17Ci0gICAgUVN0cmluZyByZXN1bHQ7Ci0KLSAgICBpZiAoKytpbmRleCA8IGFyZ3VtZW50cy0+
Y291bnQoKSAmJiAhYXJndW1lbnRzLT5hdChpbmRleCkuc3RhcnRzV2l0aCgiLSIpKQotICAgICAg
ICByZXN1bHQgPSBhcmd1bWVudHMtPnRha2VBdChpbmRleCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCi1RU3RyaW5nIGZvcm1hdEtleXMoUUxpc3Q8UVN0cmluZz4ga2V5cykKLXsKLSAgICBR
U3RyaW5nIHJlc3VsdDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMuY291bnQoKSAtIDE7
IGkrKykKLSAgICAgICAgcmVzdWx0LmFwcGVuZChrZXlzLmF0KGkpICsgInwiKTsKLSAgICByZXN1
bHQuYXBwZW5kKGtleXMubGFzdCgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1RTGlzdDxR
U3RyaW5nPiBlbnVtVG9LZXlzKGNvbnN0IFFNZXRhT2JqZWN0IG8sIGNvbnN0IFFTdHJpbmcmIG5h
bWUsIGNvbnN0IFFTdHJpbmcmIHN0cmlwKQotewotICAgIFFMaXN0PFFTdHJpbmc+IGxpc3Q7Ci0K
LSAgICBpbnQgZW51bUluZGV4ID0gby5pbmRleE9mRW51bWVyYXRvcihuYW1lLnRvTGF0aW4xKCku
ZGF0YSgpKTsKLSAgICBRTWV0YUVudW0gZW51bWVyYXRvciA9IG8uZW51bWVyYXRvcihlbnVtSW5k
ZXgpOwotCi0gICAgaWYgKGVudW1lcmF0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgZW51bWVyYXRvci5rZXlDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIFFT
dHJpbmcga2V5KGVudW1lcmF0b3IudmFsdWVUb0tleShpKSk7Ci0gICAgICAgICAgICBsaXN0LmFw
cGVuZChrZXkucmVtb3ZlKHN0cmlwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4g
bGlzdDsKLX0KLQotdm9pZCBhcHBRdWl0KGludCBleGl0Q29kZSwgY29uc3QgUVN0cmluZyYgbXNn
KQotewotICAgIGlmICghbXNnLmlzRW1wdHkoKSkgewotICAgICAgICBpZiAoZXhpdENvZGUgPiAw
KQotICAgICAgICAgICAgcURlYnVnKCJFUlJPUjogJXMiLCBtc2cudG9MYXRpbjEoKS5kYXRhKCkp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBxRGVidWcoKSA8PCBtc2c7Ci0gICAgfQotICAg
IGV4aXQoZXhpdENvZGUpOwotfQotCi1RVXJsIHVybEZyb21Vc2VySW5wdXQoY29uc3QgUVN0cmlu
ZyYgc3RyaW5nKQotewotICAgIFFTdHJpbmcgaW5wdXQoc3RyaW5nKTsKLSAgICBRRmlsZUluZm8g
ZmkoaW5wdXQpOwotICAgIGlmIChmaS5leGlzdHMoKSAmJiBmaS5pc1JlbGF0aXZlKCkpCi0gICAg
ICAgIGlucHV0ID0gZmkuYWJzb2x1dGVGaWxlUGF0aCgpOwotCi0jaWYgUVRfVkVSU0lPTiA+PSBR
VF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCi0gICAgcmV0dXJuIFFVcmw6OmZyb21Vc2VySW5wdXQo
aW5wdXQpOwotI2Vsc2UKLSAgICByZXR1cm4gUVVybChpbnB1dCk7Ci0jZW5kaWYKLX0KLQotCklu
ZGV4OiBXZWJLaXRUb29scy9RdExhdW5jaGVyL3V0aWxzLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
VG9vbHMvUXRMYXVuY2hlci91dGlscy5oCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xz
L1F0TGF1bmNoZXIvdXRpbHMuaAkod29ya2luZyBjb3B5KQpAQCAtMSw1MiArMCwwIEBACi0vKgot
ICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lk
aWFyeSgtaWVzKQotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQot
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiB1
dGlsc19oCi0jZGVmaW5lIHV0aWxzX2gKLQotI2luY2x1ZGUgPFF0Q29yZT4KLQotI2lmbmRlZiBO
T19SRVRVUk4KLSNpZiBkZWZpbmVkKF9fQ0NfQVJNKSB8fCBkZWZpbmVkKF9fQVJNQ0NfXykKLSNk
ZWZpbmUgTk9fUkVUVVJOIF9fZGVjbHNwZWMobm9yZXR1cm4pCi0jZWxpZiBkZWZpbmVkKF9fR05V
Q19fKQotI2RlZmluZSBOT19SRVRVUk4gX19hdHRyaWJ1dGUoKF9fbm9yZXR1cm5fXykpCi0jZWxz
ZQotI2RlZmluZSBOT19SRVRVUk4KLSNlbmRpZgotI2VuZGlmCi0KLS8vIG9wdGlvbnMgaGFuZGxp
bmcKLVFTdHJpbmcgdGFrZU9wdGlvblZhbHVlKFFTdHJpbmdMaXN0KiBhcmd1bWVudHMsIGludCBp
bmRleCk7Ci1RU3RyaW5nIGZvcm1hdEtleXMoUUxpc3Q8UVN0cmluZz4ga2V5cyk7Ci1RTGlzdDxR
U3RyaW5nPiBlbnVtVG9LZXlzKGNvbnN0IFFNZXRhT2JqZWN0IG8sIGNvbnN0IFFTdHJpbmcmIG5h
bWUsIGNvbnN0IFFTdHJpbmcmIHN0cmlwKTsKLQotTk9fUkVUVVJOIHZvaWQgYXBwUXVpdChpbnQg
c3RhdHVzLCBjb25zdCBRU3RyaW5nJiBtc2cgPSBRU3RyaW5nKCkpOwotCi1RVXJsIHVybEZyb21V
c2VySW5wdXQoY29uc3QgUVN0cmluZyYgaW5wdXQpOwotCi0jZW5kaWYKSW5kZXg6IFdlYktpdFRv
b2xzL1F0TGF1bmNoZXIvd2ViaW5zcGVjdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMv
UXRMYXVuY2hlci93ZWJpbnNwZWN0b3IuaAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29s
cy9RdExhdW5jaGVyL3dlYmluc3BlY3Rvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDU2ICswLDAg
QEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICov
Ci0KLSNpZm5kZWYgd2ViaW5zcGVjdG9yX2gKLSNkZWZpbmUgd2ViaW5zcGVjdG9yX2gKLQotI2lu
Y2x1ZGUgPFF0R3VpPgotI2luY2x1ZGUgInF3ZWJpbnNwZWN0b3IuaCIKLQotY2xhc3MgV2ViSW5z
cGVjdG9yIDogcHVibGljIFFXZWJJbnNwZWN0b3IgewotICAgIFFfT0JKRUNUCi0KLXB1YmxpYzoK
LSAgICBXZWJJbnNwZWN0b3IoUVdpZGdldCogcGFyZW50KSA6IFFXZWJJbnNwZWN0b3IocGFyZW50
KSB7fQotCi1zaWduYWxzOgotICAgIHZvaWQgdmlzaWJsZUNoYW5nZWQoYm9vbCBub3dWaXNpYmxl
KTsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQgc2hvd0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KQot
ICAgIHsKLSAgICAgICAgUVdlYkluc3BlY3Rvcjo6c2hvd0V2ZW50KGV2ZW50KTsKLSAgICAgICAg
ZW1pdCB2aXNpYmxlQ2hhbmdlZCh0cnVlKTsKLSAgICB9Ci0gICAgdm9pZCBoaWRlRXZlbnQoUUhp
ZGVFdmVudCogZXZlbnQpCi0gICAgewotICAgICAgICBRV2ViSW5zcGVjdG9yOjpoaWRlRXZlbnQo
ZXZlbnQpOwotICAgICAgICBlbWl0IHZpc2libGVDaGFuZ2VkKGZhbHNlKTsKLSAgICB9Ci19Owot
Ci0jZW5kaWYKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2VicGFnZS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJwYWdlLmNwcAkocmV2aXNpb24gNTc2
NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnBhZ2UuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgTm9raWEg
Q29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotICogQ29w
eXJpZ2h0IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFpa29zQGtkZS5vcmc+Ci0gKiBDb3B5
cmlnaHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5vcmc+Ci0gKiBDb3B5cmln
aHQgKEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAy
MDA2IFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgotICoKLSAqIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0g
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
LSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgIndlYnBhZ2UuaCIKLQotI2luY2x1ZGUgPFFEZXNr
dG9wU2VydmljZXM+Ci0jaW5jbHVkZSA8UXRHdWk+Ci0jaW5jbHVkZSA8UXROZXR3b3JrL1FOZXR3
b3JrUmVxdWVzdD4KLSNpbmNsdWRlIDxRdE5ldHdvcmsvUU5ldHdvcmtQcm94eT4KLQotV2ViUGFn
ZTo6V2ViUGFnZShRT2JqZWN0KiBwYXJlbnQpCi0gICAgOiBRV2ViUGFnZShwYXJlbnQpCi17Ci0g
ICAgYXBwbHlQcm94eSgpOwotfQotCi12b2lkIFdlYlBhZ2U6OmFwcGx5UHJveHkoKQotewotICAg
IFFVcmwgcHJveHlVcmwocWdldGVudigiaHR0cF9wcm94eSIpKTsKLQotICAgIGlmIChwcm94eVVy
bC5pc1ZhbGlkKCkgJiYgIXByb3h5VXJsLmhvc3QoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaW50
IHByb3h5UG9ydCA9IChwcm94eVVybC5wb3J0KCkgPiAwKSA/IHByb3h5VXJsLnBvcnQoKSA6IDgw
ODA7Ci0gICAgICAgIG5ldHdvcmtBY2Nlc3NNYW5hZ2VyKCktPnNldFByb3h5KFFOZXR3b3JrUHJv
eHkoUU5ldHdvcmtQcm94eTo6SHR0cFByb3h5LCBwcm94eVVybC5ob3N0KCksIHByb3h5UG9ydCkp
OwotICAgIH0KLX0KLQotYm9vbCBXZWJQYWdlOjpzdXBwb3J0c0V4dGVuc2lvbihRV2ViUGFnZTo6
RXh0ZW5zaW9uIGV4dGVuc2lvbikgY29uc3QKLXsKLSAgICBpZiAoZXh0ZW5zaW9uID09IFFXZWJQ
YWdlOjpFcnJvclBhZ2VFeHRlbnNpb24pCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotYm9vbCBXZWJQYWdlOjpleHRlbnNpb24oRXh0ZW5zaW9uIGV4dGVuc2lv
biwgY29uc3QgRXh0ZW5zaW9uT3B0aW9uKiBvcHRpb24sIEV4dGVuc2lvblJldHVybiogb3V0cHV0
KQotewotICAgIGNvbnN0IFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24qIGluZm8g
PSBzdGF0aWNfY2FzdDxjb25zdCBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uKj4o
b3B0aW9uKTsKLSAgICBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuKiBlcnJvclBh
Z2UgPSBzdGF0aWNfY2FzdDxRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuKj4ob3V0
cHV0KTsKLQotICAgIGVycm9yUGFnZS0+Y29udGVudCA9IFFTdHJpbmcoIjxodG1sPjxoZWFkPjx0
aXRsZT5GYWlsZWQgbG9hZGluZyBwYWdlPC90aXRsZT48L2hlYWQ+PGJvZHk+JTE8L2JvZHk+PC9o
dG1sPiIpCi0gICAgICAgIC5hcmcoaW5mby0+ZXJyb3JTdHJpbmcpLnRvVXRmOCgpOwotCi0gICAg
cmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2ViUGFnZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3Qo
UVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LCBOYXZpZ2F0
aW9uVHlwZSB0eXBlKQotewotICAgIFFPYmplY3QqIHZpZXcgPSBwYXJlbnQoKTsKLQotICAgIFFW
YXJpYW50IHZhbHVlID0gdmlldy0+cHJvcGVydHkoImtleWJvYXJkTW9kaWZpZXJzIik7Ci0KLSAg
ICBpZiAoIXZhbHVlLmlzTnVsbCgpKSB7Ci0gICAgICAgIFF0OjpLZXlib2FyZE1vZGlmaWVycyBt
b2RpZmllcnMgPSBRdDo6S2V5Ym9hcmRNb2RpZmllcnModmFsdWUudG9JbnQoKSk7Ci0KLSAgICAg
ICAgaWYgKG1vZGlmaWVycyAmIFF0OjpTaGlmdE1vZGlmaWVyKSB7Ci0gICAgICAgICAgICBRV2Vi
UGFnZSogcGFnZSA9IGNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViQnJvd3NlcldpbmRvdyk7Ci0g
ICAgICAgICAgICBwYWdlLT5tYWluRnJhbWUoKS0+bG9hZChyZXF1ZXN0KTsKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtb2RpZmllcnMgJiBRdDo6
QWx0TW9kaWZpZXIpIHsKLSAgICAgICAgICAgIG9wZW5VcmxJbkRlZmF1bHRCcm93c2VyKHJlcXVl
c3QudXJsKCkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgcmV0dXJuIFFXZWJQYWdlOjphY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChmcmFtZSwgcmVx
dWVzdCwgdHlwZSk7Ci19Ci0KLXZvaWQgV2ViUGFnZTo6b3BlblVybEluRGVmYXVsdEJyb3dzZXIo
Y29uc3QgUVVybCYgdXJsKQotewotICAgIGlmIChRQWN0aW9uKiBhY3Rpb24gPSBxb2JqZWN0X2Nh
c3Q8UUFjdGlvbio+KHNlbmRlcigpKSkKLSAgICAgICAgUURlc2t0b3BTZXJ2aWNlczo6b3BlblVy
bChhY3Rpb24tPmRhdGEoKS50b1VybCgpKTsKLSAgICBlbHNlCi0gICAgICAgIFFEZXNrdG9wU2Vy
dmljZXM6Om9wZW5VcmwodXJsKTsKLX0KLQotUVN0cmluZyBXZWJQYWdlOjp1c2VyQWdlbnRGb3JV
cmwoY29uc3QgUVVybCYgdXJsKSBjb25zdAotewotICAgIGlmICghbV91c2VyQWdlbnQuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gbV91c2VyQWdlbnQ7Ci0gICAgcmV0dXJuIFFXZWJQYWdlOjp1
c2VyQWdlbnRGb3JVcmwodXJsKTsKLX0KSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2Vi
cGFnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2VicGFnZS5oCShy
ZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2VicGFnZS5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9r
aWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotICog
Q29weXJpZ2h0IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFpa29zQGtkZS5vcmc+Ci0gKiBD
b3B5cmlnaHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5vcmc+Ci0gKiBDb3B5
cmlnaHQgKEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgotICogQ29weXJpZ2h0IChD
KSAyMDA2IFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgotICoKLSAqIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6
Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
LSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiB3ZWJwYWdlX2gKLSNkZWZpbmUgd2VicGFnZV9o
Ci0KLSNpbmNsdWRlIDxxd2ViZnJhbWUuaD4KLSNpbmNsdWRlIDxxd2VicGFnZS5oPgotCi1jbGFz
cyBXZWJQYWdlIDogcHVibGljIFFXZWJQYWdlIHsKLSAgICBRX09CSkVDVAotCi1wdWJsaWM6Ci0g
ICAgV2ViUGFnZShRT2JqZWN0KiBwYXJlbnQgPSAwKTsKLQotICAgIHZpcnR1YWwgUVdlYlBhZ2Uq
IGNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViV2luZG93VHlwZSk7Ci0gICAgdmlydHVhbCBRT2Jq
ZWN0KiBjcmVhdGVQbHVnaW4oY29uc3QgUVN0cmluZyYsIGNvbnN0IFFVcmwmLCBjb25zdCBRU3Ry
aW5nTGlzdCYsIGNvbnN0IFFTdHJpbmdMaXN0Jik7Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnRz
RXh0ZW5zaW9uKFFXZWJQYWdlOjpFeHRlbnNpb24gZXh0ZW5zaW9uKSBjb25zdDsKLSAgICB2aXJ0
dWFsIGJvb2wgZXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24sIGNvbnN0IEV4dGVuc2lvbk9w
dGlvbiogb3B0aW9uLCBFeHRlbnNpb25SZXR1cm4qIG91dHB1dCk7Ci0KLSAgICB2aXJ0dWFsIGJv
b2wgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUU5ldHdv
cmtSZXF1ZXN0JiByZXF1ZXN0LCBOYXZpZ2F0aW9uVHlwZSB0eXBlKTsKLQotICAgIFFTdHJpbmcg
dXNlckFnZW50Rm9yVXJsKGNvbnN0IFFVcmwmIHVybCkgY29uc3Q7Ci0KLXB1YmxpYyBzbG90czoK
LSAgICB2b2lkIG9wZW5VcmxJbkRlZmF1bHRCcm93c2VyKGNvbnN0IFFVcmwmIHVybCA9IFFVcmwo
KSk7Ci0gICAgdm9pZCBzZXRVc2VyQWdlbnQoY29uc3QgUVN0cmluZyYgdWEpIHsgbV91c2VyQWdl
bnQgPSB1YTsgfQotCi1wcml2YXRlOgotICAgIHZvaWQgYXBwbHlQcm94eSgpOwotICAgIFFTdHJp
bmcgbV91c2VyQWdlbnQ7Ci19OwotCi0jZW5kaWYKSW5kZXg6IFdlYktpdFRvb2xzL1F0TGF1bmNo
ZXIvd2Vidmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJ2
aWV3LmNwcAkocmV2aXNpb24gNTc2NTQpCisrKyBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnZp
ZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDIwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0
IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQot
ICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJk
Ymlhcy5pbj4KLSAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0Br
ZGUub3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUu
b3JnPgotICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KLSAq
IENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KLSAq
Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
Ci0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0g
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJ3ZWJ2aWV3LmgiCi0K
LSNpbmNsdWRlIDxRdEd1aT4KLSNpbmNsdWRlIDxRR3JhcGhpY3NTY2VuZT4KLQotV2ViVmlld0dy
YXBoaWNzQmFzZWQ6OldlYlZpZXdHcmFwaGljc0Jhc2VkKFFXaWRnZXQqIHBhcmVudCkKLSAgICA6
IFFHcmFwaGljc1ZpZXcocGFyZW50KQotICAgICwgbV9pdGVtKG5ldyBHcmFwaGljc1dlYlZpZXcp
Ci0gICAgLCBtX251bVBhaW50c1RvdGFsKDApCi0gICAgLCBtX251bVBhaW50c1NpbmNlTGFzdE1l
YXN1cmUoMCkKLSAgICAsIG1fbWVhc3VyZUZwcyhmYWxzZSkKLSAgICAsIG1fcmVzaXplc1RvQ29u
dGVudHMoZmFsc2UpCi17Ci0gICAgc2V0U2NlbmUobmV3IFFHcmFwaGljc1NjZW5lKHRoaXMpKTsK
LSAgICBzY2VuZSgpLT5hZGRJdGVtKG1faXRlbSk7Ci0KLSAgICBzZXRGcmFtZVNoYXBlKFFGcmFt
ZTo6Tm9GcmFtZSk7Ci0gICAgc2V0SG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xs
QmFyQWx3YXlzT2ZmKTsKLSAgICBzZXRWZXJ0aWNhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xs
QmFyQWx3YXlzT2ZmKTsKLQotI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2
LCAwKQotICAgIFFTdGF0ZU1hY2hpbmUqIG1hY2hpbmUgPSBuZXcgUVN0YXRlTWFjaGluZSh0aGlz
KTsKLSAgICBRU3RhdGUqIHMwID0gbmV3IFFTdGF0ZShtYWNoaW5lKTsKLSAgICBzMC0+YXNzaWdu
UHJvcGVydHkodGhpcywgInlSb3RhdGlvbiIsIDApOwotCi0gICAgUVN0YXRlKiBzMSA9IG5ldyBR
U3RhdGUobWFjaGluZSk7Ci0gICAgczEtPmFzc2lnblByb3BlcnR5KHRoaXMsICJ5Um90YXRpb24i
LCA5MCk7Ci0KLSAgICBRQWJzdHJhY3RUcmFuc2l0aW9uKiB0MSA9IHMwLT5hZGRUcmFuc2l0aW9u
KHRoaXMsIFNJR05BTCh5RmxpcFJlcXVlc3QoKSksIHMxKTsKLSAgICBRUHJvcGVydHlBbmltYXRp
b24qIHlSb3RhdGlvbkFuaW0gPSBuZXcgUVByb3BlcnR5QW5pbWF0aW9uKHRoaXMsICJ5Um90YXRp
b24iLCB0aGlzKTsKLSAgICB5Um90YXRpb25BbmltLT5zZXREdXJhdGlvbigxMDAwKTsKLSAgICB0
MS0+YWRkQW5pbWF0aW9uKHlSb3RhdGlvbkFuaW0pOwotCi0gICAgUVN0YXRlKiBzMiA9IG5ldyBR
U3RhdGUobWFjaGluZSk7Ci0gICAgczItPmFzc2lnblByb3BlcnR5KHRoaXMsICJ5Um90YXRpb24i
LCAtOTApOwotICAgIHMxLT5hZGRUcmFuc2l0aW9uKHMxLCBTSUdOQUwocHJvcGVydGllc0Fzc2ln
bmVkKCkpLCBzMik7Ci0KLSAgICBRQWJzdHJhY3RUcmFuc2l0aW9uKiB0MiA9IHMyLT5hZGRUcmFu
c2l0aW9uKHMwKTsKLSAgICB0Mi0+YWRkQW5pbWF0aW9uKHlSb3RhdGlvbkFuaW0pOwotCi0gICAg
bWFjaGluZS0+c2V0SW5pdGlhbFN0YXRlKHMwKTsKLSAgICBtYWNoaW5lLT5zdGFydCgpOwotI2Vu
ZGlmCi0KLSAgICBtX3VwZGF0ZVRpbWVyID0gbmV3IFFUaW1lcih0aGlzKTsKLSAgICBtX3VwZGF0
ZVRpbWVyLT5zZXRJbnRlcnZhbCgxMDAwKTsKLSAgICBjb25uZWN0KG1fdXBkYXRlVGltZXIsIFNJ
R05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKHVwZGF0ZUZyYW1lUmF0ZSgpKSk7Ci19Ci0KLXZv
aWQgV2ViVmlld0dyYXBoaWNzQmFzZWQ6OnNldFJlc2l6ZXNUb0NvbnRlbnRzKGJvb2wgYikKLXsK
LSAgICBtX3Jlc2l6ZXNUb0NvbnRlbnRzID0gYjsKLSAgICBtX2l0ZW0tPnNldFJlc2l6ZXNUb0Nv
bnRlbnRzKG1fcmVzaXplc1RvQ29udGVudHMpOwotICAgIGlmIChtX3Jlc2l6ZXNUb0NvbnRlbnRz
KSB7Ci0gICAgICAgIHNldEhvcml6b250YWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFz
TmVlZGVkKTsKLSAgICAgICAgc2V0VmVydGljYWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJh
ckFzTmVlZGVkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzZXRIb3Jpem9udGFsU2Nyb2xsQmFy
UG9saWN5KFF0OjpTY3JvbGxCYXJBbHdheXNPZmYpOwotICAgICAgICBzZXRWZXJ0aWNhbFNjcm9s
bEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKLSAgICB9Ci19Ci0KLXZvaWQgV2Vi
Vmlld0dyYXBoaWNzQmFzZWQ6OnJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCogZXZlbnQpCi17Ci0g
ICAgUUdyYXBoaWNzVmlldzo6cmVzaXplRXZlbnQoZXZlbnQpOwotICAgIGlmIChtX3Jlc2l6ZXNU
b0NvbnRlbnRzKQotICAgICAgICByZXR1cm47Ci0gICAgUVJlY3RGIHJlY3QoUVBvaW50KDAsIDAp
LCBldmVudC0+c2l6ZSgpKTsKLSAgICBtX2l0ZW0tPnNldEdlb21ldHJ5KHJlY3QpOwotfQotCi12
b2lkIFdlYlZpZXdHcmFwaGljc0Jhc2VkOjpzZXRGcmFtZVJhdGVNZWFzdXJlbWVudEVuYWJsZWQo
Ym9vbCBlbmFibGVkKQotewotICAgIG1fbWVhc3VyZUZwcyA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1f
bWVhc3VyZUZwcykgewotICAgICAgICBtX2xhc3RDb25zdWx0VGltZSA9IG1fc3RhcnRUaW1lID0g
UVRpbWU6OmN1cnJlbnRUaW1lKCk7Ci0gICAgICAgIG1fdXBkYXRlVGltZXItPnN0YXJ0KCk7Ci0g
ICAgfSBlbHNlCi0gICAgICAgIG1fdXBkYXRlVGltZXItPnN0b3AoKTsKLX0KLQotdm9pZCBXZWJW
aWV3R3JhcGhpY3NCYXNlZDo6dXBkYXRlRnJhbWVSYXRlKCkKLXsKLSAgICBRVGltZSBub3cgPSBR
VGltZTo6Y3VycmVudFRpbWUoKTsKLQotICAgIGludCBpbnRlcnZhbCA9IG1fbGFzdENvbnN1bHRU
aW1lLm1zZWNzVG8obm93KTsKLSAgICBpbnQgdG90YWwgPSBtX3N0YXJ0VGltZS5tc2Vjc1RvKG5v
dyk7Ci0KLSAgICBpbnQgYXZlcmFnZSA9IHRvdGFsID8gbV9udW1QYWludHNUb3RhbCAqIDEwMDAg
LyB0b3RhbCA6IDA7Ci0gICAgaW50IGN1cnJlbnQgPSBpbnRlcnZhbCA/IG1fbnVtUGFpbnRzU2lu
Y2VMYXN0TWVhc3VyZSAqIDEwMDAgLyBpbnRlcnZhbCA6IDA7Ci0KLSAgICBlbWl0IGN1cnJlbnRG
UFNVcGRhdGVkKGN1cnJlbnQpOwotCi0gICAgbV9sYXN0Q29uc3VsdFRpbWUgPSBub3c7Ci0gICAg
bV9udW1QYWludHNTaW5jZUxhc3RNZWFzdXJlID0gMDsKLX0KLQotdm9pZCBXZWJWaWV3R3JhcGhp
Y3NCYXNlZDo6YW5pbWF0ZWRGbGlwKCkKLXsKLSNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05f
Q0hFQ0soNCwgNiwgMCkKLSAgICBRU2l6ZUYgY2VudGVyID0gbV9pdGVtLT5ib3VuZGluZ1JlY3Qo
KS5zaXplKCkgLyAyOwotICAgIFFQb2ludEYgY2VudGVyUG9pbnQgPSBRUG9pbnRGKGNlbnRlci53
aWR0aCgpLCBjZW50ZXIuaGVpZ2h0KCkpOwotICAgIG1faXRlbS0+c2V0VHJhbnNmb3JtT3JpZ2lu
UG9pbnQoY2VudGVyUG9pbnQpOwotCi0gICAgUVByb3BlcnR5QW5pbWF0aW9uKiBhbmltYXRpb24g
PSBuZXcgUVByb3BlcnR5QW5pbWF0aW9uKG1faXRlbSwgInJvdGF0aW9uIiwgdGhpcyk7Ci0gICAg
YW5pbWF0aW9uLT5zZXREdXJhdGlvbigxMDAwKTsKLQotICAgIGludCByb3RhdGlvbiA9IGludCht
X2l0ZW0tPnJvdGF0aW9uKCkpOwotCi0gICAgYW5pbWF0aW9uLT5zZXRTdGFydFZhbHVlKHJvdGF0
aW9uKTsKLSAgICBhbmltYXRpb24tPnNldEVuZFZhbHVlKHJvdGF0aW9uICsgMTgwIC0gKHJvdGF0
aW9uICUgMTgwKSk7Ci0KLSAgICBhbmltYXRpb24tPnN0YXJ0KFFBYnN0cmFjdEFuaW1hdGlvbjo6
RGVsZXRlV2hlblN0b3BwZWQpOwotI2VuZGlmCi19Ci0KLXZvaWQgV2ViVmlld0dyYXBoaWNzQmFz
ZWQ6OmFuaW1hdGVkWUZsaXAoKQotewotICAgIGVtaXQgeUZsaXBSZXF1ZXN0KCk7Ci19Ci0KLXZv
aWQgV2ViVmlld0dyYXBoaWNzQmFzZWQ6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGV2ZW50KQot
ewotICAgIFFHcmFwaGljc1ZpZXc6OnBhaW50RXZlbnQoZXZlbnQpOwotICAgIGlmICghbV9tZWFz
dXJlRnBzKQotICAgICAgICByZXR1cm47Ci0gICAgbV9udW1QYWludHNTaW5jZUxhc3RNZWFzdXJl
Kys7Ci0gICAgbV9udW1QYWludHNUb3RhbCsrOwotfQotCi1zdGF0aWMgUU1lbnUqIGNyZWF0ZUNv
bnRleHRNZW51KFFXZWJQYWdlKiBwYWdlLCBRUG9pbnQgcG9zaXRpb24pCi17Ci0gICAgUU1lbnUq
IG1lbnUgPSBwYWdlLT5jcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCk7Ci0KLSAgICBRV2ViSGl0
VGVzdFJlc3VsdCByID0gcGFnZS0+bWFpbkZyYW1lKCktPmhpdFRlc3RDb250ZW50KHBvc2l0aW9u
KTsKLQotICAgIGlmICghci5saW5rVXJsKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIFdlYlBhZ2Uq
IHdlYlBhZ2UgPSBxb2JqZWN0X2Nhc3Q8V2ViUGFnZSo+KHBhZ2UpOwotICAgICAgICBRQWN0aW9u
KiBuZXdUYWJBY3Rpb24gPSBtZW51LT5hZGRBY3Rpb24oIk9wZW4gaW4gRGVmYXVsdCAmQnJvd3Nl
ciIsIHdlYlBhZ2UsIFNMT1Qob3BlblVybEluRGVmYXVsdEJyb3dzZXIoKSkpOwotICAgICAgICBu
ZXdUYWJBY3Rpb24tPnNldERhdGEoci5saW5rVXJsKCkpOwotICAgICAgICBtZW51LT5pbnNlcnRB
Y3Rpb24obWVudS0+YWN0aW9ucygpLmF0KDIpLCBuZXdUYWJBY3Rpb24pOwotICAgIH0KLSAgICBy
ZXR1cm4gbWVudTsKLX0KLQotdm9pZCBHcmFwaGljc1dlYlZpZXc6Om1vdXNlUHJlc3NFdmVudChR
R3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqIGV2ZW50KQotewotICAgIHNldFByb3BlcnR5KCJtb3Vz
ZUJ1dHRvbnMiLCBRVmFyaWFudDo6ZnJvbVZhbHVlKGludChldmVudC0+YnV0dG9ucygpKSkpOwot
ICAgIHNldFByb3BlcnR5KCJrZXlib2FyZE1vZGlmaWVycyIsIFFWYXJpYW50Ojpmcm9tVmFsdWUo
aW50KGV2ZW50LT5tb2RpZmllcnMoKSkpKTsKLQotICAgIFFHcmFwaGljc1dlYlZpZXc6Om1vdXNl
UHJlc3NFdmVudChldmVudCk7Ci19Ci0KLXZvaWQgV2ViVmlld1RyYWRpdGlvbmFsOjptb3VzZVBy
ZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGV2ZW50KQotewotICAgIHNldFByb3BlcnR5KCJtb3VzZUJ1
dHRvbnMiLCBRVmFyaWFudDo6ZnJvbVZhbHVlKGludChldmVudC0+YnV0dG9ucygpKSkpOwotICAg
IHNldFByb3BlcnR5KCJrZXlib2FyZE1vZGlmaWVycyIsIFFWYXJpYW50Ojpmcm9tVmFsdWUoaW50
KGV2ZW50LT5tb2RpZmllcnMoKSkpKTsKLQotICAgIFFXZWJWaWV3Ojptb3VzZVByZXNzRXZlbnQo
ZXZlbnQpOwotfQotCi12b2lkIEdyYXBoaWNzV2ViVmlldzo6Y29udGV4dE1lbnVFdmVudChRR3Jh
cGhpY3NTY2VuZUNvbnRleHRNZW51RXZlbnQqIGV2ZW50KQotewotICAgIFFNZW51KiBtZW51ID0g
Y3JlYXRlQ29udGV4dE1lbnUocGFnZSgpLCBldmVudC0+cG9zKCkudG9Qb2ludCgpKTsKLSAgICBt
ZW51LT5leGVjKG1hcFRvU2NlbmUoZXZlbnQtPnBvcygpKS50b1BvaW50KCkpOwotICAgIGRlbGV0
ZSBtZW51OwotfQotCi12b2lkIFdlYlZpZXdUcmFkaXRpb25hbDo6Y29udGV4dE1lbnVFdmVudChR
Q29udGV4dE1lbnVFdmVudCogZXZlbnQpCi17Ci0gICAgUU1lbnUqIG1lbnUgPSBjcmVhdGVDb250
ZXh0TWVudShwYWdlKCksIGV2ZW50LT5wb3MoKSk7Ci0gICAgbWVudS0+ZXhlYyhtYXBUb0dsb2Jh
bChldmVudC0+cG9zKCkpKTsKLSAgICBkZWxldGUgbWVudTsKLX0KLQpJbmRleDogV2ViS2l0VG9v
bHMvUXRMYXVuY2hlci93ZWJ2aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRMYXVu
Y2hlci93ZWJ2aWV3LmgJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRMYXVuY2hl
ci93ZWJ2aWV3LmgJKHdvcmtpbmcgY29weSkKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZv
cndhcmRiaWFzLmluPgotICogQ29weXJpZ2h0IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFp
a29zQGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVy
QGtkZS5vcmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3Jn
PgotICogQ29weXJpZ2h0IChDKSAyMDA2IFNpbW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3Jn
PgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCi0gKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgotICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0g
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiB3ZWJ2aWV3X2gK
LSNkZWZpbmUgd2Vidmlld19oCi0KLSNpbmNsdWRlICJ3ZWJwYWdlLmgiCi0jaW5jbHVkZSA8cXdl
YnZpZXcuaD4KLSNpbmNsdWRlIDxxZ3JhcGhpY3N3ZWJ2aWV3Lmg+Ci0jaW5jbHVkZSA8UUdyYXBo
aWNzVmlldz4KLSNpbmNsdWRlIDxRR3JhcGhpY3NXaWRnZXQ+Ci0jaW5jbHVkZSA8UVRpbWU+Ci0K
LWNsYXNzIFdlYlZpZXdUcmFkaXRpb25hbCA6IHB1YmxpYyBRV2ViVmlldyB7Ci0gICAgUV9PQkpF
Q1QKLQotcHVibGljOgotICAgIFdlYlZpZXdUcmFkaXRpb25hbChRV2lkZ2V0KiBwYXJlbnQpIDog
UVdlYlZpZXcocGFyZW50KSB7fQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGNvbnRl
eHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgbW91c2VQ
cmVzc0V2ZW50KFFNb3VzZUV2ZW50Kik7Ci19OwotCi0KLWNsYXNzIEdyYXBoaWNzV2ViVmlldyA6
IHB1YmxpYyBRR3JhcGhpY3NXZWJWaWV3IHsKLSAgICBRX09CSkVDVAotCi1wdWJsaWM6Ci0gICAg
R3JhcGhpY3NXZWJWaWV3KFFHcmFwaGljc0l0ZW0qIHBhcmVudCA9IDApIDogUUdyYXBoaWNzV2Vi
VmlldyhwYXJlbnQpIHt9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIGNvbnRleHRN
ZW51RXZlbnQoUUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2
b2lkIG1vdXNlUHJlc3NFdmVudChRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqKTsKLX07Ci0KLQot
Y2xhc3MgV2ViVmlld0dyYXBoaWNzQmFzZWQgOiBwdWJsaWMgUUdyYXBoaWNzVmlldyB7Ci0gICAg
UV9PQkpFQ1QKLSAgICBRX1BST1BFUlRZKHFyZWFsIHlSb3RhdGlvbiBSRUFEIHlSb3RhdGlvbiBX
UklURSBzZXRZUm90YXRpb24pCi0KLXB1YmxpYzoKLSAgICBXZWJWaWV3R3JhcGhpY3NCYXNlZChR
V2lkZ2V0KiBwYXJlbnQpOwotICAgIHZpcnR1YWwgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZl
bnQqKTsKLSAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqIHBhZ2UpIHsgbV9pdGVtLT5zZXRQYWdl
KHBhZ2UpOyB9Ci0gICAgdm9pZCBzZXRJdGVtQ2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkNhY2hl
TW9kZSBtb2RlKSB7IG1faXRlbS0+c2V0Q2FjaGVNb2RlKG1vZGUpOyB9Ci0gICAgUUdyYXBoaWNz
SXRlbTo6Q2FjaGVNb2RlIGl0ZW1DYWNoZU1vZGUoKSB7IHJldHVybiBtX2l0ZW0tPmNhY2hlTW9k
ZSgpOyB9Ci0KLSAgICB2b2lkIHNldEZyYW1lUmF0ZU1lYXN1cmVtZW50RW5hYmxlZChib29sIGVu
YWJsZWQpOwotICAgIGJvb2wgZnJhbWVSYXRlTWVhc3VyZW1lbnRFbmFibGVkKCkgY29uc3QgeyBy
ZXR1cm4gbV9tZWFzdXJlRnBzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRFdmVudChRUGFp
bnRFdmVudCogZXZlbnQpOwotCi0gICAgdm9pZCBzZXRSZXNpemVzVG9Db250ZW50cyhib29sIGIp
OwotCi0gICAgdm9pZCBzZXRZUm90YXRpb24ocXJlYWwgYW5nbGUpCi0gICAgewotI2lmIFFUX1ZF
UlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQotICAgICAgICBRUmVjdEYgciA9IG1f
aXRlbS0+Ym91bmRpbmdSZWN0KCk7Ci0gICAgICAgIG1faXRlbS0+c2V0VHJhbnNmb3JtKFFUcmFu
c2Zvcm0oKQotICAgICAgICAgICAgLnRyYW5zbGF0ZShyLndpZHRoKCkgLyAyLCByLmhlaWdodCgp
IC8gMikKLSAgICAgICAgICAgIC5yb3RhdGUoYW5nbGUsIFF0OjpZQXhpcykKLSAgICAgICAgICAg
IC50cmFuc2xhdGUoLXIud2lkdGgoKSAvIDIsIC1yLmhlaWdodCgpIC8gMikpOwotI2VuZGlmCi0g
ICAgICAgIG1feVJvdGF0aW9uID0gYW5nbGU7Ci0gICAgfQotICAgIHFyZWFsIHlSb3RhdGlvbigp
IGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbV95Um90YXRpb247Ci0gICAgfQotCi0gICAg
R3JhcGhpY3NXZWJWaWV3KiBncmFwaGljc1dlYlZpZXcoKSBjb25zdCB7IHJldHVybiBtX2l0ZW07
IH0KLQotcHVibGljIHNsb3RzOgotICAgIHZvaWQgdXBkYXRlRnJhbWVSYXRlKCk7Ci0gICAgdm9p
ZCBhbmltYXRlZEZsaXAoKTsKLSAgICB2b2lkIGFuaW1hdGVkWUZsaXAoKTsKLQotc2lnbmFsczoK
LSAgICB2b2lkIHlGbGlwUmVxdWVzdCgpOwotICAgIHZvaWQgY3VycmVudEZQU1VwZGF0ZWQoaW50
IGZwcyk7Ci0KLXByaXZhdGU6Ci0gICAgR3JhcGhpY3NXZWJWaWV3KiBtX2l0ZW07Ci0gICAgaW50
IG1fbnVtUGFpbnRzVG90YWw7Ci0gICAgaW50IG1fbnVtUGFpbnRzU2luY2VMYXN0TWVhc3VyZTsK
LSAgICBRVGltZSBtX3N0YXJ0VGltZTsKLSAgICBRVGltZSBtX2xhc3RDb25zdWx0VGltZTsKLSAg
ICBRVGltZXIqIG1fdXBkYXRlVGltZXI7Ci0gICAgYm9vbCBtX21lYXN1cmVGcHM7Ci0gICAgcXJl
YWwgbV95Um90YXRpb247Ci0gICAgYm9vbCBtX3Jlc2l6ZXNUb0NvbnRlbnRzOwotfTsKLQotI2Vu
ZGlmCkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0VGVzdEJyb3dzZXIucHJvCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRUZXN0QnJvd3Nlci5wcm8J
KHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL1F0TGF1bmNoZXIu
cHJvOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdFRlc3RCcm93c2VyLnBy
bwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACitURU1QTEFURSA9IGFwcAorCitTT1VS
Q0VTICs9IFwKKyAgICBsb2NhdGlvbmVkaXQuY3BwIFwKKyAgICBtYWluLmNwcCBcCisgICAgbWFp
bndpbmRvdy5jcHAgXAorICAgIHVybGxvYWRlci5jcHAgXAorICAgIHV0aWxzLmNwcCBcCisgICAg
d2VicGFnZS5jcHAgXAorICAgIHdlYnZpZXcuY3BwIFwKKworSEVBREVSUyArPSBcCisgICAgbG9j
YXRpb25lZGl0LmggXAorICAgIG1haW53aW5kb3cuaCBcCisgICAgdXJsbG9hZGVyLmggXAorICAg
IHV0aWxzLmggXAorICAgIHdlYmluc3BlY3Rvci5oIFwKKyAgICB3ZWJwYWdlLmggXAorICAgIHdl
YnZpZXcuaCBcCisKK0NPTkZJRyAtPSBhcHBfYnVuZGxlCitDT05GSUcgKz0gdWl0b29scworCitp
c0VtcHR5KE9VVFBVVF9ESVIpOiBPVVRQVVRfRElSID0gLi4vLi4KK2luY2x1ZGUoLi4vLi4vV2Vi
S2l0LnByaSkKKworREVTVERJUiA9ICQkT1VUUFVUX0RJUi9iaW4KKworUVQgKz0gbmV0d29yawor
bWFjeDpRVCs9eG1sCisKK2xpbnV4LSogeworICAgICMgRnJvbSBDcmVhdG9yJ3Mgc3JjL3JwYXRo
LnByaToKKyAgICAjIERvIHRoZSBycGF0aCBieSBoYW5kIHNpbmNlIGl0J3Mgbm90IHBvc3NpYmxl
IHRvIHVzZSBPUklHSU4gaW4gUU1BS0VfUlBBVEhESVIKKyAgICAjIHRoaXMgZXhwYW5kcyB0byAk
T1JJR0lOIChhZnRlciBxbWFrZSBhbmQgbWFrZSksIGl0IGRvZXMgTk9UIHJlYWQgYSBxbWFrZSB2
YXIuCisgICAgUU1BS0VfUlBBVEhESVIgPSBcJFwkT1JJR0lOLy4uL2xpYiAkJFFNQUtFX1JQQVRI
RElSCisgICAgTVlfUlBBVEggPSAkJGpvaW4oUU1BS0VfUlBBVEhESVIsICI6IikKKworICAgIFFN
QUtFX0xGTEFHUyArPSAtV2wsLXosb3JpZ2luIFwnLVdsLC1ycGF0aCwkJHtNWV9SUEFUSH1cJwor
ICAgIFFNQUtFX1JQQVRIRElSID0KK30gZWxzZSB7CisgICAgUU1BS0VfUlBBVEhESVIgPSAkJE9V
VFBVVF9ESVIvbGliICQkUU1BS0VfUlBBVEhESVIKK30KKworc3ltYmlhbiB7CisgICAgVEFSR0VU
LlVJRDMgPSAweEEwMDBFNTQzCisgICAgVEFSR0VULkNBUEFCSUxJVFkgPSBSZWFkVXNlckRhdGEg
V3JpdGVVc2VyRGF0YSBOZXR3b3JrU2VydmljZXMKK30KKworY29udGFpbnMoUVRfQ09ORklHLCBv
cGVuZ2wpIHsKKyAgICBRVCArPSBvcGVuZ2wKKyAgICBERUZJTkVTICs9IFFUX0NPTkZJR1VSRURf
V0lUSF9PUEVOR0wKK30KKworUkVTT1VSQ0VTICs9IFwKKyAgICBRdExhdW5jaGVyLnFyYwpJbmRl
eDogV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdFRlc3RCcm93c2VyLnBybwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0VGVzdEJyb3dzZXIucHJvCShyZXZpc2lv
biAwKQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdFRlc3RCcm93c2VyLnBybwkod29y
a2luZyBjb3B5KQpAQCAtNTMsNCArNTMsNCBAQCBjb250YWlucyhRVF9DT05GSUcsIG9wZW5nbCkg
ewogfQogCiBSRVNPVVJDRVMgKz0gXAotICAgIFF0TGF1bmNoZXIucXJjCisgICAgUXRUZXN0QnJv
d3Nlci5xcmMKSW5kZXg6IFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvUXRUZXN0QnJvd3Nlci5x
cmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9RdFRlc3RCcm93c2Vy
LnFyYwkocmV2aXNpb24gNTc2NTQpCShmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvUXRMYXVu
Y2hlci5xcmM6NTc2NTQpCisrKyBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL1F0VGVzdEJyb3dz
ZXIucXJjCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNSBAQAorPFJDQz4KKyAgICA8cXJlc291
cmNlIHByZWZpeD0iLyI+CisgICAgICAgIDxmaWxlPnVzZXJhZ2VudGxpc3QudHh0PC9maWxlPgor
ICAgIDwvcXJlc291cmNlPgorPC9SQ0M+CkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RCcm93c2Vy
L2xvY2F0aW9uZWRpdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nl
ci9sb2NhdGlvbmVkaXQuY3BwCShyZXZpc2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9vbHMvUXRM
YXVuY2hlci9sb2NhdGlvbmVkaXQuY3BwOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJv
d3Nlci9sb2NhdGlvbmVkaXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODAgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAibG9jYXRpb25lZGl0LmgiCisKK0xvY2F0aW9uRWRpdDo6TG9jYXRpb25FZGl0KFFXaWRnZXQq
IHBhcmVudCkKKyAgICA6IFFMaW5lRWRpdChwYXJlbnQpCisgICAgLCBtX3Byb2dyZXNzKDApCit7
CisgICAgbV9jbGVhclRpbWVyLnNldFNpbmdsZVNob3QodHJ1ZSk7CisgICAgY29ubmVjdCgmbV9j
bGVhclRpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhpcywgU0xPVChyZXNldCgpKSk7Cit9CisK
K3ZvaWQgTG9jYXRpb25FZGl0OjpzZXRQcm9ncmVzcyhpbnQgcHJvZ3Jlc3MpCit7CisgICAgbV9j
bGVhclRpbWVyLnN0b3AoKTsKKyAgICBtX3Byb2dyZXNzID0gcHJvZ3Jlc3M7CisgICAgdXBkYXRl
KCk7Cit9CisKK3ZvaWQgTG9jYXRpb25FZGl0OjpyZXNldCgpCit7CisgICAgc2V0UHJvZ3Jlc3Mo
MCk7Cit9CisKK3ZvaWQgTG9jYXRpb25FZGl0OjpwYWludEV2ZW50KFFQYWludEV2ZW50KiBldikK
K3sKKyAgICBRQ29sb3IgYmFja2dyb3VuZENvbG9yID0gUUFwcGxpY2F0aW9uOjpwYWxldHRlKCku
Y29sb3IoUVBhbGV0dGU6OkJhc2UpOworICAgIFFDb2xvciBwcm9ncmVzc0NvbG9yID0gUUNvbG9y
KDEyMCwgMTgwLCAyNDApOworICAgIFFQYWxldHRlIHAgPSBwYWxldHRlKCk7CisKKyAgICBpZiAo
IW1fcHJvZ3Jlc3MpCisgICAgICAgIHAuc2V0QnJ1c2goUVBhbGV0dGU6OkJhc2UsIGJhY2tncm91
bmRDb2xvcik7CisgICAgZWxzZSB7CisgICAgICAgIFFMaW5lYXJHcmFkaWVudCBncmFkaWVudCgw
LCAwLCB3aWR0aCgpLCAwKTsKKyAgICAgICAgZ3JhZGllbnQuc2V0Q29sb3JBdCgwLCBwcm9ncmVz
c0NvbG9yKTsKKyAgICAgICAgZ3JhZGllbnQuc2V0Q29sb3JBdCgoKGRvdWJsZSkgbV9wcm9ncmVz
cykgLyAxMDAsIHByb2dyZXNzQ29sb3IpOworICAgICAgICBpZiAobV9wcm9ncmVzcyAhPSAxMDAp
CisgICAgICAgICAgICBncmFkaWVudC5zZXRDb2xvckF0KChkb3VibGUpIG1fcHJvZ3Jlc3MgLyAx
MDAgKyAwLjAwMSwgYmFja2dyb3VuZENvbG9yKTsKKyAgICAgICAgcC5zZXRCcnVzaChRUGFsZXR0
ZTo6QmFzZSwgZ3JhZGllbnQpOworICAgIH0KKyAgICBzZXRQYWxldHRlKHApOworCisgICAgUUxp
bmVFZGl0OjpwYWludEV2ZW50KGV2KTsKKworICAgIGlmIChtX3Byb2dyZXNzID09IDEwMCkKKyAg
ICAgICAgbV9jbGVhclRpbWVyLnN0YXJ0KDEwMCk7Cit9CisKK3ZvaWQgTG9jYXRpb25FZGl0Ojpm
b2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqIGV2KQoreworICAgIFFMaW5lRWRpdDo6Zm9jdXNJbkV2
ZW50KGV2KTsKKyNpZmRlZiBRX1dTX01BRU1PXzUKKyAgICBRVGltZXI6OnNpbmdsZVNob3QoMCwg
dGhpcywgU0xPVChzZWxlY3RBbGwoKSkpOworI2VuZGlmCit9CkluZGV4OiBXZWJLaXRUb29scy9R
dFRlc3RCcm93c2VyL2xvY2F0aW9uZWRpdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0
VGVzdEJyb3dzZXIvbG9jYXRpb25lZGl0LmgJKHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRU
b29scy9RdExhdW5jaGVyL2xvY2F0aW9uZWRpdC5oOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRU
ZXN0QnJvd3Nlci9sb2NhdGlvbmVkaXQuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBsb2NhdGlvbmVkaXRfaAorI2RlZmluZSBsb2NhdGlvbmVkaXRfaAorCisjaW5jbHVkZSA8
UXRHdWk+CisKK2NsYXNzIExvY2F0aW9uRWRpdCA6IHB1YmxpYyBRTGluZUVkaXQgeworICAgIFFf
T0JKRUNUCisKK3B1YmxpYzoKKyAgICBMb2NhdGlvbkVkaXQoUVdpZGdldCogcGFyZW50ID0gMCk7
CisKK3B1YmxpYyBzbG90czoKKyAgICB2b2lkIHNldFByb2dyZXNzKGludCBwcm9ncmVzcyk7CisK
K3ByaXZhdGUgc2xvdHM6CisgICAgdm9pZCByZXNldCgpOworCitwcm90ZWN0ZWQ6CisgICAgdmly
dHVhbCB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZm9j
dXNJbkV2ZW50KFFGb2N1c0V2ZW50Kik7CisKK3ByaXZhdGU6CisgICAgaW50IG1fcHJvZ3Jlc3M7
CisgICAgUVRpbWVyIG1fY2xlYXJUaW1lcjsKK307CisKKyNlbmRpZgpJbmRleDogV2ViS2l0VG9v
bHMvUXRUZXN0QnJvd3Nlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdFRl
c3RCcm93c2VyL21haW4uY3BwCShyZXZpc2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9vbHMvUXRM
YXVuY2hlci9tYWluLmNwcDo1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvbWFp
bi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTk2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQor
ICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJk
Ymlhcy5pbj4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0Br
ZGUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUu
b3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KKyAq
IENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KKyAq
CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxRdEd1aT4KKyNpbmNs
dWRlIDxRdE5ldHdvcmsvUU5ldHdvcmtSZXF1ZXN0PgorCisjaWYgZGVmaW5lZChRVF9DT05GSUdV
UkVEX1dJVEhfT1BFTkdMKQorI2luY2x1ZGUgPFF0T3BlbkdML1FHTFdpZGdldD4KKyNlbmRpZgor
CisjaWYgIWRlZmluZWQoUVRfTk9fUFJJTlRFUikKKyNpbmNsdWRlIDxRUHJpbnRQcmV2aWV3RGlh
bG9nPgorI2VuZGlmCisKKyNpZm5kZWYgUVRfTk9fVUlUT09MUworI2luY2x1ZGUgPFF0VWlUb29s
cy9RVWlMb2FkZXI+CisjZW5kaWYKKworI2luY2x1ZGUgPFFEZWJ1Zz4KKworI2luY2x1ZGUgPGNz
dGRpbz4KKyNpbmNsdWRlIDxxZXZlbnQuaD4KKyNpbmNsdWRlIDxxd2ViZWxlbWVudC5oPgorI2lu
Y2x1ZGUgPHF3ZWJmcmFtZS5oPgorI2luY2x1ZGUgPHF3ZWJpbnNwZWN0b3IuaD4KKyNpbmNsdWRl
IDxxd2Vic2V0dGluZ3MuaD4KKworI2lmZGVmIFFfV1NfTUFFTU9fNQorI2luY2x1ZGUgPHF4MTFp
bmZvX3gxMS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJtYWlud2luZG93LmgiCisjaW5jbHVkZSAi
dXJsbG9hZGVyLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ3ZWJpbnNwZWN0b3Iu
aCIKKyNpbmNsdWRlICJ3ZWJwYWdlLmgiCisjaW5jbHVkZSAid2Vidmlldy5oIgorI2luY2x1ZGUg
Ii4uLy4uL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5o
IgorCisjaWZkZWYgUV9XU19NQUVNT181CisjaW5jbHVkZSA8WDExL1hhdG9tLmg+CisjaW5jbHVk
ZSA8WDExL1hsaWIuaD4KKyN1bmRlZiBLZXlQcmVzcworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBp
bnQgZ0V4aXRDbGlja0FyZWEgPSA4MDsKK3N0YXRpYyBib29sIGdVc2VHcmFwaGljc1ZpZXcgPSBm
YWxzZTsKK3N0YXRpYyBib29sIGdVc2VDb21wb3NpdGluZyA9IHRydWU7CitzdGF0aWMgYm9vbCBn
Q2FjaGVXZWJWaWV3ID0gZmFsc2U7CitzdGF0aWMgYm9vbCBnU2hvd0ZyYW1lUmF0ZSA9IGZhbHNl
Oworc3RhdGljIFFHcmFwaGljc1ZpZXc6OlZpZXdwb3J0VXBkYXRlTW9kZSBnVmlld3BvcnRVcGRh
dGVNb2RlID0gUUdyYXBoaWNzVmlldzo6TWluaW1hbFZpZXdwb3J0VXBkYXRlOworc3RhdGljIFFV
cmwgZ0luc3BlY3RvclVybDsKK3N0YXRpYyBib29sIGdSZXNpemVzVG9Db250ZW50cyA9IGZhbHNl
Oworc3RhdGljIGJvb2wgZ1VzZVRpbGVkQmFja2luZ1N0b3JlID0gZmFsc2U7CisKKyNpZiBkZWZp
bmVkKFFfV1NfTUFFTU9fNSkgfHwgZGVmaW5lZChRX1dTX1M2MCkKK3N0YXRpYyBib29sIGdVc2VG
cmFtZUZsYXR0ZW5pbmcgPSB0cnVlOworI2Vsc2UKK3N0YXRpYyBib29sIGdVc2VGcmFtZUZsYXR0
ZW5pbmcgPSBmYWxzZTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChRVF9DT05GSUdVUkVEX1dJVEhf
T1BFTkdMKQorc3RhdGljIGJvb2wgZ1VzZVFHTFdpZGdldFZpZXdwb3J0ID0gZmFsc2U7CisjZW5k
aWYKKworCitjbGFzcyBMYXVuY2hlcldpbmRvdyA6IHB1YmxpYyBNYWluV2luZG93IHsKKyAgICBR
X09CSkVDVAorCitwdWJsaWM6CisgICAgTGF1bmNoZXJXaW5kb3coTGF1bmNoZXJXaW5kb3cqIG90
aGVyID0gMCwgYm9vbCBzaGFyZVNjZW5lID0gZmFsc2UpOworICAgIHZpcnR1YWwgfkxhdW5jaGVy
V2luZG93KCk7CisKKyAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2
ZW50KTsKKyAgICB2b2lkIGdyYWJab29tS2V5cyhib29sIGdyYWIpOworCisjaWYgUVRfVkVSU0lP
TiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCisgICAgdm9pZCBzZW5kVG91Y2hFdmVudCgp
OworI2VuZGlmCisKKyAgICBib29sIGV2ZW50RmlsdGVyKFFPYmplY3QqIG9iaiwgUUV2ZW50KiBl
dmVudCk7CisKK3Byb3RlY3RlZCBzbG90czoKKyAgICB2b2lkIGxvYWRTdGFydGVkKCk7CisgICAg
dm9pZCBsb2FkRmluaXNoZWQoKTsKKworICAgIHZvaWQgc2hvd0xpbmtIb3Zlcihjb25zdCBRU3Ry
aW5nICZsaW5rLCBjb25zdCBRU3RyaW5nICZ0b29sVGlwKTsKKworICAgIHZvaWQgem9vbUluKCk7
CisgICAgdm9pZCB6b29tT3V0KCk7CisgICAgdm9pZCByZXNldFpvb20oKTsKKyAgICB2b2lkIHRv
Z2dsZVpvb21UZXh0T25seShib29sIG9uKTsKKyAgICB2b2lkIHpvb21BbmltYXRpb25GaW5pc2hl
ZCgpOworCisgICAgdm9pZCBwcmludCgpOworICAgIHZvaWQgc2NyZWVuc2hvdCgpOworCisgICAg
dm9pZCBzZXRFZGl0YWJsZShib29sIG9uKTsKKworICAgIC8qIHZvaWQgZHVtcFBsdWdpbnMoKSAq
LworICAgIHZvaWQgZHVtcEh0bWwoKTsKKworICAgIHZvaWQgc2VsZWN0RWxlbWVudHMoKTsKKwor
ICAgIHZvaWQgc2V0VG91Y2hNb2NraW5nKGJvb2wgb24pOworICAgIHZvaWQgdG9nZ2xlQWNjZWxl
cmF0ZWRDb21wb3NpdGluZyhib29sIHRvZ2dsZSk7CisgICAgdm9pZCB0b2dnbGVUaWxlZEJhY2tp
bmdTdG9yZShib29sIHRvZ2dsZSk7CisgICAgdm9pZCB0b2dnbGVSZXNpemVzVG9Db250ZW50cyhi
b29sIHRvZ2dsZSk7CisKKyAgICB2b2lkIHRvZ2dsZVdlYkdMKGJvb2wgdG9nZ2xlKTsKKyAgICB2
b2lkIGluaXRpYWxpemVWaWV3KGJvb2wgdXNlR3JhcGhpY3NWaWV3ID0gZmFsc2UpOworICAgIHZv
aWQgdG9nZ2xlU3BhdGlhbE5hdmlnYXRpb24oYm9vbCBiKTsKKyAgICB2b2lkIHRvZ2dsZUZ1bGxT
Y3JlZW5Nb2RlKGJvb2wgZW5hYmxlKTsKKyAgICB2b2lkIHNob3dGUFMoYm9vbCBlbmFibGUpOwor
ICAgIHZvaWQgY2hhbmdlVmlld3BvcnRVcGRhdGVNb2RlKGludCBtb2RlKTsKKyAgICB2b2lkIHRv
Z2dsZUZyYW1lRmxhdHRlbmluZyhib29sIHRvZ2dsZSk7CisKKyNpZiBkZWZpbmVkKFFUX0NPTkZJ
R1VSRURfV0lUSF9PUEVOR0wpCisgICAgdm9pZCB0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydChib29s
IGVuYWJsZSk7CisjZW5kaWYKKworICAgIHZvaWQgc2hvd1VzZXJBZ2VudERpYWxvZygpOworCitw
dWJsaWMgc2xvdHM6CisgICAgdm9pZCBuZXdXaW5kb3coKTsKKyAgICB2b2lkIGNsb25lV2luZG93
KCk7CisgICAgdm9pZCB1cGRhdGVGUFMoaW50IGZwcyk7CisKK3NpZ25hbHM6CisgICAgdm9pZCBl
bnRlcmVkRnVsbFNjcmVlbk1vZGUoYm9vbCBvbik7CisKK3ByaXZhdGU6CisgICAgdm9pZCBjcmVh
dGVDaHJvbWUoKTsKKyAgICB2b2lkIGFwcGx5Wm9vbSgpOworCitwcml2YXRlOgorICAgIFFWZWN0
b3I8aW50PiBtX3pvb21MZXZlbHM7CisgICAgaW50IG1fY3VycmVudFpvb207CisKKyAgICBRV2lk
Z2V0KiBtX3ZpZXc7CisgICAgV2ViSW5zcGVjdG9yKiBtX2luc3BlY3RvcjsKKworICAgIFFBY3Rp
b24qIG1fZm9ybWF0TWVudUFjdGlvbjsKKyAgICBRQWN0aW9uKiBtX2ZsaXBBbmltYXRlZDsKKyAg
ICBRQWN0aW9uKiBtX2ZsaXBZQW5pbWF0ZWQ7CisKKyNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJ
T05fQ0hFQ0soNCwgNiwgMCkKKyAgICBRUHJvcGVydHlBbmltYXRpb24qIG1fem9vbUFuaW1hdGlv
bjsKKyAgICBRTGlzdDxRVG91Y2hFdmVudDo6VG91Y2hQb2ludD4gbV90b3VjaFBvaW50czsKKyAg
ICBib29sIG1fdG91Y2hNb2NraW5nOworI2VuZGlmCisKKyAgICB2b2lkIGluaXQoYm9vbCB1c2VH
cmFwaGljc1ZpZXcgPSBmYWxzZSk7CisgICAgYm9vbCBpc0dyYXBoaWNzQmFzZWQoKSBjb25zdDsK
KyAgICB2b2lkIGFwcGx5UHJlZnMoTGF1bmNoZXJXaW5kb3cqIG90aGVyID0gMCk7Cit9OworCitM
YXVuY2hlcldpbmRvdzo6TGF1bmNoZXJXaW5kb3coTGF1bmNoZXJXaW5kb3cqIG90aGVyLCBib29s
IHNoYXJlU2NlbmUpCisgICAgOiBNYWluV2luZG93KCkKKyAgICAsIG1fY3VycmVudFpvb20oMTAw
KQorICAgICwgbV92aWV3KDApCisgICAgLCBtX2luc3BlY3RvcigwKQorICAgICwgbV9mb3JtYXRN
ZW51QWN0aW9uKDApCisgICAgLCBtX2ZsaXBBbmltYXRlZCgwKQorICAgICwgbV9mbGlwWUFuaW1h
dGVkKDApCisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCisgICAg
LCBtX3pvb21BbmltYXRpb24oMCkKKyNlbmRpZgoreworICAgIGlmIChvdGhlcikgeworICAgICAg
ICBpbml0KG90aGVyLT5pc0dyYXBoaWNzQmFzZWQoKSk7CisgICAgICAgIGFwcGx5UHJlZnMob3Ro
ZXIpOworICAgICAgICBpZiAoc2hhcmVTY2VuZSAmJiBvdGhlci0+aXNHcmFwaGljc0Jhc2VkKCkp
IHsKKyAgICAgICAgICAgIFFHcmFwaGljc1ZpZXcqIG90aGVyVmlldyA9IHN0YXRpY19jYXN0PFFH
cmFwaGljc1ZpZXcqPihvdGhlci0+bV92aWV3KTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFFH
cmFwaGljc1ZpZXcqPihtX3ZpZXcpLT5zZXRTY2VuZShvdGhlclZpZXctPnNjZW5lKCkpOworICAg
ICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdChnVXNlR3JhcGhpY3NWaWV3KTsKKyAg
ICAgICAgYXBwbHlQcmVmcygpOworICAgIH0KKworICAgIGNyZWF0ZUNocm9tZSgpOworfQorCitM
YXVuY2hlcldpbmRvdzo6fkxhdW5jaGVyV2luZG93KCkKK3sKKyAgICBncmFiWm9vbUtleXMoZmFs
c2UpOworfQorCit2b2lkIExhdW5jaGVyV2luZG93Ojppbml0KGJvb2wgdXNlR3JhcGhpY3NWaWV3
KQoreworICAgIFFTcGxpdHRlciogc3BsaXR0ZXIgPSBuZXcgUVNwbGl0dGVyKFF0OjpWZXJ0aWNh
bCwgdGhpcyk7CisgICAgc2V0Q2VudHJhbFdpZGdldChzcGxpdHRlcik7CisKKyNpZiBkZWZpbmVk
KFFfV1NfUzYwKQorICAgIHNldFdpbmRvd1N0YXRlKFF0OjpXaW5kb3dNYXhpbWl6ZWQpOworI2Vs
c2UKKyAgICBzZXRXaW5kb3dTdGF0ZShRdDo6V2luZG93Tm9TdGF0ZSk7CisgICAgcmVzaXplKDgw
MCwgNjAwKTsKKyNlbmRpZgorCisgICAgaW5pdGlhbGl6ZVZpZXcodXNlR3JhcGhpY3NWaWV3KTsK
KworICAgIGNvbm5lY3QocGFnZSgpLCBTSUdOQUwobG9hZFN0YXJ0ZWQoKSksIHRoaXMsIFNMT1Qo
bG9hZFN0YXJ0ZWQoKSkpOworICAgIGNvbm5lY3QocGFnZSgpLCBTSUdOQUwobG9hZEZpbmlzaGVk
KGJvb2wpKSwgdGhpcywgU0xPVChsb2FkRmluaXNoZWQoKSkpOworICAgIGNvbm5lY3QocGFnZSgp
LCBTSUdOQUwobGlua0hvdmVyZWQoY29uc3QgUVN0cmluZyYsIGNvbnN0IFFTdHJpbmcmLCBjb25z
dCBRU3RyaW5nJikpLAorICAgICAgICAgICAgdGhpcywgU0xPVChzaG93TGlua0hvdmVyKGNvbnN0
IFFTdHJpbmcmLCBjb25zdCBRU3RyaW5nJikpKTsKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChl
bnRlcmVkRnVsbFNjcmVlbk1vZGUoYm9vbCkpLCB0aGlzLCBTTE9UKHRvZ2dsZUZ1bGxTY3JlZW5N
b2RlKGJvb2wpKSk7CisKKyAgICBpZiAoIWdJbnNwZWN0b3JVcmwuaXNFbXB0eSgpKQorICAgICAg
cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRJbnNwZWN0b3JVcmwoZ0luc3BlY3RvclVybCk7CisKKyAg
ICBtX2luc3BlY3RvciA9IG5ldyBXZWJJbnNwZWN0b3Ioc3BsaXR0ZXIpOworICAgIG1faW5zcGVj
dG9yLT5zZXRQYWdlKHBhZ2UoKSk7CisgICAgbV9pbnNwZWN0b3ItPmhpZGUoKTsKKyAgICBjb25u
ZWN0KHRoaXMsIFNJR05BTChkZXN0cm95ZWQoKSksIG1faW5zcGVjdG9yLCBTTE9UKGRlbGV0ZUxh
dGVyKCkpKTsKKworICAgIC8vIHRoZSB6b29tIHZhbHVlcyBhcmUgY2hvc2VuIHRvIGJlIGxpa2Ug
aW4gTW96aWxsYSBGaXJlZm94IDMKKyAgICBtX3pvb21MZXZlbHMgPDwgMzAgPDwgNTAgPDwgNjcg
PDwgODAgPDwgOTA7CisgICAgbV96b29tTGV2ZWxzIDw8IDEwMDsKKyAgICBtX3pvb21MZXZlbHMg
PDwgMTEwIDw8IDEyMCA8PCAxMzMgPDwgMTUwIDw8IDE3MCA8PCAyMDAgPDwgMjQwIDw8IDMwMDsK
KworICAgIGdyYWJab29tS2V5cyh0cnVlKTsKK30KKworYm9vbCBMYXVuY2hlcldpbmRvdzo6aXNH
cmFwaGljc0Jhc2VkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gYm9vbChxb2JqZWN0X2Nhc3Q8UUdy
YXBoaWNzVmlldyo+KG1fdmlldykpOworfQorCitpbmxpbmUgdm9pZCBhcHBseVNldHRpbmcoUVdl
YlNldHRpbmdzOjpXZWJBdHRyaWJ1dGUgdHlwZSwgUVdlYlNldHRpbmdzKiBzZXR0aW5ncywgUVdl
YlNldHRpbmdzKiBvdGhlciwgYm9vbCBkZWZhdWx0VmFsdWUpCit7CisgICAgc2V0dGluZ3MtPnNl
dEF0dHJpYnV0ZSh0eXBlLCBvdGhlciA/IG90aGVyLT50ZXN0QXR0cmlidXRlKHR5cGUpIDogZGVm
YXVsdFZhbHVlKTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6YXBwbHlQcmVmcyhMYXVuY2hl
cldpbmRvdyogc291cmNlKQoreworICAgIFFXZWJTZXR0aW5ncyogb3RoZXIgPSBzb3VyY2UgPyBz
b3VyY2UtPnBhZ2UoKS0+c2V0dGluZ3MoKSA6IDA7CisgICAgUVdlYlNldHRpbmdzKiBzZXR0aW5n
cyA9IHBhZ2UoKS0+c2V0dGluZ3MoKTsKKworICAgIGFwcGx5U2V0dGluZyhRV2ViU2V0dGluZ3M6
OkFjY2VsZXJhdGVkQ29tcG9zaXRpbmdFbmFibGVkLCBzZXR0aW5ncywgb3RoZXIsIGdVc2VDb21w
b3NpdGluZyk7CisgICAgYXBwbHlTZXR0aW5nKFFXZWJTZXR0aW5nczo6VGlsZWRCYWNraW5nU3Rv
cmVFbmFibGVkLCBzZXR0aW5ncywgb3RoZXIsIGdVc2VUaWxlZEJhY2tpbmdTdG9yZSk7CisgICAg
YXBwbHlTZXR0aW5nKFFXZWJTZXR0aW5nczo6V2ViR0xFbmFibGVkLCBzZXR0aW5ncywgb3RoZXIs
IGZhbHNlKTsKKyAgICBhcHBseVNldHRpbmcoUVdlYlNldHRpbmdzOjpGcmFtZUZsYXR0ZW5pbmdF
bmFibGVkLCBzZXR0aW5ncywgb3RoZXIsIGdVc2VGcmFtZUZsYXR0ZW5pbmcpOworCisgICAgaWYg
KCFpc0dyYXBoaWNzQmFzZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViVmlld0dyYXBo
aWNzQmFzZWQqIHZpZXcgPSBzdGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmll
dyk7CisgICAgV2ViVmlld0dyYXBoaWNzQmFzZWQqIG90aGVyVmlldyA9IHNvdXJjZSA/IHFvYmpl
Y3RfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KHNvdXJjZS0+bV92aWV3KSA6IDA7CisKKyAg
ICB2aWV3LT5zZXRWaWV3cG9ydFVwZGF0ZU1vZGUob3RoZXJWaWV3ID8gb3RoZXJWaWV3LT52aWV3
cG9ydFVwZGF0ZU1vZGUoKSA6IGdWaWV3cG9ydFVwZGF0ZU1vZGUpOworICAgIHZpZXctPnNldEZy
YW1lUmF0ZU1lYXN1cmVtZW50RW5hYmxlZChvdGhlclZpZXcgPyBvdGhlclZpZXctPmZyYW1lUmF0
ZU1lYXN1cmVtZW50RW5hYmxlZCgpIDogZ1Nob3dGcmFtZVJhdGUpOworCisgICAgaWYgKG90aGVy
VmlldykKKyAgICAgICAgdmlldy0+c2V0SXRlbUNhY2hlTW9kZShvdGhlclZpZXctPml0ZW1DYWNo
ZU1vZGUoKSk7CisgICAgZWxzZQorICAgICAgICB2aWV3LT5zZXRJdGVtQ2FjaGVNb2RlKGdDYWNo
ZVdlYlZpZXcgPyBRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUgOiBRR3JhcGhp
Y3NJdGVtOjpOb0NhY2hlKTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6a2V5UHJlc3NFdmVu
dChRS2V5RXZlbnQqIGV2ZW50KQoreworI2lmZGVmIFFfV1NfTUFFTU9fNQorICAgIHN3aXRjaCAo
ZXZlbnQtPmtleSgpKSB7CisgICAgY2FzZSBRdDo6S2V5X0Y3OgorICAgICAgICB6b29tSW4oKTsK
KyAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFF0OjpL
ZXlfRjg6CisgICAgICAgIHpvb21PdXQoKTsKKyAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAg
ICAgICBicmVhazsKKyAgICB9CisjZW5kaWYKKyAgICBNYWluV2luZG93OjprZXlQcmVzc0V2ZW50
KGV2ZW50KTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6Z3JhYlpvb21LZXlzKGJvb2wgZ3Jh
YikKK3sKKyNpZmRlZiBRX1dTX01BRU1PXzUKKyAgICBpZiAoIXdpbklkKCkpIHsKKyAgICAgICAg
cVdhcm5pbmcoIkNhbid0IGdyYWIga2V5cyB1bmxlc3Mgd2UgaGF2ZSBhIHdpbmRvdyBpZCIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQXRvbSBhdG9tID0gWEludGVybkF0b20oUVgx
MUluZm86OmRpc3BsYXkoKSwgIl9ISUxET05fWk9PTV9LRVlfQVRPTSIsIEZhbHNlKTsKKyAgICBp
ZiAoIWF0b20pIHsKKyAgICAgICAgcVdhcm5pbmcoIlVuYWJsZSB0byBvYnRhaW4gX0hJTERPTl9a
T09NX0tFWV9BVE9NIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBs
b25nIHZhbCA9IChncmFiKSA/IDEgOiAwOworICAgIFhDaGFuZ2VQcm9wZXJ0eShRWDExSW5mbzo6
ZGlzcGxheSgpLCB3aW5JZCgpLCBhdG9tLCBYQV9JTlRFR0VSLCAzMiwgUHJvcE1vZGVSZXBsYWNl
LCByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmdmFsKSwgMSk7CisjZW5kaWYKK30K
KworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQordm9pZCBMYXVu
Y2hlcldpbmRvdzo6c2VuZFRvdWNoRXZlbnQoKQoreworICAgIGlmIChtX3RvdWNoUG9pbnRzLmlz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUUV2ZW50OjpUeXBlIHR5cGUgPSBRRXZl
bnQ6OlRvdWNoVXBkYXRlOworICAgIGlmIChtX3RvdWNoUG9pbnRzLnNpemUoKSA9PSAxKSB7Cisg
ICAgICAgIGlmIChtX3RvdWNoUG9pbnRzWzBdLnN0YXRlKCkgPT0gUXQ6OlRvdWNoUG9pbnRSZWxl
YXNlZCkKKyAgICAgICAgICAgIHR5cGUgPSBRRXZlbnQ6OlRvdWNoRW5kOworICAgICAgICBlbHNl
IGlmIChtX3RvdWNoUG9pbnRzWzBdLnN0YXRlKCkgPT0gUXQ6OlRvdWNoUG9pbnRQcmVzc2VkKQor
ICAgICAgICAgICAgdHlwZSA9IFFFdmVudDo6VG91Y2hCZWdpbjsKKyAgICB9CisKKyAgICBRVG91
Y2hFdmVudCB0b3VjaEV2KHR5cGUpOworICAgIHRvdWNoRXYuc2V0VG91Y2hQb2ludHMobV90b3Vj
aFBvaW50cyk7CisgICAgUUNvcmVBcHBsaWNhdGlvbjo6c2VuZEV2ZW50KHBhZ2UoKSwgJnRvdWNo
RXYpOworCisgICAgLy8gQWZ0ZXIgc2VuZGluZyB0aGUgZXZlbnQsIHJlbW92ZSBhbGwgdG91Y2hw
b2ludHMgdGhhdCB3ZXJlIHJlbGVhc2VkCisgICAgaWYgKG1fdG91Y2hQb2ludHNbMF0uc3RhdGUo
KSA9PSBRdDo6VG91Y2hQb2ludFJlbGVhc2VkKQorICAgICAgICBtX3RvdWNoUG9pbnRzLnJlbW92
ZUF0KDApOworICAgIGlmIChtX3RvdWNoUG9pbnRzLnNpemUoKSA+IDEgJiYgbV90b3VjaFBvaW50
c1sxXS5zdGF0ZSgpID09IFF0OjpUb3VjaFBvaW50UmVsZWFzZWQpCisgICAgICAgIG1fdG91Y2hQ
b2ludHMucmVtb3ZlQXQoMSk7Cit9CisjZW5kaWYgLy8gUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9O
X0NIRUNLKDQsIDYsIDApCisKK2Jvb2wgTGF1bmNoZXJXaW5kb3c6OmV2ZW50RmlsdGVyKFFPYmpl
Y3QqIG9iaiwgUUV2ZW50KiBldmVudCkKK3sKKyAgICAvLyBJZiBjbGljayBwb3MgaXMgdGhlIGJv
dHRvbSByaWdodCBjb3JuZXIgKHNxdWFyZSB3aXRoIHNpemUgZGVmaW5lZCBieSBnRXhpdENsaWNr
QXJlYSkKKyAgICAvLyBhbmQgdGhlIHdpbmRvdyBpcyBvbiBGdWxsU2NyZWVuLCB0aGUgd2luZG93
IG11c3QgcmV0dXJuIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS4KKyAgICBpZiAoZXZlbnQtPnR5cGUo
KSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZSkgeworICAgICAgICBRTW91c2VFdmVudCog
ZXYgPSBzdGF0aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2ZW50KTsKKyAgICAgICAgaWYgKHdpbmRv
d1N0YXRlKCkgPT0gUXQ6OldpbmRvd0Z1bGxTY3JlZW4KKyAgICAgICAgICAgICYmIGV2LT5wb3Mo
KS54KCkgPiAod2lkdGgoKSAtIGdFeGl0Q2xpY2tBcmVhKQorICAgICAgICAgICAgJiYgZXYtPnBv
cygpLnkoKSA+IChoZWlnaHQoKSAtIGdFeGl0Q2xpY2tBcmVhKSkgeworCisgICAgICAgICAgICBl
bWl0IGVudGVyZWRGdWxsU2NyZWVuTW9kZShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyNp
ZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKKyAgICBpZiAoIW1fdG91
Y2hNb2NraW5nIHx8IG9iaiAhPSBtX3ZpZXcpCisgICAgICAgIHJldHVybiBRT2JqZWN0OjpldmVu
dEZpbHRlcihvYmosIGV2ZW50KTsKKworICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6
TW91c2VCdXR0b25QcmVzcworICAgICAgICB8fCBldmVudC0+dHlwZSgpID09IFFFdmVudDo6TW91
c2VCdXR0b25SZWxlYXNlCisgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpNb3Vz
ZUJ1dHRvbkRibENsaWNrCisgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpNb3Vz
ZU1vdmUpIHsKKworICAgICAgICBRTW91c2VFdmVudCogZXYgPSBzdGF0aWNfY2FzdDxRTW91c2VF
dmVudCo+KGV2ZW50KTsKKyAgICAgICAgaWYgKGV2LT50eXBlKCkgPT0gUUV2ZW50OjpNb3VzZU1v
dmUKKyAgICAgICAgICAgICYmICEoZXYtPmJ1dHRvbnMoKSAmIFF0OjpMZWZ0QnV0dG9uKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBRVG91Y2hFdmVudDo6VG91Y2hQb2lu
dCB0b3VjaFBvaW50OworICAgICAgICB0b3VjaFBvaW50LnNldFN0YXRlKFF0OjpUb3VjaFBvaW50
TW92ZWQpOworICAgICAgICBpZiAoKGV2LT50eXBlKCkgPT0gUUV2ZW50OjpNb3VzZUJ1dHRvblBy
ZXNzCisgICAgICAgICAgICAgfHwgZXYtPnR5cGUoKSA9PSBRRXZlbnQ6Ok1vdXNlQnV0dG9uRGJs
Q2xpY2spKQorICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRTdGF0ZShRdDo6VG91Y2hQb2ludFBy
ZXNzZWQpOworICAgICAgICBlbHNlIGlmIChldi0+dHlwZSgpID09IFFFdmVudDo6TW91c2VCdXR0
b25SZWxlYXNlKQorICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRTdGF0ZShRdDo6VG91Y2hQb2lu
dFJlbGVhc2VkKTsKKworICAgICAgICB0b3VjaFBvaW50LnNldElkKDApOworICAgICAgICB0b3Vj
aFBvaW50LnNldFNjcmVlblBvcyhldi0+Z2xvYmFsUG9zKCkpOworICAgICAgICB0b3VjaFBvaW50
LnNldFBvcyhldi0+cG9zKCkpOworICAgICAgICB0b3VjaFBvaW50LnNldFByZXNzdXJlKDEpOwor
CisgICAgICAgIC8vIElmIHRoZSBwb2ludCBhbHJlYWR5IGV4aXN0cywgdXBkYXRlIGl0LiBPdGhl
cndpc2UgY3JlYXRlIGl0LgorICAgICAgICBpZiAobV90b3VjaFBvaW50cy5zaXplKCkgPiAwICYm
ICFtX3RvdWNoUG9pbnRzWzBdLmlkKCkpCisgICAgICAgICAgICBtX3RvdWNoUG9pbnRzWzBdID0g
dG91Y2hQb2ludDsKKyAgICAgICAgZWxzZSBpZiAobV90b3VjaFBvaW50cy5zaXplKCkgPiAxICYm
ICFtX3RvdWNoUG9pbnRzWzFdLmlkKCkpCisgICAgICAgICAgICBtX3RvdWNoUG9pbnRzWzFdID0g
dG91Y2hQb2ludDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbV90b3VjaFBvaW50cy5hcHBl
bmQodG91Y2hQb2ludCk7CisKKyAgICAgICAgc2VuZFRvdWNoRXZlbnQoKTsKKyAgICB9IGVsc2Ug
aWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpLZXlQcmVzcworICAgICAgICAmJiBzdGF0aWNf
Y2FzdDxRS2V5RXZlbnQqPihldmVudCktPmtleSgpID09IFF0OjpLZXlfRgorICAgICAgICAmJiBz
dGF0aWNfY2FzdDxRS2V5RXZlbnQqPihldmVudCktPm1vZGlmaWVycygpID09IFF0OjpDb250cm9s
TW9kaWZpZXIpIHsKKworICAgICAgICAvLyBJZiB0aGUga2V5Ym9hcmQgcG9pbnQgaXMgYWxyZWFk
eSBwcmVzc2VkLCByZWxlYXNlIGl0LgorICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGl0IGFu
ZCBhcHBlbmQgdG8gbV90b3VjaFBvaW50cy4KKyAgICAgICAgaWYgKG1fdG91Y2hQb2ludHMuc2l6
ZSgpID4gMCAmJiBtX3RvdWNoUG9pbnRzWzBdLmlkKCkgPT0gMSkgeworICAgICAgICAgICAgbV90
b3VjaFBvaW50c1swXS5zZXRTdGF0ZShRdDo6VG91Y2hQb2ludFJlbGVhc2VkKTsKKyAgICAgICAg
ICAgIHNlbmRUb3VjaEV2ZW50KCk7CisgICAgICAgIH0gZWxzZSBpZiAobV90b3VjaFBvaW50cy5z
aXplKCkgPiAxICYmIG1fdG91Y2hQb2ludHNbMV0uaWQoKSA9PSAxKSB7CisgICAgICAgICAgICBt
X3RvdWNoUG9pbnRzWzFdLnNldFN0YXRlKFF0OjpUb3VjaFBvaW50UmVsZWFzZWQpOworICAgICAg
ICAgICAgc2VuZFRvdWNoRXZlbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFFU
b3VjaEV2ZW50OjpUb3VjaFBvaW50IHRvdWNoUG9pbnQ7CisgICAgICAgICAgICB0b3VjaFBvaW50
LnNldFN0YXRlKFF0OjpUb3VjaFBvaW50UHJlc3NlZCk7CisgICAgICAgICAgICB0b3VjaFBvaW50
LnNldElkKDEpOworICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRTY3JlZW5Qb3MoUUN1cnNvcjo6
cG9zKCkpOworICAgICAgICAgICAgdG91Y2hQb2ludC5zZXRQb3MobV92aWV3LT5tYXBGcm9tR2xv
YmFsKFFDdXJzb3I6OnBvcygpKSk7CisgICAgICAgICAgICB0b3VjaFBvaW50LnNldFByZXNzdXJl
KDEpOworICAgICAgICAgICAgbV90b3VjaFBvaW50cy5hcHBlbmQodG91Y2hQb2ludCk7CisgICAg
ICAgICAgICBzZW5kVG91Y2hFdmVudCgpOworCisgICAgICAgICAgICAvLyBBZnRlciBzZW5kaW5n
IHRoZSBldmVudCwgY2hhbmdlIHRoZSB0b3VjaHBvaW50IHN0YXRlIHRvIHN0YXRpb25hcnkKKyAg
ICAgICAgICAgIG1fdG91Y2hQb2ludHMubGFzdCgpLnNldFN0YXRlKFF0OjpUb3VjaFBvaW50U3Rh
dGlvbmFyeSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gUVRfVkVSU0lPTiA+PSBRVF9W
RVJTSU9OX0NIRUNLKDQsIDYsIDApCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTGF1
bmNoZXJXaW5kb3c6OmxvYWRTdGFydGVkKCkKK3sKKyAgICBtX3ZpZXctPnNldEZvY3VzKFF0OjpP
dGhlckZvY3VzUmVhc29uKTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6bG9hZEZpbmlzaGVk
KCkKK3sKKyAgICBRVXJsIHVybCA9IHBhZ2UoKS0+bWFpbkZyYW1lKCktPnVybCgpOworICAgIHNl
dEFkZHJlc3NVcmwodXJsLnRvU3RyaW5nKCkpOworICAgIGFkZENvbXBsZXRlckVudHJ5KHVybCk7
Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnNob3dMaW5rSG92ZXIoY29uc3QgUVN0cmluZyAm
bGluaywgY29uc3QgUVN0cmluZyAmdG9vbFRpcCkKK3sKKyNpZm5kZWYgUV9XU19NQUVNT181Cisg
ICAgc3RhdHVzQmFyKCktPnNob3dNZXNzYWdlKGxpbmspOworI2VuZGlmCisjaWZuZGVmIFFUX05P
X1RPT0xUSVAKKyAgICBpZiAoIXRvb2xUaXAuaXNFbXB0eSgpKQorICAgICAgICBRVG9vbFRpcDo6
c2hvd1RleHQoUUN1cnNvcjo6cG9zKCksIHRvb2xUaXApOworI2VuZGlmCit9CisKK3ZvaWQgTGF1
bmNoZXJXaW5kb3c6Onpvb21BbmltYXRpb25GaW5pc2hlZCgpCit7CisgICAgaWYgKCFpc0dyYXBo
aWNzQmFzZWQoKSkKKyAgICAgICAgcmV0dXJuOworICAgIFFHcmFwaGljc1dlYlZpZXcqIHZpZXcg
PSBzdGF0aWNfY2FzdDxXZWJWaWV3R3JhcGhpY3NCYXNlZCo+KG1fdmlldyktPmdyYXBoaWNzV2Vi
VmlldygpOworICAgIHZpZXctPnNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKGZhbHNlKTsKK30K
Kwordm9pZCBMYXVuY2hlcldpbmRvdzo6YXBwbHlab29tKCkKK3sKKyNpZiBRVF9WRVJTSU9OID49
IFFUX1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKKyAgICBpZiAoaXNHcmFwaGljc0Jhc2VkKCkgJiYg
cGFnZSgpLT5zZXR0aW5ncygpLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6VGlsZWRCYWNr
aW5nU3RvcmVFbmFibGVkKSkgeworICAgICAgICBRR3JhcGhpY3NXZWJWaWV3KiB2aWV3ID0gc3Rh
dGljX2Nhc3Q8V2ViVmlld0dyYXBoaWNzQmFzZWQqPihtX3ZpZXcpLT5ncmFwaGljc1dlYlZpZXco
KTsKKyAgICAgICAgdmlldy0+c2V0VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4odHJ1ZSk7CisgICAg
ICAgIGlmICghbV96b29tQW5pbWF0aW9uKSB7CisgICAgICAgICAgICBtX3pvb21BbmltYXRpb24g
PSBuZXcgUVByb3BlcnR5QW5pbWF0aW9uKHZpZXcsICJzY2FsZSIpOworICAgICAgICAgICAgbV96
b29tQW5pbWF0aW9uLT5zZXRTdGFydFZhbHVlKHZpZXctPnNjYWxlKCkpOworICAgICAgICAgICAg
Y29ubmVjdChtX3pvb21BbmltYXRpb24sIFNJR05BTChmaW5pc2hlZCgpKSwgdGhpcywgU0xPVCh6
b29tQW5pbWF0aW9uRmluaXNoZWQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
bV96b29tQW5pbWF0aW9uLT5zdG9wKCk7CisgICAgICAgICAgICBtX3pvb21BbmltYXRpb24tPnNl
dFN0YXJ0VmFsdWUobV96b29tQW5pbWF0aW9uLT5jdXJyZW50VmFsdWUoKSk7CisgICAgICAgIH0K
KworICAgICAgICBtX3pvb21BbmltYXRpb24tPnNldER1cmF0aW9uKDMwMCk7CisgICAgICAgIG1f
em9vbUFuaW1hdGlvbi0+c2V0RW5kVmFsdWUocXJlYWwobV9jdXJyZW50Wm9vbSkgLyAxMDAuKTsK
KyAgICAgICAgbV96b29tQW5pbWF0aW9uLT5zdGFydCgpOworICAgICAgICByZXR1cm47CisgICAg
fQorI2VuZGlmCisgICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0Wm9vbUZhY3RvcihxcmVhbCht
X2N1cnJlbnRab29tKSAvIDEwMC4wKTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6em9vbUlu
KCkKK3sKKyAgICBpbnQgaSA9IG1fem9vbUxldmVscy5pbmRleE9mKG1fY3VycmVudFpvb20pOwor
ICAgIFFfQVNTRVJUKGkgPj0gMCk7CisgICAgaWYgKGkgPCBtX3pvb21MZXZlbHMuY291bnQoKSAt
IDEpCisgICAgICAgIG1fY3VycmVudFpvb20gPSBtX3pvb21MZXZlbHNbaSArIDFdOworCisgICAg
YXBwbHlab29tKCk7Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6Onpvb21PdXQoKQoreworICAg
IGludCBpID0gbV96b29tTGV2ZWxzLmluZGV4T2YobV9jdXJyZW50Wm9vbSk7CisgICAgUV9BU1NF
UlQoaSA+PSAwKTsKKyAgICBpZiAoaSA+IDApCisgICAgICAgIG1fY3VycmVudFpvb20gPSBtX3pv
b21MZXZlbHNbaSAtIDFdOworCisgICAgYXBwbHlab29tKCk7Cit9CisKK3ZvaWQgTGF1bmNoZXJX
aW5kb3c6OnJlc2V0Wm9vbSgpCit7CisgICAgbV9jdXJyZW50Wm9vbSA9IDEwMDsKKyAgICBwYWdl
KCktPm1haW5GcmFtZSgpLT5zZXRab29tRmFjdG9yKDEuMCk7Cit9CisKK3ZvaWQgTGF1bmNoZXJX
aW5kb3c6OnRvZ2dsZVpvb21UZXh0T25seShib29sIGIpCit7CisgICAgcGFnZSgpLT5zZXR0aW5n
cygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpab29tVGV4dE9ubHksIGIpOworfQorCit2
b2lkIExhdW5jaGVyV2luZG93OjpwcmludCgpCit7CisjaWYgIWRlZmluZWQoUVRfTk9fUFJJTlRF
UikKKyAgICBRUHJpbnRQcmV2aWV3RGlhbG9nIGRsZyh0aGlzKTsKKyAgICBjb25uZWN0KCZkbGcs
IFNJR05BTChwYWludFJlcXVlc3RlZChRUHJpbnRlciopKSwKKyAgICAgICAgICAgIHBhZ2UoKS0+
bWFpbkZyYW1lKCksIFNMT1QocHJpbnQoUVByaW50ZXIqKSkpOworICAgIGRsZy5leGVjKCk7Cisj
ZW5kaWYKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6c2NyZWVuc2hvdCgpCit7CisgICAgUVBp
eG1hcCBwaXhtYXAgPSBRUGl4bWFwOjpncmFiV2lkZ2V0KG1fdmlldyk7CisgICAgUUxhYmVsKiBs
YWJlbCA9IG5ldyBRTGFiZWw7CisgICAgbGFiZWwtPnNldEF0dHJpYnV0ZShRdDo6V0FfRGVsZXRl
T25DbG9zZSk7CisgICAgbGFiZWwtPnNldFdpbmRvd1RpdGxlKCJTY3JlZW5zaG90IC0gUHJldmll
dyIpOworICAgIGxhYmVsLT5zZXRQaXhtYXAocGl4bWFwKTsKKyAgICBsYWJlbC0+c2hvdygpOwor
CisgICAgUVN0cmluZyBmaWxlTmFtZSA9IFFGaWxlRGlhbG9nOjpnZXRTYXZlRmlsZU5hbWUobGFi
ZWwsICJTY3JlZW5zaG90Iik7CisgICAgaWYgKCFmaWxlTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgcGl4bWFwLnNhdmUoZmlsZU5hbWUsICJwbmciKTsKKyAgICAgICAgbGFiZWwtPnNldFdpbmRv
d1RpdGxlKFFTdHJpbmcoIlNjcmVlbnNob3QgLSBTYXZlZCBhdCAlMSIpLmFyZyhmaWxlTmFtZSkp
OworICAgIH0KK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6c2V0RWRpdGFibGUoYm9vbCBvbikK
K3sKKyAgICBwYWdlKCktPnNldENvbnRlbnRFZGl0YWJsZShvbik7CisgICAgbV9mb3JtYXRNZW51
QWN0aW9uLT5zZXRWaXNpYmxlKG9uKTsKK30KKworLyoKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OmR1
bXBQbHVnaW5zKCkgeworICAgIFFMaXN0PFFXZWJQbHVnaW5JbmZvPiBwbHVnaW5zID0gUVdlYlNl
dHRpbmdzOjpwbHVnaW5EYXRhYmFzZSgpLT5wbHVnaW5zKCk7CisgICAgZm9yZWFjaCAoY29uc3Qg
UVdlYlBsdWdpbkluZm8gcGx1Z2luLCBwbHVnaW5zKSB7CisgICAgICAgIHFEZWJ1ZygpIDw8ICJQ
bHVnaW46IiA8PCBwbHVnaW4ubmFtZSgpOworICAgICAgICBmb3JlYWNoIChjb25zdCBRV2ViUGx1
Z2luSW5mbzo6TWltZVR5cGUgbWltZSwgcGx1Z2luLm1pbWVUeXBlcygpKSB7CisgICAgICAgICAg
ICBxRGVidWcoKSA8PCAiICAgIiA8PCBtaW1lLm5hbWU7CisgICAgICAgIH0KKyAgICB9Cit9Cisq
LworCit2b2lkIExhdW5jaGVyV2luZG93OjpkdW1wSHRtbCgpCit7CisgICAgcURlYnVnKCkgPDwg
IkhUTUw6ICIgPDwgcGFnZSgpLT5tYWluRnJhbWUoKS0+dG9IdG1sKCk7Cit9CisKK3ZvaWQgTGF1
bmNoZXJXaW5kb3c6OnNlbGVjdEVsZW1lbnRzKCkKK3sKKyAgICBib29sIG9rOworICAgIFFTdHJp
bmcgc3RyID0gUUlucHV0RGlhbG9nOjpnZXRUZXh0KHRoaXMsICJTZWxlY3QgZWxlbWVudHMiLCAi
Q2hvb3NlIGVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBRTGluZUVkaXQ6Ok5vcm1hbCwgImEiLCAmb2spOworCisgICAgaWYgKG9rICYmICFzdHIuaXNF
bXB0eSgpKSB7CisgICAgICAgIFFXZWJFbGVtZW50Q29sbGVjdGlvbiByZXN1bHQgPSAgcGFnZSgp
LT5tYWluRnJhbWUoKS0+ZmluZEFsbEVsZW1lbnRzKHN0cik7CisgICAgICAgIGZvcmVhY2ggKFFX
ZWJFbGVtZW50IGUsIHJlc3VsdCkKKyAgICAgICAgICAgIGUuc2V0U3R5bGVQcm9wZXJ0eSgiYmFj
a2dyb3VuZC1jb2xvciIsICJ5ZWxsb3ciKTsKKyNpZm5kZWYgUV9XU19NQUVNT181CisgICAgICAg
IHN0YXR1c0JhcigpLT5zaG93TWVzc2FnZShRU3RyaW5nKCIlMSBlbGVtZW50KHMpIHNlbGVjdGVk
IikuYXJnKHJlc3VsdC5jb3VudCgpKSwgNTAwMCk7CisjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQg
TGF1bmNoZXJXaW5kb3c6OnNldFRvdWNoTW9ja2luZyhib29sIG9uKQoreworI2lmIFFUX1ZFUlNJ
T04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQorICAgIG1fdG91Y2hNb2NraW5nID0gb247
CisjZW5kaWYKK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlQWNjZWxlcmF0ZWRDb21w
b3NpdGluZyhib29sIHRvZ2dsZSkKK3sKKyAgICBnVXNlQ29tcG9zaXRpbmcgPSB0b2dnbGU7Cisg
ICAgcGFnZSgpLT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpBY2NlbGVy
YXRlZENvbXBvc2l0aW5nRW5hYmxlZCwgdG9nZ2xlKTsKK30KKwordm9pZCBMYXVuY2hlcldpbmRv
dzo6dG9nZ2xlVGlsZWRCYWNraW5nU3RvcmUoYm9vbCB0b2dnbGUpCit7CisgICAgcGFnZSgpLT5z
ZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9yZUVu
YWJsZWQsIHRvZ2dsZSk7Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZVJlc2l6ZXNU
b0NvbnRlbnRzKGJvb2wgdG9nZ2xlKQoreworICAgIHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGlj
c0Jhc2VkKj4obV92aWV3KS0+c2V0UmVzaXplc1RvQ29udGVudHModG9nZ2xlKTsKK30KKwordm9p
ZCBMYXVuY2hlcldpbmRvdzo6dG9nZ2xlV2ViR0woYm9vbCB0b2dnbGUpCit7CisgICAgcGFnZSgp
LT5zZXR0aW5ncygpLT5zZXRBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpXZWJHTEVuYWJsZWQsIHRv
Z2dsZSk7Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OmluaXRpYWxpemVWaWV3KGJvb2wgdXNl
R3JhcGhpY3NWaWV3KQoreworICAgIGRlbGV0ZSBtX3ZpZXc7CisKKyAgICBRU3BsaXR0ZXIqIHNw
bGl0dGVyID0gc3RhdGljX2Nhc3Q8UVNwbGl0dGVyKj4oY2VudHJhbFdpZGdldCgpKTsKKworICAg
IGlmICghdXNlR3JhcGhpY3NWaWV3KSB7CisgICAgICAgIFdlYlZpZXdUcmFkaXRpb25hbCogdmll
dyA9IG5ldyBXZWJWaWV3VHJhZGl0aW9uYWwoc3BsaXR0ZXIpOworICAgICAgICB2aWV3LT5zZXRQ
YWdlKHBhZ2UoKSk7CisKKyAgICAgICAgdmlldy0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOwor
CisgICAgICAgIG1fdmlldyA9IHZpZXc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgV2ViVmlld0dy
YXBoaWNzQmFzZWQqIHZpZXcgPSBuZXcgV2ViVmlld0dyYXBoaWNzQmFzZWQoc3BsaXR0ZXIpOwor
ICAgICAgICB2aWV3LT5zZXRQYWdlKHBhZ2UoKSk7CisKKyAgICAgICAgaWYgKG1fZmxpcEFuaW1h
dGVkKQorICAgICAgICAgICAgY29ubmVjdChtX2ZsaXBBbmltYXRlZCwgU0lHTkFMKHRyaWdnZXJl
ZCgpKSwgdmlldywgU0xPVChhbmltYXRlZEZsaXAoKSkpOworCisgICAgICAgIGlmIChtX2ZsaXBZ
QW5pbWF0ZWQpCisgICAgICAgICAgICBjb25uZWN0KG1fZmxpcFlBbmltYXRlZCwgU0lHTkFMKHRy
aWdnZXJlZCgpKSwgdmlldywgU0xPVChhbmltYXRlZFlGbGlwKCkpKTsKKworICAgICAgICBjb25u
ZWN0KHZpZXcsIFNJR05BTChjdXJyZW50RlBTVXBkYXRlZChpbnQpKSwgdGhpcywgU0xPVCh1cGRh
dGVGUFMoaW50KSkpOworCisgICAgICAgIC8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBRQWJzdHJh
Y3RTY3JvbGxBcmVhOjpldmVudEZpbHRlciBtYWtlcyB1cyBuZWVkCisgICAgICAgIC8vIHRvIGlu
c3RhbGwgdGhlIGV2ZW50IGZpbHRlciBvbiB0aGUgdmlld3BvcnQgb2YgYSBRR3JhcGhpY3NWaWV3
LgorICAgICAgICB2aWV3LT52aWV3cG9ydCgpLT5pbnN0YWxsRXZlbnRGaWx0ZXIodGhpcyk7CisK
KyAgICAgICAgbV92aWV3ID0gdmlldzsKKyAgICB9CisKKyNpZiBRVF9WRVJTSU9OID49IFFUX1ZF
UlNJT05fQ0hFQ0soNCwgNiwgMCkKKyAgICBtX3RvdWNoTW9ja2luZyA9IGZhbHNlOworI2VuZGlm
Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZVNwYXRpYWxOYXZpZ2F0aW9uKGJvb2wg
YikKK3sKKyAgICBwYWdlKCktPnNldHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6
OlNwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZCwgYik7Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6
OnRvZ2dsZUZ1bGxTY3JlZW5Nb2RlKGJvb2wgZW5hYmxlKQoreworICAgIGlmIChlbmFibGUpCisg
ICAgICAgIHNldFdpbmRvd1N0YXRlKFF0OjpXaW5kb3dGdWxsU2NyZWVuKTsKKyAgICBlbHNlIHsK
KyNpZiBkZWZpbmVkKFFfV1NfUzYwKQorICAgICAgICBzZXRXaW5kb3dTdGF0ZShRdDo6V2luZG93
TWF4aW1pemVkKTsKKyNlbHNlCisgICAgICAgIHNldFdpbmRvd1N0YXRlKFF0OjpXaW5kb3dOb1N0
YXRlKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBMYXVuY2hlcldpbmRvdzo6c2hvd0ZQUyhi
b29sIGVuYWJsZSkKK3sKKyAgICBpZiAoIWlzR3JhcGhpY3NCYXNlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBnU2hvd0ZyYW1lUmF0ZSA9IGVuYWJsZTsKKyAgICBXZWJWaWV3R3JhcGhpY3NC
YXNlZCogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGljc0Jhc2VkKj4obV92aWV3KTsK
KyAgICB2aWV3LT5zZXRGcmFtZVJhdGVNZWFzdXJlbWVudEVuYWJsZWQoZW5hYmxlKTsKKworICAg
IGlmICghZW5hYmxlKSB7CisjaWYgZGVmaW5lZChRX1dTX01BRU1PXzUpICYmIGRlZmluZWQoUV9X
U19TNjApCisgICAgICAgIHNldFdpbmRvd1RpdGxlKCIiKTsKKyNlbHNlCisgICAgICAgIHN0YXR1
c0JhcigpLT5jbGVhck1lc3NhZ2UoKTsKKyNlbmRpZgorICAgIH0KK30KKwordm9pZCBMYXVuY2hl
cldpbmRvdzo6Y2hhbmdlVmlld3BvcnRVcGRhdGVNb2RlKGludCBtb2RlKQoreworICAgIGdWaWV3
cG9ydFVwZGF0ZU1vZGUgPSBRR3JhcGhpY3NWaWV3OjpWaWV3cG9ydFVwZGF0ZU1vZGUobW9kZSk7
CisKKyAgICBpZiAoIWlzR3JhcGhpY3NCYXNlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBX
ZWJWaWV3R3JhcGhpY3NCYXNlZCogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGljc0Jh
c2VkKj4obV92aWV3KTsKKyAgICB2aWV3LT5zZXRWaWV3cG9ydFVwZGF0ZU1vZGUoZ1ZpZXdwb3J0
VXBkYXRlTW9kZSk7Cit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZUZyYW1lRmxhdHRl
bmluZyhib29sIHRvZ2dsZSkKK3sKKyAgICBnVXNlRnJhbWVGbGF0dGVuaW5nID0gdG9nZ2xlOwor
ICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6RnJhbWVG
bGF0dGVuaW5nRW5hYmxlZCwgdG9nZ2xlKTsKK30KKworI2lmIGRlZmluZWQoUVRfQ09ORklHVVJF
RF9XSVRIX09QRU5HTCkKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnRvZ2dsZVFHTFdpZGdldFZpZXdw
b3J0KGJvb2wgZW5hYmxlKQoreworICAgIGlmICghaXNHcmFwaGljc0Jhc2VkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIGdVc2VRR0xXaWRnZXRWaWV3cG9ydCA9IGVuYWJsZTsKKyAgICBXZWJW
aWV3R3JhcGhpY3NCYXNlZCogdmlldyA9IHN0YXRpY19jYXN0PFdlYlZpZXdHcmFwaGljc0Jhc2Vk
Kj4obV92aWV3KTsKKworICAgIHZpZXctPnNldFZpZXdwb3J0KGVuYWJsZSA/IG5ldyBRR0xXaWRn
ZXQoKSA6IDApOworfQorI2VuZGlmCisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OnNob3dVc2VyQWdl
bnREaWFsb2coKQoreworICAgIFFTdHJpbmdMaXN0IGl0ZW1zOworICAgIFFGaWxlIGZpbGUoIjov
dXNlcmFnZW50bGlzdC50eHQiKTsKKyAgICBpZiAoZmlsZS5vcGVuKFFJT0RldmljZTo6UmVhZE9u
bHkpKSB7CisgICAgICAgICB3aGlsZSAoIWZpbGUuYXRFbmQoKSkKKyAgICAgICAgICAgIGl0ZW1z
IDw8IGZpbGUucmVhZExpbmUoKS50cmltbWVkKCk7CisgICAgICAgIGZpbGUuY2xvc2UoKTsKKyAg
ICB9CisKKyAgICBRU2V0dGluZ3Mgc2V0dGluZ3M7CisgICAgUVN0cmluZyBjdXN0b21Vc2VyQWdl
bnQgPSBzZXR0aW5ncy52YWx1ZSgiQ3VzdG9tVXNlckFnZW50IikudG9TdHJpbmcoKTsKKyAgICBp
ZiAoIWl0ZW1zLmNvbnRhaW5zKGN1c3RvbVVzZXJBZ2VudCkgJiYgIWN1c3RvbVVzZXJBZ2VudC5p
c0VtcHR5KCkpCisgICAgICAgIGl0ZW1zIDw8IGN1c3RvbVVzZXJBZ2VudDsKKworICAgIFFEaWFs
b2cqIGRpYWxvZyA9IG5ldyBRRGlhbG9nKHRoaXMpOworICAgIGRpYWxvZy0+c2V0V2luZG93VGl0
bGUoIkNoYW5nZSBVc2VyIEFnZW50Iik7CisKKyAgICBRVkJveExheW91dCogbGF5b3V0ID0gbmV3
IFFWQm94TGF5b3V0KGRpYWxvZyk7CisgICAgZGlhbG9nLT5zZXRMYXlvdXQobGF5b3V0KTsKKwor
ICAgIFFDb21ib0JveCogY29tYm8gPSBuZXcgUUNvbWJvQm94KGRpYWxvZyk7CisgICAgY29tYm8t
PnNldE1heGltdW1XaWR0aChzaXplKCkud2lkdGgoKSAqIDAuNyk7CisgICAgY29tYm8tPnNldEVk
aXRhYmxlKHRydWUpOworICAgIGNvbWJvLT5pbnNlcnRJdGVtcygwLCBpdGVtcyk7CisgICAgbGF5
b3V0LT5hZGRXaWRnZXQoY29tYm8pOworCisgICAgaW50IGluZGV4ID0gY29tYm8tPmZpbmRUZXh0
KHBhZ2UoKS0+dXNlckFnZW50Rm9yVXJsKFFVcmwoKSkpOworICAgIGNvbWJvLT5zZXRDdXJyZW50
SW5kZXgoaW5kZXgpOworCisgICAgUURpYWxvZ0J1dHRvbkJveCogYnV0dG9uQm94ID0gbmV3IFFE
aWFsb2dCdXR0b25Cb3goUURpYWxvZ0J1dHRvbkJveDo6T2sKKyAgICAgICAgICAgIHwgUURpYWxv
Z0J1dHRvbkJveDo6Q2FuY2VsLCBRdDo6SG9yaXpvbnRhbCwgZGlhbG9nKTsKKyAgICBjb25uZWN0
KGJ1dHRvbkJveCwgU0lHTkFMKGFjY2VwdGVkKCkpLCBkaWFsb2csIFNMT1QoYWNjZXB0KCkpKTsK
KyAgICBjb25uZWN0KGJ1dHRvbkJveCwgU0lHTkFMKHJlamVjdGVkKCkpLCBkaWFsb2csIFNMT1Qo
cmVqZWN0KCkpKTsKKyAgICBsYXlvdXQtPmFkZFdpZGdldChidXR0b25Cb3gpOworCisgICAgaWYg
KGRpYWxvZy0+ZXhlYygpICYmICFjb21iby0+Y3VycmVudFRleHQoKS5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgcGFnZSgpLT5zZXRVc2VyQWdlbnQoY29tYm8tPmN1cnJlbnRUZXh0KCkpOworICAgICAg
ICBpZiAoIWl0ZW1zLmNvbnRhaW5zKGNvbWJvLT5jdXJyZW50VGV4dCgpKSkKKyAgICAgICAgICAg
IHNldHRpbmdzLnNldFZhbHVlKCJDdXN0b21Vc2VyQWdlbnQiLCBjb21iby0+Y3VycmVudFRleHQo
KSk7CisgICAgfQorCisgICAgZGVsZXRlIGRpYWxvZzsKK30KKwordm9pZCBMYXVuY2hlcldpbmRv
dzo6bmV3V2luZG93KCkKK3sKKyAgICBMYXVuY2hlcldpbmRvdyogbXcgPSBuZXcgTGF1bmNoZXJX
aW5kb3codGhpcywgZmFsc2UpOworICAgIG13LT5zaG93KCk7Cit9CisKK3ZvaWQgTGF1bmNoZXJX
aW5kb3c6OmNsb25lV2luZG93KCkKK3sKKyAgICBMYXVuY2hlcldpbmRvdyogbXcgPSBuZXcgTGF1
bmNoZXJXaW5kb3codGhpcywgdHJ1ZSk7CisgICAgbXctPnNob3coKTsKK30KKwordm9pZCBMYXVu
Y2hlcldpbmRvdzo6dXBkYXRlRlBTKGludCBmcHMpCit7CisgICAgUVN0cmluZyBmcHNTdGF0dXNU
ZXh0ID0gUVN0cmluZygiQ3VycmVudCBGUFM6ICUxIikuYXJnKGZwcyk7CisKKyNpZiBkZWZpbmVk
KFFfV1NfTUFFTU9fNSkgJiYgZGVmaW5lZChRX1dTX1M2MCkKKyAgICBzZXRXaW5kb3dUaXRsZShm
cHNTdGF0dXNUZXh0KTsKKyNlbHNlCisgICAgc3RhdHVzQmFyKCktPnNob3dNZXNzYWdlKGZwc1N0
YXR1c1RleHQpOworI2VuZGlmCit9CisKK3ZvaWQgTGF1bmNoZXJXaW5kb3c6OmNyZWF0ZUNocm9t
ZSgpCit7CisgICAgUU1lbnUqIGZpbGVNZW51ID0gbWVudUJhcigpLT5hZGRNZW51KCImRmlsZSIp
OworICAgIGZpbGVNZW51LT5hZGRBY3Rpb24oIk5ldyBXaW5kb3ciLCB0aGlzLCBTTE9UKG5ld1dp
bmRvdygpKSwgUUtleVNlcXVlbmNlOjpOZXcpOworICAgIGZpbGVNZW51LT5hZGRBY3Rpb24odHIo
Ik9wZW4gRmlsZS4uLiIpLCB0aGlzLCBTTE9UKG9wZW5GaWxlKCkpLCBRS2V5U2VxdWVuY2U6Ok9w
ZW4pOworICAgIGZpbGVNZW51LT5hZGRBY3Rpb24oIkNsb3NlIFdpbmRvdyIsIHRoaXMsIFNMT1Qo
Y2xvc2UoKSksIFFLZXlTZXF1ZW5jZTo6Q2xvc2UpOworICAgIGZpbGVNZW51LT5hZGRTZXBhcmF0
b3IoKTsKKyAgICBmaWxlTWVudS0+YWRkQWN0aW9uKCJUYWtlIFNjcmVlbiBTaG90Li4uIiwgdGhp
cywgU0xPVChzY3JlZW5zaG90KCkpKTsKKyAgICBmaWxlTWVudS0+YWRkQWN0aW9uKHRyKCJQcmlu
dC4uLiIpLCB0aGlzLCBTTE9UKHByaW50KCkpLCBRS2V5U2VxdWVuY2U6OlByaW50KTsKKyAgICBm
aWxlTWVudS0+YWRkU2VwYXJhdG9yKCk7CisgICAgZmlsZU1lbnUtPmFkZEFjdGlvbigiUXVpdCIs
IFFBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSwgU0xPVChjbG9zZUFsbFdpbmRvd3MoKSksIFFLZXlT
ZXF1ZW5jZShRdDo6Q1RSTCB8IFF0OjpLZXlfUSkpOworCisgICAgUU1lbnUqIGVkaXRNZW51ID0g
bWVudUJhcigpLT5hZGRNZW51KCImRWRpdCIpOworICAgIGVkaXRNZW51LT5hZGRBY3Rpb24ocGFn
ZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlVuZG8pKTsKKyAgICBlZGl0TWVudS0+YWRkQWN0aW9uKHBh
Z2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpSZWRvKSk7CisgICAgZWRpdE1lbnUtPmFkZFNlcGFyYXRv
cigpOworICAgIGVkaXRNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OkN1
dCkpOworICAgIGVkaXRNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OkNv
cHkpKTsKKyAgICBlZGl0TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpQ
YXN0ZSkpOworICAgIGVkaXRNZW51LT5hZGRTZXBhcmF0b3IoKTsKKyAgICBRQWN0aW9uKiBzZXRF
ZGl0YWJsZSA9IGVkaXRNZW51LT5hZGRBY3Rpb24oIlNldCBFZGl0YWJsZSIsIHRoaXMsIFNMT1Qo
c2V0RWRpdGFibGUoYm9vbCkpKTsKKyAgICBzZXRFZGl0YWJsZS0+c2V0Q2hlY2thYmxlKHRydWUp
OworCisgICAgUU1lbnUqIHZpZXdNZW51ID0gbWVudUJhcigpLT5hZGRNZW51KCImVmlldyIpOwor
ICAgIHZpZXdNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlN0b3ApKTsK
KyAgICB2aWV3TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQp
KTsKKyAgICB2aWV3TWVudS0+YWRkU2VwYXJhdG9yKCk7CisgICAgUUFjdGlvbiogem9vbUluID0g
dmlld01lbnUtPmFkZEFjdGlvbigiWm9vbSAmSW4iLCB0aGlzLCBTTE9UKHpvb21JbigpKSk7Cisg
ICAgUUFjdGlvbiogem9vbU91dCA9IHZpZXdNZW51LT5hZGRBY3Rpb24oIlpvb20gJk91dCIsIHRo
aXMsIFNMT1Qoem9vbU91dCgpKSk7CisgICAgUUFjdGlvbiogcmVzZXRab29tID0gdmlld01lbnUt
PmFkZEFjdGlvbigiUmVzZXQgWm9vbSIsIHRoaXMsIFNMT1QocmVzZXRab29tKCkpKTsKKyAgICBR
QWN0aW9uKiB6b29tVGV4dE9ubHkgPSB2aWV3TWVudS0+YWRkQWN0aW9uKCJab29tIFRleHQgT25s
eSIsIHRoaXMsIFNMT1QodG9nZ2xlWm9vbVRleHRPbmx5KGJvb2wpKSk7CisgICAgem9vbVRleHRP
bmx5LT5zZXRDaGVja2FibGUodHJ1ZSk7CisgICAgem9vbVRleHRPbmx5LT5zZXRDaGVja2VkKGZh
bHNlKTsKKyAgICB2aWV3TWVudS0+YWRkU2VwYXJhdG9yKCk7CisgICAgdmlld01lbnUtPmFkZEFj
dGlvbigiRHVtcCBIVE1MIiwgdGhpcywgU0xPVChkdW1wSHRtbCgpKSk7CisgICAgLy8gdmlld01l
bnUtPmFkZEFjdGlvbigiRHVtcCBwbHVnaW5zIiwgdGhpcywgU0xPVChkdW1wUGx1Z2lucygpKSk7
CisKKyAgICBRTWVudSogZm9ybWF0TWVudSA9IG5ldyBRTWVudSgiRiZvcm1hdCIsIHRoaXMpOwor
ICAgIG1fZm9ybWF0TWVudUFjdGlvbiA9IG1lbnVCYXIoKS0+YWRkTWVudShmb3JtYXRNZW51KTsK
KyAgICBtX2Zvcm1hdE1lbnVBY3Rpb24tPnNldFZpc2libGUoZmFsc2UpOworICAgIGZvcm1hdE1l
bnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlQm9sZCkpOworICAg
IGZvcm1hdE1lbnUtPmFkZEFjdGlvbihwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlSXRh
bGljKSk7CisgICAgZm9ybWF0TWVudS0+YWRkQWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdl
OjpUb2dnbGVVbmRlcmxpbmUpKTsKKyAgICBRTWVudSogd3JpdGluZ01lbnUgPSBmb3JtYXRNZW51
LT5hZGRNZW51KHRyKCJXcml0aW5nIERpcmVjdGlvbiIpKTsKKyAgICB3cml0aW5nTWVudS0+YWRk
QWN0aW9uKHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdCkp
OworICAgIHdyaXRpbmdNZW51LT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlNl
dFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodCkpOworICAgIHdyaXRpbmdNZW51LT5hZGRBY3Rpb24o
cGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdCkpOwor
CisgICAgem9vbUluLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6S2V5
X1BsdXMpKTsKKyAgICB6b29tT3V0LT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwg
fCBRdDo6S2V5X01pbnVzKSk7CisgICAgcmVzZXRab29tLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVu
Y2UoUXQ6OkNUUkwgfCBRdDo6S2V5XzApKTsKKworICAgIFFNZW51KiB3aW5kb3dNZW51ID0gbWVu
dUJhcigpLT5hZGRNZW51KCImV2luZG93Iik7CisgICAgUUFjdGlvbiogdG9nZ2xlRnVsbFNjcmVl
biA9IHdpbmRvd01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIEZ1bGxTY3JlZW4iLCB0aGlzLCBTSUdO
QUwoZW50ZXJlZEZ1bGxTY3JlZW5Nb2RlKGJvb2wpKSk7CisgICAgdG9nZ2xlRnVsbFNjcmVlbi0+
c2V0Q2hlY2thYmxlKHRydWUpOworICAgIHRvZ2dsZUZ1bGxTY3JlZW4tPnNldENoZWNrZWQoZmFs
c2UpOworCisgICAgLy8gd2hlbiBleGl0IGZ1bGxzY3JlZW4gbW9kZSBieSBjbGlja2luZyBvbiB0
aGUgZXhpdCBhcmVhIChib3R0b20gcmlnaHQgY29ybmVyKSB3ZSBtdXN0CisgICAgLy8gdW5jaGVj
ayB0aGUgVG9nZ2xlIEZ1bGxTY3JlZW4gYWN0aW9uCisgICAgdG9nZ2xlRnVsbFNjcmVlbi0+Y29u
bmVjdCh0aGlzLCBTSUdOQUwoZW50ZXJlZEZ1bGxTY3JlZW5Nb2RlKGJvb2wpKSwgU0xPVChzZXRD
aGVja2VkKGJvb2wpKSk7CisKKyAgICBRTWVudSogdG9vbHNNZW51ID0gbWVudUJhcigpLT5hZGRN
ZW51KCImRGV2ZWxvcCIpOworICAgIHRvb2xzTWVudS0+YWRkQWN0aW9uKCJTZWxlY3QgRWxlbWVu
dHMuLi4iLCB0aGlzLCBTTE9UKHNlbGVjdEVsZW1lbnRzKCkpKTsKKyAgICBRQWN0aW9uKiBzaG93
SW5zcGVjdG9yQWN0aW9uID0gdG9vbHNNZW51LT5hZGRBY3Rpb24oIlNob3cgV2ViIEluc3BlY3Rv
ciIsIG1faW5zcGVjdG9yLCBTTE9UKHNldFZpc2libGUoYm9vbCkpLCBRS2V5U2VxdWVuY2UoUXQ6
OkNUUkwgfCBRdDo6QUxUIHwgUXQ6OktleV9JKSk7CisgICAgc2hvd0luc3BlY3RvckFjdGlvbi0+
c2V0Q2hlY2thYmxlKHRydWUpOworICAgIHNob3dJbnNwZWN0b3JBY3Rpb24tPmNvbm5lY3QobV9p
bnNwZWN0b3IsIFNJR05BTCh2aXNpYmxlQ2hhbmdlZChib29sKSksIFNMT1Qoc2V0Q2hlY2tlZChi
b29sKSkpOworCisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9OX0NIRUNLKDQsIDYsIDApCisg
ICAgUUFjdGlvbiogdG91Y2hNb2NrQWN0aW9uID0gdG9vbHNNZW51LT5hZGRBY3Rpb24oIlRvZ2ds
ZSBtdWx0aXRvdWNoIG1vY2tpbmciLCB0aGlzLCBTTE9UKHNldFRvdWNoTW9ja2luZyhib29sKSkp
OworICAgIHRvdWNoTW9ja0FjdGlvbi0+c2V0Q2hlY2thYmxlKHRydWUpOworICAgIHRvdWNoTW9j
a0FjdGlvbi0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OkFMVCB8IFF0
OjpLZXlfVCkpOworI2VuZGlmCisKKyAgICBRV2ViU2V0dGluZ3MqIHNldHRpbmdzID0gcGFnZSgp
LT5zZXR0aW5ncygpOworCisgICAgUU1lbnUqIGdyYXBoaWNzVmlld01lbnUgPSB0b29sc01lbnUt
PmFkZE1lbnUoIlFHcmFwaGljc1ZpZXciKTsKKyAgICBRQWN0aW9uKiB0b2dnbGVHcmFwaGljc1Zp
ZXcgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSB1c2Ugb2YgUUdyYXBoaWNz
VmlldyIsIHRoaXMsIFNMT1QoaW5pdGlhbGl6ZVZpZXcoYm9vbCkpKTsKKyAgICB0b2dnbGVHcmFw
aGljc1ZpZXctPnNldENoZWNrYWJsZSh0cnVlKTsKKyAgICB0b2dnbGVHcmFwaGljc1ZpZXctPnNl
dENoZWNrZWQoaXNHcmFwaGljc0Jhc2VkKCkpOworCisgICAgUUFjdGlvbiogdG9nZ2xlV2ViR0wg
PSB0b29sc01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIFdlYkdMIiwgdGhpcywgU0xPVCh0b2dnbGVX
ZWJHTChib29sKSkpOworICAgIHRvZ2dsZVdlYkdMLT5zZXRDaGVja2FibGUodHJ1ZSk7CisgICAg
dG9nZ2xlV2ViR0wtPnNldENoZWNrZWQoc2V0dGluZ3MtPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRp
bmdzOjpXZWJHTEVuYWJsZWQpKTsKKworICAgIFFBY3Rpb24qIHRvZ2dsZUFjY2VsZXJhdGVkQ29t
cG9zaXRpbmcgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSBBY2NlbGVyYXRl
ZCBDb21wb3NpdGluZyIsIHRoaXMsIFNMT1QodG9nZ2xlQWNjZWxlcmF0ZWRDb21wb3NpdGluZyhi
b29sKSkpOworICAgIHRvZ2dsZUFjY2VsZXJhdGVkQ29tcG9zaXRpbmctPnNldENoZWNrYWJsZSh0
cnVlKTsKKyAgICB0b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nLT5zZXRDaGVja2VkKHNldHRp
bmdzLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0Vu
YWJsZWQpKTsKKyAgICB0b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nLT5zZXRFbmFibGVkKGlz
R3JhcGhpY3NCYXNlZCgpKTsKKyAgICB0b2dnbGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nLT5jb25u
ZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldEVu
YWJsZWQoYm9vbCkpKTsKKworICAgIFFBY3Rpb24qIHRvZ2dsZVJlc2l6ZXNUb0NvbnRlbnRzID0g
Z3JhcGhpY3NWaWV3TWVudS0+YWRkQWN0aW9uKCJUb2dnbGUgUmVzaXplcyBUbyBDb250ZW50cyBN
b2RlIiwgdGhpcywgU0xPVCh0b2dnbGVSZXNpemVzVG9Db250ZW50cyhib29sKSkpOworICAgIHRv
Z2dsZVJlc2l6ZXNUb0NvbnRlbnRzLT5zZXRDaGVja2FibGUodHJ1ZSk7CisgICAgdG9nZ2xlUmVz
aXplc1RvQ29udGVudHMtPnNldENoZWNrZWQoZmFsc2UpOworICAgIHRvZ2dsZVJlc2l6ZXNUb0Nv
bnRlbnRzLT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICB0b2dnbGVSZXNpemVzVG9Db250ZW50cy0+
Y29ubmVjdCh0b2dnbGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChz
ZXRFbmFibGVkKGJvb2wpKSk7CisKKyAgICBRQWN0aW9uKiB0b2dnbGVUaWxlZEJhY2tpbmdTdG9y
ZSA9IGdyYXBoaWNzVmlld01lbnUtPmFkZEFjdGlvbigiVG9nZ2xlIFRpbGVkIEJhY2tpbmcgU3Rv
cmUiLCB0aGlzLCBTTE9UKHRvZ2dsZVRpbGVkQmFja2luZ1N0b3JlKGJvb2wpKSk7CisgICAgdG9n
Z2xlVGlsZWRCYWNraW5nU3RvcmUtPnNldENoZWNrYWJsZSh0cnVlKTsKKyAgICB0b2dnbGVUaWxl
ZEJhY2tpbmdTdG9yZS0+c2V0Q2hlY2tlZChmYWxzZSk7CisgICAgdG9nZ2xlVGlsZWRCYWNraW5n
U3RvcmUtPnNldEVuYWJsZWQoZmFsc2UpOworICAgIHRvZ2dsZVRpbGVkQmFja2luZ1N0b3JlLT5j
b25uZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNl
dEVuYWJsZWQoYm9vbCkpKTsKKworICAgIFFBY3Rpb24qIHNwYXRpYWxOYXZpZ2F0aW9uQWN0aW9u
ID0gdG9vbHNNZW51LT5hZGRBY3Rpb24oIlRvZ2dsZSBTcGF0aWFsIE5hdmlnYXRpb24iLCB0aGlz
LCBTTE9UKHRvZ2dsZVNwYXRpYWxOYXZpZ2F0aW9uKGJvb2wpKSk7CisgICAgc3BhdGlhbE5hdmln
YXRpb25BY3Rpb24tPnNldENoZWNrYWJsZSh0cnVlKTsKKyAgICBzcGF0aWFsTmF2aWdhdGlvbkFj
dGlvbi0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OlNISUZUIHwgUXQ6
OktleV9TKSk7CisKKyAgICBRQWN0aW9uKiB0b2dnbGVGcmFtZUZsYXR0ZW5pbmcgPSB0b29sc01l
bnUtPmFkZEFjdGlvbigiVG9nZ2xlIEZyYW1lIEZsYXR0ZW5pbmciLCB0aGlzLCBTTE9UKHRvZ2ds
ZUZyYW1lRmxhdHRlbmluZyhib29sKSkpOworICAgIHRvZ2dsZUZyYW1lRmxhdHRlbmluZy0+c2V0
Q2hlY2thYmxlKHRydWUpOworICAgIHRvZ2dsZUZyYW1lRmxhdHRlbmluZy0+c2V0Q2hlY2tlZChz
ZXR0aW5ncy0+dGVzdEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkZyYW1lRmxhdHRlbmluZ0VuYWJs
ZWQpKTsKKworI2lmIGRlZmluZWQoUVRfQ09ORklHVVJFRF9XSVRIX09QRU5HTCkKKyAgICBRQWN0
aW9uKiB0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydCA9IGdyYXBoaWNzVmlld01lbnUtPmFkZEFjdGlv
bigiVG9nZ2xlIHVzZSBvZiBRR0xXaWRnZXQgVmlld3BvcnQiLCB0aGlzLCBTTE9UKHRvZ2dsZVFH
TFdpZGdldFZpZXdwb3J0KGJvb2wpKSk7CisgICAgdG9nZ2xlUUdMV2lkZ2V0Vmlld3BvcnQtPnNl
dENoZWNrYWJsZSh0cnVlKTsKKyAgICB0b2dnbGVRR0xXaWRnZXRWaWV3cG9ydC0+c2V0Q2hlY2tl
ZChnVXNlUUdMV2lkZ2V0Vmlld3BvcnQpOworICAgIHRvZ2dsZVFHTFdpZGdldFZpZXdwb3J0LT5z
ZXRFbmFibGVkKGlzR3JhcGhpY3NCYXNlZCgpKTsKKyAgICB0b2dnbGVRR0xXaWRnZXRWaWV3cG9y
dC0+Y29ubmVjdCh0b2dnbGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xP
VChzZXRFbmFibGVkKGJvb2wpKSk7CisjZW5kaWYKKworICAgIFFBY3Rpb24qIHVzZXJBZ2VudEFj
dGlvbiA9IHRvb2xzTWVudS0+YWRkQWN0aW9uKCJDaGFuZ2UgVXNlciBBZ2VudCIsIHRoaXMsIFNM
T1Qoc2hvd1VzZXJBZ2VudERpYWxvZygpKSk7CisgICAgdXNlckFnZW50QWN0aW9uLT5zZXRTaG9y
dGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6U0hJRlQgfCBRdDo6S2V5X1UpKTsKKwor
ICAgIGdyYXBoaWNzVmlld01lbnUtPmFkZFNlcGFyYXRvcigpOworCisgICAgbV9mbGlwQW5pbWF0
ZWQgPSBncmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIkFuaW1hdGVkIEZsaXAiKTsKKyAgICBt
X2ZsaXBBbmltYXRlZC0+Y29ubmVjdCh0b2dnbGVHcmFwaGljc1ZpZXcsIFNJR05BTCh0b2dnbGVk
KGJvb2wpKSwgU0xPVChzZXRFbmFibGVkKGJvb2wpKSk7CisgICAgbV9mbGlwQW5pbWF0ZWQtPnNl
dEVuYWJsZWQoaXNHcmFwaGljc0Jhc2VkKCkpOworCisgICAgbV9mbGlwWUFuaW1hdGVkID0gZ3Jh
cGhpY3NWaWV3TWVudS0+YWRkQWN0aW9uKCJBbmltYXRlZCBZLUZsaXAiKTsKKyAgICBtX2ZsaXBZ
QW5pbWF0ZWQtPmNvbm5lY3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29s
KSksIFNMT1Qoc2V0RW5hYmxlZChib29sKSkpOworICAgIG1fZmxpcFlBbmltYXRlZC0+c2V0RW5h
YmxlZChpc0dyYXBoaWNzQmFzZWQoKSk7CisKKyAgICBpZiAoaXNHcmFwaGljc0Jhc2VkKCkpIHsK
KyAgICAgICAgV2ViVmlld0dyYXBoaWNzQmFzZWQqIHZpZXcgPSBzdGF0aWNfY2FzdDxXZWJWaWV3
R3JhcGhpY3NCYXNlZCo+KG1fdmlldyk7CisgICAgICAgIGNvbm5lY3QobV9mbGlwQW5pbWF0ZWQs
IFNJR05BTCh0cmlnZ2VyZWQoKSksIHZpZXcsIFNMT1QoYW5pbWF0ZWRGbGlwKCkpKTsKKyAgICAg
ICAgY29ubmVjdChtX2ZsaXBZQW5pbWF0ZWQsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHZpZXcsIFNM
T1QoYW5pbWF0ZWRZRmxpcCgpKSk7CisgICAgfQorCisgICAgZ3JhcGhpY3NWaWV3TWVudS0+YWRk
U2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9uKiBjbG9uZVdpbmRvdyA9IGdyYXBoaWNzVmlld01l
bnUtPmFkZEFjdGlvbigiQ2xvbmUgV2luZG93IiwgdGhpcywgU0xPVChjbG9uZVdpbmRvdygpKSk7
CisgICAgY2xvbmVXaW5kb3ctPmNvbm5lY3QodG9nZ2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9n
Z2xlZChib29sKSksIFNMT1Qoc2V0RW5hYmxlZChib29sKSkpOworICAgIGNsb25lV2luZG93LT5z
ZXRFbmFibGVkKGlzR3JhcGhpY3NCYXNlZCgpKTsKKworICAgIFFBY3Rpb24qIHNob3dGUFMgPSBn
cmFwaGljc1ZpZXdNZW51LT5hZGRBY3Rpb24oIlNob3cgRlBTIiwgdGhpcywgU0xPVChzaG93RlBT
KGJvb2wpKSk7CisgICAgc2hvd0ZQUy0+c2V0Q2hlY2thYmxlKHRydWUpOworICAgIHNob3dGUFMt
PnNldEVuYWJsZWQoaXNHcmFwaGljc0Jhc2VkKCkpOworICAgIHNob3dGUFMtPmNvbm5lY3QodG9n
Z2xlR3JhcGhpY3NWaWV3LCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0RW5hYmxlZChi
b29sKSkpOworICAgIHNob3dGUFMtPnNldENoZWNrZWQoZ1Nob3dGcmFtZVJhdGUpOworCisgICAg
UU1lbnUqIHZpZXdwb3J0VXBkYXRlTWVudSA9IGdyYXBoaWNzVmlld01lbnUtPmFkZE1lbnUoIkNo
YW5nZSBWaWV3cG9ydCBVcGRhdGUgTW9kZSIpOworICAgIHZpZXdwb3J0VXBkYXRlTWVudS0+c2V0
RW5hYmxlZChpc0dyYXBoaWNzQmFzZWQoKSk7CisgICAgdmlld3BvcnRVcGRhdGVNZW51LT5jb25u
ZWN0KHRvZ2dsZUdyYXBoaWNzVmlldywgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldEVu
YWJsZWQoYm9vbCkpKTsKKworICAgIFFBY3Rpb24qIGZ1bGxVcGRhdGUgPSB2aWV3cG9ydFVwZGF0
ZU1lbnUtPmFkZEFjdGlvbigiRnVsbFZpZXdwb3J0VXBkYXRlIik7CisgICAgZnVsbFVwZGF0ZS0+
c2V0Q2hlY2thYmxlKHRydWUpOworICAgIGZ1bGxVcGRhdGUtPnNldENoZWNrZWQoKGdWaWV3cG9y
dFVwZGF0ZU1vZGUgPT0gUUdyYXBoaWNzVmlldzo6RnVsbFZpZXdwb3J0VXBkYXRlKSA/IHRydWUg
OiBmYWxzZSk7CisKKyAgICBRQWN0aW9uKiBtaW5pbWFsVXBkYXRlID0gdmlld3BvcnRVcGRhdGVN
ZW51LT5hZGRBY3Rpb24oIk1pbmltYWxWaWV3cG9ydFVwZGF0ZSIpOworICAgIG1pbmltYWxVcGRh
dGUtPnNldENoZWNrYWJsZSh0cnVlKTsKKyAgICBtaW5pbWFsVXBkYXRlLT5zZXRDaGVja2VkKChn
Vmlld3BvcnRVcGRhdGVNb2RlID09IFFHcmFwaGljc1ZpZXc6Ok1pbmltYWxWaWV3cG9ydFVwZGF0
ZSkgPyB0cnVlIDogZmFsc2UpOworCisgICAgUUFjdGlvbiogc21hcnRVcGRhdGUgPSB2aWV3cG9y
dFVwZGF0ZU1lbnUtPmFkZEFjdGlvbigiU21hcnRWaWV3cG9ydFVwZGF0ZSIpOworICAgIHNtYXJ0
VXBkYXRlLT5zZXRDaGVja2FibGUodHJ1ZSk7CisgICAgc21hcnRVcGRhdGUtPnNldENoZWNrZWQo
KGdWaWV3cG9ydFVwZGF0ZU1vZGUgPT0gUUdyYXBoaWNzVmlldzo6U21hcnRWaWV3cG9ydFVwZGF0
ZSkgPyB0cnVlIDogZmFsc2UpOworCisgICAgUUFjdGlvbiogYm91bmRpbmdSZWN0VXBkYXRlID0g
dmlld3BvcnRVcGRhdGVNZW51LT5hZGRBY3Rpb24oIkJvdW5kaW5nUmVjdFZpZXdwb3J0VXBkYXRl
Iik7CisgICAgYm91bmRpbmdSZWN0VXBkYXRlLT5zZXRDaGVja2FibGUodHJ1ZSk7CisgICAgYm91
bmRpbmdSZWN0VXBkYXRlLT5zZXRDaGVja2VkKChnVmlld3BvcnRVcGRhdGVNb2RlID09IFFHcmFw
aGljc1ZpZXc6OkJvdW5kaW5nUmVjdFZpZXdwb3J0VXBkYXRlKSA/IHRydWUgOiBmYWxzZSk7CisK
KyAgICBRQWN0aW9uKiBub1VwZGF0ZSA9IHZpZXdwb3J0VXBkYXRlTWVudS0+YWRkQWN0aW9uKCJO
b1ZpZXdwb3J0VXBkYXRlIik7CisgICAgbm9VcGRhdGUtPnNldENoZWNrYWJsZSh0cnVlKTsKKyAg
ICBub1VwZGF0ZS0+c2V0Q2hlY2tlZCgoZ1ZpZXdwb3J0VXBkYXRlTW9kZSA9PSBRR3JhcGhpY3NW
aWV3OjpOb1ZpZXdwb3J0VXBkYXRlKSA/IHRydWUgOiBmYWxzZSk7CisKKyAgICBRU2lnbmFsTWFw
cGVyKiBzaWduYWxNYXBwZXIgPSBuZXcgUVNpZ25hbE1hcHBlcih2aWV3cG9ydFVwZGF0ZU1lbnUp
OworICAgIHNpZ25hbE1hcHBlci0+c2V0TWFwcGluZyhmdWxsVXBkYXRlLCBRR3JhcGhpY3NWaWV3
OjpGdWxsVmlld3BvcnRVcGRhdGUpOworICAgIHNpZ25hbE1hcHBlci0+c2V0TWFwcGluZyhtaW5p
bWFsVXBkYXRlLCBRR3JhcGhpY3NWaWV3OjpNaW5pbWFsVmlld3BvcnRVcGRhdGUpOworICAgIHNp
Z25hbE1hcHBlci0+c2V0TWFwcGluZyhzbWFydFVwZGF0ZSwgUUdyYXBoaWNzVmlldzo6U21hcnRW
aWV3cG9ydFVwZGF0ZSk7CisgICAgc2lnbmFsTWFwcGVyLT5zZXRNYXBwaW5nKGJvdW5kaW5nUmVj
dFVwZGF0ZSwgUUdyYXBoaWNzVmlldzo6Qm91bmRpbmdSZWN0Vmlld3BvcnRVcGRhdGUpOworICAg
IHNpZ25hbE1hcHBlci0+c2V0TWFwcGluZyhub1VwZGF0ZSwgUUdyYXBoaWNzVmlldzo6Tm9WaWV3
cG9ydFVwZGF0ZSk7CisKKyAgICBjb25uZWN0KGZ1bGxVcGRhdGUsIFNJR05BTCh0cmlnZ2VyZWQo
KSksIHNpZ25hbE1hcHBlciwgU0xPVChtYXAoKSkpOworICAgIGNvbm5lY3QobWluaW1hbFVwZGF0
ZSwgU0lHTkFMKHRyaWdnZXJlZCgpKSwgc2lnbmFsTWFwcGVyLCBTTE9UKG1hcCgpKSk7CisgICAg
Y29ubmVjdChzbWFydFVwZGF0ZSwgU0lHTkFMKHRyaWdnZXJlZCgpKSwgc2lnbmFsTWFwcGVyLCBT
TE9UKG1hcCgpKSk7CisgICAgY29ubmVjdChib3VuZGluZ1JlY3RVcGRhdGUsIFNJR05BTCh0cmln
Z2VyZWQoKSksIHNpZ25hbE1hcHBlciwgU0xPVChtYXAoKSkpOworICAgIGNvbm5lY3Qobm9VcGRh
dGUsIFNJR05BTCh0cmlnZ2VyZWQoKSksIHNpZ25hbE1hcHBlciwgU0xPVChtYXAoKSkpOworCisg
ICAgY29ubmVjdChzaWduYWxNYXBwZXIsIFNJR05BTChtYXBwZWQoaW50KSksIHRoaXMsIFNMT1Qo
Y2hhbmdlVmlld3BvcnRVcGRhdGVNb2RlKGludCkpKTsKKworICAgIFFBY3Rpb25Hcm91cCogdmll
d3BvcnRVcGRhdGVNb2RlQWN0aW9ucyA9IG5ldyBRQWN0aW9uR3JvdXAodmlld3BvcnRVcGRhdGVN
ZW51KTsKKyAgICB2aWV3cG9ydFVwZGF0ZU1vZGVBY3Rpb25zLT5hZGRBY3Rpb24oZnVsbFVwZGF0
ZSk7CisgICAgdmlld3BvcnRVcGRhdGVNb2RlQWN0aW9ucy0+YWRkQWN0aW9uKG1pbmltYWxVcGRh
dGUpOworICAgIHZpZXdwb3J0VXBkYXRlTW9kZUFjdGlvbnMtPmFkZEFjdGlvbihzbWFydFVwZGF0
ZSk7CisgICAgdmlld3BvcnRVcGRhdGVNb2RlQWN0aW9ucy0+YWRkQWN0aW9uKGJvdW5kaW5nUmVj
dFVwZGF0ZSk7CisgICAgdmlld3BvcnRVcGRhdGVNb2RlQWN0aW9ucy0+YWRkQWN0aW9uKG5vVXBk
YXRlKTsKK30KKworUVdlYlBhZ2UqIFdlYlBhZ2U6OmNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2Vi
V2luZG93VHlwZSB0eXBlKQoreworICAgIExhdW5jaGVyV2luZG93KiBtdyA9IG5ldyBMYXVuY2hl
cldpbmRvdzsKKyAgICBpZiAodHlwZSA9PSBXZWJNb2RhbERpYWxvZykKKyAgICAgICAgbXctPnNl
dFdpbmRvd01vZGFsaXR5KFF0OjpBcHBsaWNhdGlvbk1vZGFsKTsKKyAgICBtdy0+c2hvdygpOwor
ICAgIHJldHVybiBtdy0+cGFnZSgpOworfQorCitRT2JqZWN0KiBXZWJQYWdlOjpjcmVhdGVQbHVn
aW4oY29uc3QgUVN0cmluZyAmY2xhc3NJZCwgY29uc3QgUVVybCYsIGNvbnN0IFFTdHJpbmdMaXN0
JiwgY29uc3QgUVN0cmluZ0xpc3QmKQoreworICAgIGlmIChjbGFzc0lkID09ICJhbGllbl9RTGFi
ZWwiKSB7CisgICAgICAgIFFMYWJlbCogbCA9IG5ldyBRTGFiZWw7CisgICAgICAgIGwtPndpbklk
KCk7CisgICAgICAgIHJldHVybiBsOworICAgIH0KKworI2lmbmRlZiBRVF9OT19VSVRPT0xTCisg
ICAgUVVpTG9hZGVyIGxvYWRlcjsKKyAgICByZXR1cm4gbG9hZGVyLmNyZWF0ZVdpZGdldChjbGFz
c0lkLCB2aWV3KCkpOworI2Vsc2UKKyAgICBRX1VOVVNFRChjbGFzc0lkKTsKKyAgICByZXR1cm4g
MDsKKyNlbmRpZgorfQorCisKK2ludCBsYXVuY2hlck1haW4oY29uc3QgUUFwcGxpY2F0aW9uJiBh
cHApCit7CisjaWZuZGVmIE5ERUJVRworICAgIGludCByZXRWYWwgPSBhcHAuZXhlYygpOworICAg
IER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OjpnYXJiYWdlQ29sbGVjdG9yQ29sbGVjdCgpOworICAg
IFFXZWJTZXR0aW5nczo6Y2xlYXJNZW1vcnlDYWNoZXMoKTsKKyAgICByZXR1cm4gcmV0VmFsOwor
I2Vsc2UKKyAgICByZXR1cm4gYXBwLmV4ZWMoKTsKKyNlbmRpZgorfQorCitjbGFzcyBMYXVuY2hl
ckFwcGxpY2F0aW9uIDogcHVibGljIFFBcHBsaWNhdGlvbiB7CisgICAgUV9PQkpFQ1QKKworcHVi
bGljOgorICAgIExhdW5jaGVyQXBwbGljYXRpb24oaW50JiBhcmdjLCBjaGFyKiogYXJndik7Cisg
ICAgUVN0cmluZ0xpc3QgdXJscygpIGNvbnN0IHsgcmV0dXJuIG1fdXJsczsgfQorICAgIGJvb2wg
aXNSb2JvdGl6ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzUm9ib3RpemVkOyB9CisKK3ByaXZhdGU6
CisgICAgdm9pZCBoYW5kbGVVc2VyT3B0aW9ucygpOworICAgIHZvaWQgYXBwbHlEZWZhdWx0U2V0
dGluZ3MoKTsKKworcHJpdmF0ZToKKyAgICBib29sIG1faXNSb2JvdGl6ZWQ7CisgICAgUVN0cmlu
Z0xpc3QgbV91cmxzOworfTsKKwordm9pZCBMYXVuY2hlckFwcGxpY2F0aW9uOjphcHBseURlZmF1
bHRTZXR0aW5ncygpCit7CisgICAgUVdlYlNldHRpbmdzOjpzZXRNYXhpbXVtUGFnZXNJbkNhY2hl
KDQpOworCisgICAgUVdlYlNldHRpbmdzOjpzZXRPYmplY3RDYWNoZUNhcGFjaXRpZXMoKDE2KjEw
MjQqMTAyNCkgLyA4LCAoMTYqMTAyNCoxMDI0KSAvIDgsIDE2KjEwMjQqMTAyNCk7CisKKyAgICBR
V2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6
OlBsdWdpbnNFbmFibGVkLCB0cnVlKTsKKyAgICBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdz
KCktPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6OkRldmVsb3BlckV4dHJhc0VuYWJsZWQsIHRy
dWUpOworICAgIFFXZWJTZXR0aW5nczo6ZW5hYmxlUGVyc2lzdGVudFN0b3JhZ2UoKTsKK30KKwor
TGF1bmNoZXJBcHBsaWNhdGlvbjo6TGF1bmNoZXJBcHBsaWNhdGlvbihpbnQmIGFyZ2MsIGNoYXIq
KiBhcmd2KQorICAgIDogUUFwcGxpY2F0aW9uKGFyZ2MsIGFyZ3YsIFFBcHBsaWNhdGlvbjo6R3Vp
U2VydmVyKQorICAgICwgbV9pc1JvYm90aXplZChmYWxzZSkKK3sKKyAgICAvLyBUbyBhbGxvdyBR
V2ViSW5zcGVjdG9yJ3MgY29uZmlndXJhdGlvbiBwZXJzaXN0ZW5jZQorICAgIHNldE9yZ2FuaXph
dGlvbk5hbWUoIk5va2lhIik7CisgICAgc2V0QXBwbGljYXRpb25OYW1lKCJRdExhdW5jaGVyIik7
CisgICAgc2V0QXBwbGljYXRpb25WZXJzaW9uKCIwLjEiKTsKKworICAgIGFwcGx5RGVmYXVsdFNl
dHRpbmdzKCk7CisKKyAgICBoYW5kbGVVc2VyT3B0aW9ucygpOworfQorCitzdGF0aWMgdm9pZCBy
ZXF1aXJlc0dyYXBoaWNzVmlldyhjb25zdCBRU3RyaW5nJiBvcHRpb24pCit7CisgICAgaWYgKGdV
c2VHcmFwaGljc1ZpZXcpCisgICAgICAgIHJldHVybjsKKyAgICBhcHBRdWl0KDEsIFFTdHJpbmco
IiUxIG9ubHkgd29ya3MgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLWdyYXBoaWNzYmFzZWQgb3B0
aW9uIikuYXJnKG9wdGlvbikpOworfQorCit2b2lkIExhdW5jaGVyQXBwbGljYXRpb246OmhhbmRs
ZVVzZXJPcHRpb25zKCkKK3sKKyAgICBRU3RyaW5nTGlzdCBhcmdzID0gYXJndW1lbnRzKCk7Cisg
ICAgUUZpbGVJbmZvIHByb2dyYW0oYXJncy5hdCgwKSk7CisgICAgUVN0cmluZyBwcm9ncmFtTmFt
ZSgiUXRMYXVuY2hlciIpOworICAgIGlmIChwcm9ncmFtLmV4aXN0cygpKQorICAgICAgICBwcm9n
cmFtTmFtZSA9IHByb2dyYW0uYmFzZU5hbWUoKTsKKworICAgIFFMaXN0PFFTdHJpbmc+IHVwZGF0
ZU1vZGVzKGVudW1Ub0tleXMoUUdyYXBoaWNzVmlldzo6c3RhdGljTWV0YU9iamVjdCwKKyAgICAg
ICAgICAgICJWaWV3cG9ydFVwZGF0ZU1vZGUiLCAiVmlld3BvcnRVcGRhdGUiKSk7CisKKyAgICBp
ZiAoYXJncy5jb250YWlucygiLWhlbHAiKSkgeworICAgICAgICBxRGVidWcoKSA8PCAiVXNhZ2U6
IiA8PCBwcm9ncmFtTmFtZS50b0xhdGluMSgpLmRhdGEoKQorICAgICAgICAgICAgIDw8ICJbLWdy
YXBoaWNzYmFzZWRdIgorICAgICAgICAgICAgIDw8ICJbLW5vLWNvbXBvc2l0aW5nXSIKKyAgICAg
ICAgICAgICA8PCBRU3RyaW5nKCJbLXZpZXdwb3J0LXVwZGF0ZS1tb2RlICUxXSIpLmFyZyhmb3Jt
YXRLZXlzKHVwZGF0ZU1vZGVzKSkudG9MYXRpbjEoKS5kYXRhKCkKKyAgICAgICAgICAgICA8PCAi
Wy1jYWNoZS13ZWJ2aWV3XSIKKyAgICAgICAgICAgICA8PCAiWy1zaG93LWZwc10iCisgICAgICAg
ICAgICAgPDwgIlstciBsaXN0XSIKKyAgICAgICAgICAgICA8PCAiWy1pbnNwZWN0b3ItdXJsIGxv
Y2F0aW9uXSIKKyAgICAgICAgICAgICA8PCAiWy10aWxlZC1iYWNraW5nLXN0b3JlXSIKKyAgICAg
ICAgICAgICA8PCAiWy1yZXNpemVzLXRvLWNvbnRlbnRzXSIKKyAgICAgICAgICAgICA8PCAiVVJM
cyI7CisgICAgICAgIGFwcFF1aXQoMCk7CisgICAgfQorCisgICAgaWYgKGFyZ3MuY29udGFpbnMo
Ii1ncmFwaGljc2Jhc2VkIikpCisgICAgICAgIGdVc2VHcmFwaGljc1ZpZXcgPSB0cnVlOworCisg
ICAgaWYgKGFyZ3MuY29udGFpbnMoIi1uby1jb21wb3NpdGluZyIpKSB7CisgICAgICAgIHJlcXVp
cmVzR3JhcGhpY3NWaWV3KCItbm8tY29tcG9zaXRpbmciKTsKKyAgICAgICAgZ1VzZUNvbXBvc2l0
aW5nID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGFyZ3MuY29udGFpbnMoIi1zaG93LWZwcyIp
KSB7CisgICAgICAgIHJlcXVpcmVzR3JhcGhpY3NWaWV3KCItc2hvdy1mcHMiKTsKKyAgICAgICAg
Z1Nob3dGcmFtZVJhdGUgPSB0cnVlOworICAgIH0KKworICAgIGlmIChhcmdzLmNvbnRhaW5zKCIt
Y2FjaGUtd2VidmlldyIpKSB7CisgICAgICAgIHJlcXVpcmVzR3JhcGhpY3NWaWV3KCItY2FjaGUt
d2VidmlldyIpOworICAgICAgICBnQ2FjaGVXZWJWaWV3ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAoYXJncy5jb250YWlucygiLXRpbGVkLWJhY2tpbmctc3RvcmUiKSkgeworICAgICAgICByZXF1
aXJlc0dyYXBoaWNzVmlldygiLXRpbGVkLWJhY2tpbmctc3RvcmUiKTsKKyAgICAgICAgZ1VzZVRp
bGVkQmFja2luZ1N0b3JlID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoYXJncy5jb250YWlucygi
LXJlc2l6ZXMtdG8tY29udGVudHMiKSkgeworICAgICAgICByZXF1aXJlc0dyYXBoaWNzVmlldygi
LXJlc2l6ZXMtdG8tY29udGVudHMiKTsKKyAgICAgICAgZ1Jlc2l6ZXNUb0NvbnRlbnRzID0gdHJ1
ZTsKKyAgICB9CisKKyAgICBRU3RyaW5nIGFyZzEoIi12aWV3cG9ydC11cGRhdGUtbW9kZSIpOwor
ICAgIGludCBtb2RlSW5kZXggPSBhcmdzLmluZGV4T2YoYXJnMSk7CisgICAgaWYgKG1vZGVJbmRl
eCAhPSAtMSkgeworICAgICAgICByZXF1aXJlc0dyYXBoaWNzVmlldyhhcmcxKTsKKworICAgICAg
ICBRU3RyaW5nIG1vZGUgPSB0YWtlT3B0aW9uVmFsdWUoJmFyZ3MsIG1vZGVJbmRleCk7CisgICAg
ICAgIGlmIChtb2RlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGFwcFF1aXQoMSwgUVN0cmluZygi
JTEgbmVlZHMgYSB2YWx1ZSBvZiBvbmUgb2YgWyUyXSIpLmFyZyhhcmcxKS5hcmcoZm9ybWF0S2V5
cyh1cGRhdGVNb2RlcykpKTsKKyAgICAgICAgaW50IGlkeCA9IHVwZGF0ZU1vZGVzLmluZGV4T2Yo
bW9kZSk7CisgICAgICAgIGlmIChpZHggPT0gLTEpCisgICAgICAgICAgICBhcHBRdWl0KDEsIFFT
dHJpbmcoIiUxIHZhbHVlIGhhcyB0byBiZSBvbmUgb2YgWyUyXSIpLmFyZyhhcmcxKS5hcmcoZm9y
bWF0S2V5cyh1cGRhdGVNb2RlcykpKTsKKworICAgICAgICBnVmlld3BvcnRVcGRhdGVNb2RlID0g
c3RhdGljX2Nhc3Q8UUdyYXBoaWNzVmlldzo6Vmlld3BvcnRVcGRhdGVNb2RlPihpZHgpOworICAg
IH0KKworICAgIFFTdHJpbmcgaW5zcGVjdG9yVXJsQXJnKCItaW5zcGVjdG9yLXVybCIpOworICAg
IGludCBpbnNwZWN0b3JVcmxJbmRleCA9IGFyZ3MuaW5kZXhPZihpbnNwZWN0b3JVcmxBcmcpOwor
ICAgIGlmIChpbnNwZWN0b3JVcmxJbmRleCAhPSAtMSkKKyAgICAgICBnSW5zcGVjdG9yVXJsID0g
dGFrZU9wdGlvblZhbHVlKCZhcmdzLCBpbnNwZWN0b3JVcmxJbmRleCk7CisKKyAgICBpbnQgcm9i
b3RJbmRleCA9IGFyZ3MuaW5kZXhPZigiLXIiKTsKKyAgICBpZiAocm9ib3RJbmRleCAhPSAtMSkg
eworICAgICAgICBRU3RyaW5nIGxpc3RGaWxlID0gdGFrZU9wdGlvblZhbHVlKCZhcmdzLCByb2Jv
dEluZGV4KTsKKyAgICAgICAgaWYgKGxpc3RGaWxlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGFw
cFF1aXQoMSwgIi1yIG5lZWRzIGEgbGlzdCBmaWxlIHRvIHN0YXJ0IGluIHJvYm90aXplZCBtb2Rl
Iik7CisgICAgICAgIGlmICghUUZpbGU6OmV4aXN0cyhsaXN0RmlsZSkpCisgICAgICAgICAgICBh
cHBRdWl0KDEsICJUaGUgbGlzdCBmaWxlIHN1cHBsaWVkIHRvIC1yIGRvZXMgbm90IGV4aXN0LiIp
OworCisgICAgICAgIG1faXNSb2JvdGl6ZWQgPSB0cnVlOworICAgICAgICBtX3VybHMgPSBRU3Ry
aW5nTGlzdChsaXN0RmlsZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbGFz
dEFyZyA9IGFyZ3MubGFzdEluZGV4T2YoUVJlZ0V4cCgiXi0uKiIpKTsKKyAgICBtX3VybHMgPSAo
bGFzdEFyZyAhPSAtMSkgPyBhcmdzLm1pZCgrK2xhc3RBcmcpIDogYXJncy5taWQoMSk7Cit9CisK
KworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIExhdW5jaGVyQXBwbGlj
YXRpb24gYXBwKGFyZ2MsIGFyZ3YpOworCisgICAgaWYgKGFwcC5pc1JvYm90aXplZCgpKSB7Cisg
ICAgICAgIExhdW5jaGVyV2luZG93KiB3aW5kb3cgPSBuZXcgTGF1bmNoZXJXaW5kb3coKTsKKyAg
ICAgICAgVXJsTG9hZGVyIGxvYWRlcih3aW5kb3ctPnBhZ2UoKS0+bWFpbkZyYW1lKCksIGFwcC51
cmxzKCkuYXQoMCkpOworICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KHdpbmRvdy0+cGFnZSgpLT5t
YWluRnJhbWUoKSwgU0lHTkFMKGxvYWRGaW5pc2hlZChib29sKSksICZsb2FkZXIsIFNMT1QobG9h
ZE5leHQoKSkpOworICAgICAgICBsb2FkZXIubG9hZE5leHQoKTsKKyAgICAgICAgd2luZG93LT5z
aG93KCk7CisgICAgICAgIHJldHVybiBsYXVuY2hlck1haW4oYXBwKTsKKyAgICB9CisKKyAgICBR
U3RyaW5nTGlzdCB1cmxzID0gYXBwLnVybHMoKTsKKworICAgIGlmICh1cmxzLmlzRW1wdHkoKSkg
eworICAgICAgICBRU3RyaW5nIGRlZmF1bHRVcmwgPSBRU3RyaW5nKCJmaWxlOi8vJTEvJTIiKS5h
cmcoUURpcjo6aG9tZVBhdGgoKSkuYXJnKFFMYXRpbjFTdHJpbmcoImluZGV4Lmh0bWwiKSk7Cisg
ICAgICAgIGlmIChRRGlyKGRlZmF1bHRVcmwpLmV4aXN0cygpKQorICAgICAgICAgICAgdXJscy5h
cHBlbmQoZGVmYXVsdFVybCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHVybHMuYXBwZW5k
KCIiKTsKKyAgICB9CisKKyAgICBMYXVuY2hlcldpbmRvdyogd2luZG93ID0gMDsKKyAgICBmb3Jl
YWNoIChRU3RyaW5nIHVybCwgdXJscykgeworICAgICAgICBpZiAoIXdpbmRvdykKKyAgICAgICAg
ICAgIHdpbmRvdyA9IG5ldyBMYXVuY2hlcldpbmRvdygpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICB3aW5kb3ctPm5ld1dpbmRvdygpOworCisgICAgICAgIHdpbmRvdy0+bG9hZCh1cmwpOwor
ICAgIH0KKworICAgIHdpbmRvdy0+c2hvdygpOworICAgIHJldHVybiBsYXVuY2hlck1haW4oYXBw
KTsKK30KKworI2luY2x1ZGUgIm1haW4ubW9jIgpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJv
d3Nlci9tYWluLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL21h
aW4uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9tYWluLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTA0OSw3ICsxMDQ5LDcgQEAgTGF1bmNoZXJBcHBsaWNhdGlv
bjo6TGF1bmNoZXJBcHBsaWNhdGlvbgogewogICAgIC8vIFRvIGFsbG93IFFXZWJJbnNwZWN0b3In
cyBjb25maWd1cmF0aW9uIHBlcnNpc3RlbmNlCiAgICAgc2V0T3JnYW5pemF0aW9uTmFtZSgiTm9r
aWEiKTsKLSAgICBzZXRBcHBsaWNhdGlvbk5hbWUoIlF0TGF1bmNoZXIiKTsKKyAgICBzZXRBcHBs
aWNhdGlvbk5hbWUoIlF0VGVzdEJyb3dzZXIiKTsKICAgICBzZXRBcHBsaWNhdGlvblZlcnNpb24o
IjAuMSIpOwogCiAgICAgYXBwbHlEZWZhdWx0U2V0dGluZ3MoKTsKQEAgLTEwNjgsNyArMTA2OCw3
IEBAIHZvaWQgTGF1bmNoZXJBcHBsaWNhdGlvbjo6aGFuZGxlVXNlck9wdGkKIHsKICAgICBRU3Ry
aW5nTGlzdCBhcmdzID0gYXJndW1lbnRzKCk7CiAgICAgUUZpbGVJbmZvIHByb2dyYW0oYXJncy5h
dCgwKSk7Ci0gICAgUVN0cmluZyBwcm9ncmFtTmFtZSgiUXRMYXVuY2hlciIpOworICAgIFFTdHJp
bmcgcHJvZ3JhbU5hbWUoIlF0VGVzdEJyb3dzZXIiKTsKICAgICBpZiAocHJvZ3JhbS5leGlzdHMo
KSkKICAgICAgICAgcHJvZ3JhbU5hbWUgPSBwcm9ncmFtLmJhc2VOYW1lKCk7CiAKSW5kZXg6IFdl
YktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvbWFpbndpbmRvdy5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0VG9vbHMvUXRUZXN0QnJvd3Nlci9tYWlud2luZG93LmNwcAkocmV2aXNpb24gNTc2NTQpCShm
cm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvbWFpbndpbmRvdy5jcHA6NTc2NTQpCisrKyBXZWJL
aXRUb29scy9RdFRlc3RCcm93c2VyL21haW53aW5kb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlz
aCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgorICogQ29weXJpZ2h0IChDKSAy
MDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2
IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBTaW1vbiBI
YXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJtYWlud2luZG93LmgiCisKKyNpbmNsdWRlICJsb2NhdGlvbmVkaXQu
aCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitNYWluV2luZG93OjpNYWluV2luZG93KGNvbnN0IFFT
dHJpbmcmIHVybCkKKyAgICA6IG1fcGFnZShuZXcgV2ViUGFnZSh0aGlzKSkKK3sKKyAgICBzZXRB
dHRyaWJ1dGUoUXQ6OldBX0RlbGV0ZU9uQ2xvc2UpOworICAgIGlmIChxZ2V0ZW52KCJRVExBVU5D
SEVSX1VTRV9BUkdCX1ZJU1VBTFMiKS50b0ludCgpID09IDEpCisgICAgICAgIHNldEF0dHJpYnV0
ZShRdDo6V0FfVHJhbnNsdWNlbnRCYWNrZ3JvdW5kKTsKKworICAgIGJ1aWxkVUkoKTsKK30KKwor
dm9pZCBNYWluV2luZG93OjpidWlsZFVJKCkKK3sKKyAgICBRVG9vbEJhciogYmFyID0gYWRkVG9v
bEJhcigiTmF2aWdhdGlvbiIpOworI2lmIGRlZmluZWQoUV9XU19TNjApCisgICAgYmFyLT5zZXRJ
Y29uU2l6ZShRU2l6ZSgxNiwgMTYpKTsKKyNlbmRpZgorICAgIGJhci0+YWRkQWN0aW9uKHBhZ2Uo
KS0+YWN0aW9uKFFXZWJQYWdlOjpCYWNrKSk7CisgICAgYmFyLT5hZGRBY3Rpb24ocGFnZSgpLT5h
Y3Rpb24oUVdlYlBhZ2U6OkZvcndhcmQpKTsKKyAgICBiYXItPmFkZEFjdGlvbihwYWdlKCktPmFj
dGlvbihRV2ViUGFnZTo6UmVsb2FkKSk7CisgICAgYmFyLT5hZGRBY3Rpb24ocGFnZSgpLT5hY3Rp
b24oUVdlYlBhZ2U6OlN0b3ApKTsKKworICAgIHVybEVkaXQgPSBuZXcgTG9jYXRpb25FZGl0KHRo
aXMpOworICAgIHVybEVkaXQtPnNldFNpemVQb2xpY3koUVNpemVQb2xpY3k6OkV4cGFuZGluZywg
dXJsRWRpdC0+c2l6ZVBvbGljeSgpLnZlcnRpY2FsUG9saWN5KCkpOworICAgIGNvbm5lY3QodXJs
RWRpdCwgU0lHTkFMKHJldHVyblByZXNzZWQoKSksIFNMT1QoY2hhbmdlTG9jYXRpb24oKSkpOwor
ICAgIFFDb21wbGV0ZXIqIGNvbXBsZXRlciA9IG5ldyBRQ29tcGxldGVyKHRoaXMpOworICAgIHVy
bEVkaXQtPnNldENvbXBsZXRlcihjb21wbGV0ZXIpOworICAgIGNvbXBsZXRlci0+c2V0TW9kZWwo
JnVybE1vZGVsKTsKKyNpZiBkZWZpbmVkKFFfV1NfUzYwKQorICAgIGFkZFRvb2xCYXJCcmVhaygp
OworICAgIGFkZFRvb2xCYXIoIkxvY2F0aW9uIiktPmFkZFdpZGdldCh1cmxFZGl0KTsKKyNlbHNl
CisgICAgYmFyLT5hZGRXaWRnZXQodXJsRWRpdCk7CisjZW5kaWYKKworICAgIGNvbm5lY3QocGFn
ZSgpLT5tYWluRnJhbWUoKSwgU0lHTkFMKHRpdGxlQ2hhbmdlZChjb25zdCBRU3RyaW5nJikpLAor
ICAgICAgICAgICAgdGhpcywgU0xPVChzZXRXaW5kb3dUaXRsZShjb25zdCBRU3RyaW5nJikpKTsK
KyAgICBjb25uZWN0KHBhZ2UoKSwgU0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQpKSwgdXJsRWRpdCwg
U0xPVChzZXRQcm9ncmVzcyhpbnQpKSk7CisgICAgY29ubmVjdChwYWdlKCksIFNJR05BTCh3aW5k
b3dDbG9zZVJlcXVlc3RlZCgpKSwgdGhpcywgU0xPVChjbG9zZSgpKSk7CisKKyAgICAvLyBzaG9y
dC1jdXRzCisgICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OkJhY2spLT5zZXRTaG9ydGN1dChR
S2V5U2VxdWVuY2U6OkJhY2spOworICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpTdG9wKS0+
c2V0U2hvcnRjdXQoUXQ6OktleV9Fc2NhcGUpOworICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdl
OjpGb3J3YXJkKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlOjpGb3J3YXJkKTsKKyAgICBwYWdl
KCktPmFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKS0+c2V0U2hvcnRjdXQoUUtleVNlcXVlbmNlOjpS
ZWZyZXNoKTsKKyAgICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VW5kbyktPnNldFNob3J0Y3V0
KFFLZXlTZXF1ZW5jZTo6VW5kbyk7CisgICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlJlZG8p
LT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OlJlZG8pOworICAgIHBhZ2UoKS0+YWN0aW9uKFFX
ZWJQYWdlOjpDdXQpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OkN1dCk7CisgICAgcGFnZSgp
LT5hY3Rpb24oUVdlYlBhZ2U6OkNvcHkpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2U6OkNvcHkp
OworICAgIHBhZ2UoKS0+YWN0aW9uKFFXZWJQYWdlOjpQYXN0ZSktPnNldFNob3J0Y3V0KFFLZXlT
ZXF1ZW5jZTo6UGFzdGUpOworCisgICAgcGFnZSgpLT5hY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZUJv
bGQpLT5zZXRTaG9ydGN1dChRS2V5U2VxdWVuY2UoUXQ6OkNUUkwgfCBRdDo6S2V5X0IpKTsKKyAg
ICBwYWdlKCktPmFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlSXRhbGljKS0+c2V0U2hvcnRjdXQoUUtl
eVNlcXVlbmNlKFF0OjpDVFJMIHwgUXQ6OktleV9JKSk7CisgICAgcGFnZSgpLT5hY3Rpb24oUVdl
YlBhZ2U6OlRvZ2dsZVVuZGVybGluZSktPnNldFNob3J0Y3V0KFFLZXlTZXF1ZW5jZShRdDo6Q1RS
TCB8IFF0OjpLZXlfVSkpOworfQorCitXZWJQYWdlKiBNYWluV2luZG93OjpwYWdlKCkKK3sKKyAg
ICByZXR1cm4gbV9wYWdlOworfQorCit2b2lkIE1haW5XaW5kb3c6OnNldEFkZHJlc3NVcmwoY29u
c3QgUVN0cmluZyYgdXJsKQoreworICAgIHVybEVkaXQtPnNldFRleHQodXJsKTsKK30KKwordm9p
ZCBNYWluV2luZG93OjphZGRDb21wbGV0ZXJFbnRyeShjb25zdCBRVXJsJiB1cmwpCit7CisgICAg
UVVybDo6Rm9ybWF0dGluZ09wdGlvbnMgb3B0czsKKyAgICBvcHRzIHw9IFFVcmw6OlJlbW92ZVNj
aGVtZTsKKyAgICBvcHRzIHw9IFFVcmw6OlJlbW92ZVVzZXJJbmZvOworICAgIG9wdHMgfD0gUVVy
bDo6U3RyaXBUcmFpbGluZ1NsYXNoOworICAgIFFTdHJpbmcgcyA9IHVybC50b1N0cmluZyhvcHRz
KTsKKyAgICBzID0gcy5taWQoMik7CisgICAgaWYgKHMuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIXVybExpc3QuY29udGFpbnMocykpCisgICAgICAgIHVybExpc3QgKz0g
czsKKyAgICB1cmxNb2RlbC5zZXRTdHJpbmdMaXN0KHVybExpc3QpOworfQorCit2b2lkIE1haW5X
aW5kb3c6OmxvYWQoY29uc3QgUVN0cmluZyYgdXJsKQoreworICAgIFFVcmwgcXVybCA9IHVybEZy
b21Vc2VySW5wdXQodXJsKTsKKyAgICBpZiAocXVybC5zY2hlbWUoKS5pc0VtcHR5KCkpCisgICAg
ICAgIHF1cmwgPSBRVXJsKCJodHRwOi8vIiArIHVybCArICIvIik7CisgICAgbG9hZChxdXJsKTsK
K30KKwordm9pZCBNYWluV2luZG93Ojpsb2FkKGNvbnN0IFFVcmwmIHVybCkKK3sKKyAgICBpZiAo
IXVybC5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHNldEFkZHJlc3NVcmwodXJs
LnRvU3RyaW5nKCkpOworICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWQodXJsKTsKK30KKwor
dm9pZCBNYWluV2luZG93OjpjaGFuZ2VMb2NhdGlvbigpCit7CisgICAgUVN0cmluZyBzdHJpbmcg
PSB1cmxFZGl0LT50ZXh0KCk7CisgICAgbG9hZChzdHJpbmcpOworfQorCit2b2lkIE1haW5XaW5k
b3c6Om9wZW5GaWxlKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgUVN0cmluZyBmaWx0ZXIoIkhUTUwg
RmlsZXMgKCouaHRtICouaHRtbCk7O1RleHQgRmlsZXMgKCoudHh0KTs7SW1hZ2UgRmlsZXMgKCou
Z2lmICouanBnICoucG5nKTs7QWxsIEZpbGVzICgqKSIpOworCisgICAgUUZpbGVEaWFsb2cgZmls
ZURpYWxvZyh0aGlzLCB0cigiT3BlbiIpLCBRU3RyaW5nKCksIGZpbHRlcik7CisgICAgZmlsZURp
YWxvZy5zZXRBY2NlcHRNb2RlKFFGaWxlRGlhbG9nOjpBY2NlcHRPcGVuKTsKKyAgICBmaWxlRGlh
bG9nLnNldEZpbGVNb2RlKFFGaWxlRGlhbG9nOjpFeGlzdGluZ0ZpbGUpOworICAgIGZpbGVEaWFs
b2cuc2V0T3B0aW9ucyhRRmlsZURpYWxvZzo6UmVhZE9ubHkpOworCisgICAgaWYgKGZpbGVEaWFs
b2cuZXhlYygpKSB7CisgICAgICAgIFFTdHJpbmcgc2VsZWN0ZWRGaWxlID0gZmlsZURpYWxvZy5z
ZWxlY3RlZEZpbGVzKClbMF07CisgICAgICAgIGlmICghc2VsZWN0ZWRGaWxlLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIGxvYWQoUVVybDo6ZnJvbUxvY2FsRmlsZShzZWxlY3RlZEZpbGUpKTsKKyAg
ICB9Cit9CisKSW5kZXg6IFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvbWFpbndpbmRvdy5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvbWFpbndpbmRvdy5oCShyZXZp
c2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci9tYWlud2luZG93Lmg6NTc2
NTQpCisrKyBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL21haW53aW5kb3cuaAkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAy
MDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KKyAqIENvcHly
aWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgorICogQ29weXJp
Z2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3JnPgorICogQ29weXJpZ2h0
IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAw
NiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KKyAqCisgKiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgbWFpbndpbmRvd19oCisjZGVmaW5lIG1haW53aW5kb3df
aAorCisjaW5jbHVkZSA8UXRHdWk+CisjaW5jbHVkZSAid2VicGFnZS5oIgorCitjbGFzcyBMb2Nh
dGlvbkVkaXQ7CisKK2NsYXNzIE1haW5XaW5kb3cgOiBwdWJsaWMgUU1haW5XaW5kb3cgeworICAg
IFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBNYWluV2luZG93KGNvbnN0IFFTdHJpbmcmIHVybCA9
IFFTdHJpbmcoKSk7CisKKyAgICB2b2lkIHNldEFkZHJlc3NVcmwoY29uc3QgUVN0cmluZyYgdXJs
KTsKKyAgICB2b2lkIGFkZENvbXBsZXRlckVudHJ5KGNvbnN0IFFVcmwmIHVybCk7CisKKyAgICB2
b2lkIGxvYWQoY29uc3QgUVN0cmluZyYgdXJsKTsKKyAgICB2b2lkIGxvYWQoY29uc3QgUVVybCYg
dXJsKTsKKworICAgIFdlYlBhZ2UqIHBhZ2UoKTsKKworcHJvdGVjdGVkIHNsb3RzOgorICAgIHZv
aWQgb3BlbkZpbGUoKTsKKyAgICB2b2lkIGNoYW5nZUxvY2F0aW9uKCk7CisKK3ByaXZhdGU6Cisg
ICAgdm9pZCBidWlsZFVJKCk7CisKKyAgICBRU3RyaW5nTGlzdE1vZGVsIHVybE1vZGVsOworICAg
IFFTdHJpbmdMaXN0IHVybExpc3Q7CisgICAgTG9jYXRpb25FZGl0KiB1cmxFZGl0OworCisgICAg
V2ViUGFnZSogbV9wYWdlOworfTsKKworI2VuZGlmCkluZGV4OiBXZWJLaXRUb29scy9RdFRlc3RC
cm93c2VyL3VybGxvYWRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJv
d3Nlci91cmxsb2FkZXIuY3BwCShyZXZpc2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9vbHMvUXRM
YXVuY2hlci91cmxsb2FkZXIuY3BwOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nl
ci91cmxsb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5
KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVW5pdmVyc2l0eSBvZiBTemVnZWQKKyAqCisg
KiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ1cmxsb2FkZXIuaCIKKwor
I2luY2x1ZGUgPFFGaWxlPgorI2luY2x1ZGUgPFFEZWJ1Zz4KKworVXJsTG9hZGVyOjpVcmxMb2Fk
ZXIoUVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgaW5wdXRGaWxlTmFtZSkKKyAgICA6
IG1fZnJhbWUoZnJhbWUpCisgICAgLCBtX3N0ZE91dChzdGRvdXQpCisgICAgLCBtX2xvYWRlZCgw
KQoreworICAgIGluaXQoaW5wdXRGaWxlTmFtZSk7Cit9CisKK3ZvaWQgVXJsTG9hZGVyOjpsb2Fk
TmV4dCgpCit7CisgICAgUVN0cmluZyBxc3RyOworICAgIGlmIChnZXRVcmwocXN0cikpIHsKKyAg
ICAgICAgUVVybCB1cmwocXN0ciwgUVVybDo6U3RyaWN0TW9kZSk7CisgICAgICAgIGlmICh1cmwu
aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBtX3N0ZE91dCA8PCAiTG9hZGluZyAiIDw8IHFzdHIg
PDwgIiAuLi4uLi4iIDw8ICsrbV9sb2FkZWQgPDwgZW5kbDsKKyAgICAgICAgICAgIG1fZnJhbWUt
PmxvYWQodXJsKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBsb2FkTmV4dCgpOworICAg
IH0gZWxzZQorICAgICAgICBkaXNjb25uZWN0KG1fZnJhbWUsIDAsIHRoaXMsIDApOworfQorCit2
b2lkIFVybExvYWRlcjo6aW5pdChjb25zdCBRU3RyaW5nJiBpbnB1dEZpbGVOYW1lKQoreworICAg
IFFGaWxlIGlucHV0RmlsZShpbnB1dEZpbGVOYW1lKTsKKyAgICBpZiAoaW5wdXRGaWxlLm9wZW4o
UUlPRGV2aWNlOjpSZWFkT25seSB8IFFJT0RldmljZTo6VGV4dCkpIHsKKyAgICAgICAgUVRleHRT
dHJlYW0gc3RyZWFtKCZpbnB1dEZpbGUpOworICAgICAgICBRU3RyaW5nIGxpbmU7CisgICAgICAg
IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBsaW5lID0gc3RyZWFtLnJlYWRMaW5lKCk7Cisg
ICAgICAgICAgICBpZiAobGluZS5pc051bGwoKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIG1fdXJscy5hcHBlbmQobGluZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2Ugewor
ICAgICAgICBxRGVidWcoKSA8PCAiQ2FuJ3Qgb3BlbiBsaXN0IGZpbGUiOworICAgICAgICBleGl0
KDApOworICAgIH0KKyAgICBtX2luZGV4ID0gMDsKKyAgICBpbnB1dEZpbGUuY2xvc2UoKTsKK30K
KworYm9vbCBVcmxMb2FkZXI6OmdldFVybChRU3RyaW5nJiBxc3RyKQoreworICAgIGlmIChtX2lu
ZGV4ID09IG1fdXJscy5zaXplKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHFzdHIg
PSBtX3VybHNbbV9pbmRleCsrXTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KSW5kZXg6IFdlYktpdFRv
b2xzL1F0VGVzdEJyb3dzZXIvdXJsbG9hZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMv
UXRUZXN0QnJvd3Nlci91cmxsb2FkZXIuaAkocmV2aXNpb24gNTc2NTQpCShmcm9tIFdlYktpdFRv
b2xzL1F0TGF1bmNoZXIvdXJsbG9hZGVyLmg6NTc2NTQpCisrKyBXZWJLaXRUb29scy9RdFRlc3RC
cm93c2VyL3VybGxvYWRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTggQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVW5pdmVyc2l0eSBvZiBTemVnZWQKKyAq
CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgdXJsbG9hZGVyX2gKKyNk
ZWZpbmUgdXJsbG9hZGVyX2gKKworI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorCisjaW5jbHVkZSA8
UVRleHRTdHJlYW0+CisjaW5jbHVkZSA8UVZlY3Rvcj4KKworY2xhc3MgVXJsTG9hZGVyIDogcHVi
bGljIFFPYmplY3QgeworICAgIFFfT0JKRUNUCisKK3B1YmxpYzoKKyAgICBVcmxMb2FkZXIoUVdl
YkZyYW1lKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgaW5wdXRGaWxlTmFtZSk7CisKK3B1YmxpYyBz
bG90czoKKyAgICB2b2lkIGxvYWROZXh0KCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBpbml0KGNv
bnN0IFFTdHJpbmcmIGlucHV0RmlsZU5hbWUpOworICAgIGJvb2wgZ2V0VXJsKFFTdHJpbmcmIHFz
dHIpOworCitwcml2YXRlOgorICAgIFFWZWN0b3I8UVN0cmluZz4gbV91cmxzOworICAgIGludCBt
X2luZGV4OworICAgIFFXZWJGcmFtZSogbV9mcmFtZTsKKyAgICBRVGV4dFN0cmVhbSBtX3N0ZE91
dDsKKyAgICBpbnQgbV9sb2FkZWQ7Cit9OworCisjZW5kaWYKSW5kZXg6IFdlYktpdFRvb2xzL1F0
VGVzdEJyb3dzZXIvdXNlcmFnZW50bGlzdC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMv
UXRUZXN0QnJvd3Nlci91c2VyYWdlbnRsaXN0LnR4dAkocmV2aXNpb24gNTc2NTQpCShmcm9tIFdl
YktpdFRvb2xzL1F0TGF1bmNoZXIvdXNlcmFnZW50bGlzdC50eHQ6NTc2NTQpCisrKyBXZWJLaXRU
b29scy9RdFRlc3RCcm93c2VyL3VzZXJhZ2VudGxpc3QudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsOSBAQAorTW96aWxsYS81LjAgKFgxMTsgVTsgTGludXg7IGVuLVVTKSBBcHBsZVdlYktp
dC81MzMuMyAoS0hUTUwsIGxpa2UgR2Vja28pIFF0TGF1bmNoZXIvMC4xIFNhZmFyaS81MzMuMwor
TW96aWxsYS81LjAgKFN5bWJpYW5PUy85LjQ7IFU7IFNlcmllczYwLzUuMDsgZW4tR0IpIEFwcGxl
V2ViS2l0LzUzMy4zIChLSFRNTCwgbGlrZSBHZWNrbykgUXRMYXVuY2hlci8wLjEgTW9iaWxlIFNh
ZmFyaS81MzMuMworTW96aWxsYS81LjAgKE1hY2ludG9zaDsgVTsgUFBDIE1hYyBPUyBYOyBlbikg
QXBwbGVXZWJLaXQvMTI1LjIgKEtIVE1MLCBsaWtlIEdlY2tvKSBTYWZhcmkvMTI1LjgKK01vemls
bGEvNS4wIChMaW51eDsgVTsgQW5kcm9pZCAxLjE7IGVuLWdiOyBkcmVhbSkgQXBwbGVXZWJLaXQv
NTI1LjEwKyAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vMy4wLjQgTW9iaWxlIFNhZmFyaS81
MjMuMTIuMgorTW96aWxsYS81LjAgKGlQaG9uZTsgVTsgQ1BVIE9TIDNfMiBsaWtlIE1hYyBPUyBY
OyBlbi11cykgQXBwbGVXZWJLaXQvNTMxLjIxLjEwIChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lv
bi80LjAuNCBNb2JpbGUvN0IzMzRiIFNhZmFyaS81MzEuMjEuMTAKK01vemlsbGEvNS4wKGlQYWQ7
IFU7IENQVSBpUGhvbmUgT1MgM18yIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSBBcHBsZVdlYktpdC81
MzEuMjEuMTAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMC40IE1vYmlsZS83QjMxNCBT
YWZhcmkvNTMxLjIxLjEwCitPcGVyYS85LjI1IChXaW5kb3dzIE5UIDYuMDsgVTsgZW4pCitNb3pp
bGxhLzUuMCAoU3ltYmlhbk9TLzkuNDsgVTsgU2VyaWVzNjAvNS4wIE5va2lhNTgwMGQtMWIvMjAu
Mi4wMTQ7IFByb2ZpbGUvTUlEUC0yLjEgQ29uZmlndXJhdGlvbi9DTERDLTEuMSApIEFwcGxlV2Vi
S2l0LzQxMyAoS0hUTUwsIGxpa2UgR2Vja28pIFNhZmFyaS80MTMKK01vemlsbGEvNC4wIChjb21w
YXRpYmxlOyBNU0lFIDguMDsgV2luZG93cyBOVCA2LjI7IFRyaWRlbnQvNC4wOyBTTENDMjsgLk5F
VCBDTFIgMi4wLjUwNzI3OyAuTkVUIENMUiAzLjUuMzA3Mjk7IC5ORVQgQ0xSIDMuMC4zMDcyOTsg
TWVkaWEgQ2VudGVyIFBDIDYuMCkKSW5kZXg6IFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvdXNl
cmFnZW50bGlzdC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci91
c2VyYWdlbnRsaXN0LnR4dAkocmV2aXNpb24gMCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dz
ZXIvdXNlcmFnZW50bGlzdC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1IEBACi1Nb3pp
bGxhLzUuMCAoWDExOyBVOyBMaW51eDsgZW4tVVMpIEFwcGxlV2ViS2l0LzUzMy4zIChLSFRNTCwg
bGlrZSBHZWNrbykgUXRMYXVuY2hlci8wLjEgU2FmYXJpLzUzMy4zCi1Nb3ppbGxhLzUuMCAoU3lt
Ymlhbk9TLzkuNDsgVTsgU2VyaWVzNjAvNS4wOyBlbi1HQikgQXBwbGVXZWJLaXQvNTMzLjMgKEtI
VE1MLCBsaWtlIEdlY2tvKSBRdExhdW5jaGVyLzAuMSBNb2JpbGUgU2FmYXJpLzUzMy4zCitNb3pp
bGxhLzUuMCAoWDExOyBVOyBMaW51eDsgZW4tVVMpIEFwcGxlV2ViS2l0LzUzMy4zIChLSFRNTCwg
bGlrZSBHZWNrbykgUXRUZXN0QnJvd3Nlci8wLjEgU2FmYXJpLzUzMy4zCitNb3ppbGxhLzUuMCAo
U3ltYmlhbk9TLzkuNDsgVTsgU2VyaWVzNjAvNS4wOyBlbi1HQikgQXBwbGVXZWJLaXQvNTMzLjMg
KEtIVE1MLCBsaWtlIEdlY2tvKSBRdFRlc3RCcm93c2VyLzAuMSBNb2JpbGUgU2FmYXJpLzUzMy4z
CiBNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBVOyBQUEMgTWFjIE9TIFg7IGVuKSBBcHBsZVdlYktp
dC8xMjUuMiAoS0hUTUwsIGxpa2UgR2Vja28pIFNhZmFyaS8xMjUuOAogTW96aWxsYS81LjAgKExp
bnV4OyBVOyBBbmRyb2lkIDEuMTsgZW4tZ2I7IGRyZWFtKSBBcHBsZVdlYktpdC81MjUuMTArIChL
SFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi8zLjAuNCBNb2JpbGUgU2FmYXJpLzUyMy4xMi4yCiBN
b3ppbGxhLzUuMCAoaVBob25lOyBVOyBDUFUgT1MgM18yIGxpa2UgTWFjIE9TIFg7IGVuLXVzKSBB
cHBsZVdlYktpdC81MzEuMjEuMTAgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMC40IE1v
YmlsZS83QjMzNGIgU2FmYXJpLzUzMS4yMS4xMApJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJv
d3Nlci91dGlscy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci91
dGlscy5jcHAJKHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL3V0
aWxzLmNwcDo1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvdXRpbHMuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
Tm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworCitRU3RyaW5n
IHRha2VPcHRpb25WYWx1ZShRU3RyaW5nTGlzdCogYXJndW1lbnRzLCBpbnQgaW5kZXgpCit7Cisg
ICAgUVN0cmluZyByZXN1bHQ7CisKKyAgICBpZiAoKytpbmRleCA8IGFyZ3VtZW50cy0+Y291bnQo
KSAmJiAhYXJndW1lbnRzLT5hdChpbmRleCkuc3RhcnRzV2l0aCgiLSIpKQorICAgICAgICByZXN1
bHQgPSBhcmd1bWVudHMtPnRha2VBdChpbmRleCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CitRU3RyaW5nIGZvcm1hdEtleXMoUUxpc3Q8UVN0cmluZz4ga2V5cykKK3sKKyAgICBRU3RyaW5n
IHJlc3VsdDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMuY291bnQoKSAtIDE7IGkrKykK
KyAgICAgICAgcmVzdWx0LmFwcGVuZChrZXlzLmF0KGkpICsgInwiKTsKKyAgICByZXN1bHQuYXBw
ZW5kKGtleXMubGFzdCgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitRTGlzdDxRU3RyaW5n
PiBlbnVtVG9LZXlzKGNvbnN0IFFNZXRhT2JqZWN0IG8sIGNvbnN0IFFTdHJpbmcmIG5hbWUsIGNv
bnN0IFFTdHJpbmcmIHN0cmlwKQoreworICAgIFFMaXN0PFFTdHJpbmc+IGxpc3Q7CisKKyAgICBp
bnQgZW51bUluZGV4ID0gby5pbmRleE9mRW51bWVyYXRvcihuYW1lLnRvTGF0aW4xKCkuZGF0YSgp
KTsKKyAgICBRTWV0YUVudW0gZW51bWVyYXRvciA9IG8uZW51bWVyYXRvcihlbnVtSW5kZXgpOwor
CisgICAgaWYgKGVudW1lcmF0b3IuaXNWYWxpZCgpKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgZW51bWVyYXRvci5rZXlDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIFFTdHJpbmcg
a2V5KGVudW1lcmF0b3IudmFsdWVUb0tleShpKSk7CisgICAgICAgICAgICBsaXN0LmFwcGVuZChr
ZXkucmVtb3ZlKHN0cmlwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbGlzdDsK
K30KKwordm9pZCBhcHBRdWl0KGludCBleGl0Q29kZSwgY29uc3QgUVN0cmluZyYgbXNnKQorewor
ICAgIGlmICghbXNnLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoZXhpdENvZGUgPiAwKQorICAg
ICAgICAgICAgcURlYnVnKCJFUlJPUjogJXMiLCBtc2cudG9MYXRpbjEoKS5kYXRhKCkpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBxRGVidWcoKSA8PCBtc2c7CisgICAgfQorICAgIGV4aXQo
ZXhpdENvZGUpOworfQorCitRVXJsIHVybEZyb21Vc2VySW5wdXQoY29uc3QgUVN0cmluZyYgc3Ry
aW5nKQoreworICAgIFFTdHJpbmcgaW5wdXQoc3RyaW5nKTsKKyAgICBRRmlsZUluZm8gZmkoaW5w
dXQpOworICAgIGlmIChmaS5leGlzdHMoKSAmJiBmaS5pc1JlbGF0aXZlKCkpCisgICAgICAgIGlu
cHV0ID0gZmkuYWJzb2x1dGVGaWxlUGF0aCgpOworCisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJT
SU9OX0NIRUNLKDQsIDYsIDApCisgICAgcmV0dXJuIFFVcmw6OmZyb21Vc2VySW5wdXQoaW5wdXQp
OworI2Vsc2UKKyAgICByZXR1cm4gUVVybChpbnB1dCk7CisjZW5kaWYKK30KKworCkluZGV4OiBX
ZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL3V0aWxzLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9v
bHMvUXRUZXN0QnJvd3Nlci91dGlscy5oCShyZXZpc2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9v
bHMvUXRMYXVuY2hlci91dGlscy5oOjU3NjU0KQorKysgV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nl
ci91dGlscy5oCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIHV0aWxzX2gKKyNk
ZWZpbmUgdXRpbHNfaAorCisjaW5jbHVkZSA8UXRDb3JlPgorCisjaWZuZGVmIE5PX1JFVFVSTgor
I2lmIGRlZmluZWQoX19DQ19BUk0pIHx8IGRlZmluZWQoX19BUk1DQ19fKQorI2RlZmluZSBOT19S
RVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjZGVm
aW5lIE5PX1JFVFVSTiBfX2F0dHJpYnV0ZSgoX19ub3JldHVybl9fKSkKKyNlbHNlCisjZGVmaW5l
IE5PX1JFVFVSTgorI2VuZGlmCisjZW5kaWYKKworLy8gb3B0aW9ucyBoYW5kbGluZworUVN0cmlu
ZyB0YWtlT3B0aW9uVmFsdWUoUVN0cmluZ0xpc3QqIGFyZ3VtZW50cywgaW50IGluZGV4KTsKK1FT
dHJpbmcgZm9ybWF0S2V5cyhRTGlzdDxRU3RyaW5nPiBrZXlzKTsKK1FMaXN0PFFTdHJpbmc+IGVu
dW1Ub0tleXMoY29uc3QgUU1ldGFPYmplY3QgbywgY29uc3QgUVN0cmluZyYgbmFtZSwgY29uc3Qg
UVN0cmluZyYgc3RyaXApOworCitOT19SRVRVUk4gdm9pZCBhcHBRdWl0KGludCBzdGF0dXMsIGNv
bnN0IFFTdHJpbmcmIG1zZyA9IFFTdHJpbmcoKSk7CisKK1FVcmwgdXJsRnJvbVVzZXJJbnB1dChj
b25zdCBRU3RyaW5nJiBpbnB1dCk7CisKKyNlbmRpZgpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0
QnJvd3Nlci93ZWJpbnNwZWN0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RC
cm93c2VyL3dlYmluc3BlY3Rvci5oCShyZXZpc2lvbiA1NzY1NCkJKGZyb20gV2ViS2l0VG9vbHMv
UXRMYXVuY2hlci93ZWJpbnNwZWN0b3IuaDo1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJy
b3dzZXIvd2ViaW5zcGVjdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiB3ZWJpbnNwZWN0b3JfaAorI2RlZmluZSB3ZWJpbnNwZWN0b3JfaAorCisjaW5jbHVkZSA8
UXRHdWk+CisjaW5jbHVkZSAicXdlYmluc3BlY3Rvci5oIgorCitjbGFzcyBXZWJJbnNwZWN0b3Ig
OiBwdWJsaWMgUVdlYkluc3BlY3RvciB7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIFdl
Ykluc3BlY3RvcihRV2lkZ2V0KiBwYXJlbnQpIDogUVdlYkluc3BlY3RvcihwYXJlbnQpIHt9CisK
K3NpZ25hbHM6CisgICAgdm9pZCB2aXNpYmxlQ2hhbmdlZChib29sIG5vd1Zpc2libGUpOworCitw
cm90ZWN0ZWQ6CisgICAgdm9pZCBzaG93RXZlbnQoUVNob3dFdmVudCogZXZlbnQpCisgICAgewor
ICAgICAgICBRV2ViSW5zcGVjdG9yOjpzaG93RXZlbnQoZXZlbnQpOworICAgICAgICBlbWl0IHZp
c2libGVDaGFuZ2VkKHRydWUpOworICAgIH0KKyAgICB2b2lkIGhpZGVFdmVudChRSGlkZUV2ZW50
KiBldmVudCkKKyAgICB7CisgICAgICAgIFFXZWJJbnNwZWN0b3I6OmhpZGVFdmVudChldmVudCk7
CisgICAgICAgIGVtaXQgdmlzaWJsZUNoYW5nZWQoZmFsc2UpOworICAgIH0KK307CisKKyNlbmRp
ZgpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci93ZWJwYWdlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL3dlYnBhZ2UuY3BwCShyZXZpc2lvbiA1NzY1
NCkJKGZyb20gV2ViS2l0VG9vbHMvUXRMYXVuY2hlci93ZWJwYWdlLmNwcDo1NzY1NCkKKysrIFdl
YktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvd2VicGFnZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBOb2tpYSBDb3Jwb3Jh
dGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAwOSBH
aXJpc2ggUmFtYWtyaXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMuaW4+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYgR2VvcmdlIFN0YWlrb3MgPHN0YWlrb3NAa2RlLm9yZz4KKyAqIENvcHlyaWdodCAo
QykgMjAwNiBEaXJrIE11ZWxsZXIgPG11ZWxsZXJAa2RlLm9yZz4KKyAqIENvcHlyaWdodCAoQykg
MjAwNiBaYWNrIFJ1c2luIDx6YWNrQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2lt
b24gSGF1c21hbm4gPGhhdXNtYW5uQGtkZS5vcmc+CisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAid2VicGFnZS5oIgorCisjaW5jbHVkZSA8UURlc2t0b3BTZXJ2
aWNlcz4KKyNpbmNsdWRlIDxRdEd1aT4KKyNpbmNsdWRlIDxRdE5ldHdvcmsvUU5ldHdvcmtSZXF1
ZXN0PgorI2luY2x1ZGUgPFF0TmV0d29yay9RTmV0d29ya1Byb3h5PgorCitXZWJQYWdlOjpXZWJQ
YWdlKFFPYmplY3QqIHBhcmVudCkKKyAgICA6IFFXZWJQYWdlKHBhcmVudCkKK3sKKyAgICBhcHBs
eVByb3h5KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6YXBwbHlQcm94eSgpCit7CisgICAgUVVybCBw
cm94eVVybChxZ2V0ZW52KCJodHRwX3Byb3h5IikpOworCisgICAgaWYgKHByb3h5VXJsLmlzVmFs
aWQoKSAmJiAhcHJveHlVcmwuaG9zdCgpLmlzRW1wdHkoKSkgeworICAgICAgICBpbnQgcHJveHlQ
b3J0ID0gKHByb3h5VXJsLnBvcnQoKSA+IDApID8gcHJveHlVcmwucG9ydCgpIDogODA4MDsKKyAg
ICAgICAgbmV0d29ya0FjY2Vzc01hbmFnZXIoKS0+c2V0UHJveHkoUU5ldHdvcmtQcm94eShRTmV0
d29ya1Byb3h5OjpIdHRwUHJveHksIHByb3h5VXJsLmhvc3QoKSwgcHJveHlQb3J0KSk7CisgICAg
fQorfQorCitib29sIFdlYlBhZ2U6OnN1cHBvcnRzRXh0ZW5zaW9uKFFXZWJQYWdlOjpFeHRlbnNp
b24gZXh0ZW5zaW9uKSBjb25zdAoreworICAgIGlmIChleHRlbnNpb24gPT0gUVdlYlBhZ2U6OkVy
cm9yUGFnZUV4dGVuc2lvbikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitib29sIFdlYlBhZ2U6OmV4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uLCBjb25z
dCBFeHRlbnNpb25PcHRpb24qIG9wdGlvbiwgRXh0ZW5zaW9uUmV0dXJuKiBvdXRwdXQpCit7Cisg
ICAgY29uc3QgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiogaW5mbyA9IHN0YXRp
Y19jYXN0PGNvbnN0IFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24qPihvcHRpb24p
OworICAgIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4qIGVycm9yUGFnZSA9IHN0
YXRpY19jYXN0PFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4qPihvdXRwdXQpOwor
CisgICAgZXJyb3JQYWdlLT5jb250ZW50ID0gUVN0cmluZygiPGh0bWw+PGhlYWQ+PHRpdGxlPkZh
aWxlZCBsb2FkaW5nIHBhZ2U8L3RpdGxlPjwvaGVhZD48Ym9keT4lMTwvYm9keT48L2h0bWw+IikK
KyAgICAgICAgLmFyZyhpbmZvLT5lcnJvclN0cmluZykudG9VdGY4KCk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlOjphY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChRV2ViRnJh
bWUqIGZyYW1lLCBjb25zdCBRTmV0d29ya1JlcXVlc3QmIHJlcXVlc3QsIE5hdmlnYXRpb25UeXBl
IHR5cGUpCit7CisgICAgUU9iamVjdCogdmlldyA9IHBhcmVudCgpOworCisgICAgUVZhcmlhbnQg
dmFsdWUgPSB2aWV3LT5wcm9wZXJ0eSgia2V5Ym9hcmRNb2RpZmllcnMiKTsKKworICAgIGlmICgh
dmFsdWUuaXNOdWxsKCkpIHsKKyAgICAgICAgUXQ6OktleWJvYXJkTW9kaWZpZXJzIG1vZGlmaWVy
cyA9IFF0OjpLZXlib2FyZE1vZGlmaWVycyh2YWx1ZS50b0ludCgpKTsKKworICAgICAgICBpZiAo
bW9kaWZpZXJzICYgUXQ6OlNoaWZ0TW9kaWZpZXIpIHsKKyAgICAgICAgICAgIFFXZWJQYWdlKiBw
YWdlID0gY3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJCcm93c2VyV2luZG93KTsKKyAgICAgICAg
ICAgIHBhZ2UtPm1haW5GcmFtZSgpLT5sb2FkKHJlcXVlc3QpOworICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGlmaWVycyAmIFF0OjpBbHRNb2Rp
ZmllcikgeworICAgICAgICAgICAgb3BlblVybEluRGVmYXVsdEJyb3dzZXIocmVxdWVzdC51cmwo
KSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gUVdlYlBhZ2U6OmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KGZyYW1lLCByZXF1ZXN0LCB0
eXBlKTsKK30KKwordm9pZCBXZWJQYWdlOjpvcGVuVXJsSW5EZWZhdWx0QnJvd3Nlcihjb25zdCBR
VXJsJiB1cmwpCit7CisgICAgaWYgKFFBY3Rpb24qIGFjdGlvbiA9IHFvYmplY3RfY2FzdDxRQWN0
aW9uKj4oc2VuZGVyKCkpKQorICAgICAgICBRRGVza3RvcFNlcnZpY2VzOjpvcGVuVXJsKGFjdGlv
bi0+ZGF0YSgpLnRvVXJsKCkpOworICAgIGVsc2UKKyAgICAgICAgUURlc2t0b3BTZXJ2aWNlczo6
b3BlblVybCh1cmwpOworfQorCitRU3RyaW5nIFdlYlBhZ2U6OnVzZXJBZ2VudEZvclVybChjb25z
dCBRVXJsJiB1cmwpIGNvbnN0Cit7CisgICAgaWYgKCFtX3VzZXJBZ2VudC5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBtX3VzZXJBZ2VudDsKKyAgICByZXR1cm4gUVdlYlBhZ2U6OnVzZXJBZ2Vu
dEZvclVybCh1cmwpOworfQpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci93ZWJwYWdl
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci93ZWJwYWdlLmgJKHJl
dmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVyL3dlYnBhZ2UuaDo1NzY1
NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvd2VicGFnZS5oCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkg
R2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgorICogQ29weXJpZ2h0
IChDKSAyMDA2IEdlb3JnZSBTdGFpa29zIDxzdGFpa29zQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYgRGlyayBNdWVsbGVyIDxtdWVsbGVyQGtkZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgWmFjayBSdXNpbiA8emFja0BrZGUub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNp
bW9uIEhhdXNtYW5uIDxoYXVzbWFubkBrZGUub3JnPgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiB3ZWJwYWdlX2gKKyNkZWZpbmUgd2VicGFnZV9oCisKKyNpbmNs
dWRlIDxxd2ViZnJhbWUuaD4KKyNpbmNsdWRlIDxxd2VicGFnZS5oPgorCitjbGFzcyBXZWJQYWdl
IDogcHVibGljIFFXZWJQYWdlIHsKKyAgICBRX09CSkVDVAorCitwdWJsaWM6CisgICAgV2ViUGFn
ZShRT2JqZWN0KiBwYXJlbnQgPSAwKTsKKworICAgIHZpcnR1YWwgUVdlYlBhZ2UqIGNyZWF0ZVdp
bmRvdyhRV2ViUGFnZTo6V2ViV2luZG93VHlwZSk7CisgICAgdmlydHVhbCBRT2JqZWN0KiBjcmVh
dGVQbHVnaW4oY29uc3QgUVN0cmluZyYsIGNvbnN0IFFVcmwmLCBjb25zdCBRU3RyaW5nTGlzdCYs
IGNvbnN0IFFTdHJpbmdMaXN0Jik7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRXh0ZW5zaW9u
KFFXZWJQYWdlOjpFeHRlbnNpb24gZXh0ZW5zaW9uKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wg
ZXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24sIGNvbnN0IEV4dGVuc2lvbk9wdGlvbiogb3B0
aW9uLCBFeHRlbnNpb25SZXR1cm4qIG91dHB1dCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgYWNjZXB0
TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1lKiBmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0
JiByZXF1ZXN0LCBOYXZpZ2F0aW9uVHlwZSB0eXBlKTsKKworICAgIFFTdHJpbmcgdXNlckFnZW50
Rm9yVXJsKGNvbnN0IFFVcmwmIHVybCkgY29uc3Q7CisKK3B1YmxpYyBzbG90czoKKyAgICB2b2lk
IG9wZW5VcmxJbkRlZmF1bHRCcm93c2VyKGNvbnN0IFFVcmwmIHVybCA9IFFVcmwoKSk7CisgICAg
dm9pZCBzZXRVc2VyQWdlbnQoY29uc3QgUVN0cmluZyYgdWEpIHsgbV91c2VyQWdlbnQgPSB1YTsg
fQorCitwcml2YXRlOgorICAgIHZvaWQgYXBwbHlQcm94eSgpOworICAgIFFTdHJpbmcgbV91c2Vy
QWdlbnQ7Cit9OworCisjZW5kaWYKSW5kZXg6IFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvd2Vi
dmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nlci93ZWJ2aWV3
LmNwcAkocmV2aXNpb24gNTc2NTQpCShmcm9tIFdlYktpdFRvb2xzL1F0TGF1bmNoZXIvd2Vidmll
dy5jcHA6NTc2NTQpCisrKyBXZWJLaXRUb29scy9RdFRlc3RCcm93c2VyL3dlYnZpZXcuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJp
Z2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4K
KyAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3JnPgor
ICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3JnPgorICog
Q29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KKyAqIENvcHlyaWdo
dCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KKyAqCisgKiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ3ZWJ2aWV3LmgiCisKKyNpbmNsdWRl
IDxRdEd1aT4KKyNpbmNsdWRlIDxRR3JhcGhpY3NTY2VuZT4KKworV2ViVmlld0dyYXBoaWNzQmFz
ZWQ6OldlYlZpZXdHcmFwaGljc0Jhc2VkKFFXaWRnZXQqIHBhcmVudCkKKyAgICA6IFFHcmFwaGlj
c1ZpZXcocGFyZW50KQorICAgICwgbV9pdGVtKG5ldyBHcmFwaGljc1dlYlZpZXcpCisgICAgLCBt
X251bVBhaW50c1RvdGFsKDApCisgICAgLCBtX251bVBhaW50c1NpbmNlTGFzdE1lYXN1cmUoMCkK
KyAgICAsIG1fbWVhc3VyZUZwcyhmYWxzZSkKKyAgICAsIG1fcmVzaXplc1RvQ29udGVudHMoZmFs
c2UpCit7CisgICAgc2V0U2NlbmUobmV3IFFHcmFwaGljc1NjZW5lKHRoaXMpKTsKKyAgICBzY2Vu
ZSgpLT5hZGRJdGVtKG1faXRlbSk7CisKKyAgICBzZXRGcmFtZVNoYXBlKFFGcmFtZTo6Tm9GcmFt
ZSk7CisgICAgc2V0SG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlz
T2ZmKTsKKyAgICBzZXRWZXJ0aWNhbFNjcm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQWx3YXlz
T2ZmKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gUVRfVkVSU0lPTl9DSEVDSyg0LCA2LCAwKQorICAg
IFFTdGF0ZU1hY2hpbmUqIG1hY2hpbmUgPSBuZXcgUVN0YXRlTWFjaGluZSh0aGlzKTsKKyAgICBR
U3RhdGUqIHMwID0gbmV3IFFTdGF0ZShtYWNoaW5lKTsKKyAgICBzMC0+YXNzaWduUHJvcGVydHko
dGhpcywgInlSb3RhdGlvbiIsIDApOworCisgICAgUVN0YXRlKiBzMSA9IG5ldyBRU3RhdGUobWFj
aGluZSk7CisgICAgczEtPmFzc2lnblByb3BlcnR5KHRoaXMsICJ5Um90YXRpb24iLCA5MCk7CisK
KyAgICBRQWJzdHJhY3RUcmFuc2l0aW9uKiB0MSA9IHMwLT5hZGRUcmFuc2l0aW9uKHRoaXMsIFNJ
R05BTCh5RmxpcFJlcXVlc3QoKSksIHMxKTsKKyAgICBRUHJvcGVydHlBbmltYXRpb24qIHlSb3Rh
dGlvbkFuaW0gPSBuZXcgUVByb3BlcnR5QW5pbWF0aW9uKHRoaXMsICJ5Um90YXRpb24iLCB0aGlz
KTsKKyAgICB5Um90YXRpb25BbmltLT5zZXREdXJhdGlvbigxMDAwKTsKKyAgICB0MS0+YWRkQW5p
bWF0aW9uKHlSb3RhdGlvbkFuaW0pOworCisgICAgUVN0YXRlKiBzMiA9IG5ldyBRU3RhdGUobWFj
aGluZSk7CisgICAgczItPmFzc2lnblByb3BlcnR5KHRoaXMsICJ5Um90YXRpb24iLCAtOTApOwor
ICAgIHMxLT5hZGRUcmFuc2l0aW9uKHMxLCBTSUdOQUwocHJvcGVydGllc0Fzc2lnbmVkKCkpLCBz
Mik7CisKKyAgICBRQWJzdHJhY3RUcmFuc2l0aW9uKiB0MiA9IHMyLT5hZGRUcmFuc2l0aW9uKHMw
KTsKKyAgICB0Mi0+YWRkQW5pbWF0aW9uKHlSb3RhdGlvbkFuaW0pOworCisgICAgbWFjaGluZS0+
c2V0SW5pdGlhbFN0YXRlKHMwKTsKKyAgICBtYWNoaW5lLT5zdGFydCgpOworI2VuZGlmCisKKyAg
ICBtX3VwZGF0ZVRpbWVyID0gbmV3IFFUaW1lcih0aGlzKTsKKyAgICBtX3VwZGF0ZVRpbWVyLT5z
ZXRJbnRlcnZhbCgxMDAwKTsKKyAgICBjb25uZWN0KG1fdXBkYXRlVGltZXIsIFNJR05BTCh0aW1l
b3V0KCkpLCB0aGlzLCBTTE9UKHVwZGF0ZUZyYW1lUmF0ZSgpKSk7Cit9CisKK3ZvaWQgV2ViVmll
d0dyYXBoaWNzQmFzZWQ6OnNldFJlc2l6ZXNUb0NvbnRlbnRzKGJvb2wgYikKK3sKKyAgICBtX3Jl
c2l6ZXNUb0NvbnRlbnRzID0gYjsKKyAgICBtX2l0ZW0tPnNldFJlc2l6ZXNUb0NvbnRlbnRzKG1f
cmVzaXplc1RvQ29udGVudHMpOworICAgIGlmIChtX3Jlc2l6ZXNUb0NvbnRlbnRzKSB7CisgICAg
ICAgIHNldEhvcml6b250YWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFzTmVlZGVkKTsK
KyAgICAgICAgc2V0VmVydGljYWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFzTmVlZGVk
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRIb3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5KFF0
OjpTY3JvbGxCYXJBbHdheXNPZmYpOworICAgICAgICBzZXRWZXJ0aWNhbFNjcm9sbEJhclBvbGlj
eShRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViVmlld0dyYXBo
aWNzQmFzZWQ6OnJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCogZXZlbnQpCit7CisgICAgUUdyYXBo
aWNzVmlldzo6cmVzaXplRXZlbnQoZXZlbnQpOworICAgIGlmIChtX3Jlc2l6ZXNUb0NvbnRlbnRz
KQorICAgICAgICByZXR1cm47CisgICAgUVJlY3RGIHJlY3QoUVBvaW50KDAsIDApLCBldmVudC0+
c2l6ZSgpKTsKKyAgICBtX2l0ZW0tPnNldEdlb21ldHJ5KHJlY3QpOworfQorCit2b2lkIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkOjpzZXRGcmFtZVJhdGVNZWFzdXJlbWVudEVuYWJsZWQoYm9vbCBlbmFi
bGVkKQoreworICAgIG1fbWVhc3VyZUZwcyA9IGVuYWJsZWQ7CisgICAgaWYgKG1fbWVhc3VyZUZw
cykgeworICAgICAgICBtX2xhc3RDb25zdWx0VGltZSA9IG1fc3RhcnRUaW1lID0gUVRpbWU6OmN1
cnJlbnRUaW1lKCk7CisgICAgICAgIG1fdXBkYXRlVGltZXItPnN0YXJ0KCk7CisgICAgfSBlbHNl
CisgICAgICAgIG1fdXBkYXRlVGltZXItPnN0b3AoKTsKK30KKwordm9pZCBXZWJWaWV3R3JhcGhp
Y3NCYXNlZDo6dXBkYXRlRnJhbWVSYXRlKCkKK3sKKyAgICBRVGltZSBub3cgPSBRVGltZTo6Y3Vy
cmVudFRpbWUoKTsKKworICAgIGludCBpbnRlcnZhbCA9IG1fbGFzdENvbnN1bHRUaW1lLm1zZWNz
VG8obm93KTsKKyAgICBpbnQgdG90YWwgPSBtX3N0YXJ0VGltZS5tc2Vjc1RvKG5vdyk7CisKKyAg
ICBpbnQgYXZlcmFnZSA9IHRvdGFsID8gbV9udW1QYWludHNUb3RhbCAqIDEwMDAgLyB0b3RhbCA6
IDA7CisgICAgaW50IGN1cnJlbnQgPSBpbnRlcnZhbCA/IG1fbnVtUGFpbnRzU2luY2VMYXN0TWVh
c3VyZSAqIDEwMDAgLyBpbnRlcnZhbCA6IDA7CisKKyAgICBlbWl0IGN1cnJlbnRGUFNVcGRhdGVk
KGN1cnJlbnQpOworCisgICAgbV9sYXN0Q29uc3VsdFRpbWUgPSBub3c7CisgICAgbV9udW1QYWlu
dHNTaW5jZUxhc3RNZWFzdXJlID0gMDsKK30KKwordm9pZCBXZWJWaWV3R3JhcGhpY3NCYXNlZDo6
YW5pbWF0ZWRGbGlwKCkKK3sKKyNpZiBRVF9WRVJTSU9OID49IFFUX1ZFUlNJT05fQ0hFQ0soNCwg
NiwgMCkKKyAgICBRU2l6ZUYgY2VudGVyID0gbV9pdGVtLT5ib3VuZGluZ1JlY3QoKS5zaXplKCkg
LyAyOworICAgIFFQb2ludEYgY2VudGVyUG9pbnQgPSBRUG9pbnRGKGNlbnRlci53aWR0aCgpLCBj
ZW50ZXIuaGVpZ2h0KCkpOworICAgIG1faXRlbS0+c2V0VHJhbnNmb3JtT3JpZ2luUG9pbnQoY2Vu
dGVyUG9pbnQpOworCisgICAgUVByb3BlcnR5QW5pbWF0aW9uKiBhbmltYXRpb24gPSBuZXcgUVBy
b3BlcnR5QW5pbWF0aW9uKG1faXRlbSwgInJvdGF0aW9uIiwgdGhpcyk7CisgICAgYW5pbWF0aW9u
LT5zZXREdXJhdGlvbigxMDAwKTsKKworICAgIGludCByb3RhdGlvbiA9IGludChtX2l0ZW0tPnJv
dGF0aW9uKCkpOworCisgICAgYW5pbWF0aW9uLT5zZXRTdGFydFZhbHVlKHJvdGF0aW9uKTsKKyAg
ICBhbmltYXRpb24tPnNldEVuZFZhbHVlKHJvdGF0aW9uICsgMTgwIC0gKHJvdGF0aW9uICUgMTgw
KSk7CisKKyAgICBhbmltYXRpb24tPnN0YXJ0KFFBYnN0cmFjdEFuaW1hdGlvbjo6RGVsZXRlV2hl
blN0b3BwZWQpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViVmlld0dyYXBoaWNzQmFzZWQ6OmFuaW1h
dGVkWUZsaXAoKQoreworICAgIGVtaXQgeUZsaXBSZXF1ZXN0KCk7Cit9CisKK3ZvaWQgV2ViVmll
d0dyYXBoaWNzQmFzZWQ6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGV2ZW50KQoreworICAgIFFH
cmFwaGljc1ZpZXc6OnBhaW50RXZlbnQoZXZlbnQpOworICAgIGlmICghbV9tZWFzdXJlRnBzKQor
ICAgICAgICByZXR1cm47CisgICAgbV9udW1QYWludHNTaW5jZUxhc3RNZWFzdXJlKys7CisgICAg
bV9udW1QYWludHNUb3RhbCsrOworfQorCitzdGF0aWMgUU1lbnUqIGNyZWF0ZUNvbnRleHRNZW51
KFFXZWJQYWdlKiBwYWdlLCBRUG9pbnQgcG9zaXRpb24pCit7CisgICAgUU1lbnUqIG1lbnUgPSBw
YWdlLT5jcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCk7CisKKyAgICBRV2ViSGl0VGVzdFJlc3Vs
dCByID0gcGFnZS0+bWFpbkZyYW1lKCktPmhpdFRlc3RDb250ZW50KHBvc2l0aW9uKTsKKworICAg
IGlmICghci5saW5rVXJsKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIFdlYlBhZ2UqIHdlYlBhZ2Ug
PSBxb2JqZWN0X2Nhc3Q8V2ViUGFnZSo+KHBhZ2UpOworICAgICAgICBRQWN0aW9uKiBuZXdUYWJB
Y3Rpb24gPSBtZW51LT5hZGRBY3Rpb24oIk9wZW4gaW4gRGVmYXVsdCAmQnJvd3NlciIsIHdlYlBh
Z2UsIFNMT1Qob3BlblVybEluRGVmYXVsdEJyb3dzZXIoKSkpOworICAgICAgICBuZXdUYWJBY3Rp
b24tPnNldERhdGEoci5saW5rVXJsKCkpOworICAgICAgICBtZW51LT5pbnNlcnRBY3Rpb24obWVu
dS0+YWN0aW9ucygpLmF0KDIpLCBuZXdUYWJBY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gbWVu
dTsKK30KKwordm9pZCBHcmFwaGljc1dlYlZpZXc6Om1vdXNlUHJlc3NFdmVudChRR3JhcGhpY3NT
Y2VuZU1vdXNlRXZlbnQqIGV2ZW50KQoreworICAgIHNldFByb3BlcnR5KCJtb3VzZUJ1dHRvbnMi
LCBRVmFyaWFudDo6ZnJvbVZhbHVlKGludChldmVudC0+YnV0dG9ucygpKSkpOworICAgIHNldFBy
b3BlcnR5KCJrZXlib2FyZE1vZGlmaWVycyIsIFFWYXJpYW50Ojpmcm9tVmFsdWUoaW50KGV2ZW50
LT5tb2RpZmllcnMoKSkpKTsKKworICAgIFFHcmFwaGljc1dlYlZpZXc6Om1vdXNlUHJlc3NFdmVu
dChldmVudCk7Cit9CisKK3ZvaWQgV2ViVmlld1RyYWRpdGlvbmFsOjptb3VzZVByZXNzRXZlbnQo
UU1vdXNlRXZlbnQqIGV2ZW50KQoreworICAgIHNldFByb3BlcnR5KCJtb3VzZUJ1dHRvbnMiLCBR
VmFyaWFudDo6ZnJvbVZhbHVlKGludChldmVudC0+YnV0dG9ucygpKSkpOworICAgIHNldFByb3Bl
cnR5KCJrZXlib2FyZE1vZGlmaWVycyIsIFFWYXJpYW50Ojpmcm9tVmFsdWUoaW50KGV2ZW50LT5t
b2RpZmllcnMoKSkpKTsKKworICAgIFFXZWJWaWV3Ojptb3VzZVByZXNzRXZlbnQoZXZlbnQpOwor
fQorCit2b2lkIEdyYXBoaWNzV2ViVmlldzo6Y29udGV4dE1lbnVFdmVudChRR3JhcGhpY3NTY2Vu
ZUNvbnRleHRNZW51RXZlbnQqIGV2ZW50KQoreworICAgIFFNZW51KiBtZW51ID0gY3JlYXRlQ29u
dGV4dE1lbnUocGFnZSgpLCBldmVudC0+cG9zKCkudG9Qb2ludCgpKTsKKyAgICBtZW51LT5leGVj
KG1hcFRvU2NlbmUoZXZlbnQtPnBvcygpKS50b1BvaW50KCkpOworICAgIGRlbGV0ZSBtZW51Owor
fQorCit2b2lkIFdlYlZpZXdUcmFkaXRpb25hbDo6Y29udGV4dE1lbnVFdmVudChRQ29udGV4dE1l
bnVFdmVudCogZXZlbnQpCit7CisgICAgUU1lbnUqIG1lbnUgPSBjcmVhdGVDb250ZXh0TWVudShw
YWdlKCksIGV2ZW50LT5wb3MoKSk7CisgICAgbWVudS0+ZXhlYyhtYXBUb0dsb2JhbChldmVudC0+
cG9zKCkpKTsKKyAgICBkZWxldGUgbWVudTsKK30KKwpJbmRleDogV2ViS2l0VG9vbHMvUXRUZXN0
QnJvd3Nlci93ZWJ2aWV3LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvUXRUZXN0QnJvd3Nl
ci93ZWJ2aWV3LmgJKHJldmlzaW9uIDU3NjU0KQkoZnJvbSBXZWJLaXRUb29scy9RdExhdW5jaGVy
L3dlYnZpZXcuaDo1NzY1NCkKKysrIFdlYktpdFRvb2xzL1F0VGVzdEJyb3dzZXIvd2Vidmlldy5o
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29w
eXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5p
bj4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBHZW9yZ2UgU3RhaWtvcyA8c3RhaWtvc0BrZGUub3Jn
PgorICogQ29weXJpZ2h0IChDKSAyMDA2IERpcmsgTXVlbGxlciA8bXVlbGxlckBrZGUub3JnPgor
ICogQ29weXJpZ2h0IChDKSAyMDA2IFphY2sgUnVzaW4gPHphY2tAa2RlLm9yZz4KKyAqIENvcHly
aWdodCAoQykgMjAwNiBTaW1vbiBIYXVzbWFubiA8aGF1c21hbm5Aa2RlLm9yZz4KKyAqCisgKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgd2Vidmlld19oCisjZGVmaW5lIHdl
YnZpZXdfaAorCisjaW5jbHVkZSAid2VicGFnZS5oIgorI2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+Cisj
aW5jbHVkZSA8cWdyYXBoaWNzd2Vidmlldy5oPgorI2luY2x1ZGUgPFFHcmFwaGljc1ZpZXc+Cisj
aW5jbHVkZSA8UUdyYXBoaWNzV2lkZ2V0PgorI2luY2x1ZGUgPFFUaW1lPgorCitjbGFzcyBXZWJW
aWV3VHJhZGl0aW9uYWwgOiBwdWJsaWMgUVdlYlZpZXcgeworICAgIFFfT0JKRUNUCisKK3B1Ymxp
YzoKKyAgICBXZWJWaWV3VHJhZGl0aW9uYWwoUVdpZGdldCogcGFyZW50KSA6IFFXZWJWaWV3KHBh
cmVudCkge30KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50
KFFDb250ZXh0TWVudUV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NFdmVudChR
TW91c2VFdmVudCopOworfTsKKworCitjbGFzcyBHcmFwaGljc1dlYlZpZXcgOiBwdWJsaWMgUUdy
YXBoaWNzV2ViVmlldyB7CisgICAgUV9PQkpFQ1QKKworcHVibGljOgorICAgIEdyYXBoaWNzV2Vi
VmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKSA6IFFHcmFwaGljc1dlYlZpZXcocGFyZW50
KSB7fTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KFFH
cmFwaGljc1NjZW5lQ29udGV4dE1lbnVFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZVBy
ZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50Kik7Cit9OworCisKK2NsYXNzIFdlYlZp
ZXdHcmFwaGljc0Jhc2VkIDogcHVibGljIFFHcmFwaGljc1ZpZXcgeworICAgIFFfT0JKRUNUCisg
ICAgUV9QUk9QRVJUWShxcmVhbCB5Um90YXRpb24gUkVBRCB5Um90YXRpb24gV1JJVEUgc2V0WVJv
dGF0aW9uKQorCitwdWJsaWM6CisgICAgV2ViVmlld0dyYXBoaWNzQmFzZWQoUVdpZGdldCogcGFy
ZW50KTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50Kik7CisgICAg
dm9pZCBzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKSB7IG1faXRlbS0+c2V0UGFnZShwYWdlKTsgfQor
ICAgIHZvaWQgc2V0SXRlbUNhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpDYWNoZU1vZGUgbW9kZSkg
eyBtX2l0ZW0tPnNldENhY2hlTW9kZShtb2RlKTsgfQorICAgIFFHcmFwaGljc0l0ZW06OkNhY2hl
TW9kZSBpdGVtQ2FjaGVNb2RlKCkgeyByZXR1cm4gbV9pdGVtLT5jYWNoZU1vZGUoKTsgfQorCisg
ICAgdm9pZCBzZXRGcmFtZVJhdGVNZWFzdXJlbWVudEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKyAg
ICBib29sIGZyYW1lUmF0ZU1lYXN1cmVtZW50RW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbWVh
c3VyZUZwczsgfQorCisgICAgdmlydHVhbCB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqIGV2
ZW50KTsKKworICAgIHZvaWQgc2V0UmVzaXplc1RvQ29udGVudHMoYm9vbCBiKTsKKworICAgIHZv
aWQgc2V0WVJvdGF0aW9uKHFyZWFsIGFuZ2xlKQorICAgIHsKKyNpZiBRVF9WRVJTSU9OID49IFFU
X1ZFUlNJT05fQ0hFQ0soNCwgNiwgMCkKKyAgICAgICAgUVJlY3RGIHIgPSBtX2l0ZW0tPmJvdW5k
aW5nUmVjdCgpOworICAgICAgICBtX2l0ZW0tPnNldFRyYW5zZm9ybShRVHJhbnNmb3JtKCkKKyAg
ICAgICAgICAgIC50cmFuc2xhdGUoci53aWR0aCgpIC8gMiwgci5oZWlnaHQoKSAvIDIpCisgICAg
ICAgICAgICAucm90YXRlKGFuZ2xlLCBRdDo6WUF4aXMpCisgICAgICAgICAgICAudHJhbnNsYXRl
KC1yLndpZHRoKCkgLyAyLCAtci5oZWlnaHQoKSAvIDIpKTsKKyNlbmRpZgorICAgICAgICBtX3lS
b3RhdGlvbiA9IGFuZ2xlOworICAgIH0KKyAgICBxcmVhbCB5Um90YXRpb24oKSBjb25zdAorICAg
IHsKKyAgICAgICAgcmV0dXJuIG1feVJvdGF0aW9uOworICAgIH0KKworICAgIEdyYXBoaWNzV2Vi
VmlldyogZ3JhcGhpY3NXZWJWaWV3KCkgY29uc3QgeyByZXR1cm4gbV9pdGVtOyB9CisKK3B1Ymxp
YyBzbG90czoKKyAgICB2b2lkIHVwZGF0ZUZyYW1lUmF0ZSgpOworICAgIHZvaWQgYW5pbWF0ZWRG
bGlwKCk7CisgICAgdm9pZCBhbmltYXRlZFlGbGlwKCk7CisKK3NpZ25hbHM6CisgICAgdm9pZCB5
RmxpcFJlcXVlc3QoKTsKKyAgICB2b2lkIGN1cnJlbnRGUFNVcGRhdGVkKGludCBmcHMpOworCitw
cml2YXRlOgorICAgIEdyYXBoaWNzV2ViVmlldyogbV9pdGVtOworICAgIGludCBtX251bVBhaW50
c1RvdGFsOworICAgIGludCBtX251bVBhaW50c1NpbmNlTGFzdE1lYXN1cmU7CisgICAgUVRpbWUg
bV9zdGFydFRpbWU7CisgICAgUVRpbWUgbV9sYXN0Q29uc3VsdFRpbWU7CisgICAgUVRpbWVyKiBt
X3VwZGF0ZVRpbWVyOworICAgIGJvb2wgbV9tZWFzdXJlRnBzOworICAgIHFyZWFsIG1feVJvdGF0
aW9uOworICAgIGJvb2wgbV9yZXNpemVzVG9Db250ZW50czsKK307CisKKyNlbmRpZgpJbmRleDog
V2ViS2l0VG9vbHMvU2NyaXB0cy9ydW4tbGF1bmNoZXIKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9v
bHMvU2NyaXB0cy9ydW4tbGF1bmNoZXIJKHJldmlzaW9uIDU3NjU0KQorKysgV2ViS2l0VG9vbHMv
U2NyaXB0cy9ydW4tbGF1bmNoZXIJKHdvcmtpbmcgY29weSkKQEAgLTQ3LDcgKzQ3LDcgQEAgY2hl
Y2tGcmFtZXdvcmtzKCk7CiAjIFNldCBwYXRocyBhY2NvcmRpbmcgdG8gdGhlIGJ1aWxkIHN5c3Rl
bSB1c2VkCiBpZiAoaXNRdCgpKSB7CiAgICAgbXkgJGxpYkRpciA9IGNhdGRpcihwcm9kdWN0RGly
KCksICdsaWInKTsKLSAgICAkbGF1bmNoZXJQYXRoID0gY2F0ZGlyKCRsYXVuY2hlclBhdGgsICJi
aW4iLCAiUXRMYXVuY2hlciIpOworICAgICRsYXVuY2hlclBhdGggPSBjYXRkaXIoJGxhdW5jaGVy
UGF0aCwgImJpbiIsICJRdFRlc3RCcm93c2VyIik7CiAKICAgICAkRU5We1FUV0VCS0lUX1BMVUdJ
Tl9QQVRIfSA9IGNhdGRpcigkbGliRGlyLCAncGx1Z2lucycpOwogCkluZGV4OiBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdGRpcnMucG0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRkaXJzLnBtCShyZXZpc2lvbiA1NzY1NCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0ZGlycy5wbQkod29ya2luZyBjb3B5KQpAQCAtODkxLDcgKzg5MSw3IEBAIHN1YiBsYXVu
Y2hlck5hbWUoKQogICAgIGlmIChpc0d0aygpKSB7CiAgICAgICAgIHJldHVybiAiR3RrTGF1bmNo
ZXIiOwogICAgIH0gZWxzaWYgKGlzUXQoKSkgewotICAgICAgICByZXR1cm4gIlF0TGF1bmNoZXIi
OworICAgICAgICByZXR1cm4gIlF0VGVzdEJyb3dzZXIiOwogICAgIH0gZWxzaWYgKGlzV3goKSkg
ewogICAgICAgICByZXR1cm4gInd4QnJvd3NlciI7CiAgICAgfSBlbHNpZiAoaXNBcHBsZVdlYktp
dCgpKSB7Cg==
</data>
<flag name="review"
          id="37209"
          type_id="1"
          status="+"
          setter="koivisto"
    />
    <flag name="commit-queue"
          id="37210"
          type_id="3"
          status="-"
          setter="commit-queue"
    />
          </attachment>
      

    </bug>

</bugzilla>