<?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>4155</bug_id>
          
          <creation_ts>2005-07-26 23:47:41 -0700</creation_ts>
          <short_desc>Temporary WebCore SPI necessary for SVG testing tools</short_desc>
          <delta_ts>2005-07-29 13:39:46 -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>SVG</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>4156</blocked>
    
    <blocked>4157</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>15235</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-07-26 23:47:41 -0700</bug_when>
    <thetext>Temporary WebCore SPI necessary for SVG testing tools.

This adds a few Obj-C wrappers around kcanvas, ksvg2 to allow writing Obj-C based testing tools which 
link against WebCore+SVG.

This SPI is only temporary, and will only exist in WebCore+SVG until SVG is well enough integrated that 
rendering can happen using the normal WebKit draw methods, and dom manipulation can happen through 
the WebKit exposed Obj-C dom classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>15292</commentid>
    <comment_count>1</comment_count>
      <attachid>3126</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-07-27 17:29:56 -0700</bug_when>
    <thetext>Created attachment 3126
SPI additions necessary for builidng SVG test tools</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>15405</commentid>
    <comment_count>2</comment_count>
      <attachid>3126</attachid>
    <who name="John Sullivan">sullivan</who>
    <bug_when>2005-07-29 11:40:36 -0700</bug_when>
    <thetext>Comment on attachment 3126
SPI additions necessary for builidng SVG test tools

Given that this is all temporary code to be used for testing, I didn&apos;t review
it really carefully. I did point out a couple of small things worth correcting
on IRC, so I&apos;m giving this a review- and will give the slightly improved
version a review+.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>15406</commentid>
    <comment_count>3</comment_count>
      <attachid>3148</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-07-29 12:00:40 -0700</bug_when>
    <thetext>Created attachment 3148
Improved version: (more comments, spelling correction)

I added a bunch of comments, mostly trying to explain some of the hacks
contained in this SPI.	None of this code was ever really meant to &quot;see the
light of day&quot; but I feel that releasing it now will help un-block other aspects
of SVG development, and when things like Obj-C DOM interface generation, or the
WC-DOM/KDOM merge are complete all of this code will be deleted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>15407</commentid>
    <comment_count>4</comment_count>
      <attachid>3148</attachid>
    <who name="John Sullivan">sullivan</who>
    <bug_when>2005-07-29 12:05:24 -0700</bug_when>
    <thetext>Comment on attachment 3148
Improved version: (more comments, spelling correction)

Checking this in as-is seems fine, given its temporary nature.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>3126</attachid>
            <date>2005-07-27 17:29:56 -0700</date>
            <delta_ts>2005-07-29 12:00:40 -0700</delta_ts>
            <desc>SPI additions necessary for builidng SVG test tools</desc>
            <filename>svg_spi.patch</filename>
            <type>text/plain</type>
            <size>83212</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IERyYXdDYW52YXNJdGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogRHJhd0NhbnZhc0l0
ZW0uaApkaWZmIC1OIERyYXdDYW52YXNJdGVtLmgKLS0tIERyYXdDYW52YXNJdGVtLmgJMSBKYW4g
MTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd0NhbnZhc0l0ZW0uaAkyOCBKdWwgMjAwNSAwMDow
NzoyMCAtMDAwMApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFw
cGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisvKgorIFdB
Uk5JTkc6IFRoZXNlIGZpbGVzIGFyZSB0ZW1wb3JhcnkgYW5kIGV4aXN0IHNvbGVseSBmb3IgdGhl
IHB1cnBvc2UKKyBvZiBhbGxvd2luZyBncmVhdGVyIHRlc3Rpbmcgb2YgV2ViQ29yZStTVkcgcHJp
b3IgdG8gZnVsbCBET00gaW50ZWdyYXRpb24uCisgRG8gTk9UIGRlcGVuZCBvbiB0aGVzZSBTUElz
IG9yIGZpbGVzIGFzIHRoZXkgd2lsbCBzb29uIGJlIGdvbmUuCisqLworCisjaW1wb3J0IDxDb2Nv
YS9Db2NvYS5oPgorCisvLyBUaGlzIGlzIGFuIE9iai1DIHdyYXBwZXIgb2JqZWN0IGZvciBLQ2Fu
dmFzSXRlbQorLy8gVGhpcyBleGlzdHMgbW9zdGx5IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBPYmot
QworLy8gYmluZGluZ3MgZm9yIHRoZSBTVkcgRE9NIHlldC4KKworQGNsYXNzIERyYXdDYW52YXNJ
dGVtUHJpdmF0ZTsKKworQGludGVyZmFjZSBEcmF3Q2FudmFzSXRlbSA6IE5TT2JqZWN0IHsKKyAg
ICBEcmF3Q2FudmFzSXRlbVByaXZhdGUgKl9wcml2YXRlOworfQorCisvLyBjb252ZW5pZW5jZQor
KyAoTlNBcnJheSAqKWNvbnRyb2xQb2ludHNGb3JSZWN0OihOU1JlY3QpYmJveDsKKysgKE5TUG9p
bnQpZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6KGludCljb250cm9sUG9pbnRJ
bmRleCBmcm9tUmVjdENvbnRyb2xQb2ludHM6KE5TQXJyYXkgKiljb250cm9sUG9pbnRzOworCist
IChOU1BvaW50KWRyYWdBbmNob3JQb2ludEZvckNvbnRyb2xQb2ludEluZGV4OihpbnQpY29udHJv
bFBvaW50SW5kZXg7CistIChOU0FycmF5ICopY29udHJvbFBvaW50czsKKy0gKE5TUmVjdClib3Vu
ZGluZ0JveDsKKworLSAodm9pZCl0cmFuc2xhdGVCeU9mZnNldDooTlNTaXplKW9mZnNldDsKKy0g
KHZvaWQpcmVzaXplV2l0aFBvaW50OihOU1BvaW50KWNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBv
aW50OihpbnQpY29udHJvbFBvaW50SW5kZXggZHJhZ0FuY2hvclBvaW50OihOU1BvaW50KWNhbnZh
c0RyYWdBbmNob3JQb2ludDsKKworLSAodW5zaWduZWQgaW50KXpJbmRleDsKKy0gKHZvaWQpcmFp
c2U7CistICh2b2lkKWxvd2VyOworCitAZW5kCkluZGV4OiBEcmF3Q2FudmFzSXRlbS5tbQo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09ClJDUyBmaWxlOiBEcmF3Q2FudmFzSXRlbS5tbQpkaWZmIC1OIERyYXdDYW52YXNJdGVt
Lm1tCi0tLSBEcmF3Q2FudmFzSXRlbS5tbQkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBE
cmF3Q2FudmFzSXRlbS5tbQkyOCBKdWwgMjAwNSAwMDowNzoyMCAtMDAwMApAQCAtMCwwICsxLDIz
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiRHJhd0NhbnZhc0l0ZW1Qcml2YXRl
LmgiCisKKyNpbXBvcnQgPGtjYW52YXMvS0NhbnZhcy5oPgorI2ltcG9ydCA8a2NhbnZhcy9LQ2Fu
dmFzSXRlbS5oPgorCisjaW1wb3J0IDxrZG9tL05hbWVzcGFjZS5oPgorI2ltcG9ydCA8a2RvbS9I
ZWxwZXIuaD4KKworI2ltcG9ydCA8a3N2ZzIvaW1wbC9TVkdTdHlsZWRFbGVtZW50SW1wbC5oPgor
I2ltcG9ydCA8a3N2ZzIvaW1wbC9TVkdFbGxpcHNlRWxlbWVudEltcGwuaD4KKyNpbXBvcnQgPGtz
dmcyL2ltcGwvU1ZHUmVjdEVsZW1lbnRJbXBsLmg+CisjaW1wb3J0IDxrc3ZnMi9pbXBsL1NWR1Bh
dGhFbGVtZW50SW1wbC5oPgorCitAaW50ZXJmYWNlIERyYXdDYW52YXNJdGVtUHJpdmF0ZSA6IE5T
T2JqZWN0IHsKKyAgICBAcHVibGljCisgICAgS0NhbnZhc0l0ZW0gKml0ZW07IC8vIHRoaXMgaXMg
bGlrZWx5IGRhbmdlcm91cy4uLgorfQorQGVuZCAKKworQGltcGxlbWVudGF0aW9uIERyYXdDYW52
YXNJdGVtUHJpdmF0ZQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gRHJhd0NhbnZhc0l0ZW0KKwor
KyAoaWQpY2FudmFzSXRlbUZvckl0ZW06KEtDYW52YXNJdGVtICopY2FudmFzSXRlbQoreworICAg
IHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aEl0ZW06Y2FudmFzSXRlbV0gYXV0b3JlbGVh
c2VdOworfQorCistIChpZClpbml0V2l0aEl0ZW06KEtDYW52YXNJdGVtICopY2FudmFzSXRlbQor
eworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKKyAgICAgICAgX3ByaXZhdGUgPSBb
W0RyYXdDYW52YXNJdGVtUHJpdmF0ZSBhbGxvY10gaW5pdF07CisgICAgICAgIF9wcml2YXRlLT5p
dGVtID0gY2FudmFzSXRlbTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKEtDYW52
YXNJdGVtICopaXRlbQoreworICAgIHJldHVybiBfcHJpdmF0ZS0+aXRlbTsKK30KKworLSAoTlNS
ZWN0KWJvdW5kaW5nQm94Cit7CisgICAgcmV0dXJuIE5TUmVjdChfcHJpdmF0ZS0+aXRlbS0+YmJv
eCgpKTsKK30KKworLSAodW5zaWduZWQgaW50KXpJbmRleAoreworICAgIHJldHVybiBfcHJpdmF0
ZS0+aXRlbS0+ekluZGV4KCk7Cit9CisKKy0gKHZvaWQpcmFpc2UKK3sKKyAgICBfcHJpdmF0ZS0+
aXRlbS0+cmFpc2UoKTsKK30KKworLSAodm9pZClsb3dlcgoreworICAgIF9wcml2YXRlLT5pdGVt
LT5sb3dlcigpOworfQorCisrIChOU1BvaW50KWRyYWdBbmNob3JQb2ludEZvckNvbnRyb2xQb2lu
dEluZGV4OihpbnQpY29udHJvbFBvaW50SW5kZXggZnJvbVJlY3RDb250cm9sUG9pbnRzOihOU0Fy
cmF5ICopY29udHJvbFBvaW50c3sKKyAgICBpbnQgYW5jaG9yUG9pbnRJbmRleCA9IChjb250cm9s
UG9pbnRJbmRleCArIDIpICUgNDsgLy8gdGhlIGFuY2hvciBwb2ludCBpcyB0aGUgb3Bwb3NpdGUg
Y29ybmVyLgorICAgIE5TUG9pbnQgYW5jaG9yUG9pbnQgPSBbW2NvbnRyb2xQb2ludHMgb2JqZWN0
QXRJbmRleDphbmNob3JQb2ludEluZGV4XSBwb2ludFZhbHVlXTsKKyAgICByZXR1cm4gYW5jaG9y
UG9pbnQ7Cit9CisKKy0gKE5TUG9pbnQpZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5k
ZXg6KGludCljb250cm9sUG9pbnRJbmRleAoreworICAgIEtET006Ok5vZGVJbXBsICpub2RlID0g
KEtET006Ok5vZGVJbXBsICopX3ByaXZhdGUtPml0ZW0tPnVzZXJEYXRhKCk7CisgICAgaW50IGxv
Y2FsSWQgPSBub2RlLT5sb2NhbElkKCk7CisgICAgTlNQb2ludCBkcmFnQW5jaG9yUG9pbnQ7Cisg
ICAgCisgICAgc3dpdGNoIChsb2NhbElkKSB7CisJY2FzZSBJRF9QQVRIOgorICAgICAgICAgICAg
Ly9LU1ZHOjpTVkdQYXRoRWxlbWVudEltcGwgKnBhdGggPSAoS1NWRzo6U1ZHUGF0aEVsZW1lbnRJ
bXBsICopbm9kZTsKKwlkZWZhdWx0OgorICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBzcGVj
aWFsIGtub2IgbGlzdCwgZ3JhYiB0aGUgZGVmYXVsdAorICAgICAgICAgICAgZHJhZ0FuY2hvclBv
aW50ID0gW0RyYXdDYW52YXNJdGVtIGRyYWdBbmNob3JQb2ludEZvckNvbnRyb2xQb2ludEluZGV4
OmNvbnRyb2xQb2ludEluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBmcm9tUmVjdENvbnRyb2xQb2ludHM6W3NlbGYgY29udHJv
bFBvaW50c11dOworICAgICAgICAgICAgCisgICAgfQorICAgIHJldHVybiBkcmFnQW5jaG9yUG9p
bnQ7Cit9CisKKysgKE5TQXJyYXkgKiljb250cm9sUG9pbnRzRm9yUmVjdDooTlNSZWN0KWJib3gK
K3sKKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czoKKyAgICAgICAgW05TVmFs
dWUgdmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNaW5YKGJib3gpLCBOU01pblkoYmJveCkp
XSwKKyAgICAgICAgW05TVmFsdWUgdmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNaW5YKGJi
b3gpLCBOU01heFkoYmJveCkpXSwKKyAgICAgICAgW05TVmFsdWUgdmFsdWVXaXRoUG9pbnQ6TlNN
YWtlUG9pbnQoTlNNYXhYKGJib3gpLCBOU01heFkoYmJveCkpXSwKKyAgICAgICAgW05TVmFsdWUg
dmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNYXhYKGJib3gpLCBOU01pblkoYmJveCkpXSwK
KyAgICAgICAgbmlsXTsKK30KKworLSAoTlNBcnJheSAqKWNvbnRyb2xQb2ludHMKK3sJCisgICAg
S0RPTTo6Tm9kZUltcGwgKm5vZGUgPSAoS0RPTTo6Tm9kZUltcGwgKilfcHJpdmF0ZS0+aXRlbS0+
dXNlckRhdGEoKTsKKyAgICBpbnQgbG9jYWxJZCA9IG5vZGUtPmxvY2FsSWQoKTsKKyAgICBOU0Fy
cmF5ICpjb250cm9sUG9pbnRzID0gbmlsOworICAgIAorICAgIHN3aXRjaCAobG9jYWxJZCkgewor
ICAgICAgICBjYXNlIElEX1BBVEg6CisgICAgICAgICAgICAvL0tTVkc6OlNWR1BhdGhFbGVtZW50
SW1wbCAqcGF0aCA9IChLU1ZHOjpTVkdQYXRoRWxlbWVudEltcGwgKilub2RlOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBzcGVjaWFsIGtub2IgbGlzdCwg
Z3JhYiB0aGUgZGVmYXVsdAorICAgICAgICAgICAgY29udHJvbFBvaW50cyA9IFtEcmF3Q2FudmFz
SXRlbSBjb250cm9sUG9pbnRzRm9yUmVjdDpbc2VsZiBib3VuZGluZ0JveF1dOworICAgIH0KKyAg
ICByZXR1cm4gY29udHJvbFBvaW50czsKK30KKworLSAodm9pZClmaXRUb05ld0JCb3g6KE5TUmVj
dCluZXdSZWN0Cit7CisgICAgW3NlbGYgd2lsbENoYW5nZVZhbHVlRm9yS2V5OkAiYm91bmRpbmdC
b3giXTsKKyAgICBbc2VsZiB3aWxsQ2hhbmdlVmFsdWVGb3JLZXk6QCJhdHRyaWJ1dGVkWE1MU3Ry
aW5nIl07CisgICAgLy9OU0xvZyhAIkZpdHRpbmcgY2FudmFzSXRlbTogJXAgZnJvbTogJUAgaW50
byBuZXcgYmJveDogJUAiLAorICAgIC8vCXNlbGYsIE5TU3RyaW5nRnJvbVJlY3QoW3NlbGYgYm91
bmRpbmdCb3hdKSwgTlNTdHJpbmdGcm9tUmVjdChuZXdSZWN0KSk7CisgICAgS0RPTTo6Tm9kZUlt
cGwgKm5vZGUgPSAoS0RPTTo6Tm9kZUltcGwgKilfcHJpdmF0ZS0+aXRlbS0+dXNlckRhdGEoKTsK
KyAgICBpbnQgbG9jYWxJZCA9IG5vZGUtPmxvY2FsSWQoKTsKKyAgICBzd2l0Y2ggKGxvY2FsSWQp
IHsKKwljYXNlIElEX0VMTElQU0U6CisJeworICAgICAgICAgICAgS1NWRzo6U1ZHRWxsaXBzZUVs
ZW1lbnRJbXBsICplbGxpcHNlID0gKEtTVkc6OlNWR0VsbGlwc2VFbGVtZW50SW1wbCAqKW5vZGU7
CisgICAgICAgICAgICBlbGxpcHNlLT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJjeCIs
IFFTdHJpbmc6Om51bWJlcihuZXdSZWN0Lm9yaWdpbi54ICsgbmV3UmVjdC5zaXplLndpZHRoLzIu
ZikpOworICAgICAgICAgICAgZWxsaXBzZS0+c2V0QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAi
Y3kiLCBRU3RyaW5nOjpudW1iZXIobmV3UmVjdC5vcmlnaW4ueSArIG5ld1JlY3Quc2l6ZS5oZWln
aHQvMi5mKSk7CisgICAgICAgICAgICBlbGxpcHNlLT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19T
VkcsICJyeCIsIFFTdHJpbmc6Om51bWJlcihuZXdSZWN0LnNpemUud2lkdGgvMi5mKSk7CisgICAg
ICAgICAgICBlbGxpcHNlLT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJyeSIsIFFTdHJp
bmc6Om51bWJlcihuZXdSZWN0LnNpemUuaGVpZ2h0LzIuZikpOworICAgICAgICAgICAgYnJlYWs7
CisJfQorCWNhc2UgSURfUkVDVDoKKwl7CisgICAgICAgICAgICBLU1ZHOjpTVkdSZWN0RWxlbWVu
dEltcGwgKnJlY3QgPSAoS1NWRzo6U1ZHUmVjdEVsZW1lbnRJbXBsICopbm9kZTsKKyAgICAgICAg
ICAgIHJlY3QtPnNldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgIngiLCBRU3RyaW5nOjpudW1i
ZXIobmV3UmVjdC5vcmlnaW4ueCkpOworICAgICAgICAgICAgcmVjdC0+c2V0QXR0cmlidXRlTlMo
S0RPTTo6TlNfU1ZHLCAieSIsIFFTdHJpbmc6Om51bWJlcihuZXdSZWN0Lm9yaWdpbi55KSk7Cisg
ICAgICAgICAgICByZWN0LT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJ3aWR0aCIsIFFT
dHJpbmc6Om51bWJlcihuZXdSZWN0LnNpemUud2lkdGggLSAxKSk7CisgICAgICAgICAgICByZWN0
LT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJoZWlnaHQiLCBRU3RyaW5nOjpudW1iZXIo
bmV3UmVjdC5zaXplLmhlaWdodCAtIDEpKTsKKyAgICAgICAgICAgIGJyZWFrOworCX0KKwlkZWZh
dWx0OgorICAgICAgICAgICAgTlNMb2coQCJJZCBub3QgaGFuZGxlZDogJWkiLCBsb2NhbElkKTsK
KyAgICB9CisgICAgW3NlbGYgZGlkQ2hhbmdlVmFsdWVGb3JLZXk6QCJib3VuZGluZ0JveCJdOwor
ICAgIFtzZWxmIGRpZENoYW5nZVZhbHVlRm9yS2V5OkAiYXR0cmlidXRlZFhNTFN0cmluZyJdOwor
fQorCistICh2b2lkKXRyYW5zbGF0ZUJ5T2Zmc2V0OihOU1NpemUpb2Zmc2V0Cit7CisgICAgTlNS
ZWN0IG5ld1JlY3QgPSBbc2VsZiBib3VuZGluZ0JveF07CisgICAgbmV3UmVjdC5vcmlnaW4ueCAr
PSBvZmZzZXQud2lkdGggKyAxOyAvLyBIQUNLCisgICAgbmV3UmVjdC5vcmlnaW4ueSArPSBvZmZz
ZXQuaGVpZ2h0ICsgMTsKKyAgICBbc2VsZiBmaXRUb05ld0JCb3g6bmV3UmVjdF07Cit9CisKKy0g
KHZvaWQpcmVzaXplV2l0aFBvaW50OihOU1BvaW50KWNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBv
aW50OihpbnQpY29udHJvbFBvaW50SW5kZXggZHJhZ0FuY2hvclBvaW50OihOU1BvaW50KWNhbnZh
c0RyYWdBbmNob3JQb2ludHsKKyAgICAvLyBUaGUgY29udHJvbFBvaW50SW5kZXggY2FuIGJlIHVz
ZWQgZm9yIHBhdGhzLCBldGMuCisgICAgTlNSZWN0IG5ld1JlY3Q7CisgICAgbmV3UmVjdC5vcmln
aW4ueCA9IE1JTihjYW52YXNEcmFnQW5jaG9yUG9pbnQueCwgY2FudmFzUG9pbnQueCk7CisgICAg
bmV3UmVjdC5vcmlnaW4ueSA9IE1JTihjYW52YXNEcmFnQW5jaG9yUG9pbnQueSwgY2FudmFzUG9p
bnQueSk7CisgICAgbmV3UmVjdC5zaXplLndpZHRoID0gQUJTKGNhbnZhc0RyYWdBbmNob3JQb2lu
dC54IC0gY2FudmFzUG9pbnQueCArIDEpOworICAgIG5ld1JlY3Quc2l6ZS5oZWlnaHQgPSBBQlMo
Y2FudmFzRHJhZ0FuY2hvclBvaW50LnkgLSBjYW52YXNQb2ludC55ICsgMSk7CisgICAgCisgICAg
W3NlbGYgZml0VG9OZXdCQm94Om5ld1JlY3RdOworfQorCistIChpZCl2YWx1ZUZvcktleTooTlNT
dHJpbmcgKilrZXkKK3sKKyAgICBLU1ZHOjpTVkdTdHlsZWRFbGVtZW50SW1wbCAqZWxlbWVudCA9
IChLU1ZHOjpTVkdTdHlsZWRFbGVtZW50SW1wbCAqKV9wcml2YXRlLT5pdGVtLT51c2VyRGF0YSgp
OworICAgIGlkIHRoZVZhbHVlID0gbmlsOworICAgIAorICAgIGlmIChba2V5IGlzRXF1YWxUb1N0
cmluZzpAImlzRmlsbGVkIl0pIHsKKyAgICAgICAgS0RPTTo6RE9NU3RyaW5nIHZhbHVlID0gZWxl
bWVudC0+Z2V0QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAiZmlsbCIpOworICAgICAgICB0aGVW
YWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoQm9vbDoodmFsdWUgIT0gIm5vbmUiKV07CisgICAg
fSBlbHNlIGlmIChba2V5IGlzRXF1YWxUb1N0cmluZzpAImlzU3Ryb2tlZCJdKSB7CisgICAgICAg
IEtET006OkRPTVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZU5TKEtET006Ok5T
X1NWRywgInN0cm9rZSIpOworICAgICAgICB0aGVWYWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRo
Qm9vbDoodmFsdWUgIT0gIm5vbmUiKV07CisgICAgfSBlbHNlIGlmIChba2V5IGlzRXF1YWxUb1N0
cmluZzpAImZpbGxDb2xvciJdKSB7CisgICAgICAgIEtET006OkRPTVN0cmluZyB2YWx1ZSA9IGVs
ZW1lbnQtPmdldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgImZpbGwiKTsKKyAgICAgICAgdGhl
VmFsdWUgPSBuc0NvbG9yKFFDb2xvcih2YWx1ZS5zdHJpbmcoKSkpOworICAgIH0gZWxzZSBpZiAo
W2tleSBpc0VxdWFsVG9TdHJpbmc6QCJzdHJva2VDb2xvciJdKSB7CisgICAgICAgIEtET006OkRP
TVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgInN0
cm9rZSIpOworICAgICAgICB0aGVWYWx1ZSA9IG5zQ29sb3IoUUNvbG9yKHZhbHVlLnN0cmluZygp
KSk7CisgICAgfQorICAgIAorICAgIGlmICh0aGVWYWx1ZSkKKyAgICAgICAgcmV0dXJuIHRoZVZh
bHVlOworICAgIAorICAgIHJldHVybiBbc3VwZXIgdmFsdWVGb3JLZXk6a2V5XTsKK30KKworLSAo
TlNBdHRyaWJ1dGVkU3RyaW5nICopYXR0cmlidHVlZFhNTFN0cmluZworeworICAgIFFTdHJpbmcg
Km5vZGVUZXh0ID0gbmV3IFFTdHJpbmcoKTsKKyAgICBRVGV4dFN0cmVhbSBub2RlVGV4dFN0cmVh
bShub2RlVGV4dCwgSU9fV3JpdGVPbmx5KTsKKyAgICBLRE9NOjpIZWxwZXI6OlByaW50Tm9kZShu
b2RlVGV4dFN0cmVhbSwgKEtET006Ok5vZGVJbXBsICopX3ByaXZhdGUtPml0ZW0tPnVzZXJEYXRh
KCkpOworICAgIE5TU3RyaW5nICpub2RlU3RyaW5nID0gbm9kZVRleHQtPmdldE5TU3RyaW5nKCk7
CisgICAgZGVsZXRlIG5vZGVUZXh0OworICAgIAorICAgIGlmIChub2RlU3RyaW5nKQorICAgICAg
ICByZXR1cm4gW1tOU0F0dHJpYnV0ZWRTdHJpbmcgYWxsb2NdIGluaXRXaXRoU3RyaW5nOm5vZGVT
dHJpbmddOworICAgIHJldHVybiBuaWw7Cit9CisKK0BlbmQKSW5kZXg6IERyYXdDYW52YXNJdGVt
UHJpdmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCmRp
ZmYgLU4gRHJhd0NhbnZhc0l0ZW1Qcml2YXRlLmgKLS0tIERyYXdDYW52YXNJdGVtUHJpdmF0ZS5o
CTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCTI4
IEp1bCAyMDA1IDAwOjA3OjIwIC0wMDAwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMgYXJlIHRlbXBvcmFyeSBhbmQgZXhpc3Qg
c29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93aW5nIGdyZWF0ZXIgdGVzdGluZyBvZiBX
ZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRlZ3JhdGlvbi4KKyBEbyBOT1QgZGVwZW5k
IG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3aWxsIHNvb24gYmUgZ29uZS4KKyovCisK
KyNpbXBvcnQgPFdlYkNvcmUrU1ZHL0RyYXdDYW52YXNJdGVtLmg+CisKK2NsYXNzIEtDYW52YXNJ
dGVtOworCitAaW50ZXJmYWNlIERyYXdDYW52YXNJdGVtIChQcml2YXRlTWV0aG9kcykKKworKyAo
aWQpY2FudmFzSXRlbUZvckl0ZW06KEtDYW52YXNJdGVtICopY2FudmFzSXRlbTsKKy0gKGlkKWlu
aXRXaXRoSXRlbTooS0NhbnZhc0l0ZW0gKiljYW52YXNJdGVtOworCistIChLQ2FudmFzSXRlbSAq
KWl0ZW07CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCkluZGV4OiBEcmF3RG9j
dW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBEcmF3RG9jdW1lbnQuaApkaWZmIC1OIERyYXdE
b2N1bWVudC5oCi0tLSBEcmF3RG9jdW1lbnQuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisr
KyBEcmF3RG9jdW1lbnQuaAkyOCBKdWwgMjAwNSAwMDowNzoyMCAtMDAwMApAQCAtMCwwICsxLDYw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisvKgorIFdBUk5JTkc6IFRoZXNlIGZpbGVzIGFyZSB0
ZW1wb3JhcnkgYW5kIGV4aXN0IHNvbGVseSBmb3IgdGhlIHB1cnBvc2UKKyBvZiBhbGxvd2luZyBn
cmVhdGVyIHRlc3Rpbmcgb2YgV2ViQ29yZStTVkcgcHJpb3IgdG8gZnVsbCBET00gaW50ZWdyYXRp
b24uCisgRG8gTk9UIGRlcGVuZCBvbiB0aGVzZSBTUElzIG9yIGZpbGVzIGFzIHRoZXkgd2lsbCBz
b29uIGJlIGdvbmUuCisqLworCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BjbGFzcyBE
cmF3RG9jdW1lbnRQcml2YXRlOworQGNsYXNzIERyYXdWaWV3OworCitAaW50ZXJmYWNlIERyYXdE
b2N1bWVudCA6IE5TT2JqZWN0IHsKK0Bwcml2YXRlCisgICAgRHJhd0RvY3VtZW50UHJpdmF0ZSAq
X3ByaXZhdGU7Cit9CisKKysgKGlkKWRvY3VtZW50V2l0aFNWR0RhdGE6KE5TRGF0YSAqKWRhdGE7
CisvLysgKGlkKWRvY3VtZW50V2l0aFNWR0RhdGE6KE5TRGF0YSAqKWRhdGEgbG9hZGluZ0ludG9W
aWV3OihEcmF3VmlldyAqKXZpZXc7CisKKy0gKGlkKWluaXRXaXRoU1ZHRGF0YTooTlNEYXRhICop
ZGF0YTsKKy8vLSAoaWQpaW5pdFdpdGhTVkdEYXRhOihOU0RhdGEgKilkYXRhIGxvYWRpbmdJbnRv
VmlldzooRHJhd1ZpZXcgKil2aWV3OworLSAoaWQpaW5pdFdpdGhDb250ZW50c09mRmlsZTooTlNT
dHJpbmcgKilwYXRoOworCisvLy0gKE5TU2l6ZSlkb2N1bWVudFNpemU7CisKKy0gKE5TU3RyaW5n
ICopc3ZnVGV4dDsKKworLy8gU1ZHR3JhZGllbnRFbGVtZW50cworLSAoTlNBcnJheSAqKWdyYWRp
ZW50czsKKworLy8gU1ZHRmlsdGVyRWxlbWVudHMKKy0gKE5TQXJyYXkgKilmaWx0ZXJzOworCitA
ZW5kCkluZGV4OiBEcmF3RG9jdW1lbnQubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogRHJhd0RvY3Vt
ZW50Lm1tCmRpZmYgLU4gRHJhd0RvY3VtZW50Lm1tCi0tLSBEcmF3RG9jdW1lbnQubW0JMSBKYW4g
MTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd0RvY3VtZW50Lm1tCTI4IEp1bCAyMDA1IDAwOjA3
OjIwIC0wMDAwCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFw
cGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW1wb3J0
ICJEcmF3RG9jdW1lbnRQcml2YXRlLmgiCisjaW1wb3J0ICJEcmF3Q2FudmFzSXRlbVByaXZhdGUu
aCIKKworI2ltcG9ydCAiRHJhd1ZpZXdQcml2YXRlLmgiCisjaW1wb3J0ICJRdWFydHpTdXBwb3J0
LmgiIC8vIGZvciBDR0FmZmluZVRyYW5zZm9ybU1ha2VNYXBCZXR3ZWVuUmVjdHMoKQorCisjaW1w
b3J0IDxrY3Vyc29yLmg+CisjaW1wb3J0IDxxZXZlbnQuaD4KKworI2ltcG9ydCA8a2NhbnZhcy9L
Q2FudmFzLmg+CisjaW1wb3J0IDxrY2FudmFzL0tDYW52YXNJdGVtLmg+CisjaW1wb3J0IDxrY2Fu
dmFzL0tDYW52YXNDb250YWluZXIuaD4KKyNpbXBvcnQgPGtjYW52YXMvZGV2aWNlL3F1YXJ0ei9L
Q2FudmFzVmlld1F1YXJ0ei5oPgorI2ltcG9ydCA8a2NhbnZhcy9kZXZpY2UvcXVhcnR6L0tSZW5k
ZXJpbmdEZXZpY2VRdWFydHouaD4KKworI2RlZmluZSBpZCBJRF9IQUNLCisKKyNpbXBvcnQgPGtk
b20vTmFtZXNwYWNlLmg+CisjaW1wb3J0IDxrZG9tL0hlbHBlci5oPgorI2ltcG9ydCA8a2RvbS9E
T01Db25maWd1cmF0aW9uLmg+CisjaW1wb3J0IDxrZG9tL3BhcnNlci9LRE9NUGFyc2VyLmg+Cisj
aW1wb3J0IDxrZG9tL2JhY2tlbmRzL2xpYnhtbC9MaWJYTUxQYXJzZXIuaD4KKyNpbXBvcnQgPGtk
b20vaW1wbC9Ob2RlSW1wbC5oPgorI2ltcG9ydCA8a2RvbS9pbXBsL05vZGVMaXN0SW1wbC5oPgor
I2ltcG9ydCA8a2RvbS9pbXBsL0RPTUNvbmZpZ3VyYXRpb25JbXBsLmg+CisjaW1wb3J0IDxrZG9t
L2ltcGwvRE9NSW1wbGVtZW50YXRpb25JbXBsLmg+CisjaW1wb3J0IDxrZG9tL2ltcGwvRWxlbWVu
dEltcGwuaD4KKyNpbXBvcnQgPGtkb20vZXZlbnRzL2tkb21ldmVudHMuaD4KKyNpbXBvcnQgPGtk
b20vZXZlbnRzL2ltcGwvRXZlbnRJbXBsLmg+CisjaW1wb3J0IDxrZG9tL2V2ZW50cy9pbXBsL01v
dXNlRXZlbnRJbXBsLmg+CisKKyNpbXBvcnQgPGtzdmcyL0tTVkdQYXJ0Lmg+CisjaW1wb3J0IDxr
c3ZnMi9LU1ZHVmlldy5oPgorI2ltcG9ydCA8a3N2ZzIvY29yZS9LU1ZHRG9jdW1lbnRCdWlsZGVy
Lmg+CisjaW1wb3J0IDxrc3ZnMi9pbXBsL1NWR0RvY3VtZW50SW1wbC5oPgorI2ltcG9ydCA8a3N2
ZzIvaW1wbC9TVkdTVkdFbGVtZW50SW1wbC5oPgorI2ltcG9ydCA8a3N2ZzIvaW1wbC9TVkdEZXNj
RWxlbWVudEltcGwuaD4KKyNpbXBvcnQgPGtzdmcyL2ltcGwvU1ZHU3R5bGVkRWxlbWVudEltcGwu
aD4KKyNpbXBvcnQgPGtzdmcyL2ltcGwvU1ZHRWxsaXBzZUVsZW1lbnRJbXBsLmg+CisjaW1wb3J0
IDxrc3ZnMi9pbXBsL1NWR1JlY3RFbGVtZW50SW1wbC5oPgorCisvLyB0aGVzZSBzaG91bGRuJ3Qg
YmUgdXNlZCEKKyNpbXBvcnQgPGtzdmcyL2RvbS9TVkdFbGxpcHNlRWxlbWVudC5oPgorI2ltcG9y
dCA8a3N2ZzIvZG9tL1NWR1JlY3RFbGVtZW50Lmg+CisKKyN1bmRlZiBpZAorCit1c2luZyBuYW1l
c3BhY2UgS0RPTTsKK3VzaW5nIG5hbWVzcGFjZSBLU1ZHOworCitAaW50ZXJmYWNlIERyYXdEb2N1
bWVudFByaXZhdGUgOiBOU09iamVjdCB7CisgICAgQHB1YmxpYworICAgIFNWR0RvY3VtZW50SW1w
bCAqc3ZnRG9jdW1lbnQ7CisgICAgS0NhbnZhcyAqY2FudmFzOworICAgIEtDYW52YXNWaWV3UXVh
cnR6ICpwcmltYXJ5VmlldzsKKyAgICAKKyAgICBLQ2FudmFzVmlld1F1YXJ0eiAqZHVtbXlWaWV3
OyAvLyB1c2VkIHRvIGhvbGQgdGhlIGNhbnZhcywgdW50aWwgd2UgZ2V0IGEgcmVhbCB2aWV3Lgor
fQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBEcmF3RG9jdW1lbnRQcml2YXRlCisKKysgKEtS
ZW5kZXJpbmdEZXZpY2VRdWFydHogKilzaGFyZWRSZW5kZXJpbmdEZXZpY2UKK3sKKyAgICBzdGF0
aWMgS1JlbmRlcmluZ0RldmljZVF1YXJ0eiAqX19xdWFydHpSZW5kZXJpbmdEZXZpY2UgPSBOVUxM
OworICAgIGlmICghX19xdWFydHpSZW5kZXJpbmdEZXZpY2UpCisgICAgICAgIF9fcXVhcnR6UmVu
ZGVyaW5nRGV2aWNlID0gbmV3IEtSZW5kZXJpbmdEZXZpY2VRdWFydHooKTsKKyAgICAKKyAgICBy
ZXR1cm4gX19xdWFydHpSZW5kZXJpbmdEZXZpY2U7Cit9CisKKy0gKHZvaWQpZGVhbGxvYworewor
ICAgIGlmIChjYW52YXMpCisgICAgICAgIGRlbGV0ZSBjYW52YXM7CisgICAgaWYgKHN2Z0RvY3Vt
ZW50KQorICAgICAgICBzdmdEb2N1bWVudC0+ZGVyZWYoKTsKKyAgICBbc3VwZXIgZGVhbGxvY107
Cit9CisKKy0gKHZvaWQpc2V0U1ZHRG9jdW1lbnQ6KFNWR0RvY3VtZW50SW1wbCAqKXN2Z0RvY3Vt
ZW50SW1wbAoreworICAgIEtET01fU0FGRV9TRVQoc3ZnRG9jdW1lbnQsIHN2Z0RvY3VtZW50SW1w
bCk7Cit9CisKKy0gKHZvaWQpc2V0UHJpbWFyeVZpZXc6KEtDYW52YXNWaWV3UXVhcnR6ICopdmll
dworeworICAgIGlmICghcHJpbWFyeVZpZXcgfHwgKHByaW1hcnlWaWV3ID09IGR1bW15Vmlldykp
IHsKKyAgICAgICAgaWYgKCFjYW52YXMpCisgICAgICAgICAgICBjYW52YXMgPSBuZXcgS0NhbnZh
cyhbRHJhd0RvY3VtZW50UHJpdmF0ZSBzaGFyZWRSZW5kZXJpbmdEZXZpY2VdKTsKKyAgICAgICAg
CisgICAgICAgIHByaW1hcnlWaWV3ID0gdmlldzsKKyAgICAgICAgcHJpbWFyeVZpZXctPmluaXQo
Y2FudmFzLCBOVUxMKTsKKyAgICAgICAgaWYgKHN2Z0RvY3VtZW50KSB7CisgICAgICAgICAgICBz
dmdEb2N1bWVudC0+c2V0Q2FudmFzVmlldyhwcmltYXJ5Vmlldyk7CisgICAgICAgICAgICBjYW52
YXMtPmFkZFZpZXcocHJpbWFyeVZpZXcpOworICAgICAgICAgICAgLy9zdmdEb2N1bWVudC0+YXR0
YWNoKCk7CisgICAgICAgICAgICAKKy8vICAgICAgICAgIC8vIGlmIHRoZSBTVkcgZG9jIGRvZXNu
J3QgY29udGFpbiBhbnkgc2l6ZSBpbmZvcm1hdGlvbgorLy8gICAgICAgICAgLy8gc2l6ZSBpdCBh
cHByb3ByaWF0ZWx5Li4uCisvLyAgICAgICAgICBpZiAoTlNFcXVhbFNpemVzKFtzZWxmIGNhbnZh
c1NpemVdLCBOU01ha2VTaXplKC0xLC0xKSkpIHsKKy8vICAgICAgICAgICAgICBbc2VsZiBzaXpl
Q2FudmFzVG9GaXRDb250ZW50XTsKKy8vICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZSBk
dW1teVZpZXc7CisgICAgICAgICAgICBkdW1teVZpZXcgPSBOVUxMOworICAgICAgICB9CisgICAg
fQorfQorCitAZW5kCisKKworQGludGVyZmFjZSBEcmF3VmlldyAoSW50ZXJuYWxDYW52YXNNZXRo
b2RzKQorLSAoS0NhbnZhc1ZpZXdRdWFydHogKiljYW52YXNWaWV3OworQGVuZAorCitAaW1wbGVt
ZW50YXRpb24gRHJhd0RvY3VtZW50CisKKysgKGlkKWRvY3VtZW50V2l0aFNWR0RhdGE6KE5TRGF0
YSAqKWRhdGEKK3sKKyAgICByZXR1cm4gW1tbRHJhd0RvY3VtZW50IGFsbG9jXSBpbml0V2l0aFNW
R0RhdGE6ZGF0YV0gYXV0b3JlbGVhc2VdOworfQorCisvLyBtYWtlcyBuZXcgZW1wdHkgZG9jdW1l
bnQKKy8vLSAoaWQpaW5pdAorLy97CisvLwlpZiAoc2VsZiA9IFtzdXBlciBpbml0XSkgeworLy8J
CS8vIG5lZWQgYW4gYWx0ZXJuYXRpdmUgY2FsbCB0aGFuICJzZWxmIgorLy8JCVNWR0RvY3VtZW50
SW1wbCAqc3ZnRG9jID0gbmV3IFNWR0RvY3VtZW50SW1wbChTVkdET01JbXBsZW1lbnRhdGlvbjo6
c2VsZigpKTsKKy8vCQlbX3ByaXZhdGUgc2V0U1ZHRG9jdW1lbnQ6c3ZnRG9jXTsKKy8vCX0KKy8v
CXJldHVybiBzZWxmOworLy99CisKKworLSAoaWQpaW5pdFdpdGhTVkdEYXRhOihOU0RhdGEgKilk
YXRhCit7CisgICAgc2VsZiA9IFtzdXBlciBpbml0XTsKKyAgICBpZiAoIXNlbGYpCisgICAgICAg
IHJldHVybiBuaWw7CisgICAgCisgICAgX3ByaXZhdGUgPSBbW0RyYXdEb2N1bWVudFByaXZhdGUg
YWxsb2NdIGluaXRdOworICAgIAorICAgIC8vIHRvdGFsIGhhY2shCisgICAgLy8gdGhpcyBpcyBu
ZWVkZWQgdW50aWwgcG9zdC1wYXJzZSBhdHRhY2ggd29ya3MuCisgICAgLy8gdGhlc2UgYXJlIGxl
YWtpbmcgZm9yIG5vdy4uLgorICAgIEtTVkdQYXJ0ICpkdW1teVBhcnQgPSBuZXcgS1NWR1BhcnQo
KTsKKyAgICBLU1ZHVmlldyAqZHVtbXlTVkdWaWV3ID0gc3RhdGljX2Nhc3Q8S1NWR1ZpZXcgKj4o
ZHVtbXlQYXJ0LT52aWV3KCkpOworICAgIF9wcml2YXRlLT5kdW1teVZpZXcgPSAgc3RhdGljX2Nh
c3Q8S0NhbnZhc1ZpZXdRdWFydHogKj4oZHVtbXlTVkdWaWV3LT5jYW52YXNWaWV3KCkpOworICAg
IC8vIEZJWE1FOiBIQUNLOiBJIHJlYWxseSBuZWVkIHRvIGJlIHRyYWNraW5nIHRoZXNlIHBhcnRz
L3ZpZXdzIGNvcnJlY3RseS4uLgorICAgIAorICAgIFtfcHJpdmF0ZSBzZXRQcmltYXJ5Vmlldzpf
cHJpdmF0ZS0+ZHVtbXlWaWV3XTsKKyAgICAKKyAgICAvLyBCdWlsZGVyIGlzIG93bmVkIChkZWxl
dGVkKSBieSBwYXJzZXIuLi4KKyAgICBLU1ZHOjpEb2N1bWVudEJ1aWxkZXIgKmJ1aWxkZXIgPSBu
ZXcgS1NWRzo6RG9jdW1lbnRCdWlsZGVyKGR1bW15U1ZHVmlldyk7CisgICAgS0RPTTo6TGliWE1M
UGFyc2VyICpwYXJzZXIgPSBuZXcgS0RPTTo6TGliWE1MUGFyc2VyKEtVUkwoKSk7CisgICAgcGFy
c2VyLT5zZXREb2N1bWVudEJ1aWxkZXIoYnVpbGRlcik7CisgICAgCisgICAgLy8gbm8gZW50aXR5
IHJlZnMKKyAgICBwYXJzZXItPmRvbUNvbmZpZygpLT5zZXRQYXJhbWV0ZXIoS0RPTTo6RU5USVRJ
RVMuaW1wbGVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIHBhcnNlci0+ZG9tQ29uZmlnKCktPnNl
dFBhcmFtZXRlcihLRE9NOjpFTEVNRU5UX0NPTlRFTlRfV0hJVEVTUEFDRS5pbXBsZW1lbnRhdGlv
bigpLCBmYWxzZSk7CisgICAgCisgICAgLy8gRmVlZCB0aGUgcGFyc2VyIHRoZSB3aG9sZSBkb2N1
bWVudCAoYSB0b3RhbCBoYWNrKQorICAgIHBhcnNlci0+ZG9PbmVTaG90UGFyc2UoKGNvbnN0IGNo
YXIgKilbZGF0YSBieXRlc10sIFtkYXRhIGxlbmd0aF0pOworICAgIAorICAgIFNWR0RvY3VtZW50
SW1wbCAqc3ZnRG9jID0gc3RhdGljX2Nhc3Q8U1ZHRG9jdW1lbnRJbXBsICo+KHBhcnNlci0+ZG9j
dW1lbnQoKS5oYW5kbGUoKSk7CisgICAgW19wcml2YXRlIHNldFNWR0RvY3VtZW50OnN2Z0RvY107
CisgICAgZGVsZXRlIHBhcnNlcjsgLy8gd2UncmUgZG9uZSBwYXJzaW5nLgorICAgIGlmKCFfcHJp
dmF0ZS0+c3ZnRG9jdW1lbnQpIHsKKyAgICAgICAgTlNMb2coQCJGYWlsZWQgdG8gZ2V0IGRvY3Vt
ZW50ISIpOworICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAg
ICB9CisgICAgCisgICAgLy8gRklYTUU6IHRlbXBvcmFyeQorICAgIC8vIHRoaXMgbmVlZHMgdG8g
Z28gc29tZXdoZXJlIGluIGtzdmcyCisgICAgaWYgKChfcHJpdmF0ZS0+Y2FudmFzLT5jYW52YXNT
aXplKCkgPT0gUVNpemUoLTEsLTEpKSAmJiBfcHJpdmF0ZS0+Y2FudmFzLT5yb290Q29udGFpbmVy
KCkpIHsKKyAgICAgICAgUVJlY3QgY2FudmFzQm91bmRzID0gX3ByaXZhdGUtPmNhbnZhcy0+cm9v
dENvbnRhaW5lcigpLT5iYm94KCk7CisgICAgICAgIF9wcml2YXRlLT5jYW52YXMtPnNldENhbnZh
c1NpemUoUVNpemUoYWJzKGNhbnZhc0JvdW5kcy54KCkpICsgY2FudmFzQm91bmRzLndpZHRoKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGNhbnZh
c0JvdW5kcy55KCkpICsgY2FudmFzQm91bmRzLmhlaWdodCgpKSk7CisgICAgfQorICAgIAorICAg
IHJldHVybiBzZWxmOworfQorCistIChpZClpbml0V2l0aENvbnRlbnRzT2ZGaWxlOihOU1N0cmlu
ZyAqKXBhdGgKK3sKKyAgICBOU0RhdGEgKmRhdGEgPSBbTlNEYXRhIGRhdGFXaXRoQ29udGVudHNP
ZkZpbGU6cGF0aF07CisgICAgaWYgKFtbcGF0aCBwYXRoRXh0ZW5zaW9uXSBpc0VxdWFsVG9TdHJp
bmc6QCJzdmciXSkgeworICAgICAgICAvL05TTG9nKEAiTG9hZGluZyBTVkcgRGF0YSBmcm9tIGZp
bGU6ICVAIiwgcGF0aCk7CisgICAgICAgIHNlbGYgPSBbc2VsZiBpbml0V2l0aFNWR0RhdGE6ZGF0
YV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgTlNMb2coQCJFcnJvcjogQXNrZWQgdG8gY3JlYXRl
IERyYXdEb2N1bWVudCBmcm9tIHVuc3VwcG9ydGVkIGZpbGUgdHlwZSEgIEZpbGU6ICVAIiwgcGF0
aCk7CisgICAgICAgIFtzZWxmIHJlbGVhc2VdOworICAgICAgICBzZWxmID0gbmlsOworICAgIH0K
KyAgICByZXR1cm4gc2VsZjsKK30KKworLSAodm9pZClkZWFsbG9jCit7CisgICAgW19wcml2YXRl
IHJlbGVhc2VdOworICAgIFtzdXBlciBkZWFsbG9jXTsKK30KKworLSAoTlNTdHJpbmcgKil0aXRs
ZQoreworICAgIC8vIERldGVjdCB0aXRsZSBpZiBwb3NzaWJsZS4uLgorICAgIEtET006OkRPTVN0
cmluZyB0aXRsZSA9IF9wcml2YXRlLT5zdmdEb2N1bWVudC0+dGl0bGUoKTsKKyAgICByZXR1cm4g
dGl0bGUuc3RyaW5nKCkuZ2V0TlNTdHJpbmcoKTsKK30KKworLSAoTlNTdHJpbmcgKilkZXNjcmlw
dGlvbgoreworICAgIC8vIERldGVjdCBkZXNjcmlwdGlvbiBpZiBwb3NzaWJsZS4uLgorLy8gIEtE
T006Ok5vZGVMaXN0SW1wbCAqZGVzY0xpc3QgPSBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQtPmdldEVs
ZW1lbnRzQnlUYWdOYW1lKCJkZXNjIik7CisvLyAgaWYoZGVzY0xpc3QgJiYgKGRlc2NMaXN0LT5s
ZW5ndGgoKSA+IDApKSB7CisvLyAgU1ZHRGVzY0VsZW1lbnRJbXBsICpkZXNjSW1wbCA9IGR5bmFt
aWNfY2FzdDxTVkdEZXNjRWxlbWVudEltcGwgKj4oZGVzY0xpc3QtPml0ZW0oMCkpOworLy8gIHJl
dHVybiBkZXNjSW1wbC0+ZGVzY3JpcHRpb24oKS5zdHJpbmcoKS5nZXROU1N0cmluZygpOworLy8g
IH0KKyAgICByZXR1cm4gbmlsOworfQorCisvLyBpbnRlcm5hbCBTUEkKKy0gKERyYXdWaWV3ICop
cHJpbWFyeVZpZXcKK3sKKyAgICBpZiAoX3ByaXZhdGUtPnByaW1hcnlWaWV3KQorICAgICAgICBy
ZXR1cm4gX3ByaXZhdGUtPnByaW1hcnlWaWV3LT52aWV3KCk7CisgICAgcmV0dXJuIG5pbDsKK30K
KworLSAodm9pZClzZXRQcmltYXJ5VmlldzooRHJhd1ZpZXcgKil2aWV3Cit7CisgICAgW19wcml2
YXRlIHNldFByaW1hcnlWaWV3OihLQ2FudmFzVmlld1F1YXJ0eiAqKVt2aWV3IGNhbnZhc1ZpZXdd
XTsKK30KKworLSAodm9pZClyZWdpc3RlclZpZXc6KERyYXdWaWV3ICopdmlldworeworICAgIGlm
ICghX3ByaXZhdGUtPnByaW1hcnlWaWV3IHx8IChfcHJpdmF0ZS0+cHJpbWFyeVZpZXcgPT0gX3By
aXZhdGUtPmR1bW15VmlldykpCisgICAgICAgIFtzZWxmIHNldFByaW1hcnlWaWV3OnZpZXddOwor
ICAgIGVsc2UKKyAgICAgICAgX3ByaXZhdGUtPmNhbnZhcy0+YWRkVmlldyhbdmlldyBjYW52YXNW
aWV3XSk7Cit9CisKKy0gKHZvaWQpdW5yZWdpc3RlclZpZXc6KERyYXdWaWV3ICopdmlldworewor
ICAgIF9wcml2YXRlLT5jYW52YXMtPnJlbW92ZVZpZXcoW3ZpZXcgY2FudmFzVmlld10pOworfQor
CistIChOU1N0cmluZyAqKXN2Z1RleHQKK3sKKyAgICBRU3RyaW5nICpkdW1wVGV4dCA9IG5ldyBR
U3RyaW5nKCk7CisgICAgUVRleHRTdHJlYW0gZHVtcFN0cmVhbShkdW1wVGV4dCwgSU9fV3JpdGVP
bmx5KTsKKyAgICBLRE9NOjpIZWxwZXI6OlByaW50Tm9kZShkdW1wU3RyZWFtLCBfcHJpdmF0ZS0+
c3ZnRG9jdW1lbnQpOworICAgIE5TU3RyaW5nICpzdmdUZXh0ID0gZHVtcFRleHQtPmdldE5TU3Ry
aW5nKCk7CisgICAgZGVsZXRlIGR1bXBUZXh0OworICAgIAorICAgIHJldHVybiBzdmdUZXh0Owor
fQorCistIChOU0FycmF5ICopZ3JhZGllbnRzCit7CisgICAgcmV0dXJuIG5pbDsKK30KKworLSAo
TlNBcnJheSAqKWZpbHRlcnMKK3sKKyAgICByZXR1cm4gbmlsOworfQorCitAZW5kCisKK0BpbXBs
ZW1lbnRhdGlvbiBEcmF3RG9jdW1lbnQgKERyYXdNb3VzZUV2ZW50cykKKworLSAoQk9PTClkb2N1
bWVudExpc3RlbnNGb3JNb3VzZU1vdmVkRXZlbnRzCit7CisgICAgU1ZHRG9jdW1lbnRJbXBsICpk
b2N1bWVudCA9IF9wcml2YXRlLT5zdmdEb2N1bWVudDsKKyAgICAKKyAgICByZXR1cm4gKGRvY3Vt
ZW50ICYmCQorICAgICAgICAgICAgKGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RPTTo6RE9N
Rk9DVVNPVVRfRVZFTlQpIHx8CisgICAgICAgICAgICAgZG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlw
ZShLRE9NOjpNT1VTRU9WRVJfRVZFTlQpIHx8CisgICAgICAgICAgICAgZG9jdW1lbnQtPmhhc0xp
c3RlbmVyVHlwZShLRE9NOjpNT1VTRU1PVkVfRVZFTlQpIHx8CisgICAgICAgICAgICAgZG9jdW1l
bnQtPmhhc0xpc3RlbmVyVHlwZShLRE9NOjpNT1VTRU9VVF9FVkVOVCkpKTsKK30KKworLSAoQk9P
TClkb2N1bWVudExpc3RlbnNGb3JNb3VzZURvd25FdmVudHMKK3sKKyAgICByZXR1cm4gKF9wcml2
YXRlLT5zdmdEb2N1bWVudCAmJiBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlw
ZShLRE9NOjpNT1VTRURPV05fRVZFTlQpKTsKK30KKworLSAoQk9PTClkb2N1bWVudExpc3RlbnNG
b3JNb3VzZVVwRXZlbnRzCit7CisgICAgU1ZHRG9jdW1lbnRJbXBsICpkb2N1bWVudCA9IF9wcml2
YXRlLT5zdmdEb2N1bWVudDsKKyAgICAKKyAgICByZXR1cm4gKGRvY3VtZW50ICYmCisgICAgICAg
ICAgICAoZG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlwZShLRE9NOjpET01GT0NVU0lOX0VWRU5UKSB8
fAorICAgICAgICAgICAgIGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RPTTo6RE9NQUNUSVZB
VEVfRVZFTlQpIHx8CisgICAgICAgICAgICAgZG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlwZShLRE9N
OjpDTElDS19FVkVOVCkgfHwKKyAgICAgICAgICAgICBkb2N1bWVudC0+aGFzTGlzdGVuZXJUeXBl
KEtET006Ok1PVVNFVVBfRVZFTlQpKSk7Cit9CisKKy0gKEtET006Ok1vdXNlRXZlbnRJbXBsICop
bmV3TW91c2VFdmVudFdpdGhFdmVudElkOihLRE9NOjpFdmVudElkKWV2ZW50SWQgcU1vdXNlRXZl
bnQ6KFFNb3VzZUV2ZW50ICopcWV2ZW50Cit7CisgICAgaWYgKCFfcHJpdmF0ZS0+c3ZnRG9jdW1l
bnQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIAorICAgIEtET006OkRPTVN0cmluZyBldmVu
dFN0cmluZyA9IEtET006OkRPTUltcGxlbWVudGF0aW9uSW1wbDo6c2VsZigpLT5pZFRvVHlwZShl
dmVudElkKTsKKyAgICAKKyAgICBTVkdTVkdFbGVtZW50SW1wbCAqcm9vdCA9IF9wcml2YXRlLT5z
dmdEb2N1bWVudC0+cm9vdEVsZW1lbnQoKTsKKyAgICBmbG9hdCBzY2FsZSA9IChyb290ID8gcm9v
dC0+Y3VycmVudFNjYWxlKCkgOiAxLjApOworICAgIAorICAgIC8vIFNldHVwIGtkb20gJ01vdXNl
RXZlbnQnLi4uCisgICAgS0RPTTo6TW91c2VFdmVudEltcGwgKmV2ZW50ID0gc3RhdGljX2Nhc3Q8
S0RPTTo6TW91c2VFdmVudEltcGwgKj4oX3ByaXZhdGUtPnN2Z0RvY3VtZW50LT5jcmVhdGVFdmVu
dCgiTW91c2VFdmVudHMiKSk7CisgICAgZXZlbnQtPnJlZigpOworICAgIAorICAgIGV2ZW50LT5p
bml0TW91c2VFdmVudChldmVudFN0cmluZywgcWV2ZW50LCBzY2FsZSk7CisgICAgcmV0dXJuIGV2
ZW50OworfQorCitOU0N1cnNvciAqY3Vyc29yRm9yU3R5bGUoS0RPTTo6UmVuZGVyU3R5bGUgKnN0
eWxlKQoreworICAgIGlmKCFzdHlsZSkgcmV0dXJuIG5pbDsKKyAgICBOU0N1cnNvciAqbmV3Q3Vy
c29yID0gbmlsOworICAgIHN3aXRjaChzdHlsZS0+Y3Vyc29yKCkpCisgICAgeworICAgICAgICBj
YXNlIEtET006OkNTX0FVVE86CisgICAgICAgIGNhc2UgS0RPTTo6Q1NfREVGQVVMVDoKKyAgICAg
ICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OmFycm93Q3Vyc29yKCkuaGFuZGxlKCk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRE9NOjpDU19DUk9TUzoKKyAgICAgICAgY2Fz
ZSBLRE9NOjpDU19QUk9HUkVTUzoKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OmNy
b3NzQ3Vyc29yKCkuaGFuZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBL
RE9NOjpDU19QT0lOVEVSOgorICAgICAgICAgICAgbmV3Q3Vyc29yID0gS0N1cnNvcjo6aGFuZEN1
cnNvcigpLmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6
Q1NfTU9WRToKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OnNpemVBbGxDdXJzb3Io
KS5oYW5kbGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtET006OkNTX0Vf
UkVTSVpFOgorICAgICAgICBjYXNlIEtET006OkNTX1dfUkVTSVpFOgorICAgICAgICAgICAgbmV3
Q3Vyc29yID0gS0N1cnNvcjo6c2l6ZUhvckN1cnNvcigpLmhhbmRsZSgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6Q1NfTkVfUkVTSVpFOgorICAgICAgICBjYXNlIEtE
T006OkNTX1NXX1JFU0laRToKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OnNpemVC
RGlhZ0N1cnNvcigpLmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
S0RPTTo6Q1NfTldfUkVTSVpFOgorICAgICAgICBjYXNlIEtET006OkNTX1NFX1JFU0laRToKKyAg
ICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OnNpemVGRGlhZ0N1cnNvcigpLmhhbmRsZSgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6Q1NfTl9SRVNJWkU6Cisg
ICAgICAgIGNhc2UgS0RPTTo6Q1NfU19SRVNJWkU6CisgICAgICAgICAgICBuZXdDdXJzb3IgPSBL
Q3Vyc29yOjpzaXplVmVyQ3Vyc29yKCkuaGFuZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBLRE9NOjpDU19URVhUOgorICAgICAgICAgICAgbmV3Q3Vyc29yID0gS0N1cnNv
cjo6aWJlYW1DdXJzb3IoKS5oYW5kbGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEtET006OkNTX1dBSVQ6CisgICAgICAgICAgICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjp3YWl0
Q3Vyc29yKCkuaGFuZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRE9N
OjpDU19IRUxQOgorICAgICAgICAgICAgbmV3Q3Vyc29yID0gS0N1cnNvcjo6d2hhdHNUaGlzQ3Vy
c29yKCkuaGFuZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAg
ICAgICAgTlNMb2coQCJzZXR0aW5nIGRlZmF1bHQgbW91c2UgY3Vyc29yIik7CisgICAgICAgICAg
ICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjphcnJvd0N1cnNvcigpLmhhbmRsZSgpOworICAgIH0KKyAg
ICByZXR1cm4gbmV3Q3Vyc29yOworfQorCistIChOU0N1cnNvciAqKWN1cnNvckFmdGVyUHJvcGFn
YXRpbmdNb3VzZU1vdmVkRXZlbnQ6KE5TRXZlbnQgKil0aGVFdmVudCBmcm9tVmlldzooRHJhd1Zp
ZXcgKil2aWV3Cit7CisgICAgTlNDdXJzb3IgKm5ld0N1cnNvciA9IFtOU0N1cnNvciBhcnJvd0N1
cnNvcl07CisgICAgCisgICAgUU1vdXNlRXZlbnQgKmV2ZW50ID0gbmV3IFFNb3VzZUV2ZW50KFFF
dmVudDo6TW91c2VNb3ZlLCB0aGVFdmVudCk7CisgICAgS0RPTTo6TW91c2VFdmVudEltcGwgKm1l
diA9IFtzZWxmIG5ld01vdXNlRXZlbnRXaXRoRXZlbnRJZDpLRE9NOjpNT1VTRU1PVkVfRVZFTlQg
cU1vdXNlRXZlbnQ6ZXZlbnRdOworICAgIGlmKG1ldikKKyAgICB7CisgICAgICAgIC8vIEZJWE1F
IHRoaXMgbWFwcGluZyBzaG91bGQgYmUgZG9uZSBlbHNld2hlcmUuLi4KKyAgICAgICAgTlNQb2lu
dCB2aWV3UG9pbnQgPSBbdmlldyBjb252ZXJ0UG9pbnQ6W3RoZUV2ZW50IGxvY2F0aW9uSW5XaW5k
b3ddIGZyb21WaWV3Om5pbF07CisgICAgICAgIFFQb2ludCBjYW52YXNQb2ludCA9IFFQb2ludChb
dmlldyBtYXBWaWV3UG9pbnRUb0NhbnZhczp2aWV3UG9pbnRdKTsKKyAgICAgICAgX3ByaXZhdGUt
PnN2Z0RvY3VtZW50LT5wcmVwYXJlTW91c2VFdmVudChmYWxzZSwgY2FudmFzUG9pbnQueCgpLCBj
YW52YXNQb2ludC55KCksIG1ldik7CisgICAgICAgIAorICAgICAgICBLRE9NOjpFbGVtZW50SW1w
bCAqdGFyZ2V0ID0gc3RhdGljX2Nhc3Q8S0RPTTo6RWxlbWVudEltcGwgKj4obWV2LT5yZWxhdGVk
VGFyZ2V0KCkpOworICAgICAgICBpZih0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEtE
T006OlJlbmRlclN0eWxlICpzdHlsZSA9IHRhcmdldC0+cmVuZGVyU3R5bGUoKTsKKyAgICAgICAg
ICAgIG5ld0N1cnNvciA9IGN1cnNvckZvclN0eWxlKHN0eWxlKTsKKyAgICAgICAgfQorICAgICAg
ICBtZXYtPmRlcmVmKCk7CisgICAgfQorICAgIHJldHVybiBuZXdDdXJzb3I7Cit9CisKKy0gKHZv
aWQpcHJvcGFnYXRlTW91c2VVcEV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgZnJvbVZpZXc6KERy
YXdWaWV3ICopdmlldworeworICAgIFFNb3VzZUV2ZW50ICpldmVudCA9IG5ldyBRTW91c2VFdmVu
dChRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZSwgdGhlRXZlbnQpOworICAgIEtET006Ok1vdXNl
RXZlbnRJbXBsICptZXYgPSBbc2VsZiBuZXdNb3VzZUV2ZW50V2l0aEV2ZW50SWQ6S0RPTTo6TU9V
U0VVUF9FVkVOVCBxTW91c2VFdmVudDpldmVudF07CisgICAgaWYobWV2KQorICAgIHsKKyAgICAg
ICAgLy8gRklYTUUgdGhpcyBtYXBwaW5nIHNob3VsZCBiZSBkb25lIGVsc2V3aGVyZS4uLgorICAg
ICAgICBOU1BvaW50IHZpZXdQb2ludCA9IFt2aWV3ICBjb252ZXJ0UG9pbnQ6W3RoZUV2ZW50IGxv
Y2F0aW9uSW5XaW5kb3ddIGZyb21WaWV3Om5pbF07CisgICAgICAgIFFQb2ludCBjYW52YXNQb2lu
dCA9IFFQb2ludChbdmlldyBtYXBWaWV3UG9pbnRUb0NhbnZhczp2aWV3UG9pbnRdKTsKKyAgICAg
ICAgX3ByaXZhdGUtPnN2Z0RvY3VtZW50LT5wcmVwYXJlTW91c2VFdmVudChmYWxzZSwgY2FudmFz
UG9pbnQueCgpLCBjYW52YXNQb2ludC55KCksIG1ldik7CisgICAgICAgIG1ldi0+ZGVyZWYoKTsK
KyAgICB9Cit9CisKKy0gKHZvaWQpcHJvcGFnYXRlTW91c2VEb3duRXZlbnQ6KE5TRXZlbnQgKil0
aGVFdmVudCBmcm9tVmlldzooRHJhd1ZpZXcgKil2aWV3Cit7CisgICAgUU1vdXNlRXZlbnQgKmV2
ZW50ID0gbmV3IFFNb3VzZUV2ZW50KFFFdmVudDo6TW91c2VCdXR0b25QcmVzcywgdGhlRXZlbnQp
OworICAgIEtET006Ok1vdXNlRXZlbnRJbXBsICptZXYgPSBbc2VsZiBuZXdNb3VzZUV2ZW50V2l0
aEV2ZW50SWQ6S0RPTTo6TU9VU0VET1dOX0VWRU5UIHFNb3VzZUV2ZW50OmV2ZW50XTsKKyAgICBp
ZihtZXYpCisgICAgeworICAgICAgICAvLyBGSVhNRSB0aGlzIG1hcHBpbmcgc2hvdWxkIGJlIGRv
bmUgZWxzZXdoZXJlLi4uCisgICAgICAgIE5TUG9pbnQgdmlld1BvaW50ID0gW3ZpZXcgY29udmVy
dFBvaW50Olt0aGVFdmVudCBsb2NhdGlvbkluV2luZG93XSBmcm9tVmlldzpuaWxdOworICAgICAg
ICBRUG9pbnQgY2FudmFzUG9pbnQgPSBRUG9pbnQoW3ZpZXcgbWFwVmlld1BvaW50VG9DYW52YXM6
dmlld1BvaW50XSk7CisgICAgICAgIF9wcml2YXRlLT5zdmdEb2N1bWVudC0+cHJlcGFyZU1vdXNl
RXZlbnQoZmFsc2UsIGNhbnZhc1BvaW50LngoKSwgY2FudmFzUG9pbnQueSgpLCBtZXYpOworICAg
ICAgICBtZXYtPmRlcmVmKCk7CisgICAgfQorfQorCisKK0BlbmQKKworQGltcGxlbWVudGF0aW9u
IERyYXdEb2N1bWVudCAoS0NhbnZhc01hbmlwdWxhdGlvbikKKworLy8gU1BJCistIChLQ2FudmFz
ICopY2FudmFzCit7CisgICAgcmV0dXJuIF9wcml2YXRlLT5jYW52YXM7Cit9CisKKy0gKE5TU2l6
ZSljYW52YXNTaXplCit7CisgICAgS0NhbnZhcyAqY2FudmFzID0gW3NlbGYgY2FudmFzXTsKKyAg
ICBpZiAoIWNhbnZhcykKKyAgICAgICAgcmV0dXJuIE5TWmVyb1NpemU7CisgICAgcmV0dXJuIE5T
U2l6ZShjYW52YXMtPmNhbnZhc1NpemUoKSk7Cit9CisKKworLSAodm9pZClzaXplQ2FudmFzVG9G
aXRDb250ZW50Cit7CisgICAgTlNSZWN0IGNhbnZhc0JvdW5kcyA9IE5TUmVjdChfcHJpdmF0ZS0+
Y2FudmFzLT5yb290Q29udGFpbmVyKCktPmJib3goKSk7CisgICAgaWYgKCFOU0VxdWFsUmVjdHMo
Y2FudmFzQm91bmRzLCBOU1plcm9SZWN0KSkgeworICAgICAgICBOU0xvZyhAInpvb21pbmcgdG8g
cmVjdDogJUAiLCBOU1N0cmluZ0Zyb21SZWN0KGNhbnZhc0JvdW5kcykpOworICAgICAgICBfcHJp
dmF0ZS0+Y2FudmFzLT5zZXRDYW52YXNTaXplKFFTaXplKGludChhYnMoKGludCljYW52YXNCb3Vu
ZHMub3JpZ2luLngpICsgY2FudmFzQm91bmRzLnNpemUud2lkdGgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChhYnMoKGludCljYW52YXNCb3VuZHMu
b3JpZ2luLnkpICsgY2FudmFzQm91bmRzLnNpemUuaGVpZ2h0KSkpOworICAgICAgICAvLyB0aGlz
IHBhbiBzaG91bGQgYmUgbW92ZWQgb3V0IG9mIHRoZSBkb2MuLi4KKyAgICAgICAgW1tzZWxmIHBy
aW1hcnlWaWV3XSBzZXRDYW52YXNWaXNpYmxlT3JpZ2luOk5TTWFrZVBvaW50KGNhbnZhc0JvdW5k
cy5vcmlnaW4ueCAqIC0xLCBjYW52YXNCb3VuZHMub3JpZ2luLnkgKiAtMSldOworICAgIH0KK30K
KworCistIChEcmF3Q2FudmFzSXRlbSAqKWNhbnZhc0l0ZW1BdFBvaW50OihOU1BvaW50KWNhbnZh
c0hpdFBvaW50Cit7CisgICAgS0NhbnZhc0l0ZW1MaXN0IGhpdEl0ZW1zOworICAgIAorICAgIF9w
cml2YXRlLT5jYW52YXMtPmNvbGxpc2lvbnMoUVBvaW50KGNhbnZhc0hpdFBvaW50KSwgaGl0SXRl
bXMpOworICAgIAorICAgIE5TTG9nKEAiY2FudmFzSXRlbUF0UG9pbnQ6JUAgaGl0ICVpIGl0ZW1z
IiwgTlNTdHJpbmdGcm9tUG9pbnQoY2FudmFzSGl0UG9pbnQpLCBoaXRJdGVtcy5jb3VudCgpKTsK
KyAgICBLQ2FudmFzSXRlbUxpc3Q6Okl0ZXJhdG9yIGl0ID0gaGl0SXRlbXMuYmVnaW4oKTsKKyAg
ICBLQ2FudmFzSXRlbUxpc3Q6Okl0ZXJhdG9yIGVuZCA9IGhpdEl0ZW1zLmVuZCgpOworICAgIGZv
cig7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBOU0xvZyhAImNhbnZhc0l0ZW1BdFBvaW50
OiBoaXQgaXRlbSB3aXRoIGJib3g6ICVAIiwgTlNTdHJpbmdGcm9tUmVjdChOU1JlY3QoKCppdCkt
PmJib3goKSkpKTsKKyAgICB9CisgICAgCisgICAgaWYgKCFoaXRJdGVtcy5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBbRHJhd0NhbnZhc0l0ZW0gY2FudmFzSXRlbUZvckl0ZW06KEtDYW52YXNJ
dGVtICopaGl0SXRlbXMubGFzdCgpXTsKKyAgICAKKyAgICByZXR1cm4gbmlsOworfQorCistICh2
b2lkKXJlbW92ZUl0ZW1Gcm9tRE9NOihEcmF3Q2FudmFzSXRlbSAqKWNhbnZhc0l0ZW0KK3sKKyAg
ICBpZiAoY2FudmFzSXRlbSkgeworICAgICAgICBLQ2FudmFzSXRlbSAqY0l0ZW0gPSBbY2FudmFz
SXRlbSBpdGVtXTsKKyAgICAgICAgS0RPTTo6Tm9kZUltcGwgKm5vZGUgPSAoS0RPTTo6Tm9kZUlt
cGwgKiljSXRlbS0+dXNlckRhdGEoKTsKKyAgICAgICAgS0RPTTo6Tm9kZUltcGwgKnBhcmVudCA9
IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgcGFyZW50LT5yZW1vdmVDaGlsZChub2RlKTsK
KyAgICB9Cit9CisKKy0gKERyYXdDYW52YXNJdGVtICopY3JlYXRlSXRlbUZvclRvb2w6KGludCl0
b29sIGF0UG9pbnQ6KE5TUG9pbnQpbW91c2VQb2ludHsKKyAgICBLRE9NOjpFbGVtZW50SW1wbCAq
bmV3RWxlbWVudCA9IE5VTEw7CisgICAgS0NhbnZhc0l0ZW0gKm5ld0NhbnZhc0l0ZW0gPSBOVUxM
OworICAgIAorICAgIHN3aXRjaCAodG9vbCkgeworCWNhc2UgRHJhd1ZpZXdUb29sRWxpcHNlOgor
CXsKKyAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQtPmNyZWF0
ZUVsZW1lbnQoImVsbGlwc2UiKTsKKyAgICAgICAgICAgIG5ld0VsZW1lbnQtPnNldEF0dHJpYnV0
ZU5TKEtET006Ok5TX1NWRywgImN4IiwgUVN0cmluZzo6bnVtYmVyKG1vdXNlUG9pbnQueCkpOwor
ICAgICAgICAgICAgbmV3RWxlbWVudC0+c2V0QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAiY3ki
LCBRU3RyaW5nOjpudW1iZXIobW91c2VQb2ludC55KSk7CisgICAgICAgICAgICBicmVhazsKKwl9
CisJY2FzZSBEcmF3Vmlld1Rvb2xUcmlhbmdsZToKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2Ug
RHJhd1ZpZXdUb29sUmVjdGFuZ2xlOgorCXsKKyAgICAgICAgICAgIG5ld0VsZW1lbnQgPSBfcHJp
dmF0ZS0+c3ZnRG9jdW1lbnQtPmNyZWF0ZUVsZW1lbnQoInJlY3QiKTsKKyAgICAgICAgICAgIG5l
d0VsZW1lbnQtPnNldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgIngiLCBRU3RyaW5nOjpudW1i
ZXIobW91c2VQb2ludC54KSk7CisgICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGVO
UyhLRE9NOjpOU19TVkcsICJ5IiwgUVN0cmluZzo6bnVtYmVyKG1vdXNlUG9pbnQueSkpOworICAg
ICAgICAgICAgYnJlYWs7CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sTGluZToKKwljYXNlIERyYXdW
aWV3VG9vbFBvbHlMaW5lOgorCWNhc2UgRHJhd1ZpZXdUb29sQXJjOgorICAgICAgICAgICAgLy8g
dGhlc2UganVzdCBkb24ndCByZWFsbHkgd29yayB3aXRoIHRoaXMgbW9kZWwuLi4KKwlkZWZhdWx0
OgorICAgICAgICAgICAgTlNMb2coQCJDYW4ndCBjcmVhdGUgaXRlbSBmb3IgdW5zdXBwb3J0ZWQg
dG9vbC4iKTsKKyAgICB9CisgICAgaWYgKG5ld0VsZW1lbnQpIHsKKyAgICAgICAgbmV3RWxlbWVu
dC0+c2V0QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAiZmlsbCIsICJuYXZ5Iik7CisgICAgICAg
IFNWR1NWR0VsZW1lbnRJbXBsICpyb290Tm9kZSA9IF9wcml2YXRlLT5zdmdEb2N1bWVudC0+cm9v
dEVsZW1lbnQoKTsKKyAgICAgICAgcm9vdE5vZGUtPmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpOwor
ICAgICAgICBuZXdFbGVtZW50LT5yZWYoKTsgLy8gZG9uJ3Qga25vdyB3aHkgdGhpcyBpcyBuZWNl
c3NhcnkuLi4KKyAgICAgICAgbmV3RWxlbWVudC0+YXR0YWNoKCk7IC8vIGF0dGFjaCBpdCB0byB0
aGUgY2FudmFzLgorICAgICAgICBuZXdDYW52YXNJdGVtID0gc3RhdGljX2Nhc3Q8U1ZHU3R5bGVk
RWxlbWVudEltcGwgKj4obmV3RWxlbWVudCktPmNhbnZhc0l0ZW0oKTsKKyAgICAgICAgTlNMb2co
QCJTdWNjZXNzZnVsbHkgY3JlYXRlZCBlbGVtZW50OiAlcCwgbm93IGNhbnZhc0l0ZW06ICVwIiwg
bmV3RWxlbWVudCwgIG5ld0NhbnZhc0l0ZW0pOworICAgICAgICAKKyAgICAgICAgaWYgKG5ld0Nh
bnZhc0l0ZW0pIHsKKyAgICAgICAgICAgIC8vIHdyYXAgaXQgaW4gYSBEcmF3Q2FudmFzSXRlbSwg
cmV0dXJuLgorICAgICAgICAgICAgcmV0dXJuIFtEcmF3Q2FudmFzSXRlbSBjYW52YXNJdGVtRm9y
SXRlbTpuZXdDYW52YXNJdGVtXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmlsOwor
fQorCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBEcmF3RG9jdW1lbnQgKFN1cGVyUHJpdmF0ZVNQ
SUZvckRhdmlkKQorCisKKy8vIFRoaXMgaXMgcmVhbGx5ICJkcmF3SW5SZWN0OiBpbkNHQ29udGV4
dDoKKy0gKHZvaWQpZHJhd1JlY3Q6KE5TUmVjdClkZXN0UmVjdCBpbkNHQ29udGV4dDooQ0dDb250
ZXh0UmVmKWNvbnRleHQKK3sKKyAgICBpZiAoIV9wcml2YXRlLT5jYW52YXMpCisgICAgICAgIHJl
dHVybjsKKyAgICAKKyAgICBzdGF0aWMgS1JlbmRlcmluZ0RldmljZUNvbnRleHRRdWFydHogKl9f
c2hhcmVkUXVhcnR6Q29udGV4dCA9IG5pbDsKKyAgICBpZiAoIV9fc2hhcmVkUXVhcnR6Q29udGV4
dCkKKyAgICAgICAgX19zaGFyZWRRdWFydHpDb250ZXh0ID0gbmV3IEtSZW5kZXJpbmdEZXZpY2VD
b250ZXh0UXVhcnR6KCk7CisgICAgCisgICAgS1JlbmRlcmluZ0RldmljZSAqcmVuZGVyaW5nRGV2
aWNlID0gX3ByaXZhdGUtPmNhbnZhcy0+cmVuZGVyaW5nRGV2aWNlKCk7CisgICAgCisgICAgLy8g
cHVzaCB0aGUgZHJhd2luZyBjb250ZXh0CisgICAgX19zaGFyZWRRdWFydHpDb250ZXh0LT5zZXRD
R0NvbnRleHQoY29udGV4dCk7CisgICAgcmVuZGVyaW5nRGV2aWNlLT5wdXNoQ29udGV4dChfX3No
YXJlZFF1YXJ0ekNvbnRleHQpOworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7Cisg
ICAgCisgICAgLy8gdHJhbnNmb3JtIHRvIHRoZSBkZXN0IHJlY3QuCisgICAgTlNTaXplIHNvdXJj
ZVNpemUgPSBbc2VsZiBjYW52YXNTaXplXTsKKyAgICBDR1JlY3Qgc291cmNlUmVjdCA9IHt7MCww
fSx7c291cmNlU2l6ZS53aWR0aCwgc291cmNlU2l6ZS5oZWlnaHR9fTsKKyAgICBDR0FmZmluZVRy
YW5zZm9ybSBtYXAgPSBDR0FmZmluZVRyYW5zZm9ybU1ha2VNYXBCZXR3ZWVuUmVjdHMoc291cmNl
UmVjdCwqKENHUmVjdCAqKSZkZXN0UmVjdCk7CisgICAgQ0dDb250ZXh0Q29uY2F0Q1RNKGNvbnRl
eHQsbWFwKTsKKyAgICAKKyAgICAvLyBkbyB0aGUgZHJhdworICAgIF9wcml2YXRlLT5jYW52YXMt
PnJvb3RDb250YWluZXIoKS0+ZHJhdyhRUmVjdChzb3VyY2VSZWN0KSk7CisgICAgCisgICAgLy8g
cmVzdG9yZSBkcmF3aW5nIHN0YXRlCisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0
KTsKKyAgICByZW5kZXJpbmdEZXZpY2UtPnBvcENvbnRleHQoKTsKK30KKworQGVuZAorCkluZGV4
OiBEcmF3RG9jdW1lbnRQcml2YXRlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogRHJhd0RvY3VtZW50
UHJpdmF0ZS5oCmRpZmYgLU4gRHJhd0RvY3VtZW50UHJpdmF0ZS5oCi0tLSBEcmF3RG9jdW1lbnRQ
cml2YXRlLmgJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd0RvY3VtZW50UHJpdmF0
ZS5oCTI4IEp1bCAyMDA1IDAwOjA3OjIwIC0wMDAwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMgYXJlIHRlbXBvcmFyeSBhbmQg
ZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93aW5nIGdyZWF0ZXIgdGVzdGlu
ZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRlZ3JhdGlvbi4KKyBEbyBOT1Qg
ZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3aWxsIHNvb24gYmUgZ29uZS4K
KyovCisKKworI2ltcG9ydCA8V2ViQ29yZStTVkcvRHJhd0RvY3VtZW50Lmg+CisKK0BjbGFzcyBE
cmF3VmlldzsKK0BjbGFzcyBEcmF3Q2FudmFzSXRlbTsKKworQGludGVyZmFjZSBEcmF3RG9jdW1l
bnQgKFByaXZhdGVNZXRob2RzKQorCisvLyByZWdpc3RlciBhcyAicHJpbWFyeSIgdmlldyAoem9v
bS9wYW4gbm90aWZpY2F0aW9ucykKKy0gKERyYXdWaWV3ICopcHJpbWFyeVZpZXc7CistICh2b2lk
KXNldFByaW1hcnlWaWV3OihEcmF3VmlldyAqKXZpZXc7CisKKy8vIHJlZ2lzdGVyL3VucmVnaXN0
ZXIgdy8gRE9NLCBldGMuCistICh2b2lkKXJlZ2lzdGVyVmlldzooRHJhd1ZpZXcgKil2aWV3Owor
LSAodm9pZCl1bnJlZ2lzdGVyVmlldzooRHJhd1ZpZXcgKil2aWV3OworCitAZW5kCisKK0BpbnRl
cmZhY2UgRHJhd0RvY3VtZW50IChTdXBlclByaXZhdGVTUElGb3JEYXZpZCkKKy0gKHZvaWQpZHJh
d1JlY3Q6KE5TUmVjdClkaXJ0eVJlY3QgaW5DR0NvbnRleHQ6KENHQ29udGV4dFJlZiljb250ZXh0
OworQGVuZAorCitAaW50ZXJmYWNlIERyYXdEb2N1bWVudCAoRHJhd01vdXNlRXZlbnRzKQorLSAo
Qk9PTClkb2N1bWVudExpc3RlbnNGb3JNb3VzZU1vdmVkRXZlbnRzOworLSAoQk9PTClkb2N1bWVu
dExpc3RlbnNGb3JNb3VzZURvd25FdmVudHM7CistIChCT09MKWRvY3VtZW50TGlzdGVuc0Zvck1v
dXNlVXBFdmVudHM7CisKKy0gKHZvaWQpcHJvcGFnYXRlTW91c2VVcEV2ZW50OihOU0V2ZW50ICop
dGhlRXZlbnQgZnJvbVZpZXc6KERyYXdWaWV3ICopdmlldzsKKy0gKHZvaWQpcHJvcGFnYXRlTW91
c2VEb3duRXZlbnQ6KE5TRXZlbnQgKil0aGVFdmVudCBmcm9tVmlldzooRHJhd1ZpZXcgKil2aWV3
OworLSAoTlNDdXJzb3IgKiljdXJzb3JBZnRlclByb3BhZ2F0aW5nTW91c2VNb3ZlZEV2ZW50OihO
U0V2ZW50ICopdGhlRXZlbnQgZnJvbVZpZXc6KERyYXdWaWV3ICopdmlldzsKKworQGVuZAorCisv
KiBUaGlzIHNob3VsZCBwcm9iYWJseSBicmVhayBvdXQgaW50byBhbm90aGVyIGNsYXNzICovCitA
aW50ZXJmYWNlIERyYXdEb2N1bWVudCAoS0NhbnZhc01hbmlwdWxhdGlvbikKKworLSAoTlNTaXpl
KWNhbnZhc1NpemU7CistICh2b2lkKXNpemVDYW52YXNUb0ZpdENvbnRlbnQ7CisKKy0gKERyYXdD
YW52YXNJdGVtICopY2FudmFzSXRlbUF0UG9pbnQ6KE5TUG9pbnQpY2FudmFzSGl0UG9pbnQ7Cist
ICh2b2lkKXJlbW92ZUl0ZW1Gcm9tRE9NOihEcmF3Q2FudmFzSXRlbSAqKWl0ZW07CistIChEcmF3
Q2FudmFzSXRlbSAqKWNyZWF0ZUl0ZW1Gb3JUb29sOihpbnQpdG9vbCBhdFBvaW50OihOU1BvaW50
KWNhbnZhc1BvaW50OworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpJbmRleDog
RHJhd1ZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBEcmF3Vmlldy5oCmRpZmYgLU4gRHJhd1Zp
ZXcuaAotLS0gRHJhd1ZpZXcuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBEcmF3Vmll
dy5oCTI4IEp1bCAyMDA1IDAwOjA3OjIwIC0wMDAwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMgYXJlIHRlbXBvcmFyeSBhbmQg
ZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93aW5nIGdyZWF0ZXIgdGVzdGlu
ZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRlZ3JhdGlvbi4KKyBEbyBOT1Qg
ZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3aWxsIHNvb24gYmUgZ29uZS4K
KyovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BjbGFzcyBEcmF3Vmlld1ByaXZhdGU7
CitAY2xhc3MgRHJhd0RvY3VtZW50OworCit0eXBlZGVmIGVudW0geworICAgIC8vIHZpZXdpbmcg
dG9vbHMKKyAgICBEcmF3Vmlld1Rvb2xCcm93c2UsIC8vIGNsaWNrIG9uIGxpbmtzLCBpbnRlcmFj
dCB3LyBqYXZhc2NyaXB0LCBldGMuCisgICAgRHJhd1ZpZXdUb29sUGFuLAorICAgIERyYXdWaWV3
VG9vbFpvb20sCisgICAgCisgICAgLy8gZWRpdGluZyB0b29scworICAgIERyYXdWaWV3VG9vbEFy
cm93LCAvLyBzZWxlY3QsIGNoYW5nZSBzaXplLCBldGMuCisgICAgRHJhd1ZpZXdUb29sTGluZSwK
KyAgICBEcmF3Vmlld1Rvb2xFbGlwc2UsCisgICAgRHJhd1ZpZXdUb29sUmVjdGFuZ2xlLAorICAg
IERyYXdWaWV3VG9vbFRyaWFuZ2xlLCAvLyBnZW5lcmljIHBvbHlnb24gdG9vbD8KKyAgICBEcmF3
Vmlld1Rvb2xQb2x5TGluZSwKKyAgICBEcmF3Vmlld1Rvb2xBcmMsCisgICAgCit9IERyYXdWaWV3
VG9vbDsKKworQGludGVyZmFjZSBEcmF3VmlldyA6IE5TVmlldyB7CisgICAgCitAcHJpdmF0ZQor
ICAgIERyYXdWaWV3VG9vbCBfdG9vbE1vZGU7CisgICAgQk9PTAlfaXNFZGl0YWJsZTsKKyAgICBO
U0ltYWdlU2NhbGluZyBfc2NhbGVSdWxlOworICAgIAorICAgIERyYXdWaWV3UHJpdmF0ZSAqX3By
aXZhdGU7Cit9CisKKy0gKERyYXdEb2N1bWVudCAqKWRvY3VtZW50OworLSAodm9pZClzZXREb2N1
bWVudDooRHJhd0RvY3VtZW50ICopZG9jdW1lbnQ7CisKKy0gKE5TSW1hZ2VTY2FsaW5nKWltYWdl
U2NhbGluZzsKKy0gKHZvaWQpc2V0SW1hZ2VTY2FsaW5nOihOU0ltYWdlU2NhbGluZylzY2FsaW5n
OworCistIChJQkFjdGlvbil6b29tSW46KGlkKXNlbmRlcjsKKy0gKElCQWN0aW9uKXpvb21PdXQ6
KGlkKXNlbmRlcjsKKy0gKElCQWN0aW9uKXpvb21PcmlnaW5hbDooaWQpc2VuZGVyOworLSAoSUJB
Y3Rpb24pem9vbVRvRml0OihpZClzZW5kZXI7CisKKy8vIFdpbGwgc2l6ZSB0aGUgdmlldyB0byBm
aXQgd2hhdGV2ZXIgU1ZHIGRvY3VtZW50IGl0IGhhcyBpbiBpdC4KKy0gKHZvaWQpc2l6ZVRvRml0
Vmlld0JveDsKKy8vIHdpbGwgZml0IHdoYXRldmVyIHRoZSBjYW52YXMgc2l6ZSBpcy4uLiAoZGVw
cmVjYXRlZCkKKy0gKHZvaWQpc2l6ZVRvRml0Q2FudmFzOworCistIChpbnQpdG9vbE1vZGU7Cist
ICh2b2lkKXNldFRvb2xNb2RlOihpbnQpdG9vbE1vZGU7CisKKy8qIEVkaXRpbmcgU3VwcG9ydCAq
LworCistIChCT09MKWlzRWRpdGFibGU7CistICh2b2lkKXNldEVkaXRhYmxlOihCT09MKWVkaXRh
YmxlOworCistIChJQkFjdGlvbilkZWxldGVTZWxlY3Rpb246KGlkKXNlbmRlcjsKKy0gKElCQWN0
aW9uKW1vdmVTZWxlY3Rpb25Gb3J3YXJkOihpZClzZW5kZXI7CistIChJQkFjdGlvbiltb3ZlU2Vs
ZWN0aW9uQmFja3dhcmQ6KGlkKXNlbmRlcjsKKworQGVuZApJbmRleDogRHJhd1ZpZXcubW0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQpSQ1MgZmlsZTogRHJhd1ZpZXcubW0KZGlmZiAtTiBEcmF3Vmlldy5tbQotLS0gRHJh
d1ZpZXcubW0JMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd1ZpZXcubW0JMjggSnVs
IDIwMDUgMDA6MDc6MjAgLTAwMDAKQEAgLTAsMCArMSw5MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisKKworI2ltcG9ydCAiRHJhd1ZpZXdQcml2YXRlLmgiCisjaW1wb3J0ICJEcmF3Q2FudmFzSXRl
bS5oIgorI2ltcG9ydCAiRHJhd0RvY3VtZW50UHJpdmF0ZS5oIgorCisjaW1wb3J0IDxrY2FudmFz
L0tDYW52YXMuaD4KKyNpbXBvcnQgPGtjYW52YXMvS0NhbnZhc0NvbnRhaW5lci5oPgorI2ltcG9y
dCA8a2NhbnZhcy9kZXZpY2UvcXVhcnR6L0tDYW52YXNWaWV3UXVhcnR6Lmg+CisjaW1wb3J0IDxr
Y2FudmFzL2RldmljZS9xdWFydHovS1JlbmRlcmluZ0RldmljZVF1YXJ0ei5oPgorCisvLyBUaGlz
IHNob3VsZCBnbyBpbiB0aGUgUHJlZml4IGhlYWRlciBldmVudHVhbGx5LgorI2RlZmluZSBmb3Jl
YWNoYXJyYXkoX192YXJpYWJsZSwgX19jb250YWluZXIpIFwKK2ZvciAoaW50IF9fdmFyaWFibGUj
I19faT0wLCBfX3ZhcmlhYmxlIyNfX249W19fY29udGFpbmVyIGNvdW50XTsgIFwKKyAgICAgX192
YXJpYWJsZSMjX19pIDwgX192YXJpYWJsZSMjX19uICYmIChfX3ZhcmlhYmxlID0gW19fY29udGFp
bmVyIG9iamVjdEF0SW5kZXg6X192YXJpYWJsZSMjX19pXSk7ICBcCisgICAgICsrX192YXJpYWJs
ZSMjX19pKQorCisjZGVmaW5lIE5TRGlmZmVyZW5jZVBvaW50KGEsYikgKE5TTWFrZVBvaW50KGEu
eC1iLngsIGEueS1iLnkpKQorI2RlZmluZSBOU1N1bVBvaW50KGEsYikgKE5TTWFrZVBvaW50KGEu
eCtiLngsIGEueStiLnkpKQorCisvLyBlZGl0aW5nIGtub2JzLgorI2RlZmluZSBLTk9CX1NJWkUg
NgorI2RlZmluZSBLTk9CX0hBTEZfU0laRSAzCisKK3R5cGVkZWYgZW51bSB7CisgICAgRHJhZ0Fj
dGlvbk5vbmUgPSAwLAorICAgIERyYWdBY3Rpb25QYW4sCisgICAgRHJhZ0FjdGlvblJlc2l6ZSwK
KyAgICBEcmFnQWN0aW9uTW92ZSwKKyAgICBEcmFnQWN0aW9uU2VsZWN0aW9uCit9IERyYXdEcmFn
QWN0aW9uOworCisvLyB0aGlzIGlzIHNvcnRhIGEgaGFjaworQGludGVyZmFjZSBEcmF3RG9jdW1l
bnQgKEludGVybmFsQ2FudmFzTWV0aG9kKQorLSAoS0NhbnZhcyAqKWNhbnZhczsKK0BlbmQKKwor
CitAaW50ZXJmYWNlIERyYXdWaWV3UHJpdmF0ZSA6IE5TT2JqZWN0IHsKKyAgICBAcHVibGljCisg
ICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtczsKKyAgICAKKyAgICBEcmF3VmlldyAqZHJhd1ZpZXc7
IC8vIHBvaW50ZXIgdG8gIm93bmVyIgorICAgIERyYXdEb2N1bWVudCAqZG9jdW1lbnQ7CisgICAg
CisgICAgTlNDb2xvciAqYmFja2dyb3VuZENvbG9yOworICAgIAorICAgIGludCBkcmFnQ29udHJv
bFBvaW50SW5kZXg7CisgICAgTlNQb2ludCBkcmFnU3RhcnRQb2ludDsKKyAgICBOU1BvaW50IGxh
c3REcmFnUG9pbnQ7CisgICAgTlNQb2ludCBjYW52YXNEcmFnQW5jaG9yUG9pbnQ7IC8vIHVzZWQg
bW9zdGx5IGZvciBncm91cCByZXNpemUuCisgICAgTlNQb2ludCBjYW52YXNEcmFnT3JpZ2luT2Zm
c2V0OworICAgIAorICAgIGludCB0cmFja2luZ1JlY3RUYWc7CisgICAgRHJhd0RyYWdBY3Rpb24g
Y3VycmVudERyYWdBY3Rpb247CisgICAgTlNSZWN0IHNlbGVjdGlvblJlY3Q7CisgICAgCisgICAg
TlNTaXplIF9tYXhTaXplOworICAgIAorICAgIC8vIHRlbXBvcmFyeSBoYWNrLCB3aWxsIGV2ZW50
dWFsbHkgYmUgc3RvcmVkIGluIHNjcm9sbHZpZXcvdmlldworICAgIGZsb2F0IGNhbnZhc1pvb207
CisgICAgTlNQb2ludCBjYW52YXNWaXNhYmxlT3JpZ2luOworICAgIAorICAgIEtDYW52YXNWaWV3
UXVhcnR6ICpjYW52YXNWaWV3OworICAgIEtSZW5kZXJpbmdEZXZpY2VDb250ZXh0UXVhcnR6ICpx
dWFydHpDb250ZXh0OworfQorQGVuZCAKKworQGltcGxlbWVudGF0aW9uIERyYXdWaWV3UHJpdmF0
ZQorCisrICh2b2lkKXNldEZpbHRlclN1cHBvcnRFbmFibGVkOihCT09MKWVuYWJsZWQKK3sKKyAg
ICBLUmVuZGVyaW5nRGV2aWNlUXVhcnR6OjpzZXRGaWx0ZXJzRW5hYmxlZChlbmFibGVkKTsKK30K
KworKyAoQk9PTClpc0ZpbHRlclN1cHBvcnRFbmFibGVkCit7CisgICAgcmV0dXJuIEtSZW5kZXJp
bmdEZXZpY2VRdWFydHo6OmZpbHRlcnNFbmFibGVkKCk7Cit9CisKKy0gKGlkKWluaXRXaXRoRHJh
d1ZpZXc6KERyYXdWaWV3ICopdmlldworeworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkp
IHsKKyAgICAgICAgZHJhd1ZpZXcgPSB2aWV3OworICAgICAgICBxdWFydHpDb250ZXh0ID0gbmV3
IEtSZW5kZXJpbmdEZXZpY2VDb250ZXh0UXVhcnR6KCk7CisgICAgICAgIGNhbnZhc1ZpZXcgPSBu
ZXcgS0NhbnZhc1ZpZXdRdWFydHooKTsKKyAgICAgICAgY2FudmFzVmlldy0+c2V0VmlldyhkcmF3
Vmlldyk7CisgICAgICAgIGNhbnZhc1ZpZXctPnNldENvbnRleHQocXVhcnR6Q29udGV4dCk7Cisg
ICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChEcmF3RG9jdW1lbnQgKilkb2N1bWVudAor
eworICAgIHJldHVybiBkb2N1bWVudDsKK30KKworLSAodm9pZClzZXREb2N1bWVudDooRHJhd0Rv
Y3VtZW50ICopZG9jCit7CisgICAgaWYgKGRvYyAhPSBkb2N1bWVudCkgeworICAgICAgICBbZG9j
dW1lbnQgdW5yZWdpc3RlclZpZXc6ZHJhd1ZpZXddOworICAgICAgICBbZG9jdW1lbnQgcmVsZWFz
ZV07CisgICAgICAgIGRvY3VtZW50ID0gW2RvYyByZXRhaW5dOworICAgICAgICBbZG9jdW1lbnQg
cmVnaXN0ZXJWaWV3OmRyYXdWaWV3XTsKKyAgICAgICAgCisgICAgICAgIGRlbGV0ZSBjYW52YXNW
aWV3OworICAgICAgICBjYW52YXNWaWV3ID0gTlVMTDsKKyAgICAgICAgaWYgKGRvY3VtZW50KSB7
CisgICAgICAgICAgICBjYW52YXNWaWV3ID0gbmV3IEtDYW52YXNWaWV3UXVhcnR6KCk7CisgICAg
ICAgICAgICBjYW52YXNWaWV3LT5pbml0KFtkb2N1bWVudCBjYW52YXNdLCBOVUxMKTsKKyAgICAg
ICAgICAgIGNhbnZhc1ZpZXctPnNldFZpZXcoZHJhd1ZpZXcpOworICAgICAgICAgICAgY2FudmFz
Vmlldy0+c2V0Q29udGV4dChxdWFydHpDb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KK30KKwor
Ly8gYysrIGVuYWJsZWQgZHJhd2luZyBjb2RlLgorLSAodm9pZClkcmF3UmVjdDooTlNSZWN0KWRp
cnR5Vmlld1JlY3QKK3sKKyAgICBpZiAoIVtkb2N1bWVudCBjYW52YXNdKQorICAgICAgICByZXR1
cm47CisgICAgaWYgKCFjYW52YXNWaWV3KQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8g
cHVzaCB0aGUgZHJhd2luZyBjb250ZXh0CisgICAgS1JlbmRlcmluZ0RldmljZSAqcmVuZGVyaW5n
RGV2aWNlID0gW2RvY3VtZW50IGNhbnZhc10tPnJlbmRlcmluZ0RldmljZSgpOworICAgIAorICAg
IC8vIEFwcGx5IHRoZSB0b3AtbGV2ZWwgIndvcmxkIHRyYW5zZm9ybSIgZm9yIHpvb20vcGFuCisg
ICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKVtbTlNHcmFwaGljc0NvbnRl
eHQgY3VycmVudENvbnRleHRdIGdyYXBoaWNzUG9ydF07CisgICAgcXVhcnR6Q29udGV4dC0+c2V0
Q0dDb250ZXh0KGNvbnRleHQpOyAvLyBzaG91bGQgcHJvYmFibHkganVzdCBiZSBzZXQgb25jZS4u
LgorICAgIHJlbmRlcmluZ0RldmljZS0+cHVzaENvbnRleHQocXVhcnR6Q29udGV4dCk7CisgICAg
Q0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKyAgICBDR0NvbnRleHRDb25jYXRDVE0oY29u
dGV4dCwgQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoW2RyYXdWaWV3IHRyYW5zZm9ybUZyb21WaWV3
VG9DYW52YXNdKSk7CisgICAgCisgICAgLy8gZG8gdGhlIGRyYXcKKyAgICAvL1tkb2N1bWVudCBk
cmF3UmVjdDpbZHJhd1ZpZXcgbWFwVmlld1JlY3RUb0NhbnZhczpkaXJ0eVZpZXdSZWN0XSBpbkNH
Q29udGV4dDpjb250ZXh0XTsKKyAgICBbZG9jdW1lbnQgY2FudmFzXS0+cm9vdENvbnRhaW5lcigp
LT5kcmF3KFFSZWN0KFtkcmF3VmlldyBtYXBWaWV3UmVjdFRvQ2FudmFzOmRpcnR5Vmlld1JlY3Rd
KSk7CisgICAgCisgICAgLy8gcmVzdG9yZSBkcmF3aW5nIHN0YXRlCisgICAgQ0dDb250ZXh0UmVz
dG9yZUdTdGF0ZShjb250ZXh0KTsKKyAgICByZW5kZXJpbmdEZXZpY2UtPnBvcENvbnRleHQoKTsK
KyAgICBxdWFydHpDb250ZXh0LT5zZXRDR0NvbnRleHQoTlVMTCk7Cit9CisKKy0gKHZvaWQpZGVh
bGxvYworeworICAgIC8vIElmIHdlIGdvIGF3YXksIG1ha2Ugc3VyZSB3ZSBjbGVhciB0aGUgdmll
dyBwb2ludGVyLgorICAgIFtkb2N1bWVudCB1bnJlZ2lzdGVyVmlldzpkcmF3Vmlld107CisgICAg
ZGVsZXRlIGNhbnZhc1ZpZXc7CisgICAgZGVsZXRlIHF1YXJ0ekNvbnRleHQ7CisgICAgW3N1cGVy
IGRlYWxsb2NdOworfQorQGVuZAorCitOU0FycmF5ICpEcmF3Vmlld0RyYWdUeXBlczsKKworQGlu
dGVyZmFjZSBEcmF3VmlldyAoSW50ZXJuYWxNZXRob2RzKQorLSAodm9pZClkcmF3S25vYnNGb3JS
ZWN0OihOU1JlY3QpcmVjdDsKKy0gKHZvaWQpdXBkYXRlQ2FudmFzU2NhbGU7CistICh2b2lkKWVu
YWJsZU1vdXNlTW92ZWRFdmVudHNJZk5lZWRlZDsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIERy
YXdWaWV3CisKKysgKHZvaWQpaW5pdGlhbGl6ZQoreworICAgIC8vRHJhd1ZpZXdEcmFnVHlwZXMg
PSBbW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0Ok5TRmlsZW5hbWVzUGJvYXJkVHlwZV0gcmV0YWlu
XTsKKyAgICBbc2VsZiBzZXRLZXlzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpAInRvb2xNb2Rl
Il0gdHJpZ2dlckNoYW5nZU5vdGlmaWNhdGlvbnNGb3JEZXBlbmRlbnRLZXk6QCJzZWxlY3RlZENh
bnZhc0l0ZW1zIl07Cit9CisKKy0gKGlkKWluaXRXaXRoRnJhbWU6KE5TUmVjdClmcmFtZVJlY3QK
K3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhGcmFtZTpmcmFtZVJlY3RdKSAhPSBu
aWwpIHsKKyAgICAgICAgX3ByaXZhdGUgPSBbW0RyYXdWaWV3UHJpdmF0ZSBhbGxvY10gaW5pdFdp
dGhEcmF3VmlldzpzZWxmXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKHZvaWQp
ZGVhbGxvYworeworICAgIFtfcHJpdmF0ZSByZWxlYXNlXTsKKyAgICBbc3VwZXIgZGVhbGxvY107
Cit9CisKKy0gKE5TUmVjdClzZWxlY3Rpb25DYW52YXNCb3VuZGluZ0JveAoreworICAgIE5TUmVj
dCBzZWxlY3Rpb25Cb3VuZGluZ0JveCA9IE5TWmVyb1JlY3Q7CisgICAgRHJhd0NhbnZhc0l0ZW0g
Kml0ZW0gPSBuaWw7CisgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtcyA9IFtzZWxmIHNlbGVjdGVk
Q2FudmFzSXRlbXNdOworICAgIGZvcmVhY2hhcnJheShpdGVtLCBzZWxlY3RlZEl0ZW1zKSB7Cisg
ICAgICAgIHNlbGVjdGlvbkJvdW5kaW5nQm94ID0gTlNVbmlvblJlY3Qoc2VsZWN0aW9uQm91bmRp
bmdCb3gsW2l0ZW0gYm91bmRpbmdCb3hdKTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGVjdGlvbkJv
dW5kaW5nQm94OworfQorCistICh2b2lkKV9jbGVhckFuZERyYXdCYWNrZ3JvdW5kOihOU1JlY3Qp
ZGlydHlSZWN0Cit7CisgICAgW1tOU0NvbG9yIGxpZ2h0R3JheUNvbG9yXSBzZXRdOworICAgIE5T
UmVjdEZpbGwoZGlydHlSZWN0KTsKKyAgICAKKyAgICBbW3NlbGYgYmFja2dyb3VuZENvbG9yXSBz
ZXRdOworICAgIE5TU2l6ZSBjYW52YXNTaXplID0gW1tzZWxmIGRvY3VtZW50XSBjYW52YXNTaXpl
XTsKKyAgICBOU1JlY3QgY2FudmFzUmVjdCA9IE5TTWFrZVJlY3QoMCwwLCBjYW52YXNTaXplLndp
ZHRoLCBjYW52YXNTaXplLmhlaWdodCk7CisgICAgTlNSZWN0RmlsbChbc2VsZiBtYXBDYW52YXNS
ZWN0VG9WaWV3OmNhbnZhc1JlY3RdKTsKK30KKworLSAodm9pZClfZHJhd1NlbGVjdGlvbktub2Jz
Cit7CisgICAgaWYgKChfdG9vbE1vZGUgPT0gRHJhd1ZpZXdUb29sQXJyb3cpICYmIFtbc2VsZiBz
ZWxlY3RlZENhbnZhc0l0ZW1zXSBjb3VudF0pIHsKKyAgICAgICAgTlNSZWN0IHZpZXdTZWxlY3Rp
b25Cb3VuZGluZ0JveCA9IFtzZWxmIG1hcENhbnZhc1JlY3RUb1ZpZXc6W3NlbGYgc2VsZWN0aW9u
Q2FudmFzQm91bmRpbmdCb3hdXTsKKyAgICAgICAgW3NlbGYgZHJhd0tub2JzRm9yUmVjdDp2aWV3
U2VsZWN0aW9uQm91bmRpbmdCb3hdOworICAgIH0KKyAgICAKKyAgICBpZiAoX3ByaXZhdGUtPmN1
cnJlbnREcmFnQWN0aW9uID09IERyYWdBY3Rpb25TZWxlY3Rpb24pIHsKKyAgICAgICAgW1tOU0Nv
bG9yIGxpZ2h0R3JheUNvbG9yXSBzZXRdOworICAgICAgICBOU0ZyYW1lUmVjdChfcHJpdmF0ZS0+
c2VsZWN0aW9uUmVjdCk7CisgICAgfQorfQorCistICh2b2lkKWRyYXdSZWN0OihOU1JlY3QpZGly
dHlSZWN0Cit7CisgICAgW3NlbGYgX2NsZWFyQW5kRHJhd0JhY2tncm91bmQ6ZGlydHlSZWN0XTsK
KyAgICBbX3ByaXZhdGUgZHJhd1JlY3Q6ZGlydHlSZWN0XTsKKyAgICBbc2VsZiBfZHJhd1NlbGVj
dGlvbktub2JzXTsKK30KKworLSAodm9pZClzZXRCYWNrZ3JvdW5kQ29sb3I6KE5TQ29sb3IgKilj
b2xvcgoreworICAgIGlkIG9sZENvbG9yID0gX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvciA7Cisg
ICAgX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvciA9IFtjb2xvciByZXRhaW5dOworICAgIFtvbGRD
b2xvciByZWxlYXNlXTsKK30KKworLSAoTlNDb2xvciAqKWJhY2tncm91bmRDb2xvcgoreworICAg
IGlmICghX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvcikKKyAgICAgICAgX3ByaXZhdGUtPmJhY2tn
cm91bmRDb2xvciA9IFtbTlNDb2xvciB3aGl0ZUNvbG9yXSByZXRhaW5dOworICAgIHJldHVybiBf
cHJpdmF0ZS0+YmFja2dyb3VuZENvbG9yOworfQorCistIChCT09MKWlzT3BhcXVlCit7CisgICAg
cmV0dXJuICFbX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvciBpc0VxdWFsOltOU0NvbG9yIGNsZWFy
Q29sb3JdXTsKK30KKworLSAoQk9PTClpc0ZsaXBwZWQKK3sKKyAgICByZXR1cm4gWUVTOworfQor
CistIChCT09MKWFjY2VwdHNGaXJzdFJlc3BvbmRlcgoreworICAgIHJldHVybiBZRVM7Cit9CisK
Ky0gKEJPT0wpYWNjZXB0c0ZpcnN0TW91c2U6KE5TRXZlbnQgKilldmVudAoreworICAgIHJldHVy
biAoKF90b29sTW9kZSA9PSBEcmF3Vmlld1Rvb2xCcm93c2UpIHx8IChfdG9vbE1vZGUgPT0gRHJh
d1ZpZXdUb29sQXJyb3cpKTsKK30KKworLSAoTlNJbWFnZVNjYWxpbmcpaW1hZ2VTY2FsaW5nCit7
CisgICAgcmV0dXJuIF9zY2FsZVJ1bGU7Cit9CisKKy0gKHZvaWQpc2V0SW1hZ2VTY2FsaW5nOihO
U0ltYWdlU2NhbGluZylzY2FsaW5nCit7CisgICAgX3NjYWxlUnVsZSA9IHNjYWxpbmc7CisgICAg
W3NlbGYgdXBkYXRlQ2FudmFzU2NhbGVdOworfQorCistICh2b2lkKXNldEZyYW1lOihOU1JlY3Qp
bmV3RnJhbWUKK3sKKyAgICBbc2VsZiByZW1vdmVUcmFja2luZ1JlY3Q6X3ByaXZhdGUtPnRyYWNr
aW5nUmVjdFRhZ107CisgICAgW3NlbGYgc2V0RnJhbWVPcmlnaW46bmV3RnJhbWUub3JpZ2luXTsK
KyAgICBbc2VsZiBzZXRGcmFtZVNpemU6bmV3RnJhbWUuc2l6ZV07CisgICAgX3ByaXZhdGUtPnRy
YWNraW5nUmVjdFRhZyA9CisgICAgICAgIFtzZWxmIGFkZFRyYWNraW5nUmVjdDpbc2VsZiBmcmFt
ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyOnNlbGYgdXNlckRhdGE6TlVMTAorICAg
ICAgICAgICAgICAgICBhc3N1bWVJbnNpZGU6W3NlbGYgbW91c2U6W05TRXZlbnQgbW91c2VMb2Nh
dGlvbl0gaW5SZWN0OltzZWxmIGJvdW5kc11dXTsKK30KKworLSAodm9pZClzZXRGcmFtZVNpemU6
KE5TU2l6ZSluZXdTaXplCit7CisgICAgW3N1cGVyIHNldEZyYW1lU2l6ZTpuZXdTaXplXTsKKyAg
ICBbc2VsZiB1cGRhdGVDYW52YXNTY2FsZV07Cit9CisKKy0gKHZvaWQpc2V0RG9jdW1lbnQ6KERy
YXdEb2N1bWVudCAqKWRvY3VtZW50Cit7CisgICAgaWYgKFtfcHJpdmF0ZSBkb2N1bWVudF0gIT0g
ZG9jdW1lbnQpIHsKKyAgICAgICAgW19wcml2YXRlIHNldERvY3VtZW50OmRvY3VtZW50XTsKKyAg
ICAgICAgW3NlbGYgdXBkYXRlQ2FudmFzU2NhbGVdOworICAgICAgICBbc2VsZiBzZXROZWVkc0Rp
c3BsYXk6WUVTXTsKKyAgICB9Cit9CisKKy0gKERyYXdEb2N1bWVudCAqKWRvY3VtZW50Cit7Cisg
ICAgcmV0dXJuIFtfcHJpdmF0ZSBkb2N1bWVudF07Cit9CisKKy0gKEtDYW52YXNWaWV3UXVhcnR6
ICopY2FudmFzVmlldworeworICAgIHJldHVybiBfcHJpdmF0ZS0+Y2FudmFzVmlldzsKK30KKwor
I3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBFZGl0aW5nIHN1cHBvcnQKKworLSAodm9pZClz
ZXRFZGl0YWJsZTooQk9PTCllZGl0YWJsZQoreworICAgIFtzZWxmIHVucmVnaXN0ZXJEcmFnZ2Vk
VHlwZXNdOworICAgIF9pc0VkaXRhYmxlID0gZWRpdGFibGU7CisgICAgaWYgKF9pc0VkaXRhYmxl
KQorICAgICAgICBbc2VsZiByZWdpc3RlckZvckRyYWdnZWRUeXBlczpEcmF3Vmlld0RyYWdUeXBl
c107Cit9CisKKy0gKEJPT0wpaXNFZGl0YWJsZQoreworICAgIHJldHVybiBfaXNFZGl0YWJsZTsK
K30KKworLSAoTlNSZWN0KWJvdW5kc0ZvckNhbnZhc0l0ZW06KERyYXdDYW52YXNJdGVtICopY2Fu
dmFzSXRlbQoreworICAgIE5TUmVjdCBpdGVtQkJveEluQ2FudmFzID0gW2NhbnZhc0l0ZW0gYm91
bmRpbmdCb3hdOworICAgIE5TUmVjdCBpdGVtQkJveEluVmlldyA9IFtzZWxmIG1hcENhbnZhc1Jl
Y3RUb1ZpZXc6aXRlbUJCb3hJbkNhbnZhc107CisgICAgcmV0dXJuIE5TSW5zZXRSZWN0KGl0ZW1C
Qm94SW5WaWV3LCAtS05PQl9IQUxGX1NJWkUsIC1LTk9CX0hBTEZfU0laRSk7Cit9CisKKy0gKE5T
QXJyYXkgKilzZWxlY3RlZENhbnZhc0l0ZW1zCit7CisgICAgLy8gc2VsZWN0aW9uIG9ubHkgImV4
aXN0cyIgd2hlbiB1c2luZyB0aGUgYXJyb3cgdG9vbC4KKyAgICAvLyBidXQgd2Ugc2lsbCByZW1l
bWJlciBzZWxlY3Rpb24gYmV0d2VlbiB1c2VzLgorICAgIHJldHVybiBfcHJpdmF0ZS0+c2VsZWN0
ZWRJdGVtczsKK30KKworLSAodm9pZClzZXRTZWxlY3RlZENhbnZhc0l0ZW1zOihOU0FycmF5ICop
c2VsZWN0ZWRJdGVtcworeworICAgIERyYXdDYW52YXNJdGVtICpuZXdTZWxlY3RlZEl0ZW0gPSBu
aWw7CisgICAgTlNNdXRhYmxlQXJyYXkgKm5ld1NlbGVjdGVkSXRlbXMgPSBbW05TTXV0YWJsZUFy
cmF5IGFsbG9jXSBpbml0XTsKKyAgICBmb3JlYWNoYXJyYXkobmV3U2VsZWN0ZWRJdGVtLCBzZWxl
Y3RlZEl0ZW1zKSB7CisgICAgICAgIFtuZXdTZWxlY3RlZEl0ZW1zIGFkZE9iamVjdDpuZXdTZWxl
Y3RlZEl0ZW1dOworICAgIH0KKyAgICBbX3ByaXZhdGUtPnNlbGVjdGVkSXRlbXMgcmVsZWFzZV07
CisgICAgaWYgKFtuZXdTZWxlY3RlZEl0ZW1zIGNvdW50XSkKKyAgICAgICAgX3ByaXZhdGUtPnNl
bGVjdGVkSXRlbXMgPSBuZXdTZWxlY3RlZEl0ZW1zOworICAgIGVsc2UKKyAgICAgICAgX3ByaXZh
dGUtPnNlbGVjdGVkSXRlbXMgPSBuaWw7CisgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5OllFU107
IC8vIEZJWE1FOiBqdXN0IGludmFsaWRhdGUgdGhlIHdob2xlIHZpZXcgZm9yIG5vdy4KK30KKwor
LSAoSUJBY3Rpb24pbW92ZVNlbGVjdGlvbkZvcndhcmQ6KGlkKXNlbmRlcgoreworICAgIERyYXdD
YW52YXNJdGVtICppdGVtID0gbmlsOworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2Vs
ZiBzZWxlY3RlZENhbnZhc0l0ZW1zXTsKKyAgICBmb3JlYWNoYXJyYXkoaXRlbSwgc2VsZWN0ZWRJ
dGVtcykgeworICAgICAgICBbaXRlbSByYWlzZV07CisgICAgfQorfQorCistIChJQkFjdGlvbilt
b3ZlU2VsZWN0aW9uQmFja3dhcmQ6KGlkKXNlbmRlcgoreworICAgIERyYXdDYW52YXNJdGVtICpp
dGVtID0gbmlsOworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2VsZiBzZWxlY3RlZENh
bnZhc0l0ZW1zXTsKKyAgICBmb3JlYWNoYXJyYXkoaXRlbSwgc2VsZWN0ZWRJdGVtcykgeworICAg
ICAgICBbaXRlbSBsb3dlcl07CisgICAgfQorfQorCistIChOU0FycmF5ICopY2FudmFzQ29udHJv
bFBvaW50c0ZvclNlbGVjdGlvbgoreworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2Vs
ZiBzZWxlY3RlZENhbnZhc0l0ZW1zXTsKKyAgICBpZiAoW3NlbGVjdGVkSXRlbXMgY291bnRdID09
IDEpCisgICAgICAgIHJldHVybiBbW3NlbGVjdGVkSXRlbXMgb2JqZWN0QXRJbmRleDowXSBjb250
cm9sUG9pbnRzXTsKKyAgICBlbHNlIGlmIChbc2VsZWN0ZWRJdGVtcyBjb3VudF0gPiAxKQorICAg
ICAgICByZXR1cm4gW0RyYXdDYW52YXNJdGVtIGNvbnRyb2xQb2ludHNGb3JSZWN0OltzZWxmIHNl
bGVjdGlvbkNhbnZhc0JvdW5kaW5nQm94XV07CisgICAgCisgICAgcmV0dXJuIG5pbDsKK30KKwor
LSAoTlNQb2ludCljYW52YXNEcmFnQW5jaG9yUG9pbnRGb3JDb250cm9sUG9pbnRJbmRleDooaW50
KWNvbnRyb2xQb2ludEluZGV4Cit7CisgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtcyA9IFtzZWxm
IHNlbGVjdGVkQ2FudmFzSXRlbXNdOworICAgIGlmIChbc2VsZWN0ZWRJdGVtcyBjb3VudF0gPT0g
MSkgeworICAgICAgICByZXR1cm4gW1tzZWxlY3RlZEl0ZW1zIG9iamVjdEF0SW5kZXg6MF0gZHJh
Z0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6Y29udHJvbFBvaW50SW5kZXhdOworICAg
IH0gZWxzZSBpZiAoW3NlbGVjdGVkSXRlbXMgY291bnRdID4gMSkgeworICAgICAgICBOU0FycmF5
ICpjb250cm9sUG9pbnRzID0gW0RyYXdDYW52YXNJdGVtIGNvbnRyb2xQb2ludHNGb3JSZWN0Oltz
ZWxmIHNlbGVjdGlvbkNhbnZhc0JvdW5kaW5nQm94XV07CisgICAgICAgIHJldHVybiBbRHJhd0Nh
bnZhc0l0ZW0gZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6Y29udHJvbFBvaW50
SW5kZXggZnJvbVJlY3RDb250cm9sUG9pbnRzOmNvbnRyb2xQb2ludHNdOworICAgIH0KKyAgICBO
U0xvZyhAIkVycm9yLCBubyBzZWxlY3Rpb24sIHlvdSBzaG91bGRuJ3QgYXNrIGZvciBkcmFnIGFu
Y2hvciBwb2ludCEiKTsKKyAgICByZXR1cm4gTlNaZXJvUG9pbnQ7Cit9CisKKy0gKGludCljb250
cm9sUG9pbnRJbmRleEZvckNhbnZhc0hpdFBvaW50OihOU1BvaW50KWNhbnZhc1BvaW50Cit7Cisg
ICAgTlNWYWx1ZSAqY29udHJvbFBvaW50VmFsdWUgPSBuaWw7CisgICAgTlNBcnJheSAqY29udHJv
bFBvaW50cyA9IFtzZWxmIGNhbnZhc0NvbnRyb2xQb2ludHNGb3JTZWxlY3Rpb25dOworICAgIAor
ICAgIE5TU2l6ZSBjYW52YXNLbm9iU2l6ZSA9IFtzZWxmIG1hcFZpZXdTaXplVG9DYW52YXM6TlNN
YWtlU2l6ZShLTk9CX1NJWkUsIEtOT0JfU0laRSldOworICAgIAorICAgIE5TUmVjdCBjb250cm9s
UmVjdCA9IE5TWmVyb1JlY3Q7CisgICAgY29udHJvbFJlY3Quc2l6ZSA9IGNhbnZhc0tub2JTaXpl
OworICAgIE5TU2l6ZSBoYWxmQ2FudmFzS25vYlNpemUgPSBOU01ha2VTaXplKGNhbnZhc0tub2JT
aXplLndpZHRoLzIuZiwgY2FudmFzS25vYlNpemUuaGVpZ2h0LzIuZik7CisgICAgaW50IGluZGV4
ID0gMDsKKyAgICAKKyAgICBmb3JlYWNoYXJyYXkgKGNvbnRyb2xQb2ludFZhbHVlLCBjb250cm9s
UG9pbnRzKSB7CisgICAgICAgIE5TUG9pbnQgY29udHJvbFBvaW50ID0gW2NvbnRyb2xQb2ludFZh
bHVlIHBvaW50VmFsdWVdOworICAgICAgICBjb250cm9sUmVjdC5vcmlnaW4ueCA9IGNvbnRyb2xQ
b2ludC54IC0gaGFsZkNhbnZhc0tub2JTaXplLndpZHRoOworICAgICAgICBjb250cm9sUmVjdC5v
cmlnaW4ueSA9IGNvbnRyb2xQb2ludC55IC0gaGFsZkNhbnZhc0tub2JTaXplLmhlaWdodDsKKyAg
ICAgICAgCisgICAgICAgIGlmIChOU1BvaW50SW5SZWN0KGNhbnZhc1BvaW50LCBjb250cm9sUmVj
dCkpCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIGluZGV4Kys7CisgICAgfQor
ICAgIHJldHVybiBOU05vdEZvdW5kOworfQorCistIChCT09MKWNyZWF0ZUNhbnZhc0l0ZW1BdFBv
aW50OihOU1BvaW50KW1vdXNlUG9pbnQKK3sKKyAgICAvLyBmaXJzdCBtYXAgdG8gY2FudmFzIGNv
b3Jkcy4KKyAgICBtb3VzZVBvaW50ID0gW3NlbGYgbWFwVmlld1BvaW50VG9DYW52YXM6bW91c2VQ
b2ludF07CisgICAgCisgICAgRHJhd0NhbnZhc0l0ZW0gKm5ld0l0ZW0gPSBbW19wcml2YXRlIGRv
Y3VtZW50XSBjcmVhdGVJdGVtRm9yVG9vbDpfdG9vbE1vZGUgYXRQb2ludDptb3VzZVBvaW50XTsK
KyAgICBpZiAobmV3SXRlbSkgeworICAgICAgICBbc2VsZiBzZXRTZWxlY3RlZENhbnZhc0l0ZW1z
OltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpuZXdJdGVtXV07CisgICAgICAgIHJldHVybiBZRVM7
CisgICAgfQorICAgIHJldHVybiBOTzsKK30KKworLSAoSUJBY3Rpb24pZGVsZXRlU2VsZWN0aW9u
OihpZClzZW5kZXIKK3sKKyAgICBOU0FycmF5ICpvbGRJdGVtcyA9IFtbc2VsZiBzZWxlY3RlZENh
bnZhc0l0ZW1zXSByZXRhaW5dOworICAgIFtzZWxmIHNldFNlbGVjdGVkQ2FudmFzSXRlbXM6bmls
XTsKKyAgICBEcmF3Q2FudmFzSXRlbSAqb2xkSXRlbSA9IG5pbDsKKyAgICBmb3JlYWNoYXJyYXko
b2xkSXRlbSwgb2xkSXRlbXMpIHsKKyAgICAgICAgW1tfcHJpdmF0ZSBkb2N1bWVudF0gcmVtb3Zl
SXRlbUZyb21ET006b2xkSXRlbV07CisgICAgfQorICAgIFtvbGRJdGVtcyByZWxlYXNlXTsKK30K
KworLSAoaW50KXRvb2xNb2RlCit7CisgICAgcmV0dXJuIF90b29sTW9kZTsKK30KKworLSAodm9p
ZClzZXRUb29sTW9kZTooaW50KW5ld1Rvb2xNb2RlCit7CisgICAgX3Rvb2xNb2RlID0gKERyYXdW
aWV3VG9vbCluZXdUb29sTW9kZTsKKyAgICAvL1tbc2VsZiB3aW5kb3ddIGludmFsaWRhdGVDdXJz
b3JSZWN0c0ZvclZpZXc6c2VsZl07CisgICAgLy8gTm90IGdldHRpbmcgY2FsbGVkIHVudGlsIHRo
ZSB2aWV3IGJlY29tZXMga2V5Li4uCisgICAgW1tzZWxmIHdpbmRvd10gcmVzZXRDdXJzb3JSZWN0
c107IC8vIEhBQ0s/CisgICAgaWYgKFtzZWxmIG1vdXNlOltOU0V2ZW50IG1vdXNlTG9jYXRpb25d
IGluUmVjdDpbc2VsZiBib3VuZHNdXSkKKyAgICAgICAgW3NlbGYgZW5hYmxlTW91c2VNb3ZlZEV2
ZW50c0lmTmVlZGVkXTsKK30KKworLSAodm9pZClyZXNldEN1cnNvclJlY3RzCit7CisgICAgW3N1
cGVyIHJlc2V0Q3Vyc29yUmVjdHNdOworICAgIAorICAgIE5TQ3Vyc29yICp0b29sQ3Vyc29yID0g
bmlsOworICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2FzZSBEcmF3Vmlld1Rvb2xQYW46Cisg
ICAgICAgICAgICB0b29sQ3Vyc29yID0gW05TQ3Vyc29yIG9wZW5IYW5kQ3Vyc29yXTsKKyAgICAg
ICAgICAgIGJyZWFrOworCWNhc2UgRHJhd1ZpZXdUb29sWm9vbToKKyAgICAgICAgICAgIHRvb2xD
dXJzb3IgPSBbTlNDdXJzb3IgY2xvc2VkSGFuZEN1cnNvcl07IC8vIGZvciBub3cuLi4KKyAgICAg
ICAgICAgIGJyZWFrOworCWNhc2UgRHJhd1ZpZXdUb29sTGluZToKKwljYXNlIERyYXdWaWV3VG9v
bEVsaXBzZToKKwljYXNlIERyYXdWaWV3VG9vbFJlY3RhbmdsZToKKwljYXNlIERyYXdWaWV3VG9v
bFBvbHlMaW5lOgorCWNhc2UgRHJhd1ZpZXdUb29sQXJjOgorICAgICAgICAgICAgdG9vbEN1cnNv
ciA9IFtOU0N1cnNvciBjcm9zc2hhaXJDdXJzb3JdOworICAgICAgICAgICAgYnJlYWs7CisJZGVm
YXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodG9vbEN1cnNvcikKKyAg
ICAgICAgW3NlbGYgYWRkQ3Vyc29yUmVjdDpbc2VsZiBmcmFtZV0gY3Vyc29yOnRvb2xDdXJzb3Jd
OworfQorCistICh2b2lkKWRyYXdLbm9ic0ZvclJlY3Q6KE5TUmVjdClyZWN0Cit7CisgICAgW1tO
U0NvbG9yIGJsYWNrQ29sb3JdIHNldF07CisgICAgW05TQmV6aWVyUGF0aCBmaWxsUmVjdDpOU01h
a2VSZWN0KHJlY3Qub3JpZ2luLnggLSBLTk9CX0hBTEZfU0laRSwgcmVjdC5vcmlnaW4ueSAtIEtO
T0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUsIEtOT0JfU0laRSldOworICAgIFtOU0JlemllclBhdGgg
ZmlsbFJlY3Q6TlNNYWtlUmVjdChOU01heFgocmVjdCkgLSBLTk9CX0hBTEZfU0laRSwgcmVjdC5v
cmlnaW4ueSAtIEtOT0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUsIEtOT0JfU0laRSldOworICAgIFtO
U0JlemllclBhdGggZmlsbFJlY3Q6TlNNYWtlUmVjdChyZWN0Lm9yaWdpbi54IC0gS05PQl9IQUxG
X1NJWkUsIE5TTWF4WShyZWN0KSAtIEtOT0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUsIEtOT0JfU0la
RSldOworICAgIFtOU0JlemllclBhdGggZmlsbFJlY3Q6TlNNYWtlUmVjdChOU01heFgocmVjdCkg
LSBLTk9CX0hBTEZfU0laRSwgTlNNYXhZKHJlY3QpIC0gS05PQl9IQUxGX1NJWkUsIEtOT0JfU0la
RSwgS05PQl9TSVpFKV07Cit9CisKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBFdmVu
dCBzdXBwb3J0CisKKy0gKHZvaWQpbW91c2VEb3duOihOU0V2ZW50ICopdGhlRXZlbnQKK3sKKyAg
ICBOU1BvaW50IG1vdXNlUG9pbnQgPSBbc2VsZiBjb252ZXJ0UG9pbnQ6W3RoZUV2ZW50IGxvY2F0
aW9uSW5XaW5kb3ddIGZyb21WaWV3Om5pbF07CisgICAgTlNQb2ludCBjYW52YXNQb2ludCA9IFtz
ZWxmIG1hcFZpZXdQb2ludFRvQ2FudmFzOm1vdXNlUG9pbnRdOworICAgIF9wcml2YXRlLT5kcmFn
U3RhcnRQb2ludCA9IG1vdXNlUG9pbnQ7CisgICAgX3ByaXZhdGUtPmxhc3REcmFnUG9pbnQgPSBt
b3VzZVBvaW50OworICAgIAorICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2FzZSBEcmF3Vmll
d1Rvb2xCcm93c2U6CisJeworICAgICAgICAgICAgLy8gc2VuZCBtb3VzZSBkb3duIGV2ZW50cyB0
byBET00KKyAgICAgICAgICAgIGlmICghW1tfcHJpdmF0ZSBkb2N1bWVudF0gZG9jdW1lbnRMaXN0
ZW5zRm9yTW91c2VEb3duRXZlbnRzXSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICBbW19wcml2YXRlIGRvY3VtZW50XSBwcm9wYWdhdGVNb3VzZURvd25FdmVudDp0aGVFdmVu
dCBmcm9tVmlldzpzZWxmXTsKKyAgICAgICAgICAgIGJyZWFrOworCX0KKwljYXNlIERyYXdWaWV3
VG9vbEFycm93OgorCXsKKyAgICAgICAgICAgIGlmICggKF9wcml2YXRlLT5kcmFnQ29udHJvbFBv
aW50SW5kZXggPSBbc2VsZiBjb250cm9sUG9pbnRJbmRleEZvckNhbnZhc0hpdFBvaW50OmNhbnZh
c1BvaW50XSkgIT0gTlNOb3RGb3VuZCkgeworICAgICAgICAgICAgICAgIF9wcml2YXRlLT5jYW52
YXNEcmFnQW5jaG9yUG9pbnQgPSBbc2VsZiBjYW52YXNEcmFnQW5jaG9yUG9pbnRGb3JDb250cm9s
UG9pbnRJbmRleDpfcHJpdmF0ZS0+ZHJhZ0NvbnRyb2xQb2ludEluZGV4XTsKKyAgICAgICAgICAg
ICAgICBOU0xvZyhAInJlc2l6ZSAtLSBkcmFnU3RhcnRQb2ludDogJUAgY2FudmFzUG9pbnQ6ICVA
IGNvbnRyb2xJbmRleDogJWkgY2FudmFzRHJhZ0FuY2hvclBvaW50OiAlQCIsCisgICAgICAgICAg
ICAgICAgICAgICAgTlNTdHJpbmdGcm9tUG9pbnQobW91c2VQb2ludCksIE5TU3RyaW5nRnJvbVBv
aW50KGNhbnZhc1BvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICBfcHJpdmF0ZS0+ZHJhZ0Nv
bnRyb2xQb2ludEluZGV4LCBOU1N0cmluZ0Zyb21Qb2ludChfcHJpdmF0ZS0+Y2FudmFzRHJhZ0Fu
Y2hvclBvaW50KSk7CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmN1cnJlbnREcmFnQWN0aW9u
ID0gRHJhZ0FjdGlvblJlc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgLy8gRklYTUU6IHdlIHJlYWxseSBzaG91bGQgc2VsZWN0IFNWR0VsZW1lbnRzLCBub3QgY2Fu
dmFzIGl0ZW1zLi4uCisgICAgICAgICAgICAgICAgRHJhd0NhbnZhc0l0ZW0gKmhpdEl0ZW0gPSBb
W19wcml2YXRlIGRvY3VtZW50XSBjYW52YXNJdGVtQXRQb2ludDpjYW52YXNQb2ludF07CQkJCisg
ICAgICAgICAgICAgICAgLy9OU0xvZyhAIm1vdmUgLS0gZHJhZ1N0YXJ0UG9pbnQ6ICVAIGNhbnZh
c1BvaW50OiAlQCIsIE5TU3RyaW5nRnJvbVBvaW50KG1vdXNlUG9pbnQpLCBOU1N0cmluZ0Zyb21Q
b2ludChjYW52YXNQb2ludCkpOworICAgICAgICAgICAgICAgIGlmIChoaXRJdGVtKSB7CisgICAg
ICAgICAgICAgICAgICAgIE5TQXJyYXkgKmhpdEl0ZW1zID0gW05TQXJyYXkgYXJyYXlXaXRoT2Jq
ZWN0OmhpdEl0ZW1dOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXRTZWxlY3RlZENhbnZh
c0l0ZW1zOmhpdEl0ZW1zXTsKKyAgICAgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmN1cnJlbnRE
cmFnQWN0aW9uID0gRHJhZ0FjdGlvbk1vdmU7CisgICAgICAgICAgICAgICAgICAgIE5TUG9pbnQg
aGl0T3JpZ2luID0gW2hpdEl0ZW0gYm91bmRpbmdCb3hdLm9yaWdpbjsKKyAgICAgICAgICAgICAg
ICAgICAgX3ByaXZhdGUtPmNhbnZhc0RyYWdPcmlnaW5PZmZzZXQgPSBOU0RpZmZlcmVuY2VQb2lu
dChoaXRPcmlnaW4sIGNhbnZhc1BvaW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICBbc2VsZiBzZXRTZWxlY3RlZENhbnZhc0l0ZW1zOm5pbF07CisgICAg
ICAgICAgICAgICAgICAgIF9wcml2YXRlLT5jdXJyZW50RHJhZ0FjdGlvbiA9IERyYWdBY3Rpb25T
ZWxlY3Rpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAg
YnJlYWs7CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sUGFuOgorICAgICAgICAgICAgW1tOU0N1cnNv
ciBjbG9zZWRIYW5kQ3Vyc29yXSBwdXNoXTsKKyAgICAgICAgICAgIF9wcml2YXRlLT5jdXJyZW50
RHJhZ0FjdGlvbiA9IERyYWdBY3Rpb25QYW47CisgICAgICAgICAgICAvL05TTG9nKEAibW91c2VE
b3duOiAlQCIsIE5TU3RyaW5nRnJvbVBvaW50KF9wcml2YXRlLT5sYXN0RHJhZ1BvaW50KSk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNyZWF0aW9uIHRvb2xzOgorCWNhc2Ug
RHJhd1ZpZXdUb29sTGluZToKKwljYXNlIERyYXdWaWV3VG9vbEVsaXBzZToKKwljYXNlIERyYXdW
aWV3VG9vbFRyaWFuZ2xlOgorCWNhc2UgRHJhd1ZpZXdUb29sUmVjdGFuZ2xlOgorCWNhc2UgRHJh
d1ZpZXdUb29sUG9seUxpbmU6CisJY2FzZSBEcmF3Vmlld1Rvb2xBcmM6CisJeworICAgICAgICAg
ICAgaWYgKFtzZWxmIGNyZWF0ZUNhbnZhc0l0ZW1BdFBvaW50Om1vdXNlUG9pbnRdKSB7CisgICAg
ICAgICAgICAgICAgX3ByaXZhdGUtPmN1cnJlbnREcmFnQWN0aW9uID0gRHJhZ0FjdGlvblJlc2l6
ZTsKKyAgICAgICAgICAgICAgICBfcHJpdmF0ZS0+Y2FudmFzRHJhZ0FuY2hvclBvaW50ID0gY2Fu
dmFzUG9pbnQ7CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmRyYWdDb250cm9sUG9pbnRJbmRl
eCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwl9CisJZGVmYXVsdDoK
KyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLSAodm9pZCltb3VzZURyYWdnZWQ6KE5T
RXZlbnQgKil0aGVFdmVudAoreworICAgIE5TUG9pbnQgbW91c2VQb2ludCA9IFtzZWxmIGNvbnZl
cnRQb2ludDpbdGhlRXZlbnQgbG9jYXRpb25JbldpbmRvd10gZnJvbVZpZXc6bmlsXTsKKyAgICAK
KyAgICBzd2l0Y2ggKF90b29sTW9kZSkgeworCWNhc2UgRHJhd1ZpZXdUb29sQnJvd3NlOgorCXsK
KyAgICAgICAgICAgIC8vIHNlbmQgbW91c2UgZHJhZ2dlZCBldmVudHMgdG8gRE9NLgorICAgICAg
ICAgICAgYnJlYWs7CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sQXJyb3c6CisJeworICAgICAgICAg
ICAgLy8gbW92ZSBzaGFwZXMgaGVyZS4KKyAgICAgICAgICAgIGlmIChfcHJpdmF0ZS0+Y3VycmVu
dERyYWdBY3Rpb24gPT0gRHJhZ0FjdGlvbk1vdmUpIHsKKyAgICAgICAgICAgICAgICBOU1NpemUg
ZHJhZ09mZnNldCA9IE5TTWFrZVNpemUobW91c2VQb2ludC54IC0gX3ByaXZhdGUtPmxhc3REcmFn
UG9pbnQueCwgbW91c2VQb2ludC55IC0gX3ByaXZhdGUtPmxhc3REcmFnUG9pbnQueSk7CisgICAg
ICAgICAgICAgICAgTlNTaXplIGNhbnZhc0RyYWdPZmZzZXQgPSBbc2VsZiBtYXBWaWV3U2l6ZVRv
Q2FudmFzOmRyYWdPZmZzZXRdOworICAgICAgICAgICAgICAgIE5TTG9nKEAibW92ZTogdHJhbnNs
YXRpbmcgc2VsZWN0aW9uIGJ5OiAlQCIsIE5TU3RyaW5nRnJvbVNpemUoY2FudmFzRHJhZ09mZnNl
dCkpOworICAgICAgICAgICAgICAgIERyYXdDYW52YXNJdGVtICppdGVtID0gbmlsOworICAgICAg
ICAgICAgICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2VsZiBzZWxlY3RlZENhbnZhc0l0
ZW1zXTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoYXJyYXkoaXRlbSwgc2VsZWN0ZWRJdGVtcykg
eworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXlJblJlY3Q6W3NlbGYg
Ym91bmRzRm9yQ2FudmFzSXRlbTppdGVtXV07CisgICAgICAgICAgICAgICAgICAgIFtpdGVtIHRy
YW5zbGF0ZUJ5T2Zmc2V0OmNhbnZhc0RyYWdPZmZzZXRdOworICAgICAgICAgICAgICAgICAgICBb
c2VsZiBzZXROZWVkc0Rpc3BsYXlJblJlY3Q6W3NlbGYgYm91bmRzRm9yQ2FudmFzSXRlbTppdGVt
XV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChfcHJpdmF0ZS0+
Y3VycmVudERyYWdBY3Rpb24gPT0gRHJhZ0FjdGlvblNlbGVjdGlvbikgeworICAgICAgICAgICAg
ICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheUluUmVjdDpfcHJpdmF0ZS0+c2VsZWN0aW9uUmVjdF07
CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPnNlbGVjdGlvblJlY3QgPSBOU01ha2VSZWN0KF9w
cml2YXRlLT5kcmFnU3RhcnRQb2ludC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBfcHJpdmF0ZS0+ZHJhZ1N0YXJ0UG9pbnQueSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VQb2lu
dC54IC0gX3ByaXZhdGUtPmRyYWdTdGFydFBvaW50LngsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlUG9pbnQueSAtIF9wcml2YXRlLT5k
cmFnU3RhcnRQb2ludC55KTsKKyAgICAgICAgICAgICAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXlJ
blJlY3Q6X3ByaXZhdGUtPnNlbGVjdGlvblJlY3RdOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgLy8gZmFsbCB0aHJvdWdoIGZvciByZXNpemUgY29kZS4KKwl9CisJY2FzZSBEcmF3Vmlld1Rv
b2xMaW5lOgorCWNhc2UgRHJhd1ZpZXdUb29sRWxpcHNlOgorCWNhc2UgRHJhd1ZpZXdUb29sVHJp
YW5nbGU6CisJY2FzZSBEcmF3Vmlld1Rvb2xSZWN0YW5nbGU6CisJY2FzZSBEcmF3Vmlld1Rvb2xQ
b2x5TGluZToKKwljYXNlIERyYXdWaWV3VG9vbEFyYzoKKwl7CisgICAgICAgICAgICBpZiAoX3By
aXZhdGUtPmN1cnJlbnREcmFnQWN0aW9uID09IERyYWdBY3Rpb25SZXNpemUpIHsKKyAgICAgICAg
ICAgICAgICBOU1BvaW50IGNhbnZhc1BvaW50ID0gW3NlbGYgbWFwVmlld1BvaW50VG9DYW52YXM6
bW91c2VQb2ludF07CisgICAgICAgICAgICAgICAgRHJhd0NhbnZhc0l0ZW0gKml0ZW0gPSBuaWw7
CisgICAgICAgICAgICAgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtcyA9IFtzZWxmIHNlbGVjdGVk
Q2FudmFzSXRlbXNdOworICAgICAgICAgICAgICAgIGZvcmVhY2hhcnJheShpdGVtLCBzZWxlY3Rl
ZEl0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheUluUmVj
dDpbc2VsZiBib3VuZHNGb3JDYW52YXNJdGVtOml0ZW1dXTsKKyAgICAgICAgICAgICAgICAgICAg
W2l0ZW0gcmVzaXplV2l0aFBvaW50OmNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBvaW50Ol9wcml2
YXRlLT5kcmFnQ29udHJvbFBvaW50SW5kZXggZHJhZ0FuY2hvclBvaW50Ol9wcml2YXRlLT5jYW52
YXNEcmFnQW5jaG9yUG9pbnRdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXROZWVkc0Rp
c3BsYXlJblJlY3Q6W3NlbGYgYm91bmRzRm9yQ2FudmFzSXRlbTppdGVtXV07CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJfQorICAgICAgICAg
ICAgCisJY2FzZSBEcmF3Vmlld1Rvb2xQYW46CisJeworICAgICAgICAgICAgTlNQb2ludCBkaWZm
ID0gTlNEaWZmZXJlbmNlUG9pbnQobW91c2VQb2ludCwgX3ByaXZhdGUtPmxhc3REcmFnUG9pbnQp
OworICAgICAgICAgICAgTlNQb2ludCBjYW52YXNPcmlnaW4gPSBbc2VsZiBjYW52YXNWaXNpYmxl
T3JpZ2luXTsKKyAgICAgICAgICAgIE5TUG9pbnQgbmV3T3JpZ2luID0gTlNEaWZmZXJlbmNlUG9p
bnQoY2FudmFzT3JpZ2luLCBkaWZmKTsKKyAgICAgICAgICAgIFtzZWxmIHNldENhbnZhc1Zpc2li
bGVPcmlnaW46bmV3T3JpZ2luXTsKKyAgICAgICAgICAgIC8vCQlOU0xvZyhAIm1vdXNlRHJhZ2dl
ZDogJUAgIGRpZmY6ICVAIG9sZCBvcmlnaW46ICVAIG5ld09yaWdpbjogJUAiLAorICAgICAgICAg
ICAgLy8JCQlOU1N0cmluZ0Zyb21Qb2ludChfcHJpdmF0ZS0+bGFzdERyYWdQb2ludCksIAorICAg
ICAgICAgICAgLy8JCQlOU1N0cmluZ0Zyb21Qb2ludChkaWZmKSwgTlNTdHJpbmdGcm9tUG9pbnQo
Y2FudmFzT3JpZ2luKSwgTlNTdHJpbmdGcm9tUG9pbnQobmV3T3JpZ2luKSk7CisgICAgICAgICAg
ICBicmVhazsKKwl9CisgICAgICAgICAgICAKKwlkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7
CisgICAgfQorICAgIAorICAgIC8vIHJlY29yZCB0aGUgbGFzdCBkcmFnIHBvaW50LgorICAgIF9w
cml2YXRlLT5sYXN0RHJhZ1BvaW50ID0gbW91c2VQb2ludDsKK30KKworCistICh2b2lkKW1vdXNl
VXA6KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIC8vTlNQb2ludCBtb3VzZVBvaW50ID0gW3Nl
bGYgY29udmVydFBvaW50Olt0aGVFdmVudCBsb2NhdGlvbkluV2luZG93XSBmcm9tVmlldzpuaWxd
OworICAgIAorICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2FzZSBEcmF3Vmlld1Rvb2xCcm93
c2U6CisJeworICAgICAgICAgICAgaWYgKCFbW19wcml2YXRlIGRvY3VtZW50XSBkb2N1bWVudExp
c3RlbnNGb3JNb3VzZVVwRXZlbnRzXSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAg
ICAgICBbW19wcml2YXRlIGRvY3VtZW50XSBwcm9wYWdhdGVNb3VzZVVwRXZlbnQ6dGhlRXZlbnQg
ZnJvbVZpZXc6c2VsZl07CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sUGFuOgorICAgICAgICAgICAg
W05TQ3Vyc29yIHBvcF07CisgICAgICAgICAgICBicmVhazsKKwljYXNlIERyYXdWaWV3VG9vbEFy
cm93OgorICAgICAgICAgICAgaWYgKF9wcml2YXRlLT5jdXJyZW50RHJhZ0FjdGlvbiA9PSBEcmFn
QWN0aW9uU2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0Ol9wcml2YXRlLT5zZWxlY3Rpb25SZWN0XTsKKyAgICAgICAgICAgICAgICAvLyBmaWd1
cmUgb3V0IHdoYXQgYWxsIHdhcyBpbiB0aGF0IHJlY3QuLi4KKyAgICAgICAgICAgICAgICBfcHJp
dmF0ZS0+c2VsZWN0aW9uUmVjdCA9IE5TWmVyb1JlY3Q7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIF9w
cml2YXRlLT5jdXJyZW50RHJhZ0FjdGlvbiA9IERyYWdBY3Rpb25Ob25lOworfQorCistICh2b2lk
KWRpc2FibGVNb3VzZU1vdmVkRXZlbnRzCit7CisgICAgaWYgKFtbc2VsZiB3aW5kb3ddIGFjY2Vw
dHNNb3VzZU1vdmVkRXZlbnRzXSkKKyAgICAgICAgTlNMb2coQCJNb3VzZSBtb3ZlIGV2ZW50cyBu
b3cgT0ZGIik7CisgICAgW1tzZWxmIHdpbmRvd10gc2V0QWNjZXB0c01vdXNlTW92ZWRFdmVudHM6
Tk9dOworfQorCistICh2b2lkKWVuYWJsZU1vdXNlTW92ZWRFdmVudHNJZk5lZWRlZAoreworICAg
IC8vIEZJWE1FOiAgVGhpcyBjb3VsZCBzdGlsbCBiZSBtb3JlIGVmZmljaWVudAorICAgIEJPT0wg
bmVlZHNNb3VzZU1vdmVkID0gKF90b29sTW9kZSA9PSBEcmF3Vmlld1Rvb2xCcm93c2UpCisgICAg
JiYgW1tfcHJpdmF0ZSBkb2N1bWVudF0gZG9jdW1lbnRMaXN0ZW5zRm9yTW91c2VNb3ZlZEV2ZW50
c107CisgICAgaWYgKG5lZWRzTW91c2VNb3ZlZCAhPSBbW3NlbGYgd2luZG93XSBhY2NlcHRzTW91
c2VNb3ZlZEV2ZW50c10pCisgICAgICAgIE5TTG9nKEAiTW91c2UgbW92ZSBldmVudHMgbm93ICVA
IiwgbmVlZHNNb3VzZU1vdmVkID8gQCJPTiIgOiBAIk9GRiIpOworICAgIGlmIChuZWVkc01vdXNl
TW92ZWQpIHsKKyAgICAgICAgW1tzZWxmIHdpbmRvd10gc2V0QWNjZXB0c01vdXNlTW92ZWRFdmVu
dHM6bmVlZHNNb3VzZU1vdmVkXTsKKyAgICB9Cit9CisKKy0gKHZvaWQpbW91c2VFbnRlcmVkOihO
U0V2ZW50ICopdGhlRXZlbnQKK3sKKyAgICBbc2VsZiBlbmFibGVNb3VzZU1vdmVkRXZlbnRzSWZO
ZWVkZWRdOworfQorCistICh2b2lkKW1vdXNlRXhpdGVkOihOU0V2ZW50ICopdGhlRXZlbnQKK3sK
KyAgICBbc2VsZiBkaXNhYmxlTW91c2VNb3ZlZEV2ZW50c107Cit9CisKKy0gKHZvaWQpbW91c2VN
b3ZlZDooTlNFdmVudCAqKXRoZUV2ZW50Cit7CisgICAgLy9OU1BvaW50IG1vdXNlUG9pbnQgPSBb
c2VsZiBjb252ZXJ0UG9pbnQ6W3RoZUV2ZW50IGxvY2F0aW9uSW5XaW5kb3ddIGZyb21WaWV3Om5p
bF07CisgICAgCisgICAgc3dpdGNoIChfdG9vbE1vZGUpIHsKKwljYXNlIERyYXdWaWV3VG9vbEJy
b3dzZToKKwl7CisgICAgICAgICAgICBpZiAoIVtbX3ByaXZhdGUgZG9jdW1lbnRdIGRvY3VtZW50
TGlzdGVuc0Zvck1vdXNlTW92ZWRFdmVudHNdKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgTlNDdXJzb3IgKmN1cnNvciA9IFtbX3ByaXZhdGUgZG9j
dW1lbnRdIGN1cnNvckFmdGVyUHJvcGFnYXRpbmdNb3VzZU1vdmVkRXZlbnQ6dGhlRXZlbnQgZnJv
bVZpZXc6c2VsZl07CisgICAgICAgICAgICBpZiAoY3Vyc29yICYmIChjdXJzb3IgIT0gW05TQ3Vy
c29yIGN1cnJlbnRDdXJzb3JdKSkgTlNMb2coQCJDaGFuZ2luZyBjdXJzb3I6ICVAIG5hbWU6ICVA
IiwgY3Vyc29yLCBbW2N1cnNvciBpbWFnZV0gbmFtZV0pOworICAgICAgICAgICAgW2N1cnNvciBz
ZXRdOworCX0KKwlkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCistICh2
b2lkKWtleURvd246KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIGlmIChfdG9vbE1vZGUgPT0g
RHJhd1ZpZXdUb29sQXJyb3cpIHsKKyAgICAgICAgdW5pY2hhciBrZXkgPSBbW3RoZUV2ZW50IGNo
YXJhY3RlcnNJZ25vcmluZ01vZGlmaWVyc10gY2hhcmFjdGVyQXRJbmRleDowXTsKKyAgICAgICAg
aW50IGZsYWdzID0gW3RoZUV2ZW50IG1vZGlmaWVyRmxhZ3NdICYgTlNEZXZpY2VJbmRlcGVuZGVu
dE1vZGlmaWVyRmxhZ3NNYXNrOworICAgICAgICBpZiAoKFt0aGVFdmVudCBrZXlDb2RlXSA9PSBO
U0RlbGV0ZUZ1bmN0aW9uS2V5KSB8fCAoKGtleSA9PSBOU0RlbGV0ZUNoYXJhY3RlcikgJiYgKGZs
YWdzID09IDApKSApIHsKKyAgICAgICAgICAgIFtzZWxmIGRlbGV0ZVNlbGVjdGlvbjpuaWxdOwor
ICAgICAgICB9CisgICAgfSBlbHNlIGlmIChfdG9vbE1vZGUgPT0gRHJhd1ZpZXdUb29sQnJvd3Nl
KSB7CisgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUga2V5IGV2ZW50IHVwIHRocm91Z2ggdGhlIERP
TQorICAgIH0KK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBab29tL1BhbiBzdXBw
b3J0CisKKy0gKElCQWN0aW9uKXpvb21Ub0ZpdDooaWQpc2VuZGVyCit7CisgICAgTlNTaXplIGNh
bnZhc1NpemUgPSBbW19wcml2YXRlIGRvY3VtZW50XSBjYW52YXNTaXplXTsKKyAgICBmbG9hdCB3
aWR0aFNjYWxlID0gY2FudmFzU2l6ZS53aWR0aCAvIFtzZWxmIGJvdW5kc10uc2l6ZS53aWR0aDsK
KyAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IGNhbnZhc1NpemUuaGVpZ2h0IC8gW3NlbGYgYm91bmRz
XS5zaXplLmhlaWdodDsKKyAgICAKKyAgICBmbG9hdCBtaW5TY2FsZSA9IE1BWCh3aWR0aFNjYWxl
LCBoZWlnaHRTY2FsZSk7CisgICAgW3NlbGYgc2V0Q2FudmFzWm9vbTptaW5TY2FsZV07Cit9CisK
Ky0gKHZvaWQpdXBkYXRlQ2FudmFzU2NhbGUKK3sKKyAgICBpZiAoX3NjYWxlUnVsZSA9PSBOU1Nj
YWxlUHJvcG9ydGlvbmFsbHkpIHsKKyAgICAgICAgW3NlbGYgem9vbVRvRml0Om5pbF07CisgICAg
fSBlbHNlIGlmIChfc2NhbGVSdWxlID09IE5TU2NhbGVUb0ZpdCkgeworICAgICAgICAvLyBOb3Qg
eWV0IHN1cHBvcnRlZCEKKyAgICB9IGVsc2UgaWYgKF9zY2FsZVJ1bGUgPT0gTlNTY2FsZU5vbmUp
IHsKKyAgICAgICAgW3NlbGYgc2V0Q2FudmFzWm9vbToxLjBdOworICAgIH0KK30KKworLSAodm9p
ZClzaXplVG9GaXRDYW52YXMKK3sKKyAgICBOU1NpemUgY2FudmFzU2l6ZSA9IFtbX3ByaXZhdGUg
ZG9jdW1lbnRdIGNhbnZhc1NpemVdOworICAgIGlmICgoY2FudmFzU2l6ZS53aWR0aCA9PSAwKSB8
fCAoY2FudmFzU2l6ZS5oZWlnaHQgPT0gMCkpCisgICAgICAgIHJldHVybjsgLy8gYXZvaWQgZGlz
YXBwZWFyaW5nLgorICAgIFtzZWxmIHNldEZyYW1lU2l6ZTpjYW52YXNTaXplXTsKK30KKworLSAo
dm9pZClzaXplVG9GaXRWaWV3Qm94Cit7CisgICAgLy8gRklYTUU6IHRoaXMgaXMgYnJva2VuIQor
ICAgIFtzZWxmIHNpemVUb0ZpdENhbnZhc107Cit9CisKKy0gKElCQWN0aW9uKXpvb21JbjooaWQp
c2VuZGVyCit7CisgICAgTlNQb2ludCBjZW50ZXIgPSBbc2VsZiBjYW52YXNWaXNhYmxlQ2VudGVy
UG9pbnRdOworICAgIFtzZWxmIHNldENhbnZhc1pvb206KFtzZWxmIGNhbnZhc1pvb21dICogMC45
KV07CisgICAgW3NlbGYgcGFuVG9DYW52YXNDZW50ZXJQb2ludDpjZW50ZXJdOworfQorCistIChJ
QkFjdGlvbil6b29tT3V0OihpZClzZW5kZXIKK3sKKyAgICBOU1BvaW50IGNlbnRlciA9IFtzZWxm
IGNhbnZhc1Zpc2FibGVDZW50ZXJQb2ludF07CisgICAgW3NlbGYgc2V0Q2FudmFzWm9vbTooW3Nl
bGYgY2FudmFzWm9vbV0gKiAxLjEpXTsKKyAgICBbc2VsZiBwYW5Ub0NhbnZhc0NlbnRlclBvaW50
OmNlbnRlcl07Cit9CisKKy0gKElCQWN0aW9uKXpvb21PcmlnaW5hbDooaWQpc2VuZGVyCit7Cisg
ICAgLy8gZG8gdGhlc2UgbmVlZCB0byBjYWxsIGludG8gdGhlIGNhbnZhcyBvciBkb2N1bWVudCBp
bnN0ZWFkPworICAgIFtzZWxmIHNldENhbnZhc1pvb206MS4wXTsKKyAgICBbc2VsZiBzZXRDYW52
YXNWaXNpYmxlT3JpZ2luOk5TTWFrZVBvaW50KDAsMCldOworfQorCistIChDR0FmZmluZVRyYW5z
Zm9ybSl0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzCit7CisgICAgZmxvYXQgem9vbSA9IFtzZWxm
IGNhbnZhc1pvb21dOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9IENHQWZmaW5l
VHJhbnNmb3JtTWFrZVNjYWxlKHpvb20sIHpvb20pOworICAgIE5TUG9pbnQgb3JpZ2luID0gW3Nl
bGYgY2FudmFzVmlzaWJsZU9yaWdpbl07CisgICAgcmV0dXJuIENHQWZmaW5lVHJhbnNmb3JtVHJh
bnNsYXRlKHRyYW5zZm9ybSxvcmlnaW4ueCxvcmlnaW4ueSk7Cit9CisKKy0gKE5TUG9pbnQpbWFw
Vmlld1BvaW50VG9DYW52YXM6KE5TUG9pbnQpdmlld1BvaW50Cit7CisgICAgQ0dQb2ludCBjYW52
YXNQb2ludCA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybSgqKENHUG9pbnQgKikmdmlld1Bv
aW50LCBbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzXSk7CisgICAgcmV0dXJuICgqKE5T
UG9pbnQgKikmY2FudmFzUG9pbnQpOworfQorLSAoTlNSZWN0KW1hcFZpZXdSZWN0VG9DYW52YXM6
KE5TUmVjdCl2aWV3UmVjdAoreworICAgIENHUmVjdCBjYW52YXNSZWN0ID0gQ0dSZWN0QXBwbHlB
ZmZpbmVUcmFuc2Zvcm0oKihDR1JlY3QgKikmdmlld1JlY3QsIFtzZWxmIHRyYW5zZm9ybUZyb21W
aWV3VG9DYW52YXNdKTsKKyAgICByZXR1cm4gKCooTlNSZWN0ICopJmNhbnZhc1JlY3QpOworfQor
LSAoTlNTaXplKW1hcFZpZXdTaXplVG9DYW52YXM6KE5TU2l6ZSl2aWV3U2l6ZQoreworICAgIENH
U2l6ZSBjYW52YXNTaXplID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1NpemUgKikm
dmlld1NpemUsIFtzZWxmIHRyYW5zZm9ybUZyb21WaWV3VG9DYW52YXNdKTsKKyAgICByZXR1cm4g
KCooTlNTaXplICopJmNhbnZhc1NpemUpOworfQorCistIChOU1BvaW50KW1hcENhbnZhc1BvaW50
VG9WaWV3OihOU1BvaW50KWNhbnZhc1BvaW50Cit7CisgICAgQ0dQb2ludCB2aWV3UG9pbnQgPSBD
R1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1BvaW50ICopJmNhbnZhc1BvaW50LCBDR0Fm
ZmluZVRyYW5zZm9ybUludmVydChbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzXSkpOwor
ICAgIHJldHVybiAoKihOU1BvaW50ICopJnZpZXdQb2ludCk7Cit9CistIChOU1JlY3QpbWFwQ2Fu
dmFzUmVjdFRvVmlldzooTlNSZWN0KWNhbnZhc1JlY3QKK3sKKyAgICBDR1JlY3Qgdmlld1JlY3Qg
PSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybSgqKENHUmVjdCAqKSZjYW52YXNSZWN0LCBDR0Fm
ZmluZVRyYW5zZm9ybUludmVydChbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzXSkpOwor
ICAgIHJldHVybiAoKihOU1JlY3QgKikmdmlld1JlY3QpOworfQorLSAoTlNTaXplKW1hcENhbnZh
c1NpemVUb1ZpZXc6KE5TU2l6ZSljYW5hdnNTaXplCit7CisgICAgQ0dTaXplIHZpZXdTaXplID0g
Q0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1NpemUgKikmY2FuYXZzU2l6ZSwgQ0dBZmZp
bmVUcmFuc2Zvcm1JbnZlcnQoW3NlbGYgdHJhbnNmb3JtRnJvbVZpZXdUb0NhbnZhc10pKTsKKyAg
ICByZXR1cm4gKCooTlNTaXplICopJnZpZXdTaXplKTsKK30KKyNwcmFnbWEgbWFyayAtCisjcHJh
Z21hIG1hcmsgQ2FudmFzIFpvb20vUGFuIChIYWNrISkKKworLSAoTlNQb2ludCljYW52YXNWaXNp
YmxlT3JpZ2luCit7CisgICAgcmV0dXJuIF9wcml2YXRlLT5jYW52YXNWaXNhYmxlT3JpZ2luOwor
fQorCistICh2b2lkKXNldENhbnZhc1Zpc2libGVPcmlnaW46KE5TUG9pbnQpbmV3T3JpZ2luCit7
CisgICAgLy8gd2lsbCBldmVudHVhbGx5IG1vdmUgaW50byBOU1Njcm9sbFZpZXcgSSBmaWd1cmUu
CisgICAgX3ByaXZhdGUtPmNhbnZhc1Zpc2FibGVPcmlnaW4gPSBuZXdPcmlnaW47CisgICAgW3Nl
bGYgc2V0TmVlZHNEaXNwbGF5OllFU107Cit9CisKKy0gKE5TUG9pbnQpY2FudmFzVmlzYWJsZUNl
bnRlclBvaW50Cit7CisgICAgTlNQb2ludCBjZW50ZXJQb2ludCA9IFtzZWxmIGNhbnZhc1Zpc2li
bGVPcmlnaW5dOworICAgIE5TU2l6ZSBjYW52YXNWaXNpYmxlU2l6ZSA9IFtzZWxmIG1hcFZpZXdT
aXplVG9DYW52YXM6W3NlbGYgYm91bmRzXS5zaXplXTsKKyAgICBjZW50ZXJQb2ludC54ICs9IGNh
bnZhc1Zpc2libGVTaXplLndpZHRoLzIuZjsKKyAgICBjZW50ZXJQb2ludC55ICs9IGNhbnZhc1Zp
c2libGVTaXplLmhlaWdodC8yLmY7CisgICAgLy8JTlNQb2ludCBjdm8gPSBbc2VsZiBjYW52YXNW
aXNpYmxlT3JpZ2luXTsKKyAgICAvLwlOU0xvZyhAIlZpc2libGUgY2VudGVyOiAlQCAgdmlzaWJs
ZSBvcmlnaW46ICVAICB2aXNpYmxlIHNpemU6ICVAICBmYXJQb2ludDogJUAiLAorICAgIC8vCQlO
U1N0cmluZ0Zyb21Qb2ludChjZW50ZXJQb2ludCksIE5TU3RyaW5nRnJvbVBvaW50KGN2byksCisg
ICAgLy8JCU5TU3RyaW5nRnJvbVNpemUoY2FudmFzVmlzaWJsZVNpemUpLCBOU1N0cmluZ0Zyb21Q
b2ludChOU01ha2VQb2ludChjdm8ueCArIGNhbnZhc1Zpc2libGVTaXplLndpZHRoLCBjdm8ueSAr
IGNhbnZhc1Zpc2libGVTaXplLmhlaWdodCkpKTsKKyAgICByZXR1cm4gY2VudGVyUG9pbnQ7Cit9
CisKKy0gKHZvaWQpcGFuVG9DYW52YXNDZW50ZXJQb2ludDooTlNQb2ludCluZXdDZW50ZXIKK3sK
KyAgICBOU1BvaW50IG5ld1Zpc2libGVPcmlnaW4gPSBuZXdDZW50ZXI7CisgICAgTlNTaXplIGNh
bnZhc1Zpc2libGVTaXplID0gW3NlbGYgbWFwVmlld1NpemVUb0NhbnZhczpbc2VsZiBib3VuZHNd
LnNpemVdOworICAgIG5ld1Zpc2libGVPcmlnaW4ueCAtPSBjYW52YXNWaXNpYmxlU2l6ZS53aWR0
aC8yLmY7CisgICAgbmV3VmlzaWJsZU9yaWdpbi55IC09IGNhbnZhc1Zpc2libGVTaXplLmhlaWdo
dC8yLmY7CisgICAgLy8JTlNMb2coQCJzZXR0aW5nIG5ldyBvcmlnaW46ICVAICB2aXNpYmxlIHNp
emU6ICVAIiwgTlNTdHJpbmdGcm9tUG9pbnQobmV3VmlzaWJsZU9yaWdpbiksIE5TU3RyaW5nRnJv
bVNpemUoY2FudmFzVmlzaWJsZVNpemUpKTsKKyAgICBbc2VsZiBzZXRDYW52YXNWaXNpYmxlT3Jp
Z2luOm5ld1Zpc2libGVPcmlnaW5dOworfSAKKworLSAoZmxvYXQpY2FudmFzWm9vbQoreworICAg
IHJldHVybiBfcHJpdmF0ZS0+Y2FudmFzWm9vbTsKKyAgICAvL3JldHVybiBbc2VsZiBzY2FsZV0u
d2lkdGg7Cit9CisKKy0gKHZvaWQpc2V0Q2FudmFzWm9vbTooZmxvYXQpbmV3Wm9vbQoreworICAg
IGlmIChfcHJpdmF0ZS0+Y2FudmFzWm9vbSAhPSBuZXdab29tKSB7CisgICAgICAgIF9wcml2YXRl
LT5jYW52YXNab29tID0gbmV3Wm9vbTsKKyAgICAgICAgLy9bc2VsZiBzZXRTY2FsZTpOU01ha2VT
aXplKG5ld1pvb20sIG5ld1pvb20pXTsKKyAgICAgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5OllF
U107CisgICAgfQorfQorCitAZW5kCisKSW5kZXg6IERyYXdWaWV3UHJpdmF0ZS5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IERyYXdWaWV3UHJpdmF0ZS5oCmRpZmYgLU4gRHJhd1ZpZXdQcml2YXRlLmgK
LS0tIERyYXdWaWV3UHJpdmF0ZS5oCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIERyYXdW
aWV3UHJpdmF0ZS5oCTI4IEp1bCAyMDA1IDAwOjA3OjIwIC0wMDAwCkBAIC0wLDAgKzEsNjYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMgYXJlIHRlbXBv
cmFyeSBhbmQgZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93aW5nIGdyZWF0
ZXIgdGVzdGluZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRlZ3JhdGlvbi4K
KyBEbyBOT1QgZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3aWxsIHNvb24g
YmUgZ29uZS4KKyovCisKKyNpbmNsdWRlIDxXZWJDb3JlK1NWRy9EcmF3Vmlldy5oPgorCitleHRl
cm4gTlNBcnJheSAqRHJhd1ZpZXdEcmFnVHlwZXM7CisKK0BpbnRlcmZhY2UgRHJhd1ZpZXcgKFBy
aXZhdGVNZXRob2RzKQorCisrICh2b2lkKXNldEZpbHRlclN1cHBvcnRFbmFibGVkOihCT09MKWVu
YWJsZWQ7CisrIChCT09MKWlzRmlsdGVyU3VwcG9ydEVuYWJsZWQ7CisKKy0gKHZvaWQpc2V0QmFj
a2dyb3VuZENvbG9yOihOU0NvbG9yICopY29sb3I7CistIChOU0NvbG9yICopYmFja2dyb3VuZENv
bG9yOworCistIChOU0FycmF5ICopc2VsZWN0ZWRDYW52YXNJdGVtczsKKworLy8gWm9vbS9QYW4K
KworLSAoQ0dBZmZpbmVUcmFuc2Zvcm0pdHJhbnNmb3JtRnJvbVZpZXdUb0NhbnZhczsKKworLSAo
TlNQb2ludCltYXBWaWV3UG9pbnRUb0NhbnZhczooTlNQb2ludCl2aWV3UG9pbnQ7CistIChOU1Jl
Y3QpbWFwVmlld1JlY3RUb0NhbnZhczooTlNSZWN0KXZpZXdSZWN0OworLSAoTlNTaXplKW1hcFZp
ZXdTaXplVG9DYW52YXM6KE5TU2l6ZSl2aWV3U2l6ZTsKKy0gKE5TUG9pbnQpbWFwQ2FudmFzUG9p
bnRUb1ZpZXc6KE5TUG9pbnQpY2FudmFzUG9pbnQ7CistIChOU1JlY3QpbWFwQ2FudmFzUmVjdFRv
VmlldzooTlNSZWN0KWNhbnZhc1JlY3Q7CistIChOU1NpemUpbWFwQ2FudmFzU2l6ZVRvVmlldzoo
TlNTaXplKXZpZXdTaXplOworCistIChOU1BvaW50KWNhbnZhc1Zpc2libGVPcmlnaW47CistICh2
b2lkKXNldENhbnZhc1Zpc2libGVPcmlnaW46KE5TUG9pbnQpbmV3T3JpZ2luOworCistIChOU1Bv
aW50KWNhbnZhc1Zpc2FibGVDZW50ZXJQb2ludDsKKy0gKHZvaWQpcGFuVG9DYW52YXNDZW50ZXJQ
b2ludDooTlNQb2ludCluZXdDZW50ZXI7CisKKy0gKGZsb2F0KWNhbnZhc1pvb207CistICh2b2lk
KXNldENhbnZhc1pvb206KGZsb2F0KW5ld1pvb207CisKK0BlbmQKSW5kZXg6IE5TU1ZHSW1hZ2VS
ZXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBOU1NWR0ltYWdlUmVwLmgKZGlmZiAtTiBOU1NWR0lt
YWdlUmVwLmgKLS0tIE5TU1ZHSW1hZ2VSZXAuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisr
KyBOU1NWR0ltYWdlUmVwLmgJMjggSnVsIDIwMDUgMDA6MDc6MjAgLTAwMDAKQEAgLTAsMCArMSw1
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworLyoKKyBXQVJOSU5HOiBUaGVzZSBmaWxlcyBhcmUg
dGVtcG9yYXJ5IGFuZCBleGlzdCBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlCisgb2YgYWxsb3dpbmcg
Z3JlYXRlciB0ZXN0aW5nIG9mIFdlYkNvcmUrU1ZHIHByaW9yIHRvIGZ1bGwgRE9NIGludGVncmF0
aW9uLgorIERvIE5PVCBkZXBlbmQgb24gdGhlc2UgU1BJcyBvciBmaWxlcyBhcyB0aGV5IHdpbGwg
c29vbiBiZSBnb25lLgorKi8KKworLyoKKyBOT1RFOiBUaGlzIHNwZWNpZmljIGZpbGUgZXhpc3Rz
IGFzIGEgaGFjayB0byBhbGxvdyBXZWJLaXQgKGFuZCB0aGUgdGVzdCAKKyBhcHBzIHdoaWNoIGxp
bmsgYWdhaW5zdCBXZWJDb3JlK1NWRykgdG8gcGFzcyBhbiBTVkcgZmlsZSB0byBOU0ltYWdlIAor
IFtOU0ltYWdlIGltYWdlV2l0aENvbnRlbnRzT2ZGaWxlOl0KKyBhbmQgaGF2ZSBOU0ltYWdlIGJl
IGFibGUgdG8gaGFuZGxlIHRoZSBTVkcgY29ycmVjdGx5LgorKi8KKworI2ltcG9ydCA8Q29jb2Ev
Q29jb2EuaD4KKworQGNsYXNzIERyYXdEb2N1bWVudDsKK0BjbGFzcyBEcmF3VmlldzsKKworQGlu
dGVyZmFjZSBOU1NWR0ltYWdlUmVwIDogTlNJbWFnZVJlcCB7CisgICAgRHJhd0RvY3VtZW50ICpf
ZHJhd0RvY3VtZW50OworICAgIERyYXdWaWV3ICpfdmlldzsKKyAgICAKKyAgICBOU0JpdG1hcElt
YWdlUmVwICpfY2FjaGVkUmVwSGFjazsgLy8gRklYTUU6IFRlbXBvcmFyeSBIQUNLCit9CisKKysg
KGlkKWltYWdlUmVwV2l0aERhdGE6KE5TRGF0YSAqKXN2Z0RhdGE7CistIChpZClpbml0V2l0aERh
dGE6KE5TRGF0YSAqKXN2Z0RhdGE7CitAZW5kCkluZGV4OiBOU1NWR0ltYWdlUmVwLm0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQpSQ1MgZmlsZTogTlNTVkdJbWFnZVJlcC5tCmRpZmYgLU4gTlNTVkdJbWFnZVJlcC5tCi0t
LSBOU1NWR0ltYWdlUmVwLm0JMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgTlNTVkdJbWFn
ZVJlcC5tCTI4IEp1bCAyMDA1IDAwOjA3OjIwIC0wMDAwCkBAIC0wLDAgKzEsMTUxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW1wb3J0ICJOU1NWR0ltYWdlUmVwLmgiCisKKyNpbXBvcnQgPFdl
YkNvcmUrU1ZHL0RyYXdEb2N1bWVudFByaXZhdGUuaD4KKyNpbXBvcnQgPFdlYkNvcmUrU1ZHL0Ry
YXdWaWV3Lmg+CisKK3N0YXRpYyBOU1N0cmluZyAqU1ZHRGF0YVBhc3RlYm9hcmRUeXBlID0gQCJT
VkdEYXRhUGFzdGVib2FyZFR5cGUiOworCitAaW1wbGVtZW50YXRpb24gTlNTVkdJbWFnZVJlcAor
CisrICh2b2lkKWxvYWQKK3sKKyAgICAvLyBSZWdpc3RlciB0aGlzIEltYWdlUmVwIHN1YmNsYXNz
IHJpZ2h0IHdoZW4gV2ViQ29yZStTVkcgaXMgbG9hZGVkLgorICAgIFtOU0ltYWdlUmVwIHJlZ2lz
dGVySW1hZ2VSZXBDbGFzczpzZWxmXTsKK30KKworKyAoQk9PTCljYW5Jbml0V2l0aERhdGE6KE5T
RGF0YSAqKWRhdGEKK3sKKyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiBOTzsKKyAgICAK
KyAgICBpbnQgbGVuZ3RoID0gW2RhdGEgbGVuZ3RoXTsKKyAgICBpZiAobGVuZ3RoID4gMTAyNCkK
KyAgICAgICAgbGVuZ3RoID0gMTAyNDsKKyAgICBOU1N0cmluZyAqdGVzdFN0cmluZyA9IFtbTlNT
dHJpbmcgYWxsb2NdIGluaXRXaXRoQnl0ZXM6W2RhdGEgYnl0ZXNdIGxlbmd0aDpsZW5ndGggZW5j
b2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOworICAgIE5TUmFuZ2UgcmFuZ2UgPSBbdGVzdFN0
cmluZyByYW5nZU9mU3RyaW5nOkAic3ZnIiBvcHRpb25zOk5TQ2FzZUluc2Vuc2l0aXZlU2VhcmNo
XTsKKyAgICBbdGVzdFN0cmluZyByZWxlYXNlXTsKKyAgICBpZiAoKHJhbmdlLmxvY2F0aW9uID4g
MCkgJiYgKHJhbmdlLmxlbmd0aCA9PSAzKSkKKyAgICAgICAgcmV0dXJuIFlFUzsKKyAgICAKKyAg
ICByZXR1cm4gTk87Cit9CisKKysgKEJPT0wpY2FuSW5pdFdpdGhQYXN0ZWJvYXJkOihOU1Bhc3Rl
Ym9hcmQgKilwYXN0ZWJvYXJkCit7CisgICAgTlNTdHJpbmcgKnR5cGUgPSBbcGFzdGVib2FyZCBh
dmFpbGFibGVUeXBlRnJvbUFycmF5OltzZWxmIGltYWdlVW5maWx0ZXJlZFBhc3RlYm9hcmRUeXBl
c11dOworICAgIGlmIChbdHlwZSBpc0VxdWFsVG9TdHJpbmc6TlNGaWxlbmFtZXNQYm9hcmRUeXBl
XSkgeworICAgICAgICBOU0FycmF5ICpuYW1lcyA9IFtwYXN0ZWJvYXJkIHByb3BlcnR5TGlzdEZv
clR5cGU6TlNGaWxlbmFtZXNQYm9hcmRUeXBlXTsKKyAgICAgICAgTlNFbnVtZXJhdG9yICpmaWxl
bmFtZUVudW1lcmF0b3IgPSBbbmFtZXMgb2JqZWN0RW51bWVyYXRvcl07CisgICAgICAgIE5TU3Ry
aW5nICpmaWxlbmFtZSA9IG5pbDsKKyAgICAgICAgd2hpbGUgKChmaWxlbmFtZSA9IFtmaWxlbmFt
ZUVudW1lcmF0b3IgbmV4dE9iamVjdF0pKSB7CisgICAgICAgICAgICBpZiAoW1tmaWxlbmFtZSBw
YXRoRXh0ZW5zaW9uXSBpc0VxdWFsVG9TdHJpbmc6QCJzdmciXSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gWUVTOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAodHlwZSAhPSBuaWwpOwor
fQorCisrIChOU0FycmF5ICopaW1hZ2VVbmZpbHRlcmVkRmlsZVR5cGVzCit7CisgICAgc3RhdGlj
IE5TQXJyYXkgKnR5cGVzID0gbmlsOworICAgIGlmICghdHlwZXMpCisgICAgICAgIHR5cGVzID0g
W1tOU0FycmF5IGFsbG9jXSAgaW5pdFdpdGhPYmplY3RzOkAic3ZnIiwgbmlsXTsKKyAgICByZXR1
cm4gdHlwZXM7Cit9CisKKysgKE5TQXJyYXkgKilpbWFnZVVuZmlsdGVyZWRQYXN0ZWJvYXJkVHlw
ZXMKK3sKKyAgICBzdGF0aWMgTlNBcnJheSAqdHlwZXMgPSBuaWw7CisgICAgaWYgKCF0eXBlcykK
KyAgICAgICAgdHlwZXMgPSBbW05TQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czpTVkdEYXRh
UGFzdGVib2FyZFR5cGUsIE5TRmlsZW5hbWVzUGJvYXJkVHlwZSwgbmlsXTsKKyAgICByZXR1cm4g
dHlwZXM7Cit9CisKKy0gKEJPT0wpZHJhdworeworICAgIE5TTG9nKEAiTlNTVkdJbWFnZVJlcCBk
cmF3Iik7CisgICAgcmV0dXJuIFtfY2FjaGVkUmVwSGFjayBkcmF3XTs7Cit9CisKKy0gKEJPT0wp
ZHJhd0F0UG9pbnQ6KE5TUG9pbnQpcG9pbnQKK3sKKyAgICBOU0xvZyhAIk5TU1ZHSW1hZ2VSZXAg
ZHJhd0F0UG9pbnQ6ICVAIiwgTlNTdHJpbmdGcm9tUG9pbnQocG9pbnQpKTsKKyAgICByZXR1cm4g
W19jYWNoZWRSZXBIYWNrIGRyYXdBdFBvaW50OnBvaW50XTsKK30KKworLSAoQk9PTClkcmF3SW5S
ZWN0OihOU1JlY3QpcmVjdAoreworICAgIE5TTG9nKEAiTlNTVkdJbWFnZVJlcCBkcmF3SW5SZWN0
OiAlQCIsIE5TU3RyaW5nRnJvbVJlY3QocmVjdCkpOworICAgIHJldHVybiBbX2NhY2hlZFJlcEhh
Y2sgZHJhd0luUmVjdDpyZWN0XTsKK30KKworKyAoaWQpaW1hZ2VSZXBXaXRoRGF0YTooTlNEYXRh
ICopc3ZnRGF0YQoreworICAgIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aERhdGE6c3Zn
RGF0YV0gYXV0b3JlbGVhc2VdOworfQorCistIChpZClpbml0V2l0aERhdGE6KE5TRGF0YSAqKXN2
Z0RhdGEKK3sKKyAgICBOU0xvZyhAIk5TU1ZHSW1hZ2VSZXAgaW5pdFdpdGhEYXRhIik7CisgICAg
aWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgeworICAgICAgICBfZHJhd0RvY3VtZW50ID0gW1tE
cmF3RG9jdW1lbnQgYWxsb2NdIGluaXRXaXRoU1ZHRGF0YTpzdmdEYXRhXTsKKyAgICAgICAgaWYg
KCFfZHJhd0RvY3VtZW50KSB7CisgICAgICAgICAgICBbc2VsZiByZWxlYXNlXTsKKyAgICAgICAg
ICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFtzZWxmIHNldEFs
cGhhOllFU107CisgICAgICAgIC8vW3NlbGYgc2V0Qml0c1BlclNhbXBsZTozMl07CisgICAgICAg
IFtzZWxmIHNldENvbG9yU3BhY2VOYW1lOk5TQ2FsaWJyYXRlZFJHQkNvbG9yU3BhY2VdOworICAg
ICAgICBbc2VsZiBzZXRPcGFxdWU6Tk9dOworICAgICAgICBOU1NpemUgZG9jdW1lbnRTaXplID0g
W19kcmF3RG9jdW1lbnQgY2FudmFzU2l6ZV07CisgICAgICAgIFtzZWxmIHNldFNpemU6ZG9jdW1l
bnRTaXplXTsKKyAgICAgICAgW3NlbGYgc2V0UGl4ZWxzV2lkZTooaW50KWRvY3VtZW50U2l6ZS53
aWR0aF07CisgICAgICAgIFtzZWxmIHNldFBpeGVsc0hpZ2g6KGludClkb2N1bWVudFNpemUuaGVp
Z2h0XTsKKyAgICAgICAgCisgICAgICAgIF92aWV3ID0gW1tEcmF3VmlldyBhbGxvY10gaW5pdFdp
dGhGcmFtZTpOU01ha2VSZWN0KDAsMCxkb2N1bWVudFNpemUud2lkdGgsZG9jdW1lbnRTaXplLndp
ZHRoKV07CisgICAgICAgIFtfdmlldyBzZXREb2N1bWVudDpfZHJhd0RvY3VtZW50XTsKKyAgICAg
ICAgW192aWV3IHNpemVUb0ZpdFZpZXdCb3hdOworICAgICAgICBfY2FjaGVkUmVwSGFjayA9IFtb
X3ZpZXcgYml0bWFwSW1hZ2VSZXBGb3JDYWNoaW5nRGlzcGxheUluUmVjdDpbX3ZpZXcgYm91bmRz
XV0gcmV0YWluXTsKKyAgICAgICAgW192aWV3IGNhY2hlRGlzcGxheUluUmVjdDpbX3ZpZXcgYm91
bmRzXSB0b0JpdG1hcEltYWdlUmVwOl9jYWNoZWRSZXBIYWNrXTsKKyAgICB9CisgICAgcmV0dXJu
IHNlbGY7Cit9CisKKy0gKE5TRGF0YSAqKXJlcHJlc2VudGF0aW9uVXNpbmdUeXBlOihOU0JpdG1h
cEltYWdlRmlsZVR5cGUpc3RvcmFnZVR5cGUgcHJvcGVydGllczooTlNEaWN0aW9uYXJ5ICopcHJv
cGVydGllcworeworICAgIHJldHVybiBbX2NhY2hlZFJlcEhhY2sgcmVwcmVzZW50YXRpb25Vc2lu
Z1R5cGU6c3RvcmFnZVR5cGUgcHJvcGVydGllczpwcm9wZXJ0aWVzXTsKK30KKworLSAodm9pZClz
ZXRTaXplOihOU1NpemUpbmV3U2l6ZQoreworICAgIE5TTG9nKEAiTlNTVkdJbWFnZVJlcCBzZXRT
aXplOiIpOworICAgIFtzdXBlciBzZXRTaXplOm5ld1NpemVdOworfQorCitAZW5kCg==
</data>
<flag name="review"
          id="284"
          type_id="1"
          status="-"
          setter="sullivan"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>3148</attachid>
            <date>2005-07-29 12:00:40 -0700</date>
            <delta_ts>2005-07-29 12:05:24 -0700</delta_ts>
            <desc>Improved version: (more comments, spelling correction)</desc>
            <filename>svg_spi.patch</filename>
            <type>text/plain</type>
            <size>84848</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IERyYXdDYW52YXNJdGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogRHJhd0NhbnZhc0l0
ZW0uaApkaWZmIC1OIERyYXdDYW52YXNJdGVtLmgKLS0tIERyYXdDYW52YXNJdGVtLmgJMSBKYW4g
MTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd0NhbnZhc0l0ZW0uaAkyOSBKdWwgMjAwNSAxODo0
MzoyNCAtMDAwMApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFw
cGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisvKgorIFdB
Uk5JTkc6IFRoZXNlIGZpbGVzIGFyZSB0ZW1wb3JhcnkgYW5kIGV4aXN0IHNvbGVseSBmb3IgdGhl
IHB1cnBvc2UKKyBvZiBhbGxvd2luZyBncmVhdGVyIHRlc3Rpbmcgb2YgV2ViQ29yZStTVkcgcHJp
b3IgdG8gZnVsbCBET00gaW50ZWdyYXRpb24uCisgRG8gTk9UIGRlcGVuZCBvbiB0aGVzZSBTUElz
IG9yIGZpbGVzIGFzIHRoZXkgd2lsbCBzb29uIGJlIGdvbmUuCisqLworCisjaW1wb3J0IDxDb2Nv
YS9Db2NvYS5oPgorCisvKgorIFRoaXMgaXMgYW4gT2JqLUMgd3JhcHBlciBvYmplY3QgZm9yIEtD
YW52YXNJdGVtCisgVGhpcyBleGlzdHMgbW9zdGx5IGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBPYmot
QworIGJpbmRpbmdzIGZvciB0aGUgU1ZHIERPTSB5ZXQuCisKKyBJbiBhIHJlYWwgZWRpdG9yLCB5
b3Ugd291bGQgbm90IHdhbnQgdG8gbWFrZSBjaGFuZ2VzIHRvIG9ubHkgdGhlIHJlbmRlcgorIHRy
ZWUsIGJ1dCByYXRoZXIgdG8gdGhlIERPTSBkaXJlY3RseSwgYW5kIGxldCB0aGUgZW5naW5lIGF1
dG9tYXRpY2FsbHkKKyByZWZsZWN0IHRob3NlIGluIHRoZSByZW5kZXIgdHJlZS4KKyovCisKK0Bj
bGFzcyBEcmF3Q2FudmFzSXRlbVByaXZhdGU7CisKK0BpbnRlcmZhY2UgRHJhd0NhbnZhc0l0ZW0g
OiBOU09iamVjdCB7CisgICAgRHJhd0NhbnZhc0l0ZW1Qcml2YXRlICpfcHJpdmF0ZTsKK30KKwor
Ly8gY29udmVuaWVuY2UKKysgKE5TQXJyYXkgKiljb250cm9sUG9pbnRzRm9yUmVjdDooTlNSZWN0
KWJib3g7CisrIChOU1BvaW50KWRyYWdBbmNob3JQb2ludEZvckNvbnRyb2xQb2ludEluZGV4Oihp
bnQpY29udHJvbFBvaW50SW5kZXggZnJvbVJlY3RDb250cm9sUG9pbnRzOihOU0FycmF5ICopY29u
dHJvbFBvaW50czsKKworLyoKKyAgIFRoZXNlIHdlcmUgYWxsIG9yaWdpbmFsbHkgaW50ZW5kZWQg
dG8gYWxsb3cgbW9yZSB0aGFuIGp1c3QgdGhlIGZvdXIgY29ybmVyCisgICBrbm9icyB0byBiZSBk
aXNwbGF5ZWQgZm9yIHNlbGVjdGlvbiwgZWRpdGluZywgYnV0IGFyZSBub3QgZmluaXNoZWQsIGFu
ZAorICAgaW5zdGVhZCBhbHdheXMgcmV0dXJuIHRoZSA0IGNvcm5lciBwb2ludHMgZm9yIGFueSBz
aGFwZSwgcGF0aCwgZXRjLgorICAgV2h5PyBBIGNsYXNzaWMgZXhhbXBsZSBpcyBhIGN1cnZlZCBw
YXRoLCB3aGVyZSB5b3UgZG9uJ3QganVzdCB3YW50IDQgc2VsZWN0aW9uCisgICBub2JzLCBidXQg
cmF0aGVyIG9uZXMgYWxvbmcgdGhlIHBhdGgsIHBvc3NpYmx5IGZvciBjdXJ2ZSBjb250cm9sIHBv
aW50cywgZXRjLgorKi8KKy0gKE5TUG9pbnQpZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50
SW5kZXg6KGludCljb250cm9sUG9pbnRJbmRleDsKKy0gKE5TQXJyYXkgKiljb250cm9sUG9pbnRz
OworLSAoTlNSZWN0KWJvdW5kaW5nQm94OworCisvLyB1c2VkIGZvciBtb3Zpbmcgb2JqZWN0cwor
LSAodm9pZCl0cmFuc2xhdGVCeU9mZnNldDooTlNTaXplKW9mZnNldDsKKy0gKHZvaWQpcmVzaXpl
V2l0aFBvaW50OihOU1BvaW50KWNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBvaW50OihpbnQpY29u
dHJvbFBvaW50SW5kZXggZHJhZ0FuY2hvclBvaW50OihOU1BvaW50KWNhbnZhc0RyYWdBbmNob3JQ
b2ludDsKKworLSAodW5zaWduZWQgaW50KXpJbmRleDsKKy0gKHZvaWQpcmFpc2U7CistICh2b2lk
KWxvd2VyOworCitAZW5kCkluZGV4OiBEcmF3Q2FudmFzSXRlbS5tbQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm
aWxlOiBEcmF3Q2FudmFzSXRlbS5tbQpkaWZmIC1OIERyYXdDYW52YXNJdGVtLm1tCi0tLSBEcmF3
Q2FudmFzSXRlbS5tbQkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBEcmF3Q2FudmFzSXRl
bS5tbQkyOSBKdWwgMjAwNSAxODo0MzoyNCAtMDAwMApAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2ltcG9ydCAiRHJhd0NhbnZhc0l0ZW1Qcml2YXRlLmgiCisKKyNpbXBv
cnQgPGtjYW52YXMvS0NhbnZhcy5oPgorI2ltcG9ydCA8a2NhbnZhcy9LQ2FudmFzSXRlbS5oPgor
CisjaW1wb3J0IDxrZG9tL05hbWVzcGFjZS5oPgorI2ltcG9ydCA8a2RvbS9IZWxwZXIuaD4KKwor
I2ltcG9ydCA8a3N2ZzIvaW1wbC9TVkdTdHlsZWRFbGVtZW50SW1wbC5oPgorI2ltcG9ydCA8a3N2
ZzIvaW1wbC9TVkdFbGxpcHNlRWxlbWVudEltcGwuaD4KKyNpbXBvcnQgPGtzdmcyL2ltcGwvU1ZH
UmVjdEVsZW1lbnRJbXBsLmg+CisjaW1wb3J0IDxrc3ZnMi9pbXBsL1NWR1BhdGhFbGVtZW50SW1w
bC5oPgorCitAaW50ZXJmYWNlIERyYXdDYW52YXNJdGVtUHJpdmF0ZSA6IE5TT2JqZWN0IHsKKyAg
ICBAcHVibGljCisgICAgS0NhbnZhc0l0ZW0gKml0ZW07IC8vIHRoaXMgaXMgbGlrZWx5IGRhbmdl
cm91cy4uLgorfQorQGVuZCAKKworQGltcGxlbWVudGF0aW9uIERyYXdDYW52YXNJdGVtUHJpdmF0
ZQorQGVuZAorCitAaW1wbGVtZW50YXRpb24gRHJhd0NhbnZhc0l0ZW0KKworKyAoaWQpY2FudmFz
SXRlbUZvckl0ZW06KEtDYW52YXNJdGVtICopY2FudmFzSXRlbQoreworICAgIHJldHVybiBbW1tz
ZWxmIGFsbG9jXSBpbml0V2l0aEl0ZW06Y2FudmFzSXRlbV0gYXV0b3JlbGVhc2VdOworfQorCist
IChpZClpbml0V2l0aEl0ZW06KEtDYW52YXNJdGVtICopY2FudmFzSXRlbQoreworICAgIGlmICgo
c2VsZiA9IFtzdXBlciBpbml0XSkpIHsKKyAgICAgICAgX3ByaXZhdGUgPSBbW0RyYXdDYW52YXNJ
dGVtUHJpdmF0ZSBhbGxvY10gaW5pdF07CisgICAgICAgIF9wcml2YXRlLT5pdGVtID0gY2FudmFz
SXRlbTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKEtDYW52YXNJdGVtICopaXRl
bQoreworICAgIHJldHVybiBfcHJpdmF0ZS0+aXRlbTsKK30KKworLSAoTlNSZWN0KWJvdW5kaW5n
Qm94Cit7CisgICAgcmV0dXJuIE5TUmVjdChfcHJpdmF0ZS0+aXRlbS0+YmJveCgpKTsKK30KKwor
LSAodW5zaWduZWQgaW50KXpJbmRleAoreworICAgIHJldHVybiBfcHJpdmF0ZS0+aXRlbS0+eklu
ZGV4KCk7Cit9CisKKy0gKHZvaWQpcmFpc2UKK3sKKyAgICBfcHJpdmF0ZS0+aXRlbS0+cmFpc2Uo
KTsKK30KKworLSAodm9pZClsb3dlcgoreworICAgIF9wcml2YXRlLT5pdGVtLT5sb3dlcigpOwor
fQorCisvLyBzZWUgbm90ZSBpbiBoZWFkZXIuCisrIChOU1BvaW50KWRyYWdBbmNob3JQb2ludEZv
ckNvbnRyb2xQb2ludEluZGV4OihpbnQpY29udHJvbFBvaW50SW5kZXggZnJvbVJlY3RDb250cm9s
UG9pbnRzOihOU0FycmF5ICopY29udHJvbFBvaW50c3sKKyAgICBpbnQgYW5jaG9yUG9pbnRJbmRl
eCA9IChjb250cm9sUG9pbnRJbmRleCArIDIpICUgNDsgLy8gdGhlIGFuY2hvciBwb2ludCBpcyB0
aGUgb3Bwb3NpdGUgY29ybmVyLgorICAgIE5TUG9pbnQgYW5jaG9yUG9pbnQgPSBbW2NvbnRyb2xQ
b2ludHMgb2JqZWN0QXRJbmRleDphbmNob3JQb2ludEluZGV4XSBwb2ludFZhbHVlXTsKKyAgICBy
ZXR1cm4gYW5jaG9yUG9pbnQ7Cit9CisKKy8vIHNlZSBub3RlIGluIGhlYWRlci4KKy0gKE5TUG9p
bnQpZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6KGludCljb250cm9sUG9pbnRJ
bmRleAoreworICAgIEtET006Ok5vZGVJbXBsICpub2RlID0gKEtET006Ok5vZGVJbXBsICopX3By
aXZhdGUtPml0ZW0tPnVzZXJEYXRhKCk7CisgICAgaW50IGxvY2FsSWQgPSBub2RlLT5sb2NhbElk
KCk7CisgICAgTlNQb2ludCBkcmFnQW5jaG9yUG9pbnQ7CisgICAgCisgICAgc3dpdGNoIChsb2Nh
bElkKSB7CisJY2FzZSBJRF9QQVRIOgorICAgICAgICAgICAgLy9LU1ZHOjpTVkdQYXRoRWxlbWVu
dEltcGwgKnBhdGggPSAoS1NWRzo6U1ZHUGF0aEVsZW1lbnRJbXBsICopbm9kZTsKKwlkZWZhdWx0
OgorICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBzcGVjaWFsIGtub2IgbGlzdCwgZ3JhYiB0
aGUgZGVmYXVsdAorICAgICAgICAgICAgZHJhZ0FuY2hvclBvaW50ID0gW0RyYXdDYW52YXNJdGVt
IGRyYWdBbmNob3JQb2ludEZvckNvbnRyb2xQb2ludEluZGV4OmNvbnRyb2xQb2ludEluZGV4Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmcm9tUmVjdENvbnRyb2xQb2ludHM6W3NlbGYgY29udHJvbFBvaW50c11dOworICAgICAgICAg
ICAgCisgICAgfQorICAgIHJldHVybiBkcmFnQW5jaG9yUG9pbnQ7Cit9CisKKy8vIHNlZSBub3Rl
IGluIGhlYWRlci4KKysgKE5TQXJyYXkgKiljb250cm9sUG9pbnRzRm9yUmVjdDooTlNSZWN0KWJi
b3gKK3sKKyAgICByZXR1cm4gW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0czoKKyAgICAgICAgW05T
VmFsdWUgdmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNaW5YKGJib3gpLCBOU01pblkoYmJv
eCkpXSwKKyAgICAgICAgW05TVmFsdWUgdmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNaW5Y
KGJib3gpLCBOU01heFkoYmJveCkpXSwKKyAgICAgICAgW05TVmFsdWUgdmFsdWVXaXRoUG9pbnQ6
TlNNYWtlUG9pbnQoTlNNYXhYKGJib3gpLCBOU01heFkoYmJveCkpXSwKKyAgICAgICAgW05TVmFs
dWUgdmFsdWVXaXRoUG9pbnQ6TlNNYWtlUG9pbnQoTlNNYXhYKGJib3gpLCBOU01pblkoYmJveCkp
XSwKKyAgICAgICAgbmlsXTsKK30KKworLy8gc2VlIG5vdGUgaW4gaGVhZGVyLgorLSAoTlNBcnJh
eSAqKWNvbnRyb2xQb2ludHMKK3sJCisgICAgS0RPTTo6Tm9kZUltcGwgKm5vZGUgPSAoS0RPTTo6
Tm9kZUltcGwgKilfcHJpdmF0ZS0+aXRlbS0+dXNlckRhdGEoKTsKKyAgICBpbnQgbG9jYWxJZCA9
IG5vZGUtPmxvY2FsSWQoKTsKKyAgICBOU0FycmF5ICpjb250cm9sUG9pbnRzID0gbmlsOworICAg
IAorICAgIHN3aXRjaCAobG9jYWxJZCkgeworICAgICAgICBjYXNlIElEX1BBVEg6CisgICAgICAg
ICAgICAvL0tTVkc6OlNWR1BhdGhFbGVtZW50SW1wbCAqcGF0aCA9IChLU1ZHOjpTVkdQYXRoRWxl
bWVudEltcGwgKilub2RlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gaWYgd2Ug
aGF2ZSBubyBzcGVjaWFsIGtub2IgbGlzdCwgZ3JhYiB0aGUgZGVmYXVsdAorICAgICAgICAgICAg
Y29udHJvbFBvaW50cyA9IFtEcmF3Q2FudmFzSXRlbSBjb250cm9sUG9pbnRzRm9yUmVjdDpbc2Vs
ZiBib3VuZGluZ0JveF1dOworICAgIH0KKyAgICByZXR1cm4gY29udHJvbFBvaW50czsKK30KKwor
LSAodm9pZClmaXRUb05ld0JCb3g6KE5TUmVjdCluZXdSZWN0Cit7CisgICAgW3NlbGYgd2lsbENo
YW5nZVZhbHVlRm9yS2V5OkAiYm91bmRpbmdCb3giXTsKKyAgICBbc2VsZiB3aWxsQ2hhbmdlVmFs
dWVGb3JLZXk6QCJhdHRyaWJ1dGVkWE1MU3RyaW5nIl07CisgICAgLy9OU0xvZyhAIkZpdHRpbmcg
Y2FudmFzSXRlbTogJXAgZnJvbTogJUAgaW50byBuZXcgYmJveDogJUAiLAorICAgIC8vCXNlbGYs
IE5TU3RyaW5nRnJvbVJlY3QoW3NlbGYgYm91bmRpbmdCb3hdKSwgTlNTdHJpbmdGcm9tUmVjdChu
ZXdSZWN0KSk7CisgICAgS0RPTTo6Tm9kZUltcGwgKm5vZGUgPSAoS0RPTTo6Tm9kZUltcGwgKilf
cHJpdmF0ZS0+aXRlbS0+dXNlckRhdGEoKTsKKyAgICBpbnQgbG9jYWxJZCA9IG5vZGUtPmxvY2Fs
SWQoKTsKKyAgICBzd2l0Y2ggKGxvY2FsSWQpIHsKKwljYXNlIElEX0VMTElQU0U6CisJeworICAg
ICAgICAgICAgS1NWRzo6U1ZHRWxsaXBzZUVsZW1lbnRJbXBsICplbGxpcHNlID0gKEtTVkc6OlNW
R0VsbGlwc2VFbGVtZW50SW1wbCAqKW5vZGU7CisgICAgICAgICAgICBlbGxpcHNlLT5zZXRBdHRy
aWJ1dGVOUyhLRE9NOjpOU19TVkcsICJjeCIsIFFTdHJpbmc6Om51bWJlcihuZXdSZWN0Lm9yaWdp
bi54ICsgbmV3UmVjdC5zaXplLndpZHRoLzIuZikpOworICAgICAgICAgICAgZWxsaXBzZS0+c2V0
QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAiY3kiLCBRU3RyaW5nOjpudW1iZXIobmV3UmVjdC5v
cmlnaW4ueSArIG5ld1JlY3Quc2l6ZS5oZWlnaHQvMi5mKSk7CisgICAgICAgICAgICBlbGxpcHNl
LT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJyeCIsIFFTdHJpbmc6Om51bWJlcihuZXdS
ZWN0LnNpemUud2lkdGgvMi5mKSk7CisgICAgICAgICAgICBlbGxpcHNlLT5zZXRBdHRyaWJ1dGVO
UyhLRE9NOjpOU19TVkcsICJyeSIsIFFTdHJpbmc6Om51bWJlcihuZXdSZWN0LnNpemUuaGVpZ2h0
LzIuZikpOworICAgICAgICAgICAgYnJlYWs7CisJfQorCWNhc2UgSURfUkVDVDoKKwl7CisgICAg
ICAgICAgICBLU1ZHOjpTVkdSZWN0RWxlbWVudEltcGwgKnJlY3QgPSAoS1NWRzo6U1ZHUmVjdEVs
ZW1lbnRJbXBsICopbm9kZTsKKyAgICAgICAgICAgIHJlY3QtPnNldEF0dHJpYnV0ZU5TKEtET006
Ok5TX1NWRywgIngiLCBRU3RyaW5nOjpudW1iZXIobmV3UmVjdC5vcmlnaW4ueCkpOworICAgICAg
ICAgICAgcmVjdC0+c2V0QXR0cmlidXRlTlMoS0RPTTo6TlNfU1ZHLCAieSIsIFFTdHJpbmc6Om51
bWJlcihuZXdSZWN0Lm9yaWdpbi55KSk7CisgICAgICAgICAgICByZWN0LT5zZXRBdHRyaWJ1dGVO
UyhLRE9NOjpOU19TVkcsICJ3aWR0aCIsIFFTdHJpbmc6Om51bWJlcihuZXdSZWN0LnNpemUud2lk
dGggLSAxKSk7CisgICAgICAgICAgICByZWN0LT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcs
ICJoZWlnaHQiLCBRU3RyaW5nOjpudW1iZXIobmV3UmVjdC5zaXplLmhlaWdodCAtIDEpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworCX0KKwlkZWZhdWx0OgorICAgICAgICAgICAgTlNMb2coQCJJZCBu
b3QgaGFuZGxlZDogJWkiLCBsb2NhbElkKTsKKyAgICB9CisgICAgW3NlbGYgZGlkQ2hhbmdlVmFs
dWVGb3JLZXk6QCJib3VuZGluZ0JveCJdOworICAgIFtzZWxmIGRpZENoYW5nZVZhbHVlRm9yS2V5
OkAiYXR0cmlidXRlZFhNTFN0cmluZyJdOworfQorCistICh2b2lkKXRyYW5zbGF0ZUJ5T2Zmc2V0
OihOU1NpemUpb2Zmc2V0Cit7CisgICAgTlNSZWN0IG5ld1JlY3QgPSBbc2VsZiBib3VuZGluZ0Jv
eF07CisgICAgbmV3UmVjdC5vcmlnaW4ueCArPSBvZmZzZXQud2lkdGggKyAxOyAvLyBIQUNLCisg
ICAgbmV3UmVjdC5vcmlnaW4ueSArPSBvZmZzZXQuaGVpZ2h0ICsgMTsKKyAgICBbc2VsZiBmaXRU
b05ld0JCb3g6bmV3UmVjdF07Cit9CisKKy0gKHZvaWQpcmVzaXplV2l0aFBvaW50OihOU1BvaW50
KWNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBvaW50OihpbnQpY29udHJvbFBvaW50SW5kZXggZHJh
Z0FuY2hvclBvaW50OihOU1BvaW50KWNhbnZhc0RyYWdBbmNob3JQb2ludHsKKyAgICAvLyBUaGUg
Y29udHJvbFBvaW50SW5kZXggY2FuIGJlIHVzZWQgZm9yIHBhdGhzLCBldGMuCisgICAgTlNSZWN0
IG5ld1JlY3Q7CisgICAgbmV3UmVjdC5vcmlnaW4ueCA9IE1JTihjYW52YXNEcmFnQW5jaG9yUG9p
bnQueCwgY2FudmFzUG9pbnQueCk7CisgICAgbmV3UmVjdC5vcmlnaW4ueSA9IE1JTihjYW52YXNE
cmFnQW5jaG9yUG9pbnQueSwgY2FudmFzUG9pbnQueSk7CisgICAgbmV3UmVjdC5zaXplLndpZHRo
ID0gQUJTKGNhbnZhc0RyYWdBbmNob3JQb2ludC54IC0gY2FudmFzUG9pbnQueCArIDEpOworICAg
IG5ld1JlY3Quc2l6ZS5oZWlnaHQgPSBBQlMoY2FudmFzRHJhZ0FuY2hvclBvaW50LnkgLSBjYW52
YXNQb2ludC55ICsgMSk7CisgICAgCisgICAgW3NlbGYgZml0VG9OZXdCQm94Om5ld1JlY3RdOwor
fQorCistIChpZCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkKK3sKKyAgICBLU1ZHOjpTVkdT
dHlsZWRFbGVtZW50SW1wbCAqZWxlbWVudCA9IChLU1ZHOjpTVkdTdHlsZWRFbGVtZW50SW1wbCAq
KV9wcml2YXRlLT5pdGVtLT51c2VyRGF0YSgpOworICAgIGlkIHRoZVZhbHVlID0gbmlsOworICAg
IAorICAgIGlmIChba2V5IGlzRXF1YWxUb1N0cmluZzpAImlzRmlsbGVkIl0pIHsKKyAgICAgICAg
S0RPTTo6RE9NU3RyaW5nIHZhbHVlID0gZWxlbWVudC0+Z2V0QXR0cmlidXRlTlMoS0RPTTo6TlNf
U1ZHLCAiZmlsbCIpOworICAgICAgICB0aGVWYWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoQm9v
bDoodmFsdWUgIT0gIm5vbmUiKV07CisgICAgfSBlbHNlIGlmIChba2V5IGlzRXF1YWxUb1N0cmlu
ZzpAImlzU3Ryb2tlZCJdKSB7CisgICAgICAgIEtET006OkRPTVN0cmluZyB2YWx1ZSA9IGVsZW1l
bnQtPmdldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgInN0cm9rZSIpOworICAgICAgICB0aGVW
YWx1ZSA9IFtOU051bWJlciBudW1iZXJXaXRoQm9vbDoodmFsdWUgIT0gIm5vbmUiKV07CisgICAg
fSBlbHNlIGlmIChba2V5IGlzRXF1YWxUb1N0cmluZzpAImZpbGxDb2xvciJdKSB7CisgICAgICAg
IEtET006OkRPTVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQtPmdldEF0dHJpYnV0ZU5TKEtET006Ok5T
X1NWRywgImZpbGwiKTsKKyAgICAgICAgdGhlVmFsdWUgPSBuc0NvbG9yKFFDb2xvcih2YWx1ZS5z
dHJpbmcoKSkpOworICAgIH0gZWxzZSBpZiAoW2tleSBpc0VxdWFsVG9TdHJpbmc6QCJzdHJva2VD
b2xvciJdKSB7CisgICAgICAgIEtET006OkRPTVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQtPmdldEF0
dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgInN0cm9rZSIpOworICAgICAgICB0aGVWYWx1ZSA9IG5z
Q29sb3IoUUNvbG9yKHZhbHVlLnN0cmluZygpKSk7CisgICAgfQorICAgIAorICAgIGlmICh0aGVW
YWx1ZSkKKyAgICAgICAgcmV0dXJuIHRoZVZhbHVlOworICAgIAorICAgIHJldHVybiBbc3VwZXIg
dmFsdWVGb3JLZXk6a2V5XTsKK30KKworLSAoTlNBdHRyaWJ1dGVkU3RyaW5nICopYXR0cmlidHVl
ZFhNTFN0cmluZworeworICAgIFFTdHJpbmcgKm5vZGVUZXh0ID0gbmV3IFFTdHJpbmcoKTsKKyAg
ICBRVGV4dFN0cmVhbSBub2RlVGV4dFN0cmVhbShub2RlVGV4dCwgSU9fV3JpdGVPbmx5KTsKKyAg
ICBLRE9NOjpIZWxwZXI6OlByaW50Tm9kZShub2RlVGV4dFN0cmVhbSwgKEtET006Ok5vZGVJbXBs
ICopX3ByaXZhdGUtPml0ZW0tPnVzZXJEYXRhKCkpOworICAgIE5TU3RyaW5nICpub2RlU3RyaW5n
ID0gbm9kZVRleHQtPmdldE5TU3RyaW5nKCk7CisgICAgZGVsZXRlIG5vZGVUZXh0OworICAgIAor
ICAgIGlmIChub2RlU3RyaW5nKQorICAgICAgICByZXR1cm4gW1tOU0F0dHJpYnV0ZWRTdHJpbmcg
YWxsb2NdIGluaXRXaXRoU3RyaW5nOm5vZGVTdHJpbmddOworICAgIHJldHVybiBuaWw7Cit9CisK
K0BlbmQKSW5kZXg6IERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6
IERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCmRpZmYgLU4gRHJhd0NhbnZhc0l0ZW1Qcml2YXRlLmgK
LS0tIERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysr
IERyYXdDYW52YXNJdGVtUHJpdmF0ZS5oCTI5IEp1bCAyMDA1IDE4OjQzOjI0IC0wMDAwCkBAIC0w
LDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmls
ZXMgYXJlIHRlbXBvcmFyeSBhbmQgZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFs
bG93aW5nIGdyZWF0ZXIgdGVzdGluZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBp
bnRlZ3JhdGlvbi4KKyBEbyBOT1QgZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhl
eSB3aWxsIHNvb24gYmUgZ29uZS4KKyovCisKKyNpbXBvcnQgPFdlYkNvcmUrU1ZHL0RyYXdDYW52
YXNJdGVtLmg+CisKK2NsYXNzIEtDYW52YXNJdGVtOworCitAaW50ZXJmYWNlIERyYXdDYW52YXNJ
dGVtIChQcml2YXRlTWV0aG9kcykKKworLy8gVGhpcyBkb2VzIG5vdCByZXRhaW4gY2FudmFzSXRl
bSwgZGFuZ2Vyb3VzLgorKyAoaWQpY2FudmFzSXRlbUZvckl0ZW06KEtDYW52YXNJdGVtICopY2Fu
dmFzSXRlbTsKKy0gKGlkKWluaXRXaXRoSXRlbTooS0NhbnZhc0l0ZW0gKiljYW52YXNJdGVtOwor
CistIChLQ2FudmFzSXRlbSAqKWl0ZW07CisKK0BlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBm
aWxlCkluZGV4OiBEcmF3RG9jdW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBEcmF3RG9jdW1l
bnQuaApkaWZmIC1OIERyYXdEb2N1bWVudC5oCi0tLSBEcmF3RG9jdW1lbnQuaAkxIEphbiAxOTcw
IDAwOjAwOjAwIC0wMDAwCisrKyBEcmF3RG9jdW1lbnQuaAkyOSBKdWwgMjAwNSAxODo0MzoyNCAt
MDAwMApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENv
bXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisvKgorIFdBUk5JTkc6
IFRoZXNlIGZpbGVzIGFyZSB0ZW1wb3JhcnkgYW5kIGV4aXN0IHNvbGVseSBmb3IgdGhlIHB1cnBv
c2UKKyBvZiBhbGxvd2luZyBncmVhdGVyIHRlc3Rpbmcgb2YgV2ViQ29yZStTVkcgcHJpb3IgdG8g
ZnVsbCBET00gaW50ZWdyYXRpb24uCisgRG8gTk9UIGRlcGVuZCBvbiB0aGVzZSBTUElzIG9yIGZp
bGVzIGFzIHRoZXkgd2lsbCBzb29uIGJlIGdvbmUuCisqLworCisKKyNpbXBvcnQgPENvY29hL0Nv
Y29hLmg+CisKK0BjbGFzcyBEcmF3RG9jdW1lbnRQcml2YXRlOworQGNsYXNzIERyYXdWaWV3Owor
CitAaW50ZXJmYWNlIERyYXdEb2N1bWVudCA6IE5TT2JqZWN0IHsKK0Bwcml2YXRlCisgICAgRHJh
d0RvY3VtZW50UHJpdmF0ZSAqX3ByaXZhdGU7Cit9CisKKysgKGlkKWRvY3VtZW50V2l0aFNWR0Rh
dGE6KE5TRGF0YSAqKWRhdGE7CisvLysgKGlkKWRvY3VtZW50V2l0aFNWR0RhdGE6KE5TRGF0YSAq
KWRhdGEgbG9hZGluZ0ludG9WaWV3OihEcmF3VmlldyAqKXZpZXc7CisKKy0gKGlkKWluaXRXaXRo
U1ZHRGF0YTooTlNEYXRhICopZGF0YTsKKy8vLSAoaWQpaW5pdFdpdGhTVkdEYXRhOihOU0RhdGEg
KilkYXRhIGxvYWRpbmdJbnRvVmlldzooRHJhd1ZpZXcgKil2aWV3OworLSAoaWQpaW5pdFdpdGhD
b250ZW50c09mRmlsZTooTlNTdHJpbmcgKilwYXRoOworCisvLy0gKE5TU2l6ZSlkb2N1bWVudFNp
emU7CisKKy0gKE5TU3RyaW5nICopc3ZnVGV4dDsKKworQGVuZApJbmRleDogRHJhd0RvY3VtZW50
Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KUkNTIGZpbGU6IERyYXdEb2N1bWVudC5tbQpkaWZmIC1OIERyYXdEb2N1
bWVudC5tbQotLS0gRHJhd0RvY3VtZW50Lm1tCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysr
IERyYXdEb2N1bWVudC5tbQkyOSBKdWwgMjAwNSAxODo0MzoyNCAtMDAwMApAQCAtMCwwICsxLDU4
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiRHJhd0RvY3VtZW50UHJpdmF0ZS5o
IgorI2ltcG9ydCAiRHJhd0NhbnZhc0l0ZW1Qcml2YXRlLmgiCisKKyNpbXBvcnQgIkRyYXdWaWV3
UHJpdmF0ZS5oIgorI2ltcG9ydCAiUXVhcnR6U3VwcG9ydC5oIiAvLyBmb3IgQ0dBZmZpbmVUcmFu
c2Zvcm1NYWtlTWFwQmV0d2VlblJlY3RzKCkKKworI2ltcG9ydCA8a2N1cnNvci5oPgorI2ltcG9y
dCA8cWV2ZW50Lmg+CisKKyNpbXBvcnQgPGtjYW52YXMvS0NhbnZhcy5oPgorI2ltcG9ydCA8a2Nh
bnZhcy9LQ2FudmFzSXRlbS5oPgorI2ltcG9ydCA8a2NhbnZhcy9LQ2FudmFzQ29udGFpbmVyLmg+
CisjaW1wb3J0IDxrY2FudmFzL2RldmljZS9xdWFydHovS0NhbnZhc1ZpZXdRdWFydHouaD4KKyNp
bXBvcnQgPGtjYW52YXMvZGV2aWNlL3F1YXJ0ei9LUmVuZGVyaW5nRGV2aWNlUXVhcnR6Lmg+CisK
KyNkZWZpbmUgaWQgSURfSEFDSworCisjaW1wb3J0IDxrZG9tL05hbWVzcGFjZS5oPgorI2ltcG9y
dCA8a2RvbS9IZWxwZXIuaD4KKyNpbXBvcnQgPGtkb20vRE9NQ29uZmlndXJhdGlvbi5oPgorI2lt
cG9ydCA8a2RvbS9wYXJzZXIvS0RPTVBhcnNlci5oPgorI2ltcG9ydCA8a2RvbS9iYWNrZW5kcy9s
aWJ4bWwvTGliWE1MUGFyc2VyLmg+CisjaW1wb3J0IDxrZG9tL2ltcGwvTm9kZUltcGwuaD4KKyNp
bXBvcnQgPGtkb20vaW1wbC9Ob2RlTGlzdEltcGwuaD4KKyNpbXBvcnQgPGtkb20vaW1wbC9ET01D
b25maWd1cmF0aW9uSW1wbC5oPgorI2ltcG9ydCA8a2RvbS9pbXBsL0RPTUltcGxlbWVudGF0aW9u
SW1wbC5oPgorI2ltcG9ydCA8a2RvbS9pbXBsL0VsZW1lbnRJbXBsLmg+CisjaW1wb3J0IDxrZG9t
L2V2ZW50cy9rZG9tZXZlbnRzLmg+CisjaW1wb3J0IDxrZG9tL2V2ZW50cy9pbXBsL0V2ZW50SW1w
bC5oPgorI2ltcG9ydCA8a2RvbS9ldmVudHMvaW1wbC9Nb3VzZUV2ZW50SW1wbC5oPgorCisjaW1w
b3J0IDxrc3ZnMi9LU1ZHUGFydC5oPgorI2ltcG9ydCA8a3N2ZzIvS1NWR1ZpZXcuaD4KKyNpbXBv
cnQgPGtzdmcyL2NvcmUvS1NWR0RvY3VtZW50QnVpbGRlci5oPgorI2ltcG9ydCA8a3N2ZzIvaW1w
bC9TVkdEb2N1bWVudEltcGwuaD4KKyNpbXBvcnQgPGtzdmcyL2ltcGwvU1ZHU1ZHRWxlbWVudElt
cGwuaD4KKyNpbXBvcnQgPGtzdmcyL2ltcGwvU1ZHRGVzY0VsZW1lbnRJbXBsLmg+CisjaW1wb3J0
IDxrc3ZnMi9pbXBsL1NWR1N0eWxlZEVsZW1lbnRJbXBsLmg+CisjaW1wb3J0IDxrc3ZnMi9pbXBs
L1NWR0VsbGlwc2VFbGVtZW50SW1wbC5oPgorI2ltcG9ydCA8a3N2ZzIvaW1wbC9TVkdSZWN0RWxl
bWVudEltcGwuaD4KKworLy8gdGhlc2Ugc2hvdWxkbid0IGJlIHVzZWQhCisjaW1wb3J0IDxrc3Zn
Mi9kb20vU1ZHRWxsaXBzZUVsZW1lbnQuaD4KKyNpbXBvcnQgPGtzdmcyL2RvbS9TVkdSZWN0RWxl
bWVudC5oPgorCisjdW5kZWYgaWQKKwordXNpbmcgbmFtZXNwYWNlIEtET007Cit1c2luZyBuYW1l
c3BhY2UgS1NWRzsKKworQGludGVyZmFjZSBEcmF3RG9jdW1lbnRQcml2YXRlIDogTlNPYmplY3Qg
eworICAgIEBwdWJsaWMKKyAgICBTVkdEb2N1bWVudEltcGwgKnN2Z0RvY3VtZW50OworICAgIEtD
YW52YXMgKmNhbnZhczsKKyAgICBLQ2FudmFzVmlld1F1YXJ0eiAqcHJpbWFyeVZpZXc7CisgICAg
CisgICAgS0NhbnZhc1ZpZXdRdWFydHogKmR1bW15VmlldzsgLy8gdXNlZCB0byBob2xkIHRoZSBj
YW52YXMsIHVudGlsIHdlIGdldCBhIHJlYWwgdmlldy4KK30KKworQGVuZAorCitAaW1wbGVtZW50
YXRpb24gRHJhd0RvY3VtZW50UHJpdmF0ZQorCisrIChLUmVuZGVyaW5nRGV2aWNlUXVhcnR6ICop
c2hhcmVkUmVuZGVyaW5nRGV2aWNlCit7CisgICAgc3RhdGljIEtSZW5kZXJpbmdEZXZpY2VRdWFy
dHogKl9fcXVhcnR6UmVuZGVyaW5nRGV2aWNlID0gTlVMTDsKKyAgICBpZiAoIV9fcXVhcnR6UmVu
ZGVyaW5nRGV2aWNlKQorICAgICAgICBfX3F1YXJ0elJlbmRlcmluZ0RldmljZSA9IG5ldyBLUmVu
ZGVyaW5nRGV2aWNlUXVhcnR6KCk7CisgICAgCisgICAgcmV0dXJuIF9fcXVhcnR6UmVuZGVyaW5n
RGV2aWNlOworfQorCistICh2b2lkKWRlYWxsb2MKK3sKKyAgICBpZiAoY2FudmFzKQorICAgICAg
ICBkZWxldGUgY2FudmFzOworICAgIGlmIChzdmdEb2N1bWVudCkKKyAgICAgICAgc3ZnRG9jdW1l
bnQtPmRlcmVmKCk7CisgICAgW3N1cGVyIGRlYWxsb2NdOworfQorCistICh2b2lkKXNldFNWR0Rv
Y3VtZW50OihTVkdEb2N1bWVudEltcGwgKilzdmdEb2N1bWVudEltcGwKK3sKKyAgICBLRE9NX1NB
RkVfU0VUKHN2Z0RvY3VtZW50LCBzdmdEb2N1bWVudEltcGwpOworfQorCistICh2b2lkKXNldFBy
aW1hcnlWaWV3OihLQ2FudmFzVmlld1F1YXJ0eiAqKXZpZXcKK3sKKyAgICBpZiAoIXByaW1hcnlW
aWV3IHx8IChwcmltYXJ5VmlldyA9PSBkdW1teVZpZXcpKSB7CisgICAgICAgIGlmICghY2FudmFz
KQorICAgICAgICAgICAgY2FudmFzID0gbmV3IEtDYW52YXMoW0RyYXdEb2N1bWVudFByaXZhdGUg
c2hhcmVkUmVuZGVyaW5nRGV2aWNlXSk7CisgICAgICAgIAorICAgICAgICBwcmltYXJ5VmlldyA9
IHZpZXc7CisgICAgICAgIHByaW1hcnlWaWV3LT5pbml0KGNhbnZhcywgTlVMTCk7CisgICAgICAg
IGlmIChzdmdEb2N1bWVudCkgeworICAgICAgICAgICAgc3ZnRG9jdW1lbnQtPnNldENhbnZhc1Zp
ZXcocHJpbWFyeVZpZXcpOworICAgICAgICAgICAgY2FudmFzLT5hZGRWaWV3KHByaW1hcnlWaWV3
KTsKKyAgICAgICAgICAgIC8vc3ZnRG9jdW1lbnQtPmF0dGFjaCgpOworICAgICAgICAgICAgCisv
LyAgICAgICAgICAvLyBpZiB0aGUgU1ZHIGRvYyBkb2Vzbid0IGNvbnRhaW4gYW55IHNpemUgaW5m
b3JtYXRpb24KKy8vICAgICAgICAgIC8vIHNpemUgaXQgYXBwcm9wcmlhdGVseS4uLgorLy8gICAg
ICAgICAgaWYgKE5TRXF1YWxTaXplcyhbc2VsZiBjYW52YXNTaXplXSwgTlNNYWtlU2l6ZSgtMSwt
MSkpKSB7CisvLyAgICAgICAgICAgICAgW3NlbGYgc2l6ZUNhbnZhc1RvRml0Q29udGVudF07Cisv
LyAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgZHVtbXlWaWV3OworICAgICAgICAgICAg
ZHVtbXlWaWV3ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworQGVuZAorCisKK0BpbnRl
cmZhY2UgRHJhd1ZpZXcgKEludGVybmFsQ2FudmFzTWV0aG9kcykKKy0gKEtDYW52YXNWaWV3UXVh
cnR6ICopY2FudmFzVmlldzsKK0BlbmQKKworQGltcGxlbWVudGF0aW9uIERyYXdEb2N1bWVudAor
CisrIChpZClkb2N1bWVudFdpdGhTVkdEYXRhOihOU0RhdGEgKilkYXRhCit7CisgICAgcmV0dXJu
IFtbW0RyYXdEb2N1bWVudCBhbGxvY10gaW5pdFdpdGhTVkdEYXRhOmRhdGFdIGF1dG9yZWxlYXNl
XTsKK30KKworLy8gbWFrZXMgbmV3IGVtcHR5IGRvY3VtZW50CisvLy0gKGlkKWluaXQKKy8vewor
Ly8JaWYgKHNlbGYgPSBbc3VwZXIgaW5pdF0pIHsKKy8vCQkvLyBuZWVkIGFuIGFsdGVybmF0aXZl
IGNhbGwgdGhhbiAic2VsZiIKKy8vCQlTVkdEb2N1bWVudEltcGwgKnN2Z0RvYyA9IG5ldyBTVkdE
b2N1bWVudEltcGwoU1ZHRE9NSW1wbGVtZW50YXRpb246OnNlbGYoKSk7CisvLwkJW19wcml2YXRl
IHNldFNWR0RvY3VtZW50OnN2Z0RvY107CisvLwl9CisvLwlyZXR1cm4gc2VsZjsKKy8vfQorCisK
Ky0gKGlkKWluaXRXaXRoU1ZHRGF0YTooTlNEYXRhICopZGF0YQoreworICAgIHNlbGYgPSBbc3Vw
ZXIgaW5pdF07CisgICAgaWYgKCFzZWxmKQorICAgICAgICByZXR1cm4gbmlsOworICAgIAorICAg
IF9wcml2YXRlID0gW1tEcmF3RG9jdW1lbnRQcml2YXRlIGFsbG9jXSBpbml0XTsKKyAgICAKKyAg
ICAvLyB0b3RhbCBoYWNrIQorICAgIC8vIHRoaXMgaXMgbmVlZGVkIHVudGlsIHBvc3QtcGFyc2Ug
YXR0YWNoIHdvcmtzLgorICAgIC8vIHRoZXNlIGFyZSBsZWFraW5nIGZvciBub3cuLi4KKyAgICBL
U1ZHUGFydCAqZHVtbXlQYXJ0ID0gbmV3IEtTVkdQYXJ0KCk7CisgICAgS1NWR1ZpZXcgKmR1bW15
U1ZHVmlldyA9IHN0YXRpY19jYXN0PEtTVkdWaWV3ICo+KGR1bW15UGFydC0+dmlldygpKTsKKyAg
ICBfcHJpdmF0ZS0+ZHVtbXlWaWV3ID0gIHN0YXRpY19jYXN0PEtDYW52YXNWaWV3UXVhcnR6ICo+
KGR1bW15U1ZHVmlldy0+Y2FudmFzVmlldygpKTsKKyAgICAvLyBGSVhNRTogSEFDSzogSSByZWFs
bHkgbmVlZCB0byBiZSB0cmFja2luZyB0aGVzZSBwYXJ0cy92aWV3cyBjb3JyZWN0bHkuLi4KKyAg
ICAKKyAgICBbX3ByaXZhdGUgc2V0UHJpbWFyeVZpZXc6X3ByaXZhdGUtPmR1bW15Vmlld107Cisg
ICAgCisgICAgLy8gQnVpbGRlciBpcyBvd25lZCAoZGVsZXRlZCkgYnkgcGFyc2VyLi4uCisgICAg
S1NWRzo6RG9jdW1lbnRCdWlsZGVyICpidWlsZGVyID0gbmV3IEtTVkc6OkRvY3VtZW50QnVpbGRl
cihkdW1teVNWR1ZpZXcpOworICAgIEtET006OkxpYlhNTFBhcnNlciAqcGFyc2VyID0gbmV3IEtE
T006OkxpYlhNTFBhcnNlcihLVVJMKCkpOworICAgIHBhcnNlci0+c2V0RG9jdW1lbnRCdWlsZGVy
KGJ1aWxkZXIpOworICAgIAorICAgIC8vIG5vIGVudGl0eSByZWZzCisgICAgcGFyc2VyLT5kb21D
b25maWcoKS0+c2V0UGFyYW1ldGVyKEtET006OkVOVElUSUVTLmltcGxlbWVudGF0aW9uKCksIGZh
bHNlKTsKKyAgICBwYXJzZXItPmRvbUNvbmZpZygpLT5zZXRQYXJhbWV0ZXIoS0RPTTo6RUxFTUVO
VF9DT05URU5UX1dISVRFU1BBQ0UuaW1wbGVtZW50YXRpb24oKSwgZmFsc2UpOworICAgIAorICAg
IC8vIEZlZWQgdGhlIHBhcnNlciB0aGUgd2hvbGUgZG9jdW1lbnQgKGEgdG90YWwgaGFjaykKKyAg
ICBwYXJzZXItPmRvT25lU2hvdFBhcnNlKChjb25zdCBjaGFyICopW2RhdGEgYnl0ZXNdLCBbZGF0
YSBsZW5ndGhdKTsKKyAgICAKKyAgICBTVkdEb2N1bWVudEltcGwgKnN2Z0RvYyA9IHN0YXRpY19j
YXN0PFNWR0RvY3VtZW50SW1wbCAqPihwYXJzZXItPmRvY3VtZW50KCkuaGFuZGxlKCkpOworICAg
IFtfcHJpdmF0ZSBzZXRTVkdEb2N1bWVudDpzdmdEb2NdOworICAgIGRlbGV0ZSBwYXJzZXI7IC8v
IHdlJ3JlIGRvbmUgcGFyc2luZy4KKyAgICBpZighX3ByaXZhdGUtPnN2Z0RvY3VtZW50KSB7Cisg
ICAgICAgIE5TTG9nKEAiRmFpbGVkIHRvIGdldCBkb2N1bWVudCEiKTsKKyAgICAgICAgW3NlbGYg
cmVsZWFzZV07CisgICAgICAgIHJldHVybiBuaWw7CisgICAgfQorICAgIAorICAgIC8vIEZJWE1F
OiB0ZW1wb3JhcnkKKyAgICAvLyB0aGlzIG5lZWRzIHRvIGdvIHNvbWV3aGVyZSBpbiBrc3ZnMgor
ICAgIGlmICgoX3ByaXZhdGUtPmNhbnZhcy0+Y2FudmFzU2l6ZSgpID09IFFTaXplKC0xLC0xKSkg
JiYgX3ByaXZhdGUtPmNhbnZhcy0+cm9vdENvbnRhaW5lcigpKSB7CisgICAgICAgIFFSZWN0IGNh
bnZhc0JvdW5kcyA9IF9wcml2YXRlLT5jYW52YXMtPnJvb3RDb250YWluZXIoKS0+YmJveCgpOwor
ICAgICAgICBfcHJpdmF0ZS0+Y2FudmFzLT5zZXRDYW52YXNTaXplKFFTaXplKGFicyhjYW52YXNC
b3VuZHMueCgpKSArIGNhbnZhc0JvdW5kcy53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhjYW52YXNCb3VuZHMueSgpKSArIGNhbnZhc0Jv
dW5kcy5oZWlnaHQoKSkpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc2VsZjsKK30KKworLSAo
aWQpaW5pdFdpdGhDb250ZW50c09mRmlsZTooTlNTdHJpbmcgKilwYXRoCit7CisgICAgTlNEYXRh
ICpkYXRhID0gW05TRGF0YSBkYXRhV2l0aENvbnRlbnRzT2ZGaWxlOnBhdGhdOworICAgIGlmIChb
W3BhdGggcGF0aEV4dGVuc2lvbl0gaXNFcXVhbFRvU3RyaW5nOkAic3ZnIl0pIHsKKyAgICAgICAg
Ly9OU0xvZyhAIkxvYWRpbmcgU1ZHIERhdGEgZnJvbSBmaWxlOiAlQCIsIHBhdGgpOworICAgICAg
ICBzZWxmID0gW3NlbGYgaW5pdFdpdGhTVkdEYXRhOmRhdGFdOworICAgIH0gZWxzZSB7CisgICAg
ICAgIE5TTG9nKEAiRXJyb3I6IEFza2VkIHRvIGNyZWF0ZSBEcmF3RG9jdW1lbnQgZnJvbSB1bnN1
cHBvcnRlZCBmaWxlIHR5cGUhICBGaWxlOiAlQCIsIHBhdGgpOworICAgICAgICBbc2VsZiByZWxl
YXNlXTsKKyAgICAgICAgc2VsZiA9IG5pbDsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisK
Ky0gKHZvaWQpZGVhbGxvYworeworICAgIFtfcHJpdmF0ZSByZWxlYXNlXTsKKyAgICBbc3VwZXIg
ZGVhbGxvY107Cit9CisKKy0gKE5TU3RyaW5nICopdGl0bGUKK3sKKyAgICAvLyBEZXRlY3QgdGl0
bGUgaWYgcG9zc2libGUuLi4KKyAgICBLRE9NOjpET01TdHJpbmcgdGl0bGUgPSBfcHJpdmF0ZS0+
c3ZnRG9jdW1lbnQtPnRpdGxlKCk7CisgICAgcmV0dXJuIHRpdGxlLnN0cmluZygpLmdldE5TU3Ry
aW5nKCk7Cit9CisKKy0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24KK3sKKyAgICAvLyBEZXRlY3Qg
ZGVzY3JpcHRpb24gaWYgcG9zc2libGUuLi4KKy8vICBLRE9NOjpOb2RlTGlzdEltcGwgKmRlc2NM
aXN0ID0gX3ByaXZhdGUtPnN2Z0RvY3VtZW50LT5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGVzYyIp
OworLy8gIGlmKGRlc2NMaXN0ICYmIChkZXNjTGlzdC0+bGVuZ3RoKCkgPiAwKSkgeworLy8gIFNW
R0Rlc2NFbGVtZW50SW1wbCAqZGVzY0ltcGwgPSBkeW5hbWljX2Nhc3Q8U1ZHRGVzY0VsZW1lbnRJ
bXBsICo+KGRlc2NMaXN0LT5pdGVtKDApKTsKKy8vICByZXR1cm4gZGVzY0ltcGwtPmRlc2NyaXB0
aW9uKCkuc3RyaW5nKCkuZ2V0TlNTdHJpbmcoKTsKKy8vICB9CisgICAgcmV0dXJuIG5pbDsKK30K
KworLy8gaW50ZXJuYWwgU1BJCistIChEcmF3VmlldyAqKXByaW1hcnlWaWV3Cit7CisgICAgaWYg
KF9wcml2YXRlLT5wcmltYXJ5VmlldykKKyAgICAgICAgcmV0dXJuIF9wcml2YXRlLT5wcmltYXJ5
Vmlldy0+dmlldygpOworICAgIHJldHVybiBuaWw7Cit9CisKKy0gKHZvaWQpc2V0UHJpbWFyeVZp
ZXc6KERyYXdWaWV3ICopdmlldworeworICAgIFtfcHJpdmF0ZSBzZXRQcmltYXJ5VmlldzooS0Nh
bnZhc1ZpZXdRdWFydHogKilbdmlldyBjYW52YXNWaWV3XV07Cit9CisKKy0gKHZvaWQpcmVnaXN0
ZXJWaWV3OihEcmF3VmlldyAqKXZpZXcKK3sKKyAgICBpZiAoIV9wcml2YXRlLT5wcmltYXJ5Vmll
dyB8fCAoX3ByaXZhdGUtPnByaW1hcnlWaWV3ID09IF9wcml2YXRlLT5kdW1teVZpZXcpKQorICAg
ICAgICBbc2VsZiBzZXRQcmltYXJ5Vmlldzp2aWV3XTsKKyAgICBlbHNlCisgICAgICAgIF9wcml2
YXRlLT5jYW52YXMtPmFkZFZpZXcoW3ZpZXcgY2FudmFzVmlld10pOworfQorCistICh2b2lkKXVu
cmVnaXN0ZXJWaWV3OihEcmF3VmlldyAqKXZpZXcKK3sKKyAgICBfcHJpdmF0ZS0+Y2FudmFzLT5y
ZW1vdmVWaWV3KFt2aWV3IGNhbnZhc1ZpZXddKTsKK30KKworLSAoTlNTdHJpbmcgKilzdmdUZXh0
Cit7CisgICAgUVN0cmluZyAqZHVtcFRleHQgPSBuZXcgUVN0cmluZygpOworICAgIFFUZXh0U3Ry
ZWFtIGR1bXBTdHJlYW0oZHVtcFRleHQsIElPX1dyaXRlT25seSk7CisgICAgS0RPTTo6SGVscGVy
OjpQcmludE5vZGUoZHVtcFN0cmVhbSwgX3ByaXZhdGUtPnN2Z0RvY3VtZW50KTsKKyAgICBOU1N0
cmluZyAqc3ZnVGV4dCA9IGR1bXBUZXh0LT5nZXROU1N0cmluZygpOworICAgIGRlbGV0ZSBkdW1w
VGV4dDsKKyAgICAKKyAgICByZXR1cm4gc3ZnVGV4dDsKK30KKworQGVuZAorCitAaW1wbGVtZW50
YXRpb24gRHJhd0RvY3VtZW50IChEcmF3TW91c2VFdmVudHMpCisKKy0gKEJPT0wpZG9jdW1lbnRM
aXN0ZW5zRm9yTW91c2VNb3ZlZEV2ZW50cworeworICAgIFNWR0RvY3VtZW50SW1wbCAqZG9jdW1l
bnQgPSBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQ7CisgICAgCisgICAgcmV0dXJuIChkb2N1bWVudCAm
JgkKKyAgICAgICAgICAgIChkb2N1bWVudC0+aGFzTGlzdGVuZXJUeXBlKEtET006OkRPTUZPQ1VT
T1VUX0VWRU5UKSB8fAorICAgICAgICAgICAgIGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RP
TTo6TU9VU0VPVkVSX0VWRU5UKSB8fAorICAgICAgICAgICAgIGRvY3VtZW50LT5oYXNMaXN0ZW5l
clR5cGUoS0RPTTo6TU9VU0VNT1ZFX0VWRU5UKSB8fAorICAgICAgICAgICAgIGRvY3VtZW50LT5o
YXNMaXN0ZW5lclR5cGUoS0RPTTo6TU9VU0VPVVRfRVZFTlQpKSk7Cit9CisKKy0gKEJPT0wpZG9j
dW1lbnRMaXN0ZW5zRm9yTW91c2VEb3duRXZlbnRzCit7CisgICAgcmV0dXJuIChfcHJpdmF0ZS0+
c3ZnRG9jdW1lbnQgJiYgX3ByaXZhdGUtPnN2Z0RvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RP
TTo6TU9VU0VET1dOX0VWRU5UKSk7Cit9CisKKy0gKEJPT0wpZG9jdW1lbnRMaXN0ZW5zRm9yTW91
c2VVcEV2ZW50cworeworICAgIFNWR0RvY3VtZW50SW1wbCAqZG9jdW1lbnQgPSBfcHJpdmF0ZS0+
c3ZnRG9jdW1lbnQ7CisgICAgCisgICAgcmV0dXJuIChkb2N1bWVudCAmJgorICAgICAgICAgICAg
KGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RPTTo6RE9NRk9DVVNJTl9FVkVOVCkgfHwKKyAg
ICAgICAgICAgICBkb2N1bWVudC0+aGFzTGlzdGVuZXJUeXBlKEtET006OkRPTUFDVElWQVRFX0VW
RU5UKSB8fAorICAgICAgICAgICAgIGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoS0RPTTo6Q0xJ
Q0tfRVZFTlQpIHx8CisgICAgICAgICAgICAgZG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlwZShLRE9N
OjpNT1VTRVVQX0VWRU5UKSkpOworfQorCistIChLRE9NOjpNb3VzZUV2ZW50SW1wbCAqKW5ld01v
dXNlRXZlbnRXaXRoRXZlbnRJZDooS0RPTTo6RXZlbnRJZClldmVudElkIHFNb3VzZUV2ZW50OihR
TW91c2VFdmVudCAqKXFldmVudAoreworICAgIGlmICghX3ByaXZhdGUtPnN2Z0RvY3VtZW50KQor
ICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAKKyAgICBLRE9NOjpET01TdHJpbmcgZXZlbnRTdHJp
bmcgPSBLRE9NOjpET01JbXBsZW1lbnRhdGlvbkltcGw6OnNlbGYoKS0+aWRUb1R5cGUoZXZlbnRJ
ZCk7CisgICAgCisgICAgU1ZHU1ZHRWxlbWVudEltcGwgKnJvb3QgPSBfcHJpdmF0ZS0+c3ZnRG9j
dW1lbnQtPnJvb3RFbGVtZW50KCk7CisgICAgZmxvYXQgc2NhbGUgPSAocm9vdCA/IHJvb3QtPmN1
cnJlbnRTY2FsZSgpIDogMS4wKTsKKyAgICAKKyAgICAvLyBTZXR1cCBrZG9tICdNb3VzZUV2ZW50
Jy4uLgorICAgIEtET006Ok1vdXNlRXZlbnRJbXBsICpldmVudCA9IHN0YXRpY19jYXN0PEtET006
Ok1vdXNlRXZlbnRJbXBsICo+KF9wcml2YXRlLT5zdmdEb2N1bWVudC0+Y3JlYXRlRXZlbnQoIk1v
dXNlRXZlbnRzIikpOworICAgIGV2ZW50LT5yZWYoKTsKKyAgICAKKyAgICBldmVudC0+aW5pdE1v
dXNlRXZlbnQoZXZlbnRTdHJpbmcsIHFldmVudCwgc2NhbGUpOworICAgIHJldHVybiBldmVudDsK
K30KKworTlNDdXJzb3IgKmN1cnNvckZvclN0eWxlKEtET006OlJlbmRlclN0eWxlICpzdHlsZSkK
K3sKKyAgICBpZighc3R5bGUpIHJldHVybiBuaWw7CisgICAgTlNDdXJzb3IgKm5ld0N1cnNvciA9
IG5pbDsKKyAgICBzd2l0Y2goc3R5bGUtPmN1cnNvcigpKQorICAgIHsKKyAgICAgICAgY2FzZSBL
RE9NOjpDU19BVVRPOgorICAgICAgICBjYXNlIEtET006OkNTX0RFRkFVTFQ6CisgICAgICAgICAg
ICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjphcnJvd0N1cnNvcigpLmhhbmRsZSgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6Q1NfQ1JPU1M6CisgICAgICAgIGNhc2UgS0RP
TTo6Q1NfUFJPR1JFU1M6CisgICAgICAgICAgICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjpjcm9zc0N1
cnNvcigpLmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6
Q1NfUE9JTlRFUjoKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OmhhbmRDdXJzb3Io
KS5oYW5kbGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtET006OkNTX01P
VkU6CisgICAgICAgICAgICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjpzaXplQWxsQ3Vyc29yKCkuaGFu
ZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLRE9NOjpDU19FX1JFU0la
RToKKyAgICAgICAgY2FzZSBLRE9NOjpDU19XX1JFU0laRToKKyAgICAgICAgICAgIG5ld0N1cnNv
ciA9IEtDdXJzb3I6OnNpemVIb3JDdXJzb3IoKS5oYW5kbGUoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEtET006OkNTX05FX1JFU0laRToKKyAgICAgICAgY2FzZSBLRE9NOjpD
U19TV19SRVNJWkU6CisgICAgICAgICAgICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjpzaXplQkRpYWdD
dXJzb3IoKS5oYW5kbGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtET006
OkNTX05XX1JFU0laRToKKyAgICAgICAgY2FzZSBLRE9NOjpDU19TRV9SRVNJWkU6CisgICAgICAg
ICAgICBuZXdDdXJzb3IgPSBLQ3Vyc29yOjpzaXplRkRpYWdDdXJzb3IoKS5oYW5kbGUoKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtET006OkNTX05fUkVTSVpFOgorICAgICAg
ICBjYXNlIEtET006OkNTX1NfUkVTSVpFOgorICAgICAgICAgICAgbmV3Q3Vyc29yID0gS0N1cnNv
cjo6c2l6ZVZlckN1cnNvcigpLmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgS0RPTTo6Q1NfVEVYVDoKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6Omli
ZWFtQ3Vyc29yKCkuaGFuZGxlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBL
RE9NOjpDU19XQUlUOgorICAgICAgICAgICAgbmV3Q3Vyc29yID0gS0N1cnNvcjo6d2FpdEN1cnNv
cigpLmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RPTTo6Q1Nf
SEVMUDoKKyAgICAgICAgICAgIG5ld0N1cnNvciA9IEtDdXJzb3I6OndoYXRzVGhpc0N1cnNvcigp
LmhhbmRsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
IE5TTG9nKEAic2V0dGluZyBkZWZhdWx0IG1vdXNlIGN1cnNvciIpOworICAgICAgICAgICAgbmV3
Q3Vyc29yID0gS0N1cnNvcjo6YXJyb3dDdXJzb3IoKS5oYW5kbGUoKTsKKyAgICB9CisgICAgcmV0
dXJuIG5ld0N1cnNvcjsKK30KKworLSAoTlNDdXJzb3IgKiljdXJzb3JBZnRlclByb3BhZ2F0aW5n
TW91c2VNb3ZlZEV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgZnJvbVZpZXc6KERyYXdWaWV3ICop
dmlldworeworICAgIE5TQ3Vyc29yICpuZXdDdXJzb3IgPSBbTlNDdXJzb3IgYXJyb3dDdXJzb3Jd
OworICAgIAorICAgIFFNb3VzZUV2ZW50ICpldmVudCA9IG5ldyBRTW91c2VFdmVudChRRXZlbnQ6
Ok1vdXNlTW92ZSwgdGhlRXZlbnQpOworICAgIEtET006Ok1vdXNlRXZlbnRJbXBsICptZXYgPSBb
c2VsZiBuZXdNb3VzZUV2ZW50V2l0aEV2ZW50SWQ6S0RPTTo6TU9VU0VNT1ZFX0VWRU5UIHFNb3Vz
ZUV2ZW50OmV2ZW50XTsKKyAgICBpZihtZXYpCisgICAgeworICAgICAgICAvLyBGSVhNRSB0aGlz
IG1hcHBpbmcgc2hvdWxkIGJlIGRvbmUgZWxzZXdoZXJlLi4uCisgICAgICAgIE5TUG9pbnQgdmll
d1BvaW50ID0gW3ZpZXcgY29udmVydFBvaW50Olt0aGVFdmVudCBsb2NhdGlvbkluV2luZG93XSBm
cm9tVmlldzpuaWxdOworICAgICAgICBRUG9pbnQgY2FudmFzUG9pbnQgPSBRUG9pbnQoW3ZpZXcg
bWFwVmlld1BvaW50VG9DYW52YXM6dmlld1BvaW50XSk7CisgICAgICAgIF9wcml2YXRlLT5zdmdE
b2N1bWVudC0+cHJlcGFyZU1vdXNlRXZlbnQoZmFsc2UsIGNhbnZhc1BvaW50LngoKSwgY2FudmFz
UG9pbnQueSgpLCBtZXYpOworICAgICAgICAKKyAgICAgICAgS0RPTTo6RWxlbWVudEltcGwgKnRh
cmdldCA9IHN0YXRpY19jYXN0PEtET006OkVsZW1lbnRJbXBsICo+KG1ldi0+cmVsYXRlZFRhcmdl
dCgpKTsKKyAgICAgICAgaWYodGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICBLRE9NOjpS
ZW5kZXJTdHlsZSAqc3R5bGUgPSB0YXJnZXQtPnJlbmRlclN0eWxlKCk7CisgICAgICAgICAgICBu
ZXdDdXJzb3IgPSBjdXJzb3JGb3JTdHlsZShzdHlsZSk7CisgICAgICAgIH0KKyAgICAgICAgbWV2
LT5kZXJlZigpOworICAgIH0KKyAgICByZXR1cm4gbmV3Q3Vyc29yOworfQorCistICh2b2lkKXBy
b3BhZ2F0ZU1vdXNlVXBFdmVudDooTlNFdmVudCAqKXRoZUV2ZW50IGZyb21WaWV3OihEcmF3Vmll
dyAqKXZpZXcKK3sKKyAgICBRTW91c2VFdmVudCAqZXZlbnQgPSBuZXcgUU1vdXNlRXZlbnQoUUV2
ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2UsIHRoZUV2ZW50KTsKKyAgICBLRE9NOjpNb3VzZUV2ZW50
SW1wbCAqbWV2ID0gW3NlbGYgbmV3TW91c2VFdmVudFdpdGhFdmVudElkOktET006Ok1PVVNFVVBf
RVZFTlQgcU1vdXNlRXZlbnQ6ZXZlbnRdOworICAgIGlmKG1ldikKKyAgICB7CisgICAgICAgIC8v
IEZJWE1FIHRoaXMgbWFwcGluZyBzaG91bGQgYmUgZG9uZSBlbHNld2hlcmUuLi4KKyAgICAgICAg
TlNQb2ludCB2aWV3UG9pbnQgPSBbdmlldyAgY29udmVydFBvaW50Olt0aGVFdmVudCBsb2NhdGlv
bkluV2luZG93XSBmcm9tVmlldzpuaWxdOworICAgICAgICBRUG9pbnQgY2FudmFzUG9pbnQgPSBR
UG9pbnQoW3ZpZXcgbWFwVmlld1BvaW50VG9DYW52YXM6dmlld1BvaW50XSk7CisgICAgICAgIF9w
cml2YXRlLT5zdmdEb2N1bWVudC0+cHJlcGFyZU1vdXNlRXZlbnQoZmFsc2UsIGNhbnZhc1BvaW50
LngoKSwgY2FudmFzUG9pbnQueSgpLCBtZXYpOworICAgICAgICBtZXYtPmRlcmVmKCk7CisgICAg
fQorfQorCistICh2b2lkKXByb3BhZ2F0ZU1vdXNlRG93bkV2ZW50OihOU0V2ZW50ICopdGhlRXZl
bnQgZnJvbVZpZXc6KERyYXdWaWV3ICopdmlldworeworICAgIFFNb3VzZUV2ZW50ICpldmVudCA9
IG5ldyBRTW91c2VFdmVudChRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsIHRoZUV2ZW50KTsKKyAg
ICBLRE9NOjpNb3VzZUV2ZW50SW1wbCAqbWV2ID0gW3NlbGYgbmV3TW91c2VFdmVudFdpdGhFdmVu
dElkOktET006Ok1PVVNFRE9XTl9FVkVOVCBxTW91c2VFdmVudDpldmVudF07CisgICAgaWYobWV2
KQorICAgIHsKKyAgICAgICAgLy8gRklYTUUgdGhpcyBtYXBwaW5nIHNob3VsZCBiZSBkb25lIGVs
c2V3aGVyZS4uLgorICAgICAgICBOU1BvaW50IHZpZXdQb2ludCA9IFt2aWV3IGNvbnZlcnRQb2lu
dDpbdGhlRXZlbnQgbG9jYXRpb25JbldpbmRvd10gZnJvbVZpZXc6bmlsXTsKKyAgICAgICAgUVBv
aW50IGNhbnZhc1BvaW50ID0gUVBvaW50KFt2aWV3IG1hcFZpZXdQb2ludFRvQ2FudmFzOnZpZXdQ
b2ludF0pOworICAgICAgICBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQtPnByZXBhcmVNb3VzZUV2ZW50
KGZhbHNlLCBjYW52YXNQb2ludC54KCksIGNhbnZhc1BvaW50LnkoKSwgbWV2KTsKKyAgICAgICAg
bWV2LT5kZXJlZigpOworICAgIH0KK30KKworCitAZW5kCisKK0BpbXBsZW1lbnRhdGlvbiBEcmF3
RG9jdW1lbnQgKEtDYW52YXNNYW5pcHVsYXRpb24pCisKKy8vIFNQSQorLSAoS0NhbnZhcyAqKWNh
bnZhcworeworICAgIHJldHVybiBfcHJpdmF0ZS0+Y2FudmFzOworfQorCistIChOU1NpemUpY2Fu
dmFzU2l6ZQoreworICAgIEtDYW52YXMgKmNhbnZhcyA9IFtzZWxmIGNhbnZhc107CisgICAgaWYg
KCFjYW52YXMpCisgICAgICAgIHJldHVybiBOU1plcm9TaXplOworICAgIHJldHVybiBOU1NpemUo
Y2FudmFzLT5jYW52YXNTaXplKCkpOworfQorCisKKy0gKHZvaWQpc2l6ZUNhbnZhc1RvRml0Q29u
dGVudAoreworICAgIE5TUmVjdCBjYW52YXNCb3VuZHMgPSBOU1JlY3QoX3ByaXZhdGUtPmNhbnZh
cy0+cm9vdENvbnRhaW5lcigpLT5iYm94KCkpOworICAgIGlmICghTlNFcXVhbFJlY3RzKGNhbnZh
c0JvdW5kcywgTlNaZXJvUmVjdCkpIHsKKyAgICAgICAgTlNMb2coQCJ6b29taW5nIHRvIHJlY3Q6
ICVAIiwgTlNTdHJpbmdGcm9tUmVjdChjYW52YXNCb3VuZHMpKTsKKyAgICAgICAgX3ByaXZhdGUt
PmNhbnZhcy0+c2V0Q2FudmFzU2l6ZShRU2l6ZShpbnQoYWJzKChpbnQpY2FudmFzQm91bmRzLm9y
aWdpbi54KSArIGNhbnZhc0JvdW5kcy5zaXplLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQoYWJzKChpbnQpY2FudmFzQm91bmRzLm9yaWdp
bi55KSArIGNhbnZhc0JvdW5kcy5zaXplLmhlaWdodCkpKTsKKyAgICAgICAgLy8gdGhpcyBwYW4g
c2hvdWxkIGJlIG1vdmVkIG91dCBvZiB0aGUgZG9jLi4uCisgICAgICAgIFtbc2VsZiBwcmltYXJ5
Vmlld10gc2V0Q2FudmFzVmlzaWJsZU9yaWdpbjpOU01ha2VQb2ludChjYW52YXNCb3VuZHMub3Jp
Z2luLnggKiAtMSwgY2FudmFzQm91bmRzLm9yaWdpbi55ICogLTEpXTsKKyAgICB9Cit9CisKKwor
LSAoRHJhd0NhbnZhc0l0ZW0gKiljYW52YXNJdGVtQXRQb2ludDooTlNQb2ludCljYW52YXNIaXRQ
b2ludAoreworICAgIEtDYW52YXNJdGVtTGlzdCBoaXRJdGVtczsKKyAgICAKKyAgICBfcHJpdmF0
ZS0+Y2FudmFzLT5jb2xsaXNpb25zKFFQb2ludChjYW52YXNIaXRQb2ludCksIGhpdEl0ZW1zKTsK
KyAgICAKKyAgICBOU0xvZyhAImNhbnZhc0l0ZW1BdFBvaW50OiVAIGhpdCAlaSBpdGVtcyIsIE5T
U3RyaW5nRnJvbVBvaW50KGNhbnZhc0hpdFBvaW50KSwgaGl0SXRlbXMuY291bnQoKSk7CisgICAg
S0NhbnZhc0l0ZW1MaXN0OjpJdGVyYXRvciBpdCA9IGhpdEl0ZW1zLmJlZ2luKCk7CisgICAgS0Nh
bnZhc0l0ZW1MaXN0OjpJdGVyYXRvciBlbmQgPSBoaXRJdGVtcy5lbmQoKTsKKyAgICBmb3IoOyBp
dCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgTlNMb2coQCJjYW52YXNJdGVtQXRQb2ludDogaGl0
IGl0ZW0gd2l0aCBiYm94OiAlQCIsIE5TU3RyaW5nRnJvbVJlY3QoTlNSZWN0KCgqaXQpLT5iYm94
KCkpKSk7CisgICAgfQorICAgIAorICAgIGlmICghaGl0SXRlbXMuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gW0RyYXdDYW52YXNJdGVtIGNhbnZhc0l0ZW1Gb3JJdGVtOihLQ2FudmFzSXRlbSAq
KWhpdEl0ZW1zLmxhc3QoKV07CisgICAgCisgICAgcmV0dXJuIG5pbDsKK30KKworLSAodm9pZCly
ZW1vdmVJdGVtRnJvbURPTTooRHJhd0NhbnZhc0l0ZW0gKiljYW52YXNJdGVtCit7CisgICAgaWYg
KGNhbnZhc0l0ZW0pIHsKKyAgICAgICAgS0NhbnZhc0l0ZW0gKmNJdGVtID0gW2NhbnZhc0l0ZW0g
aXRlbV07CisgICAgICAgIEtET006Ok5vZGVJbXBsICpub2RlID0gKEtET006Ok5vZGVJbXBsICop
Y0l0ZW0tPnVzZXJEYXRhKCk7CisgICAgICAgIEtET006Ok5vZGVJbXBsICpwYXJlbnQgPSBub2Rl
LT5wYXJlbnROb2RlKCk7CisgICAgICAgIHBhcmVudC0+cmVtb3ZlQ2hpbGQobm9kZSk7CisgICAg
fQorfQorCistIChEcmF3Q2FudmFzSXRlbSAqKWNyZWF0ZUl0ZW1Gb3JUb29sOihpbnQpdG9vbCBh
dFBvaW50OihOU1BvaW50KW1vdXNlUG9pbnR7CisgICAgS0RPTTo6RWxlbWVudEltcGwgKm5ld0Vs
ZW1lbnQgPSBOVUxMOworICAgIEtDYW52YXNJdGVtICpuZXdDYW52YXNJdGVtID0gTlVMTDsKKyAg
ICAKKyAgICBzd2l0Y2ggKHRvb2wpIHsKKwljYXNlIERyYXdWaWV3VG9vbEVsaXBzZToKKwl7Cisg
ICAgICAgICAgICBuZXdFbGVtZW50ID0gX3ByaXZhdGUtPnN2Z0RvY3VtZW50LT5jcmVhdGVFbGVt
ZW50KCJlbGxpcHNlIik7CisgICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGVOUyhL
RE9NOjpOU19TVkcsICJjeCIsIFFTdHJpbmc6Om51bWJlcihtb3VzZVBvaW50LngpKTsKKyAgICAg
ICAgICAgIG5ld0VsZW1lbnQtPnNldEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgImN5IiwgUVN0
cmluZzo6bnVtYmVyKG1vdXNlUG9pbnQueSkpOworICAgICAgICAgICAgYnJlYWs7CisJfQorCWNh
c2UgRHJhd1ZpZXdUb29sVHJpYW5nbGU6CisgICAgICAgICAgICBicmVhazsKKwljYXNlIERyYXdW
aWV3VG9vbFJlY3RhbmdsZToKKwl7CisgICAgICAgICAgICBuZXdFbGVtZW50ID0gX3ByaXZhdGUt
PnN2Z0RvY3VtZW50LT5jcmVhdGVFbGVtZW50KCJyZWN0Iik7CisgICAgICAgICAgICBuZXdFbGVt
ZW50LT5zZXRBdHRyaWJ1dGVOUyhLRE9NOjpOU19TVkcsICJ4IiwgUVN0cmluZzo6bnVtYmVyKG1v
dXNlUG9pbnQueCkpOworICAgICAgICAgICAgbmV3RWxlbWVudC0+c2V0QXR0cmlidXRlTlMoS0RP
TTo6TlNfU1ZHLCAieSIsIFFTdHJpbmc6Om51bWJlcihtb3VzZVBvaW50LnkpKTsKKyAgICAgICAg
ICAgIGJyZWFrOworCX0KKwljYXNlIERyYXdWaWV3VG9vbExpbmU6CisJY2FzZSBEcmF3Vmlld1Rv
b2xQb2x5TGluZToKKwljYXNlIERyYXdWaWV3VG9vbEFyYzoKKyAgICAgICAgICAgIC8vIHRoZXNl
IGp1c3QgZG9uJ3QgcmVhbGx5IHdvcmsgd2l0aCB0aGlzIG1vZGVsLi4uCisJZGVmYXVsdDoKKyAg
ICAgICAgICAgIE5TTG9nKEAiQ2FuJ3QgY3JlYXRlIGl0ZW0gZm9yIHVuc3VwcG9ydGVkIHRvb2wu
Iik7CisgICAgfQorICAgIGlmIChuZXdFbGVtZW50KSB7CisgICAgICAgIG5ld0VsZW1lbnQtPnNl
dEF0dHJpYnV0ZU5TKEtET006Ok5TX1NWRywgImZpbGwiLCAibmF2eSIpOworICAgICAgICBTVkdT
VkdFbGVtZW50SW1wbCAqcm9vdE5vZGUgPSBfcHJpdmF0ZS0+c3ZnRG9jdW1lbnQtPnJvb3RFbGVt
ZW50KCk7CisgICAgICAgIHJvb3ROb2RlLT5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTsKKyAgICAg
ICAgbmV3RWxlbWVudC0+cmVmKCk7IC8vIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5
Li4uCisgICAgICAgIG5ld0VsZW1lbnQtPmF0dGFjaCgpOyAvLyBhdHRhY2ggaXQgdG8gdGhlIGNh
bnZhcy4KKyAgICAgICAgbmV3Q2FudmFzSXRlbSA9IHN0YXRpY19jYXN0PFNWR1N0eWxlZEVsZW1l
bnRJbXBsICo+KG5ld0VsZW1lbnQpLT5jYW52YXNJdGVtKCk7CisgICAgICAgIE5TTG9nKEAiU3Vj
Y2Vzc2Z1bGx5IGNyZWF0ZWQgZWxlbWVudDogJXAsIG5vdyBjYW52YXNJdGVtOiAlcCIsIG5ld0Vs
ZW1lbnQsICBuZXdDYW52YXNJdGVtKTsKKyAgICAgICAgCisgICAgICAgIGlmIChuZXdDYW52YXNJ
dGVtKSB7CisgICAgICAgICAgICAvLyB3cmFwIGl0IGluIGEgRHJhd0NhbnZhc0l0ZW0sIHJldHVy
bi4KKyAgICAgICAgICAgIHJldHVybiBbRHJhd0NhbnZhc0l0ZW0gY2FudmFzSXRlbUZvckl0ZW06
bmV3Q2FudmFzSXRlbV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5pbDsKK30KKwor
QGVuZAorCitAaW1wbGVtZW50YXRpb24gRHJhd0RvY3VtZW50IChTdXBlclByaXZhdGVTUElGb3JE
YXZpZCkKKworCisvLyBUaGlzIGlzIHJlYWxseSAiZHJhd0luUmVjdDogaW5DR0NvbnRleHQ6Cist
ICh2b2lkKWRyYXdSZWN0OihOU1JlY3QpZGVzdFJlY3QgaW5DR0NvbnRleHQ6KENHQ29udGV4dFJl
Ziljb250ZXh0Cit7CisgICAgaWYgKCFfcHJpdmF0ZS0+Y2FudmFzKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgc3RhdGljIEtSZW5kZXJpbmdEZXZpY2VDb250ZXh0UXVhcnR6ICpfX3NoYXJl
ZFF1YXJ0ekNvbnRleHQgPSBuaWw7CisgICAgaWYgKCFfX3NoYXJlZFF1YXJ0ekNvbnRleHQpCisg
ICAgICAgIF9fc2hhcmVkUXVhcnR6Q29udGV4dCA9IG5ldyBLUmVuZGVyaW5nRGV2aWNlQ29udGV4
dFF1YXJ0eigpOworICAgIAorICAgIEtSZW5kZXJpbmdEZXZpY2UgKnJlbmRlcmluZ0RldmljZSA9
IF9wcml2YXRlLT5jYW52YXMtPnJlbmRlcmluZ0RldmljZSgpOworICAgIAorICAgIC8vIHB1c2gg
dGhlIGRyYXdpbmcgY29udGV4dAorICAgIF9fc2hhcmVkUXVhcnR6Q29udGV4dC0+c2V0Q0dDb250
ZXh0KGNvbnRleHQpOworICAgIHJlbmRlcmluZ0RldmljZS0+cHVzaENvbnRleHQoX19zaGFyZWRR
dWFydHpDb250ZXh0KTsKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworICAgIAor
ICAgIC8vIHRyYW5zZm9ybSB0byB0aGUgZGVzdCByZWN0LgorICAgIE5TU2l6ZSBzb3VyY2VTaXpl
ID0gW3NlbGYgY2FudmFzU2l6ZV07CisgICAgQ0dSZWN0IHNvdXJjZVJlY3QgPSB7ezAsMH0se3Nv
dXJjZVNpemUud2lkdGgsIHNvdXJjZVNpemUuaGVpZ2h0fX07CisgICAgQ0dBZmZpbmVUcmFuc2Zv
cm0gbWFwID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlTWFwQmV0d2VlblJlY3RzKHNvdXJjZVJlY3Qs
KihDR1JlY3QgKikmZGVzdFJlY3QpOworICAgIENHQ29udGV4dENvbmNhdENUTShjb250ZXh0LG1h
cCk7CisgICAgCisgICAgLy8gZG8gdGhlIGRyYXcKKyAgICBfcHJpdmF0ZS0+Y2FudmFzLT5yb290
Q29udGFpbmVyKCktPmRyYXcoUVJlY3Qoc291cmNlUmVjdCkpOworICAgIAorICAgIC8vIHJlc3Rv
cmUgZHJhd2luZyBzdGF0ZQorICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7Cisg
ICAgcmVuZGVyaW5nRGV2aWNlLT5wb3BDb250ZXh0KCk7Cit9CisKK0BlbmQKKwpJbmRleDogRHJh
d0RvY3VtZW50UHJpdmF0ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IERyYXdEb2N1bWVudFByaXZh
dGUuaApkaWZmIC1OIERyYXdEb2N1bWVudFByaXZhdGUuaAotLS0gRHJhd0RvY3VtZW50UHJpdmF0
ZS5oCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIERyYXdEb2N1bWVudFByaXZhdGUuaAky
OSBKdWwgMjAwNSAxODo0MzoyNCAtMDAwMApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisvKgorIFdBUk5JTkc6IFRoZXNlIGZpbGVzIGFyZSB0ZW1wb3JhcnkgYW5kIGV4aXN0
IHNvbGVseSBmb3IgdGhlIHB1cnBvc2UKKyBvZiBhbGxvd2luZyBncmVhdGVyIHRlc3Rpbmcgb2Yg
V2ViQ29yZStTVkcgcHJpb3IgdG8gZnVsbCBET00gaW50ZWdyYXRpb24uCisgRG8gTk9UIGRlcGVu
ZCBvbiB0aGVzZSBTUElzIG9yIGZpbGVzIGFzIHRoZXkgd2lsbCBzb29uIGJlIGdvbmUuCisqLwor
CisKKyNpbXBvcnQgPFdlYkNvcmUrU1ZHL0RyYXdEb2N1bWVudC5oPgorCitAY2xhc3MgRHJhd1Zp
ZXc7CitAY2xhc3MgRHJhd0NhbnZhc0l0ZW07CisKK0BpbnRlcmZhY2UgRHJhd0RvY3VtZW50IChQ
cml2YXRlTWV0aG9kcykKKworLy8gcmVnaXN0ZXIgYXMgInByaW1hcnkiIHZpZXcgKHpvb20vcGFu
IG5vdGlmaWNhdGlvbnMpCistIChEcmF3VmlldyAqKXByaW1hcnlWaWV3OworLSAodm9pZClzZXRQ
cmltYXJ5VmlldzooRHJhd1ZpZXcgKil2aWV3OworCisvLyByZWdpc3Rlci91bnJlZ2lzdGVyIHcv
IERPTSwgZXRjLgorLSAodm9pZClyZWdpc3RlclZpZXc6KERyYXdWaWV3ICopdmlldzsKKy0gKHZv
aWQpdW5yZWdpc3RlclZpZXc6KERyYXdWaWV3ICopdmlldzsKKworQGVuZAorCitAaW50ZXJmYWNl
IERyYXdEb2N1bWVudCAoU3VwZXJQcml2YXRlU1BJRm9yRGF2aWQpCistICh2b2lkKWRyYXdSZWN0
OihOU1JlY3QpZGlydHlSZWN0IGluQ0dDb250ZXh0OihDR0NvbnRleHRSZWYpY29udGV4dDsKK0Bl
bmQKKworQGludGVyZmFjZSBEcmF3RG9jdW1lbnQgKERyYXdNb3VzZUV2ZW50cykKKy0gKEJPT0wp
ZG9jdW1lbnRMaXN0ZW5zRm9yTW91c2VNb3ZlZEV2ZW50czsKKy0gKEJPT0wpZG9jdW1lbnRMaXN0
ZW5zRm9yTW91c2VEb3duRXZlbnRzOworLSAoQk9PTClkb2N1bWVudExpc3RlbnNGb3JNb3VzZVVw
RXZlbnRzOworCistICh2b2lkKXByb3BhZ2F0ZU1vdXNlVXBFdmVudDooTlNFdmVudCAqKXRoZUV2
ZW50IGZyb21WaWV3OihEcmF3VmlldyAqKXZpZXc7CistICh2b2lkKXByb3BhZ2F0ZU1vdXNlRG93
bkV2ZW50OihOU0V2ZW50ICopdGhlRXZlbnQgZnJvbVZpZXc6KERyYXdWaWV3ICopdmlldzsKKy0g
KE5TQ3Vyc29yICopY3Vyc29yQWZ0ZXJQcm9wYWdhdGluZ01vdXNlTW92ZWRFdmVudDooTlNFdmVu
dCAqKXRoZUV2ZW50IGZyb21WaWV3OihEcmF3VmlldyAqKXZpZXc7CisKK0BlbmQKKworLyogVGhp
cyBzaG91bGQgcHJvYmFibHkgYnJlYWsgb3V0IGludG8gYW5vdGhlciBmaWxlL2NsYXNzICovCitA
aW50ZXJmYWNlIERyYXdEb2N1bWVudCAoS0NhbnZhc01hbmlwdWxhdGlvbikKKworLSAoTlNTaXpl
KWNhbnZhc1NpemU7CistICh2b2lkKXNpemVDYW52YXNUb0ZpdENvbnRlbnQ7CisKKy8qCisgVGhp
cyBjdXJyZW50bHkgKGhhY2tpc2hseSkgbWFuaXB1bGF0ZXMgdGhlIHJlbmRlciB0cmVlLgorIFRo
aXMgImRlc2lnbiIgZGVjaXNpb24gd2FzIG1hZGUgYmVjYXVzZSB0aGUgZG9tIGhpdCB0ZXN0aW5n
Cisgd2FzIG5vdCB3b3JraW5nIHByb3Blcmx5IGluIGtzdmcyIGF0IHRoZSB0aW1lLgorIEFueW9u
ZSB3cml0aW5nIGEgcmVhbCBlZGl0b3Igc2hvdWxkIHRvIGhpdCB0ZXN0aW5nIGFnYWluc3QKKyB0
aGUgRE9NLCB1c2luZyBPYmotQyBET00gaW50ZXJmYWNlcywgaW5zdGVhZCBvZiB0aGlzCisgdmVy
eSBoYWNraXNoIERyYXdDYW52YXNJdGVtIE9iai1DIFJlbmRlck9iamVjdCB3cmFwcGVyLgorKi8K
Ky0gKERyYXdDYW52YXNJdGVtICopY2FudmFzSXRlbUF0UG9pbnQ6KE5TUG9pbnQpY2FudmFzSGl0
UG9pbnQ7CistICh2b2lkKXJlbW92ZUl0ZW1Gcm9tRE9NOihEcmF3Q2FudmFzSXRlbSAqKWl0ZW07
CistIChEcmF3Q2FudmFzSXRlbSAqKWNyZWF0ZUl0ZW1Gb3JUb29sOihpbnQpdG9vbCBhdFBvaW50
OihOU1BvaW50KWNhbnZhc1BvaW50OworCitAZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQpJbmRleDogRHJhd1ZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBEcmF3Vmlldy5oCmRpZmYg
LU4gRHJhd1ZpZXcuaAotLS0gRHJhd1ZpZXcuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisr
KyBEcmF3Vmlldy5oCTI5IEp1bCAyMDA1IDE4OjQzOjI0IC0wMDAwCkBAIC0wLDAgKzEsOTIgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMgYXJlIHRlbXBv
cmFyeSBhbmQgZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93aW5nIGdyZWF0
ZXIgdGVzdGluZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRlZ3JhdGlvbi4K
KyBEbyBOT1QgZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3aWxsIHNvb24g
YmUgZ29uZS4KKyovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisKK0BjbGFzcyBEcmF3Vmll
d1ByaXZhdGU7CitAY2xhc3MgRHJhd0RvY3VtZW50OworCit0eXBlZGVmIGVudW0geworICAgIC8v
IHZpZXdpbmcgdG9vbHMKKyAgICBEcmF3Vmlld1Rvb2xCcm93c2UsIC8vIGNsaWNrIG9uIGxpbmtz
LCBpbnRlcmFjdCB3LyBqYXZhc2NyaXB0LCBldGMuCisgICAgRHJhd1ZpZXdUb29sUGFuLAorICAg
IERyYXdWaWV3VG9vbFpvb20sCisgICAgCisgICAgLy8gZWRpdGluZyB0b29scworICAgIERyYXdW
aWV3VG9vbEFycm93LCAvLyBzZWxlY3QsIGNoYW5nZSBzaXplLCBldGMuCisgICAgRHJhd1ZpZXdU
b29sTGluZSwKKyAgICBEcmF3Vmlld1Rvb2xFbGlwc2UsCisgICAgRHJhd1ZpZXdUb29sUmVjdGFu
Z2xlLAorICAgIERyYXdWaWV3VG9vbFRyaWFuZ2xlLCAvLyBnZW5lcmljIHBvbHlnb24gdG9vbD8K
KyAgICBEcmF3Vmlld1Rvb2xQb2x5TGluZSwKKyAgICBEcmF3Vmlld1Rvb2xBcmMsCisgICAgCit9
IERyYXdWaWV3VG9vbDsKKworQGludGVyZmFjZSBEcmF3VmlldyA6IE5TVmlldyB7CisgICAgCitA
cHJpdmF0ZQorICAgIERyYXdWaWV3VG9vbCBfdG9vbE1vZGU7CisgICAgQk9PTAlfaXNFZGl0YWJs
ZTsKKyAgICBOU0ltYWdlU2NhbGluZyBfc2NhbGVSdWxlOworICAgIAorICAgIERyYXdWaWV3UHJp
dmF0ZSAqX3ByaXZhdGU7Cit9CisKKy0gKERyYXdEb2N1bWVudCAqKWRvY3VtZW50OworLSAodm9p
ZClzZXREb2N1bWVudDooRHJhd0RvY3VtZW50ICopZG9jdW1lbnQ7CisKKy0gKE5TSW1hZ2VTY2Fs
aW5nKWltYWdlU2NhbGluZzsKKy0gKHZvaWQpc2V0SW1hZ2VTY2FsaW5nOihOU0ltYWdlU2NhbGlu
ZylzY2FsaW5nOworCistIChJQkFjdGlvbil6b29tSW46KGlkKXNlbmRlcjsKKy0gKElCQWN0aW9u
KXpvb21PdXQ6KGlkKXNlbmRlcjsKKy0gKElCQWN0aW9uKXpvb21PcmlnaW5hbDooaWQpc2VuZGVy
OworLSAoSUJBY3Rpb24pem9vbVRvRml0OihpZClzZW5kZXI7CisKKy8vIFdpbGwgc2l6ZSB0aGUg
dmlldyB0byBmaXQgd2hhdGV2ZXIgU1ZHIGRvY3VtZW50IGl0IGhhcyBpbiBpdC4KKy0gKHZvaWQp
c2l6ZVRvRml0Vmlld0JveDsKKy8vIHdpbGwgZml0IHdoYXRldmVyIHRoZSBjYW52YXMgc2l6ZSBp
cy4uLiAoZGVwcmVjYXRlZCkKKy0gKHZvaWQpc2l6ZVRvRml0Q2FudmFzOworCistIChpbnQpdG9v
bE1vZGU7CistICh2b2lkKXNldFRvb2xNb2RlOihpbnQpdG9vbE1vZGU7CisKKy8qIEVkaXRpbmcg
U3VwcG9ydCAqLworCistIChCT09MKWlzRWRpdGFibGU7CistICh2b2lkKXNldEVkaXRhYmxlOihC
T09MKWVkaXRhYmxlOworCistIChJQkFjdGlvbilkZWxldGVTZWxlY3Rpb246KGlkKXNlbmRlcjsK
Ky0gKElCQWN0aW9uKW1vdmVTZWxlY3Rpb25Gb3J3YXJkOihpZClzZW5kZXI7CistIChJQkFjdGlv
biltb3ZlU2VsZWN0aW9uQmFja3dhcmQ6KGlkKXNlbmRlcjsKKworQGVuZApJbmRleDogRHJhd1Zp
ZXcubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogRHJhd1ZpZXcubW0KZGlmZiAtTiBEcmF3Vmlldy5t
bQotLS0gRHJhd1ZpZXcubW0JMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgRHJhd1ZpZXcu
bW0JMjkgSnVsIDIwMDUgMTg6NDM6MjQgLTAwMDAKQEAgLTAsMCArMSw5MDIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKworI2ltcG9ydCAiRHJhd1ZpZXdQcml2YXRlLmgiCisjaW1wb3J0ICJEcmF3
Q2FudmFzSXRlbS5oIgorI2ltcG9ydCAiRHJhd0RvY3VtZW50UHJpdmF0ZS5oIgorCisjaW1wb3J0
IDxrY2FudmFzL0tDYW52YXMuaD4KKyNpbXBvcnQgPGtjYW52YXMvS0NhbnZhc0NvbnRhaW5lci5o
PgorI2ltcG9ydCA8a2NhbnZhcy9kZXZpY2UvcXVhcnR6L0tDYW52YXNWaWV3UXVhcnR6Lmg+Cisj
aW1wb3J0IDxrY2FudmFzL2RldmljZS9xdWFydHovS1JlbmRlcmluZ0RldmljZVF1YXJ0ei5oPgor
CisvLyBUaGlzIHNob3VsZCBnbyBpbiB0aGUgUHJlZml4IGhlYWRlciBldmVudHVhbGx5LgorI2Rl
ZmluZSBmb3JlYWNoYXJyYXkoX192YXJpYWJsZSwgX19jb250YWluZXIpIFwKK2ZvciAoaW50IF9f
dmFyaWFibGUjI19faT0wLCBfX3ZhcmlhYmxlIyNfX249W19fY29udGFpbmVyIGNvdW50XTsgIFwK
KyAgICAgX192YXJpYWJsZSMjX19pIDwgX192YXJpYWJsZSMjX19uICYmIChfX3ZhcmlhYmxlID0g
W19fY29udGFpbmVyIG9iamVjdEF0SW5kZXg6X192YXJpYWJsZSMjX19pXSk7ICBcCisgICAgICsr
X192YXJpYWJsZSMjX19pKQorCisjZGVmaW5lIE5TRGlmZmVyZW5jZVBvaW50KGEsYikgKE5TTWFr
ZVBvaW50KGEueC1iLngsIGEueS1iLnkpKQorI2RlZmluZSBOU1N1bVBvaW50KGEsYikgKE5TTWFr
ZVBvaW50KGEueCtiLngsIGEueStiLnkpKQorCisvLyBlZGl0aW5nIGtub2JzLgorI2RlZmluZSBL
Tk9CX1NJWkUgNgorI2RlZmluZSBLTk9CX0hBTEZfU0laRSAzCisKK3R5cGVkZWYgZW51bSB7Cisg
ICAgRHJhZ0FjdGlvbk5vbmUgPSAwLAorICAgIERyYWdBY3Rpb25QYW4sCisgICAgRHJhZ0FjdGlv
blJlc2l6ZSwKKyAgICBEcmFnQWN0aW9uTW92ZSwKKyAgICBEcmFnQWN0aW9uU2VsZWN0aW9uCit9
IERyYXdEcmFnQWN0aW9uOworCisvLyB0aGlzIGlzIHNvcnRhIGEgaGFjaworQGludGVyZmFjZSBE
cmF3RG9jdW1lbnQgKEludGVybmFsQ2FudmFzTWV0aG9kKQorLSAoS0NhbnZhcyAqKWNhbnZhczsK
K0BlbmQKKworCitAaW50ZXJmYWNlIERyYXdWaWV3UHJpdmF0ZSA6IE5TT2JqZWN0IHsKKyAgICBA
cHVibGljCisgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtczsKKyAgICAKKyAgICBEcmF3VmlldyAq
ZHJhd1ZpZXc7IC8vIHBvaW50ZXIgdG8gIm93bmVyIgorICAgIERyYXdEb2N1bWVudCAqZG9jdW1l
bnQ7CisgICAgCisgICAgTlNDb2xvciAqYmFja2dyb3VuZENvbG9yOworICAgIAorICAgIGludCBk
cmFnQ29udHJvbFBvaW50SW5kZXg7CisgICAgTlNQb2ludCBkcmFnU3RhcnRQb2ludDsKKyAgICBO
U1BvaW50IGxhc3REcmFnUG9pbnQ7CisgICAgTlNQb2ludCBjYW52YXNEcmFnQW5jaG9yUG9pbnQ7
IC8vIHVzZWQgbW9zdGx5IGZvciBncm91cCByZXNpemUuCisgICAgTlNQb2ludCBjYW52YXNEcmFn
T3JpZ2luT2Zmc2V0OworICAgIAorICAgIGludCB0cmFja2luZ1JlY3RUYWc7CisgICAgRHJhd0Ry
YWdBY3Rpb24gY3VycmVudERyYWdBY3Rpb247CisgICAgTlNSZWN0IHNlbGVjdGlvblJlY3Q7Cisg
ICAgCisgICAgTlNTaXplIF9tYXhTaXplOworICAgIAorICAgIC8vIHRlbXBvcmFyeSBoYWNrLCB3
aWxsIGV2ZW50dWFsbHkgYmUgc3RvcmVkIGluIHNjcm9sbHZpZXcvdmlldworICAgIGZsb2F0IGNh
bnZhc1pvb207CisgICAgTlNQb2ludCBjYW52YXN2aXNpYmxlT3JpZ2luOworICAgIAorICAgIEtD
YW52YXNWaWV3UXVhcnR6ICpjYW52YXNWaWV3OworICAgIEtSZW5kZXJpbmdEZXZpY2VDb250ZXh0
UXVhcnR6ICpxdWFydHpDb250ZXh0OworfQorQGVuZCAKKworQGltcGxlbWVudGF0aW9uIERyYXdW
aWV3UHJpdmF0ZQorCisrICh2b2lkKXNldEZpbHRlclN1cHBvcnRFbmFibGVkOihCT09MKWVuYWJs
ZWQKK3sKKyAgICBLUmVuZGVyaW5nRGV2aWNlUXVhcnR6OjpzZXRGaWx0ZXJzRW5hYmxlZChlbmFi
bGVkKTsKK30KKworKyAoQk9PTClpc0ZpbHRlclN1cHBvcnRFbmFibGVkCit7CisgICAgcmV0dXJu
IEtSZW5kZXJpbmdEZXZpY2VRdWFydHo6OmZpbHRlcnNFbmFibGVkKCk7Cit9CisKKy0gKGlkKWlu
aXRXaXRoRHJhd1ZpZXc6KERyYXdWaWV3ICopdmlldworeworICAgIGlmICgoc2VsZiA9IFtzdXBl
ciBpbml0XSkpIHsKKyAgICAgICAgZHJhd1ZpZXcgPSB2aWV3OworICAgICAgICBxdWFydHpDb250
ZXh0ID0gbmV3IEtSZW5kZXJpbmdEZXZpY2VDb250ZXh0UXVhcnR6KCk7CisgICAgICAgIGNhbnZh
c1ZpZXcgPSBuZXcgS0NhbnZhc1ZpZXdRdWFydHooKTsKKyAgICAgICAgY2FudmFzVmlldy0+c2V0
VmlldyhkcmF3Vmlldyk7CisgICAgICAgIGNhbnZhc1ZpZXctPnNldENvbnRleHQocXVhcnR6Q29u
dGV4dCk7CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChEcmF3RG9jdW1lbnQgKilk
b2N1bWVudAoreworICAgIHJldHVybiBkb2N1bWVudDsKK30KKworLSAodm9pZClzZXREb2N1bWVu
dDooRHJhd0RvY3VtZW50ICopZG9jCit7CisgICAgaWYgKGRvYyAhPSBkb2N1bWVudCkgeworICAg
ICAgICBbZG9jdW1lbnQgdW5yZWdpc3RlclZpZXc6ZHJhd1ZpZXddOworICAgICAgICBbZG9jdW1l
bnQgcmVsZWFzZV07CisgICAgICAgIGRvY3VtZW50ID0gW2RvYyByZXRhaW5dOworICAgICAgICBb
ZG9jdW1lbnQgcmVnaXN0ZXJWaWV3OmRyYXdWaWV3XTsKKyAgICAgICAgCisgICAgICAgIGRlbGV0
ZSBjYW52YXNWaWV3OworICAgICAgICBjYW52YXNWaWV3ID0gTlVMTDsKKyAgICAgICAgaWYgKGRv
Y3VtZW50KSB7CisgICAgICAgICAgICBjYW52YXNWaWV3ID0gbmV3IEtDYW52YXNWaWV3UXVhcnR6
KCk7CisgICAgICAgICAgICBjYW52YXNWaWV3LT5pbml0KFtkb2N1bWVudCBjYW52YXNdLCBOVUxM
KTsKKyAgICAgICAgICAgIGNhbnZhc1ZpZXctPnNldFZpZXcoZHJhd1ZpZXcpOworICAgICAgICAg
ICAgY2FudmFzVmlldy0+c2V0Q29udGV4dChxdWFydHpDb250ZXh0KTsKKyAgICAgICAgfQorICAg
IH0KK30KKworLy8gYysrIGVuYWJsZWQgZHJhd2luZyBjb2RlLgorLSAodm9pZClkcmF3UmVjdDoo
TlNSZWN0KWRpcnR5Vmlld1JlY3QKK3sKKyAgICBpZiAoIVtkb2N1bWVudCBjYW52YXNdKQorICAg
ICAgICByZXR1cm47CisgICAgaWYgKCFjYW52YXNWaWV3KQorICAgICAgICByZXR1cm47CisgICAg
CisgICAgLy8gcHVzaCB0aGUgZHJhd2luZyBjb250ZXh0CisgICAgS1JlbmRlcmluZ0RldmljZSAq
cmVuZGVyaW5nRGV2aWNlID0gW2RvY3VtZW50IGNhbnZhc10tPnJlbmRlcmluZ0RldmljZSgpOwor
ICAgIAorICAgIC8vIEFwcGx5IHRoZSB0b3AtbGV2ZWwgIndvcmxkIHRyYW5zZm9ybSIgZm9yIHpv
b20vcGFuCisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSAoQ0dDb250ZXh0UmVmKVtbTlNHcmFw
aGljc0NvbnRleHQgY3VycmVudENvbnRleHRdIGdyYXBoaWNzUG9ydF07CisgICAgcXVhcnR6Q29u
dGV4dC0+c2V0Q0dDb250ZXh0KGNvbnRleHQpOyAvLyBzaG91bGQgcHJvYmFibHkganVzdCBiZSBz
ZXQgb25jZS4uLgorICAgIHJlbmRlcmluZ0RldmljZS0+cHVzaENvbnRleHQocXVhcnR6Q29udGV4
dCk7CisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKyAgICBDR0NvbnRleHRDb25j
YXRDVE0oY29udGV4dCwgQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoW2RyYXdWaWV3IHRyYW5zZm9y
bUZyb21WaWV3VG9DYW52YXNdKSk7CisgICAgCisgICAgLy8gZG8gdGhlIGRyYXcKKyAgICAvL1tk
b2N1bWVudCBkcmF3UmVjdDpbZHJhd1ZpZXcgbWFwVmlld1JlY3RUb0NhbnZhczpkaXJ0eVZpZXdS
ZWN0XSBpbkNHQ29udGV4dDpjb250ZXh0XTsKKyAgICBbZG9jdW1lbnQgY2FudmFzXS0+cm9vdENv
bnRhaW5lcigpLT5kcmF3KFFSZWN0KFtkcmF3VmlldyBtYXBWaWV3UmVjdFRvQ2FudmFzOmRpcnR5
Vmlld1JlY3RdKSk7CisgICAgCisgICAgLy8gcmVzdG9yZSBkcmF3aW5nIHN0YXRlCisgICAgQ0dD
b250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKKyAgICByZW5kZXJpbmdEZXZpY2UtPnBvcENv
bnRleHQoKTsKKyAgICBxdWFydHpDb250ZXh0LT5zZXRDR0NvbnRleHQoTlVMTCk7Cit9CisKKy0g
KHZvaWQpZGVhbGxvYworeworICAgIC8vIElmIHdlIGdvIGF3YXksIG1ha2Ugc3VyZSB3ZSBjbGVh
ciB0aGUgdmlldyBwb2ludGVyLgorICAgIFtkb2N1bWVudCB1bnJlZ2lzdGVyVmlldzpkcmF3Vmll
d107CisgICAgZGVsZXRlIGNhbnZhc1ZpZXc7CisgICAgZGVsZXRlIHF1YXJ0ekNvbnRleHQ7Cisg
ICAgW3N1cGVyIGRlYWxsb2NdOworfQorQGVuZAorCitOU0FycmF5ICpEcmF3Vmlld0RyYWdUeXBl
czsKKworQGludGVyZmFjZSBEcmF3VmlldyAoSW50ZXJuYWxNZXRob2RzKQorLSAodm9pZClkcmF3
S25vYnNGb3JSZWN0OihOU1JlY3QpcmVjdDsKKy0gKHZvaWQpdXBkYXRlQ2FudmFzU2NhbGU7Cist
ICh2b2lkKWVuYWJsZU1vdXNlTW92ZWRFdmVudHNJZk5lZWRlZDsKK0BlbmQKKworQGltcGxlbWVu
dGF0aW9uIERyYXdWaWV3CisKKysgKHZvaWQpaW5pdGlhbGl6ZQoreworICAgIC8vRHJhd1ZpZXdE
cmFnVHlwZXMgPSBbW05TQXJyYXkgYXJyYXlXaXRoT2JqZWN0Ok5TRmlsZW5hbWVzUGJvYXJkVHlw
ZV0gcmV0YWluXTsKKyAgICBbc2VsZiBzZXRLZXlzOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpA
InRvb2xNb2RlIl0gdHJpZ2dlckNoYW5nZU5vdGlmaWNhdGlvbnNGb3JEZXBlbmRlbnRLZXk6QCJz
ZWxlY3RlZENhbnZhc0l0ZW1zIl07Cit9CisKKy0gKGlkKWluaXRXaXRoRnJhbWU6KE5TUmVjdClm
cmFtZVJlY3QKK3sKKyAgICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdFdpdGhGcmFtZTpmcmFtZVJl
Y3RdKSAhPSBuaWwpIHsKKyAgICAgICAgX3ByaXZhdGUgPSBbW0RyYXdWaWV3UHJpdmF0ZSBhbGxv
Y10gaW5pdFdpdGhEcmF3VmlldzpzZWxmXTsKKyAgICB9CisgICAgcmV0dXJuIHNlbGY7Cit9CisK
Ky0gKHZvaWQpZGVhbGxvYworeworICAgIFtfcHJpdmF0ZSByZWxlYXNlXTsKKyAgICBbc3VwZXIg
ZGVhbGxvY107Cit9CisKKy0gKE5TUmVjdClzZWxlY3Rpb25DYW52YXNCb3VuZGluZ0JveAorewor
ICAgIE5TUmVjdCBzZWxlY3Rpb25Cb3VuZGluZ0JveCA9IE5TWmVyb1JlY3Q7CisgICAgRHJhd0Nh
bnZhc0l0ZW0gKml0ZW0gPSBuaWw7CisgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtcyA9IFtzZWxm
IHNlbGVjdGVkQ2FudmFzSXRlbXNdOworICAgIGZvcmVhY2hhcnJheShpdGVtLCBzZWxlY3RlZEl0
ZW1zKSB7CisgICAgICAgIHNlbGVjdGlvbkJvdW5kaW5nQm94ID0gTlNVbmlvblJlY3Qoc2VsZWN0
aW9uQm91bmRpbmdCb3gsW2l0ZW0gYm91bmRpbmdCb3hdKTsKKyAgICB9CisgICAgcmV0dXJuIHNl
bGVjdGlvbkJvdW5kaW5nQm94OworfQorCistICh2b2lkKV9jbGVhckFuZERyYXdCYWNrZ3JvdW5k
OihOU1JlY3QpZGlydHlSZWN0Cit7CisgICAgW1tOU0NvbG9yIGxpZ2h0R3JheUNvbG9yXSBzZXRd
OworICAgIE5TUmVjdEZpbGwoZGlydHlSZWN0KTsKKyAgICAKKyAgICBbW3NlbGYgYmFja2dyb3Vu
ZENvbG9yXSBzZXRdOworICAgIE5TU2l6ZSBjYW52YXNTaXplID0gW1tzZWxmIGRvY3VtZW50XSBj
YW52YXNTaXplXTsKKyAgICBOU1JlY3QgY2FudmFzUmVjdCA9IE5TTWFrZVJlY3QoMCwwLCBjYW52
YXNTaXplLndpZHRoLCBjYW52YXNTaXplLmhlaWdodCk7CisgICAgTlNSZWN0RmlsbChbc2VsZiBt
YXBDYW52YXNSZWN0VG9WaWV3OmNhbnZhc1JlY3RdKTsKK30KKworLSAodm9pZClfZHJhd1NlbGVj
dGlvbktub2JzCit7CisgICAgaWYgKChfdG9vbE1vZGUgPT0gRHJhd1ZpZXdUb29sQXJyb3cpICYm
IFtbc2VsZiBzZWxlY3RlZENhbnZhc0l0ZW1zXSBjb3VudF0pIHsKKyAgICAgICAgTlNSZWN0IHZp
ZXdTZWxlY3Rpb25Cb3VuZGluZ0JveCA9IFtzZWxmIG1hcENhbnZhc1JlY3RUb1ZpZXc6W3NlbGYg
c2VsZWN0aW9uQ2FudmFzQm91bmRpbmdCb3hdXTsKKyAgICAgICAgW3NlbGYgZHJhd0tub2JzRm9y
UmVjdDp2aWV3U2VsZWN0aW9uQm91bmRpbmdCb3hdOworICAgIH0KKyAgICAKKyAgICBpZiAoX3By
aXZhdGUtPmN1cnJlbnREcmFnQWN0aW9uID09IERyYWdBY3Rpb25TZWxlY3Rpb24pIHsKKyAgICAg
ICAgW1tOU0NvbG9yIGxpZ2h0R3JheUNvbG9yXSBzZXRdOworICAgICAgICBOU0ZyYW1lUmVjdChf
cHJpdmF0ZS0+c2VsZWN0aW9uUmVjdCk7CisgICAgfQorfQorCistICh2b2lkKWRyYXdSZWN0OihO
U1JlY3QpZGlydHlSZWN0Cit7CisgICAgW3NlbGYgX2NsZWFyQW5kRHJhd0JhY2tncm91bmQ6ZGly
dHlSZWN0XTsKKyAgICBbX3ByaXZhdGUgZHJhd1JlY3Q6ZGlydHlSZWN0XTsKKyAgICBbc2VsZiBf
ZHJhd1NlbGVjdGlvbktub2JzXTsKK30KKworLSAodm9pZClzZXRCYWNrZ3JvdW5kQ29sb3I6KE5T
Q29sb3IgKiljb2xvcgoreworICAgIGlkIG9sZENvbG9yID0gX3ByaXZhdGUtPmJhY2tncm91bmRD
b2xvciA7CisgICAgX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvciA9IFtjb2xvciByZXRhaW5dOwor
ICAgIFtvbGRDb2xvciByZWxlYXNlXTsKK30KKworLSAoTlNDb2xvciAqKWJhY2tncm91bmRDb2xv
cgoreworICAgIGlmICghX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvcikKKyAgICAgICAgX3ByaXZh
dGUtPmJhY2tncm91bmRDb2xvciA9IFtbTlNDb2xvciB3aGl0ZUNvbG9yXSByZXRhaW5dOworICAg
IHJldHVybiBfcHJpdmF0ZS0+YmFja2dyb3VuZENvbG9yOworfQorCistIChCT09MKWlzT3BhcXVl
Cit7CisgICAgcmV0dXJuICFbX3ByaXZhdGUtPmJhY2tncm91bmRDb2xvciBpc0VxdWFsOltOU0Nv
bG9yIGNsZWFyQ29sb3JdXTsKK30KKworLSAoQk9PTClpc0ZsaXBwZWQKK3sKKyAgICByZXR1cm4g
WUVTOworfQorCistIChCT09MKWFjY2VwdHNGaXJzdFJlc3BvbmRlcgoreworICAgIHJldHVybiBZ
RVM7Cit9CisKKy0gKEJPT0wpYWNjZXB0c0ZpcnN0TW91c2U6KE5TRXZlbnQgKilldmVudAorewor
ICAgIHJldHVybiAoKF90b29sTW9kZSA9PSBEcmF3Vmlld1Rvb2xCcm93c2UpIHx8IChfdG9vbE1v
ZGUgPT0gRHJhd1ZpZXdUb29sQXJyb3cpKTsKK30KKworLSAoTlNJbWFnZVNjYWxpbmcpaW1hZ2VT
Y2FsaW5nCit7CisgICAgcmV0dXJuIF9zY2FsZVJ1bGU7Cit9CisKKy0gKHZvaWQpc2V0SW1hZ2VT
Y2FsaW5nOihOU0ltYWdlU2NhbGluZylzY2FsaW5nCit7CisgICAgX3NjYWxlUnVsZSA9IHNjYWxp
bmc7CisgICAgW3NlbGYgdXBkYXRlQ2FudmFzU2NhbGVdOworfQorCistICh2b2lkKXNldEZyYW1l
OihOU1JlY3QpbmV3RnJhbWUKK3sKKyAgICBbc2VsZiByZW1vdmVUcmFja2luZ1JlY3Q6X3ByaXZh
dGUtPnRyYWNraW5nUmVjdFRhZ107CisgICAgW3NlbGYgc2V0RnJhbWVPcmlnaW46bmV3RnJhbWUu
b3JpZ2luXTsKKyAgICBbc2VsZiBzZXRGcmFtZVNpemU6bmV3RnJhbWUuc2l6ZV07CisgICAgX3By
aXZhdGUtPnRyYWNraW5nUmVjdFRhZyA9CisgICAgICAgIFtzZWxmIGFkZFRyYWNraW5nUmVjdDpb
c2VsZiBmcmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyOnNlbGYgdXNlckRhdGE6
TlVMTAorICAgICAgICAgICAgICAgICBhc3N1bWVJbnNpZGU6W3NlbGYgbW91c2U6W05TRXZlbnQg
bW91c2VMb2NhdGlvbl0gaW5SZWN0OltzZWxmIGJvdW5kc11dXTsKK30KKworLSAodm9pZClzZXRG
cmFtZVNpemU6KE5TU2l6ZSluZXdTaXplCit7CisgICAgW3N1cGVyIHNldEZyYW1lU2l6ZTpuZXdT
aXplXTsKKyAgICBbc2VsZiB1cGRhdGVDYW52YXNTY2FsZV07Cit9CisKKy0gKHZvaWQpc2V0RG9j
dW1lbnQ6KERyYXdEb2N1bWVudCAqKWRvY3VtZW50Cit7CisgICAgaWYgKFtfcHJpdmF0ZSBkb2N1
bWVudF0gIT0gZG9jdW1lbnQpIHsKKyAgICAgICAgW19wcml2YXRlIHNldERvY3VtZW50OmRvY3Vt
ZW50XTsKKyAgICAgICAgW3NlbGYgdXBkYXRlQ2FudmFzU2NhbGVdOworICAgICAgICBbc2VsZiBz
ZXROZWVkc0Rpc3BsYXk6WUVTXTsKKyAgICB9Cit9CisKKy0gKERyYXdEb2N1bWVudCAqKWRvY3Vt
ZW50Cit7CisgICAgcmV0dXJuIFtfcHJpdmF0ZSBkb2N1bWVudF07Cit9CisKKy0gKEtDYW52YXNW
aWV3UXVhcnR6ICopY2FudmFzVmlldworeworICAgIHJldHVybiBfcHJpdmF0ZS0+Y2FudmFzVmll
dzsKK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBFZGl0aW5nIHN1cHBvcnQKKwor
LSAodm9pZClzZXRFZGl0YWJsZTooQk9PTCllZGl0YWJsZQoreworICAgIFtzZWxmIHVucmVnaXN0
ZXJEcmFnZ2VkVHlwZXNdOworICAgIF9pc0VkaXRhYmxlID0gZWRpdGFibGU7CisgICAgaWYgKF9p
c0VkaXRhYmxlKQorICAgICAgICBbc2VsZiByZWdpc3RlckZvckRyYWdnZWRUeXBlczpEcmF3Vmll
d0RyYWdUeXBlc107Cit9CisKKy0gKEJPT0wpaXNFZGl0YWJsZQoreworICAgIHJldHVybiBfaXNF
ZGl0YWJsZTsKK30KKworLSAoTlNSZWN0KWJvdW5kc0ZvckNhbnZhc0l0ZW06KERyYXdDYW52YXNJ
dGVtICopY2FudmFzSXRlbQoreworICAgIE5TUmVjdCBpdGVtQkJveEluQ2FudmFzID0gW2NhbnZh
c0l0ZW0gYm91bmRpbmdCb3hdOworICAgIE5TUmVjdCBpdGVtQkJveEluVmlldyA9IFtzZWxmIG1h
cENhbnZhc1JlY3RUb1ZpZXc6aXRlbUJCb3hJbkNhbnZhc107CisgICAgcmV0dXJuIE5TSW5zZXRS
ZWN0KGl0ZW1CQm94SW5WaWV3LCAtS05PQl9IQUxGX1NJWkUsIC1LTk9CX0hBTEZfU0laRSk7Cit9
CisKKy0gKE5TQXJyYXkgKilzZWxlY3RlZENhbnZhc0l0ZW1zCit7CisgICAgLy8gc2VsZWN0aW9u
IG9ubHkgImV4aXN0cyIgd2hlbiB1c2luZyB0aGUgYXJyb3cgdG9vbC4KKyAgICAvLyBidXQgd2Ug
c2lsbCByZW1lbWJlciBzZWxlY3Rpb24gYmV0d2VlbiB1c2VzLgorICAgIHJldHVybiBfcHJpdmF0
ZS0+c2VsZWN0ZWRJdGVtczsKK30KKworLSAodm9pZClzZXRTZWxlY3RlZENhbnZhc0l0ZW1zOihO
U0FycmF5ICopc2VsZWN0ZWRJdGVtcworeworICAgIERyYXdDYW52YXNJdGVtICpuZXdTZWxlY3Rl
ZEl0ZW0gPSBuaWw7CisgICAgTlNNdXRhYmxlQXJyYXkgKm5ld1NlbGVjdGVkSXRlbXMgPSBbW05T
TXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKKyAgICBmb3JlYWNoYXJyYXkobmV3U2VsZWN0ZWRJ
dGVtLCBzZWxlY3RlZEl0ZW1zKSB7CisgICAgICAgIFtuZXdTZWxlY3RlZEl0ZW1zIGFkZE9iamVj
dDpuZXdTZWxlY3RlZEl0ZW1dOworICAgIH0KKyAgICBbX3ByaXZhdGUtPnNlbGVjdGVkSXRlbXMg
cmVsZWFzZV07CisgICAgaWYgKFtuZXdTZWxlY3RlZEl0ZW1zIGNvdW50XSkKKyAgICAgICAgX3By
aXZhdGUtPnNlbGVjdGVkSXRlbXMgPSBuZXdTZWxlY3RlZEl0ZW1zOworICAgIGVsc2UKKyAgICAg
ICAgX3ByaXZhdGUtPnNlbGVjdGVkSXRlbXMgPSBuaWw7CisgICAgW3NlbGYgc2V0TmVlZHNEaXNw
bGF5OllFU107IC8vIEZJWE1FOiBqdXN0IGludmFsaWRhdGUgdGhlIHdob2xlIHZpZXcgZm9yIG5v
dy4KK30KKworLSAoSUJBY3Rpb24pbW92ZVNlbGVjdGlvbkZvcndhcmQ6KGlkKXNlbmRlcgorewor
ICAgIERyYXdDYW52YXNJdGVtICppdGVtID0gbmlsOworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRl
bXMgPSBbc2VsZiBzZWxlY3RlZENhbnZhc0l0ZW1zXTsKKyAgICBmb3JlYWNoYXJyYXkoaXRlbSwg
c2VsZWN0ZWRJdGVtcykgeworICAgICAgICBbaXRlbSByYWlzZV07CisgICAgfQorfQorCistIChJ
QkFjdGlvbiltb3ZlU2VsZWN0aW9uQmFja3dhcmQ6KGlkKXNlbmRlcgoreworICAgIERyYXdDYW52
YXNJdGVtICppdGVtID0gbmlsOworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2VsZiBz
ZWxlY3RlZENhbnZhc0l0ZW1zXTsKKyAgICBmb3JlYWNoYXJyYXkoaXRlbSwgc2VsZWN0ZWRJdGVt
cykgeworICAgICAgICBbaXRlbSBsb3dlcl07CisgICAgfQorfQorCistIChOU0FycmF5ICopY2Fu
dmFzQ29udHJvbFBvaW50c0ZvclNlbGVjdGlvbgoreworICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRl
bXMgPSBbc2VsZiBzZWxlY3RlZENhbnZhc0l0ZW1zXTsKKyAgICBpZiAoW3NlbGVjdGVkSXRlbXMg
Y291bnRdID09IDEpCisgICAgICAgIHJldHVybiBbW3NlbGVjdGVkSXRlbXMgb2JqZWN0QXRJbmRl
eDowXSBjb250cm9sUG9pbnRzXTsKKyAgICBlbHNlIGlmIChbc2VsZWN0ZWRJdGVtcyBjb3VudF0g
PiAxKQorICAgICAgICByZXR1cm4gW0RyYXdDYW52YXNJdGVtIGNvbnRyb2xQb2ludHNGb3JSZWN0
OltzZWxmIHNlbGVjdGlvbkNhbnZhc0JvdW5kaW5nQm94XV07CisgICAgCisgICAgcmV0dXJuIG5p
bDsKK30KKworLSAoTlNQb2ludCljYW52YXNEcmFnQW5jaG9yUG9pbnRGb3JDb250cm9sUG9pbnRJ
bmRleDooaW50KWNvbnRyb2xQb2ludEluZGV4Cit7CisgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVt
cyA9IFtzZWxmIHNlbGVjdGVkQ2FudmFzSXRlbXNdOworICAgIGlmIChbc2VsZWN0ZWRJdGVtcyBj
b3VudF0gPT0gMSkgeworICAgICAgICByZXR1cm4gW1tzZWxlY3RlZEl0ZW1zIG9iamVjdEF0SW5k
ZXg6MF0gZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6Y29udHJvbFBvaW50SW5k
ZXhdOworICAgIH0gZWxzZSBpZiAoW3NlbGVjdGVkSXRlbXMgY291bnRdID4gMSkgeworICAgICAg
ICBOU0FycmF5ICpjb250cm9sUG9pbnRzID0gW0RyYXdDYW52YXNJdGVtIGNvbnRyb2xQb2ludHNG
b3JSZWN0OltzZWxmIHNlbGVjdGlvbkNhbnZhc0JvdW5kaW5nQm94XV07CisgICAgICAgIHJldHVy
biBbRHJhd0NhbnZhc0l0ZW0gZHJhZ0FuY2hvclBvaW50Rm9yQ29udHJvbFBvaW50SW5kZXg6Y29u
dHJvbFBvaW50SW5kZXggZnJvbVJlY3RDb250cm9sUG9pbnRzOmNvbnRyb2xQb2ludHNdOworICAg
IH0KKyAgICBOU0xvZyhAIkVycm9yLCBubyBzZWxlY3Rpb24sIHlvdSBzaG91bGRuJ3QgYXNrIGZv
ciBkcmFnIGFuY2hvciBwb2ludCEiKTsKKyAgICByZXR1cm4gTlNaZXJvUG9pbnQ7Cit9CisKKy0g
KGludCljb250cm9sUG9pbnRJbmRleEZvckNhbnZhc0hpdFBvaW50OihOU1BvaW50KWNhbnZhc1Bv
aW50Cit7CisgICAgTlNWYWx1ZSAqY29udHJvbFBvaW50VmFsdWUgPSBuaWw7CisgICAgTlNBcnJh
eSAqY29udHJvbFBvaW50cyA9IFtzZWxmIGNhbnZhc0NvbnRyb2xQb2ludHNGb3JTZWxlY3Rpb25d
OworICAgIAorICAgIE5TU2l6ZSBjYW52YXNLbm9iU2l6ZSA9IFtzZWxmIG1hcFZpZXdTaXplVG9D
YW52YXM6TlNNYWtlU2l6ZShLTk9CX1NJWkUsIEtOT0JfU0laRSldOworICAgIAorICAgIE5TUmVj
dCBjb250cm9sUmVjdCA9IE5TWmVyb1JlY3Q7CisgICAgY29udHJvbFJlY3Quc2l6ZSA9IGNhbnZh
c0tub2JTaXplOworICAgIE5TU2l6ZSBoYWxmQ2FudmFzS25vYlNpemUgPSBOU01ha2VTaXplKGNh
bnZhc0tub2JTaXplLndpZHRoLzIuZiwgY2FudmFzS25vYlNpemUuaGVpZ2h0LzIuZik7CisgICAg
aW50IGluZGV4ID0gMDsKKyAgICAKKyAgICBmb3JlYWNoYXJyYXkgKGNvbnRyb2xQb2ludFZhbHVl
LCBjb250cm9sUG9pbnRzKSB7CisgICAgICAgIE5TUG9pbnQgY29udHJvbFBvaW50ID0gW2NvbnRy
b2xQb2ludFZhbHVlIHBvaW50VmFsdWVdOworICAgICAgICBjb250cm9sUmVjdC5vcmlnaW4ueCA9
IGNvbnRyb2xQb2ludC54IC0gaGFsZkNhbnZhc0tub2JTaXplLndpZHRoOworICAgICAgICBjb250
cm9sUmVjdC5vcmlnaW4ueSA9IGNvbnRyb2xQb2ludC55IC0gaGFsZkNhbnZhc0tub2JTaXplLmhl
aWdodDsKKyAgICAgICAgCisgICAgICAgIGlmIChOU1BvaW50SW5SZWN0KGNhbnZhc1BvaW50LCBj
b250cm9sUmVjdCkpCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIGluZGV4Kys7
CisgICAgfQorICAgIHJldHVybiBOU05vdEZvdW5kOworfQorCistIChCT09MKWNyZWF0ZUNhbnZh
c0l0ZW1BdFBvaW50OihOU1BvaW50KW1vdXNlUG9pbnQKK3sKKyAgICAvLyBmaXJzdCBtYXAgdG8g
Y2FudmFzIGNvb3Jkcy4KKyAgICBtb3VzZVBvaW50ID0gW3NlbGYgbWFwVmlld1BvaW50VG9DYW52
YXM6bW91c2VQb2ludF07CisgICAgCisgICAgRHJhd0NhbnZhc0l0ZW0gKm5ld0l0ZW0gPSBbW19w
cml2YXRlIGRvY3VtZW50XSBjcmVhdGVJdGVtRm9yVG9vbDpfdG9vbE1vZGUgYXRQb2ludDptb3Vz
ZVBvaW50XTsKKyAgICBpZiAobmV3SXRlbSkgeworICAgICAgICBbc2VsZiBzZXRTZWxlY3RlZENh
bnZhc0l0ZW1zOltOU0FycmF5IGFycmF5V2l0aE9iamVjdDpuZXdJdGVtXV07CisgICAgICAgIHJl
dHVybiBZRVM7CisgICAgfQorICAgIHJldHVybiBOTzsKK30KKworLSAoSUJBY3Rpb24pZGVsZXRl
U2VsZWN0aW9uOihpZClzZW5kZXIKK3sKKyAgICBOU0FycmF5ICpvbGRJdGVtcyA9IFtbc2VsZiBz
ZWxlY3RlZENhbnZhc0l0ZW1zXSByZXRhaW5dOworICAgIFtzZWxmIHNldFNlbGVjdGVkQ2FudmFz
SXRlbXM6bmlsXTsKKyAgICBEcmF3Q2FudmFzSXRlbSAqb2xkSXRlbSA9IG5pbDsKKyAgICBmb3Jl
YWNoYXJyYXkob2xkSXRlbSwgb2xkSXRlbXMpIHsKKyAgICAgICAgW1tfcHJpdmF0ZSBkb2N1bWVu
dF0gcmVtb3ZlSXRlbUZyb21ET006b2xkSXRlbV07CisgICAgfQorICAgIFtvbGRJdGVtcyByZWxl
YXNlXTsKK30KKworLSAoaW50KXRvb2xNb2RlCit7CisgICAgcmV0dXJuIF90b29sTW9kZTsKK30K
KworLSAodm9pZClzZXRUb29sTW9kZTooaW50KW5ld1Rvb2xNb2RlCit7CisgICAgX3Rvb2xNb2Rl
ID0gKERyYXdWaWV3VG9vbCluZXdUb29sTW9kZTsKKyAgICAvL1tbc2VsZiB3aW5kb3ddIGludmFs
aWRhdGVDdXJzb3JSZWN0c0ZvclZpZXc6c2VsZl07CisgICAgLy8gTm90IGdldHRpbmcgY2FsbGVk
IHVudGlsIHRoZSB2aWV3IGJlY29tZXMga2V5Li4uCisgICAgW1tzZWxmIHdpbmRvd10gcmVzZXRD
dXJzb3JSZWN0c107IC8vIEhBQ0s/CisgICAgaWYgKFtzZWxmIG1vdXNlOltOU0V2ZW50IG1vdXNl
TG9jYXRpb25dIGluUmVjdDpbc2VsZiBib3VuZHNdXSkKKyAgICAgICAgW3NlbGYgZW5hYmxlTW91
c2VNb3ZlZEV2ZW50c0lmTmVlZGVkXTsKK30KKworLSAodm9pZClyZXNldEN1cnNvclJlY3RzCit7
CisgICAgW3N1cGVyIHJlc2V0Q3Vyc29yUmVjdHNdOworICAgIAorICAgIE5TQ3Vyc29yICp0b29s
Q3Vyc29yID0gbmlsOworICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2FzZSBEcmF3Vmlld1Rv
b2xQYW46CisgICAgICAgICAgICB0b29sQ3Vyc29yID0gW05TQ3Vyc29yIG9wZW5IYW5kQ3Vyc29y
XTsKKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgRHJhd1ZpZXdUb29sWm9vbToKKyAgICAgICAg
ICAgIHRvb2xDdXJzb3IgPSBbTlNDdXJzb3IgY2xvc2VkSGFuZEN1cnNvcl07IC8vIGZvciBub3cu
Li4KKyAgICAgICAgICAgIGJyZWFrOworCWNhc2UgRHJhd1ZpZXdUb29sTGluZToKKwljYXNlIERy
YXdWaWV3VG9vbEVsaXBzZToKKwljYXNlIERyYXdWaWV3VG9vbFJlY3RhbmdsZToKKwljYXNlIERy
YXdWaWV3VG9vbFBvbHlMaW5lOgorCWNhc2UgRHJhd1ZpZXdUb29sQXJjOgorICAgICAgICAgICAg
dG9vbEN1cnNvciA9IFtOU0N1cnNvciBjcm9zc2hhaXJDdXJzb3JdOworICAgICAgICAgICAgYnJl
YWs7CisJZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAodG9vbEN1
cnNvcikKKyAgICAgICAgW3NlbGYgYWRkQ3Vyc29yUmVjdDpbc2VsZiBmcmFtZV0gY3Vyc29yOnRv
b2xDdXJzb3JdOworfQorCistICh2b2lkKWRyYXdLbm9ic0ZvclJlY3Q6KE5TUmVjdClyZWN0Cit7
CisgICAgW1tOU0NvbG9yIGJsYWNrQ29sb3JdIHNldF07CisgICAgW05TQmV6aWVyUGF0aCBmaWxs
UmVjdDpOU01ha2VSZWN0KHJlY3Qub3JpZ2luLnggLSBLTk9CX0hBTEZfU0laRSwgcmVjdC5vcmln
aW4ueSAtIEtOT0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUsIEtOT0JfU0laRSldOworICAgIFtOU0Jl
emllclBhdGggZmlsbFJlY3Q6TlNNYWtlUmVjdChOU01heFgocmVjdCkgLSBLTk9CX0hBTEZfU0la
RSwgcmVjdC5vcmlnaW4ueSAtIEtOT0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUsIEtOT0JfU0laRSld
OworICAgIFtOU0JlemllclBhdGggZmlsbFJlY3Q6TlNNYWtlUmVjdChyZWN0Lm9yaWdpbi54IC0g
S05PQl9IQUxGX1NJWkUsIE5TTWF4WShyZWN0KSAtIEtOT0JfSEFMRl9TSVpFLCBLTk9CX1NJWkUs
IEtOT0JfU0laRSldOworICAgIFtOU0JlemllclBhdGggZmlsbFJlY3Q6TlNNYWtlUmVjdChOU01h
eFgocmVjdCkgLSBLTk9CX0hBTEZfU0laRSwgTlNNYXhZKHJlY3QpIC0gS05PQl9IQUxGX1NJWkUs
IEtOT0JfU0laRSwgS05PQl9TSVpFKV07Cit9CisKKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEg
bWFyayBFdmVudCBzdXBwb3J0CisKKy0gKHZvaWQpbW91c2VEb3duOihOU0V2ZW50ICopdGhlRXZl
bnQKK3sKKyAgICBOU1BvaW50IG1vdXNlUG9pbnQgPSBbc2VsZiBjb252ZXJ0UG9pbnQ6W3RoZUV2
ZW50IGxvY2F0aW9uSW5XaW5kb3ddIGZyb21WaWV3Om5pbF07CisgICAgTlNQb2ludCBjYW52YXNQ
b2ludCA9IFtzZWxmIG1hcFZpZXdQb2ludFRvQ2FudmFzOm1vdXNlUG9pbnRdOworICAgIF9wcml2
YXRlLT5kcmFnU3RhcnRQb2ludCA9IG1vdXNlUG9pbnQ7CisgICAgX3ByaXZhdGUtPmxhc3REcmFn
UG9pbnQgPSBtb3VzZVBvaW50OworICAgIAorICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2Fz
ZSBEcmF3Vmlld1Rvb2xCcm93c2U6CisJeworICAgICAgICAgICAgLy8gc2VuZCBtb3VzZSBkb3du
IGV2ZW50cyB0byBET00KKyAgICAgICAgICAgIGlmICghW1tfcHJpdmF0ZSBkb2N1bWVudF0gZG9j
dW1lbnRMaXN0ZW5zRm9yTW91c2VEb3duRXZlbnRzXSkKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICBbW19wcml2YXRlIGRvY3VtZW50XSBwcm9wYWdhdGVNb3VzZURvd25FdmVu
dDp0aGVFdmVudCBmcm9tVmlldzpzZWxmXTsKKyAgICAgICAgICAgIGJyZWFrOworCX0KKwljYXNl
IERyYXdWaWV3VG9vbEFycm93OgorCXsKKyAgICAgICAgICAgIGlmICggKF9wcml2YXRlLT5kcmFn
Q29udHJvbFBvaW50SW5kZXggPSBbc2VsZiBjb250cm9sUG9pbnRJbmRleEZvckNhbnZhc0hpdFBv
aW50OmNhbnZhc1BvaW50XSkgIT0gTlNOb3RGb3VuZCkgeworICAgICAgICAgICAgICAgIF9wcml2
YXRlLT5jYW52YXNEcmFnQW5jaG9yUG9pbnQgPSBbc2VsZiBjYW52YXNEcmFnQW5jaG9yUG9pbnRG
b3JDb250cm9sUG9pbnRJbmRleDpfcHJpdmF0ZS0+ZHJhZ0NvbnRyb2xQb2ludEluZGV4XTsKKyAg
ICAgICAgICAgICAgICBOU0xvZyhAInJlc2l6ZSAtLSBkcmFnU3RhcnRQb2ludDogJUAgY2FudmFz
UG9pbnQ6ICVAIGNvbnRyb2xJbmRleDogJWkgY2FudmFzRHJhZ0FuY2hvclBvaW50OiAlQCIsCisg
ICAgICAgICAgICAgICAgICAgICAgTlNTdHJpbmdGcm9tUG9pbnQobW91c2VQb2ludCksIE5TU3Ry
aW5nRnJvbVBvaW50KGNhbnZhc1BvaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICBfcHJpdmF0
ZS0+ZHJhZ0NvbnRyb2xQb2ludEluZGV4LCBOU1N0cmluZ0Zyb21Qb2ludChfcHJpdmF0ZS0+Y2Fu
dmFzRHJhZ0FuY2hvclBvaW50KSk7CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmN1cnJlbnRE
cmFnQWN0aW9uID0gRHJhZ0FjdGlvblJlc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICAgICAgLy8gRklYTUU6IHdlIHJlYWxseSBzaG91bGQgc2VsZWN0IFNWR0VsZW1lbnRz
LCBub3QgY2FudmFzIGl0ZW1zLi4uCisgICAgICAgICAgICAgICAgRHJhd0NhbnZhc0l0ZW0gKmhp
dEl0ZW0gPSBbW19wcml2YXRlIGRvY3VtZW50XSBjYW52YXNJdGVtQXRQb2ludDpjYW52YXNQb2lu
dF07CQkJCisgICAgICAgICAgICAgICAgLy9OU0xvZyhAIm1vdmUgLS0gZHJhZ1N0YXJ0UG9pbnQ6
ICVAIGNhbnZhc1BvaW50OiAlQCIsIE5TU3RyaW5nRnJvbVBvaW50KG1vdXNlUG9pbnQpLCBOU1N0
cmluZ0Zyb21Qb2ludChjYW52YXNQb2ludCkpOworICAgICAgICAgICAgICAgIGlmIChoaXRJdGVt
KSB7CisgICAgICAgICAgICAgICAgICAgIE5TQXJyYXkgKmhpdEl0ZW1zID0gW05TQXJyYXkgYXJy
YXlXaXRoT2JqZWN0OmhpdEl0ZW1dOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXRTZWxl
Y3RlZENhbnZhc0l0ZW1zOmhpdEl0ZW1zXTsKKyAgICAgICAgICAgICAgICAgICAgX3ByaXZhdGUt
PmN1cnJlbnREcmFnQWN0aW9uID0gRHJhZ0FjdGlvbk1vdmU7CisgICAgICAgICAgICAgICAgICAg
IE5TUG9pbnQgaGl0T3JpZ2luID0gW2hpdEl0ZW0gYm91bmRpbmdCb3hdLm9yaWdpbjsKKyAgICAg
ICAgICAgICAgICAgICAgX3ByaXZhdGUtPmNhbnZhc0RyYWdPcmlnaW5PZmZzZXQgPSBOU0RpZmZl
cmVuY2VQb2ludChoaXRPcmlnaW4sIGNhbnZhc1BvaW50KTsKKyAgICAgICAgICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXRTZWxlY3RlZENhbnZhc0l0ZW1zOm5p
bF07CisgICAgICAgICAgICAgICAgICAgIF9wcml2YXRlLT5jdXJyZW50RHJhZ0FjdGlvbiA9IERy
YWdBY3Rpb25TZWxlY3Rpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgICAgYnJlYWs7CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sUGFuOgorICAgICAgICAgICAg
W1tOU0N1cnNvciBjbG9zZWRIYW5kQ3Vyc29yXSBwdXNoXTsKKyAgICAgICAgICAgIF9wcml2YXRl
LT5jdXJyZW50RHJhZ0FjdGlvbiA9IERyYWdBY3Rpb25QYW47CisgICAgICAgICAgICAvL05TTG9n
KEAibW91c2VEb3duOiAlQCIsIE5TU3RyaW5nRnJvbVBvaW50KF9wcml2YXRlLT5sYXN0RHJhZ1Bv
aW50KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNyZWF0aW9uIHRvb2xz
OgorCWNhc2UgRHJhd1ZpZXdUb29sTGluZToKKwljYXNlIERyYXdWaWV3VG9vbEVsaXBzZToKKwlj
YXNlIERyYXdWaWV3VG9vbFRyaWFuZ2xlOgorCWNhc2UgRHJhd1ZpZXdUb29sUmVjdGFuZ2xlOgor
CWNhc2UgRHJhd1ZpZXdUb29sUG9seUxpbmU6CisJY2FzZSBEcmF3Vmlld1Rvb2xBcmM6CisJewor
ICAgICAgICAgICAgaWYgKFtzZWxmIGNyZWF0ZUNhbnZhc0l0ZW1BdFBvaW50Om1vdXNlUG9pbnRd
KSB7CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmN1cnJlbnREcmFnQWN0aW9uID0gRHJhZ0Fj
dGlvblJlc2l6ZTsKKyAgICAgICAgICAgICAgICBfcHJpdmF0ZS0+Y2FudmFzRHJhZ0FuY2hvclBv
aW50ID0gY2FudmFzUG9pbnQ7CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPmRyYWdDb250cm9s
UG9pbnRJbmRleCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwl9CisJ
ZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLSAodm9pZCltb3VzZURy
YWdnZWQ6KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIE5TUG9pbnQgbW91c2VQb2ludCA9IFtz
ZWxmIGNvbnZlcnRQb2ludDpbdGhlRXZlbnQgbG9jYXRpb25JbldpbmRvd10gZnJvbVZpZXc6bmls
XTsKKyAgICAKKyAgICBzd2l0Y2ggKF90b29sTW9kZSkgeworCWNhc2UgRHJhd1ZpZXdUb29sQnJv
d3NlOgorCXsKKyAgICAgICAgICAgIC8vIHNlbmQgbW91c2UgZHJhZ2dlZCBldmVudHMgdG8gRE9N
LgorICAgICAgICAgICAgYnJlYWs7CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sQXJyb3c6CisJewor
ICAgICAgICAgICAgLy8gbW92ZSBzaGFwZXMgaGVyZS4KKyAgICAgICAgICAgIGlmIChfcHJpdmF0
ZS0+Y3VycmVudERyYWdBY3Rpb24gPT0gRHJhZ0FjdGlvbk1vdmUpIHsKKyAgICAgICAgICAgICAg
ICBOU1NpemUgZHJhZ09mZnNldCA9IE5TTWFrZVNpemUobW91c2VQb2ludC54IC0gX3ByaXZhdGUt
Pmxhc3REcmFnUG9pbnQueCwgbW91c2VQb2ludC55IC0gX3ByaXZhdGUtPmxhc3REcmFnUG9pbnQu
eSk7CisgICAgICAgICAgICAgICAgTlNTaXplIGNhbnZhc0RyYWdPZmZzZXQgPSBbc2VsZiBtYXBW
aWV3U2l6ZVRvQ2FudmFzOmRyYWdPZmZzZXRdOworICAgICAgICAgICAgICAgIE5TTG9nKEAibW92
ZTogdHJhbnNsYXRpbmcgc2VsZWN0aW9uIGJ5OiAlQCIsIE5TU3RyaW5nRnJvbVNpemUoY2FudmFz
RHJhZ09mZnNldCkpOworICAgICAgICAgICAgICAgIERyYXdDYW52YXNJdGVtICppdGVtID0gbmls
OworICAgICAgICAgICAgICAgIE5TQXJyYXkgKnNlbGVjdGVkSXRlbXMgPSBbc2VsZiBzZWxlY3Rl
ZENhbnZhc0l0ZW1zXTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoYXJyYXkoaXRlbSwgc2VsZWN0
ZWRJdGVtcykgeworICAgICAgICAgICAgICAgICAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXlJblJl
Y3Q6W3NlbGYgYm91bmRzRm9yQ2FudmFzSXRlbTppdGVtXV07CisgICAgICAgICAgICAgICAgICAg
IFtpdGVtIHRyYW5zbGF0ZUJ5T2Zmc2V0OmNhbnZhc0RyYWdPZmZzZXRdOworICAgICAgICAgICAg
ICAgICAgICBbc2VsZiBzZXROZWVkc0Rpc3BsYXlJblJlY3Q6W3NlbGYgYm91bmRzRm9yQ2FudmFz
SXRlbTppdGVtXV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChf
cHJpdmF0ZS0+Y3VycmVudERyYWdBY3Rpb24gPT0gRHJhZ0FjdGlvblNlbGVjdGlvbikgeworICAg
ICAgICAgICAgICAgIFtzZWxmIHNldE5lZWRzRGlzcGxheUluUmVjdDpfcHJpdmF0ZS0+c2VsZWN0
aW9uUmVjdF07CisgICAgICAgICAgICAgICAgX3ByaXZhdGUtPnNlbGVjdGlvblJlY3QgPSBOU01h
a2VSZWN0KF9wcml2YXRlLT5kcmFnU3RhcnRQb2ludC54LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJpdmF0ZS0+ZHJhZ1N0YXJ0UG9pbnQu
eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bW91c2VQb2ludC54IC0gX3ByaXZhdGUtPmRyYWdTdGFydFBvaW50LngsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlUG9pbnQueSAtIF9w
cml2YXRlLT5kcmFnU3RhcnRQb2ludC55KTsKKyAgICAgICAgICAgICAgICBbc2VsZiBzZXROZWVk
c0Rpc3BsYXlJblJlY3Q6X3ByaXZhdGUtPnNlbGVjdGlvblJlY3RdOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGZvciByZXNpemUgY29kZS4KKwl9CisJY2FzZSBE
cmF3Vmlld1Rvb2xMaW5lOgorCWNhc2UgRHJhd1ZpZXdUb29sRWxpcHNlOgorCWNhc2UgRHJhd1Zp
ZXdUb29sVHJpYW5nbGU6CisJY2FzZSBEcmF3Vmlld1Rvb2xSZWN0YW5nbGU6CisJY2FzZSBEcmF3
Vmlld1Rvb2xQb2x5TGluZToKKwljYXNlIERyYXdWaWV3VG9vbEFyYzoKKwl7CisgICAgICAgICAg
ICBpZiAoX3ByaXZhdGUtPmN1cnJlbnREcmFnQWN0aW9uID09IERyYWdBY3Rpb25SZXNpemUpIHsK
KyAgICAgICAgICAgICAgICBOU1BvaW50IGNhbnZhc1BvaW50ID0gW3NlbGYgbWFwVmlld1BvaW50
VG9DYW52YXM6bW91c2VQb2ludF07CisgICAgICAgICAgICAgICAgRHJhd0NhbnZhc0l0ZW0gKml0
ZW0gPSBuaWw7CisgICAgICAgICAgICAgICAgTlNBcnJheSAqc2VsZWN0ZWRJdGVtcyA9IFtzZWxm
IHNlbGVjdGVkQ2FudmFzSXRlbXNdOworICAgICAgICAgICAgICAgIGZvcmVhY2hhcnJheShpdGVt
LCBzZWxlY3RlZEl0ZW1zKSB7CisgICAgICAgICAgICAgICAgICAgIFtzZWxmIHNldE5lZWRzRGlz
cGxheUluUmVjdDpbc2VsZiBib3VuZHNGb3JDYW52YXNJdGVtOml0ZW1dXTsKKyAgICAgICAgICAg
ICAgICAgICAgW2l0ZW0gcmVzaXplV2l0aFBvaW50OmNhbnZhc1BvaW50IHVzaW5nQ29udHJvbFBv
aW50Ol9wcml2YXRlLT5kcmFnQ29udHJvbFBvaW50SW5kZXggZHJhZ0FuY2hvclBvaW50Ol9wcml2
YXRlLT5jYW52YXNEcmFnQW5jaG9yUG9pbnRdOworICAgICAgICAgICAgICAgICAgICBbc2VsZiBz
ZXROZWVkc0Rpc3BsYXlJblJlY3Q6W3NlbGYgYm91bmRzRm9yQ2FudmFzSXRlbTppdGVtXV07Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisJfQor
ICAgICAgICAgICAgCisJY2FzZSBEcmF3Vmlld1Rvb2xQYW46CisJeworICAgICAgICAgICAgTlNQ
b2ludCBkaWZmID0gTlNEaWZmZXJlbmNlUG9pbnQobW91c2VQb2ludCwgX3ByaXZhdGUtPmxhc3RE
cmFnUG9pbnQpOworICAgICAgICAgICAgTlNQb2ludCBjYW52YXNPcmlnaW4gPSBbc2VsZiBjYW52
YXNWaXNpYmxlT3JpZ2luXTsKKyAgICAgICAgICAgIE5TUG9pbnQgbmV3T3JpZ2luID0gTlNEaWZm
ZXJlbmNlUG9pbnQoY2FudmFzT3JpZ2luLCBkaWZmKTsKKyAgICAgICAgICAgIFtzZWxmIHNldENh
bnZhc1Zpc2libGVPcmlnaW46bmV3T3JpZ2luXTsKKyAgICAgICAgICAgIC8vCQlOU0xvZyhAIm1v
dXNlRHJhZ2dlZDogJUAgIGRpZmY6ICVAIG9sZCBvcmlnaW46ICVAIG5ld09yaWdpbjogJUAiLAor
ICAgICAgICAgICAgLy8JCQlOU1N0cmluZ0Zyb21Qb2ludChfcHJpdmF0ZS0+bGFzdERyYWdQb2lu
dCksIAorICAgICAgICAgICAgLy8JCQlOU1N0cmluZ0Zyb21Qb2ludChkaWZmKSwgTlNTdHJpbmdG
cm9tUG9pbnQoY2FudmFzT3JpZ2luKSwgTlNTdHJpbmdGcm9tUG9pbnQobmV3T3JpZ2luKSk7Cisg
ICAgICAgICAgICBicmVhazsKKwl9CisgICAgICAgICAgICAKKwlkZWZhdWx0OgorICAgICAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIC8vIHJlY29yZCB0aGUgbGFzdCBkcmFnIHBvaW50
LgorICAgIF9wcml2YXRlLT5sYXN0RHJhZ1BvaW50ID0gbW91c2VQb2ludDsKK30KKworCistICh2
b2lkKW1vdXNlVXA6KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIC8vTlNQb2ludCBtb3VzZVBv
aW50ID0gW3NlbGYgY29udmVydFBvaW50Olt0aGVFdmVudCBsb2NhdGlvbkluV2luZG93XSBmcm9t
VmlldzpuaWxdOworICAgIAorICAgIHN3aXRjaCAoX3Rvb2xNb2RlKSB7CisJY2FzZSBEcmF3Vmll
d1Rvb2xCcm93c2U6CisJeworICAgICAgICAgICAgaWYgKCFbW19wcml2YXRlIGRvY3VtZW50XSBk
b2N1bWVudExpc3RlbnNGb3JNb3VzZVVwRXZlbnRzXSkKKyAgICAgICAgICAgICAgICByZXR1cm47
CisgICAgICAgICAgICBbW19wcml2YXRlIGRvY3VtZW50XSBwcm9wYWdhdGVNb3VzZVVwRXZlbnQ6
dGhlRXZlbnQgZnJvbVZpZXc6c2VsZl07CisJfQorCWNhc2UgRHJhd1ZpZXdUb29sUGFuOgorICAg
ICAgICAgICAgW05TQ3Vyc29yIHBvcF07CisgICAgICAgICAgICBicmVhazsKKwljYXNlIERyYXdW
aWV3VG9vbEFycm93OgorICAgICAgICAgICAgaWYgKF9wcml2YXRlLT5jdXJyZW50RHJhZ0FjdGlv
biA9PSBEcmFnQWN0aW9uU2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgW3NlbGYgc2V0TmVl
ZHNEaXNwbGF5SW5SZWN0Ol9wcml2YXRlLT5zZWxlY3Rpb25SZWN0XTsKKyAgICAgICAgICAgICAg
ICAvLyBmaWd1cmUgb3V0IHdoYXQgYWxsIHdhcyBpbiB0aGF0IHJlY3QuLi4KKyAgICAgICAgICAg
ICAgICBfcHJpdmF0ZS0+c2VsZWN0aW9uUmVjdCA9IE5TWmVyb1JlY3Q7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAg
fQorICAgIF9wcml2YXRlLT5jdXJyZW50RHJhZ0FjdGlvbiA9IERyYWdBY3Rpb25Ob25lOworfQor
CistICh2b2lkKWRpc2FibGVNb3VzZU1vdmVkRXZlbnRzCit7CisgICAgaWYgKFtbc2VsZiB3aW5k
b3ddIGFjY2VwdHNNb3VzZU1vdmVkRXZlbnRzXSkKKyAgICAgICAgTlNMb2coQCJNb3VzZSBtb3Zl
IGV2ZW50cyBub3cgT0ZGIik7CisgICAgW1tzZWxmIHdpbmRvd10gc2V0QWNjZXB0c01vdXNlTW92
ZWRFdmVudHM6Tk9dOworfQorCistICh2b2lkKWVuYWJsZU1vdXNlTW92ZWRFdmVudHNJZk5lZWRl
ZAoreworICAgIC8vIEZJWE1FOiAgVGhpcyBjb3VsZCBzdGlsbCBiZSBtb3JlIGVmZmljaWVudAor
ICAgIEJPT0wgbmVlZHNNb3VzZU1vdmVkID0gKF90b29sTW9kZSA9PSBEcmF3Vmlld1Rvb2xCcm93
c2UpCisgICAgJiYgW1tfcHJpdmF0ZSBkb2N1bWVudF0gZG9jdW1lbnRMaXN0ZW5zRm9yTW91c2VN
b3ZlZEV2ZW50c107CisgICAgaWYgKG5lZWRzTW91c2VNb3ZlZCAhPSBbW3NlbGYgd2luZG93XSBh
Y2NlcHRzTW91c2VNb3ZlZEV2ZW50c10pCisgICAgICAgIE5TTG9nKEAiTW91c2UgbW92ZSBldmVu
dHMgbm93ICVAIiwgbmVlZHNNb3VzZU1vdmVkID8gQCJPTiIgOiBAIk9GRiIpOworICAgIGlmIChu
ZWVkc01vdXNlTW92ZWQpIHsKKyAgICAgICAgW1tzZWxmIHdpbmRvd10gc2V0QWNjZXB0c01vdXNl
TW92ZWRFdmVudHM6bmVlZHNNb3VzZU1vdmVkXTsKKyAgICB9Cit9CisKKy0gKHZvaWQpbW91c2VF
bnRlcmVkOihOU0V2ZW50ICopdGhlRXZlbnQKK3sKKyAgICBbc2VsZiBlbmFibGVNb3VzZU1vdmVk
RXZlbnRzSWZOZWVkZWRdOworfQorCistICh2b2lkKW1vdXNlRXhpdGVkOihOU0V2ZW50ICopdGhl
RXZlbnQKK3sKKyAgICBbc2VsZiBkaXNhYmxlTW91c2VNb3ZlZEV2ZW50c107Cit9CisKKy0gKHZv
aWQpbW91c2VNb3ZlZDooTlNFdmVudCAqKXRoZUV2ZW50Cit7CisgICAgLy9OU1BvaW50IG1vdXNl
UG9pbnQgPSBbc2VsZiBjb252ZXJ0UG9pbnQ6W3RoZUV2ZW50IGxvY2F0aW9uSW5XaW5kb3ddIGZy
b21WaWV3Om5pbF07CisgICAgCisgICAgc3dpdGNoIChfdG9vbE1vZGUpIHsKKwljYXNlIERyYXdW
aWV3VG9vbEJyb3dzZToKKwl7CisgICAgICAgICAgICBpZiAoIVtbX3ByaXZhdGUgZG9jdW1lbnRd
IGRvY3VtZW50TGlzdGVuc0Zvck1vdXNlTW92ZWRFdmVudHNdKQorICAgICAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTlNDdXJzb3IgKmN1cnNvciA9IFtbX3By
aXZhdGUgZG9jdW1lbnRdIGN1cnNvckFmdGVyUHJvcGFnYXRpbmdNb3VzZU1vdmVkRXZlbnQ6dGhl
RXZlbnQgZnJvbVZpZXc6c2VsZl07CisgICAgICAgICAgICBpZiAoY3Vyc29yICYmIChjdXJzb3Ig
IT0gW05TQ3Vyc29yIGN1cnJlbnRDdXJzb3JdKSkgTlNMb2coQCJDaGFuZ2luZyBjdXJzb3I6ICVA
IG5hbWU6ICVAIiwgY3Vyc29yLCBbW2N1cnNvciBpbWFnZV0gbmFtZV0pOworICAgICAgICAgICAg
W2N1cnNvciBzZXRdOworCX0KKwlkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQor
fQorCistICh2b2lkKWtleURvd246KE5TRXZlbnQgKil0aGVFdmVudAoreworICAgIGlmIChfdG9v
bE1vZGUgPT0gRHJhd1ZpZXdUb29sQXJyb3cpIHsKKyAgICAgICAgdW5pY2hhciBrZXkgPSBbW3Ro
ZUV2ZW50IGNoYXJhY3RlcnNJZ25vcmluZ01vZGlmaWVyc10gY2hhcmFjdGVyQXRJbmRleDowXTsK
KyAgICAgICAgaW50IGZsYWdzID0gW3RoZUV2ZW50IG1vZGlmaWVyRmxhZ3NdICYgTlNEZXZpY2VJ
bmRlcGVuZGVudE1vZGlmaWVyRmxhZ3NNYXNrOworICAgICAgICBpZiAoKFt0aGVFdmVudCBrZXlD
b2RlXSA9PSBOU0RlbGV0ZUZ1bmN0aW9uS2V5KSB8fCAoKGtleSA9PSBOU0RlbGV0ZUNoYXJhY3Rl
cikgJiYgKGZsYWdzID09IDApKSApIHsKKyAgICAgICAgICAgIFtzZWxmIGRlbGV0ZVNlbGVjdGlv
bjpuaWxdOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChfdG9vbE1vZGUgPT0gRHJhd1ZpZXdU
b29sQnJvd3NlKSB7CisgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUga2V5IGV2ZW50IHVwIHRocm91
Z2ggdGhlIERPTQorICAgIH0KK30KKworI3ByYWdtYSBtYXJrIC0KKyNwcmFnbWEgbWFyayBab29t
L1BhbiBzdXBwb3J0CisKKy0gKElCQWN0aW9uKXpvb21Ub0ZpdDooaWQpc2VuZGVyCit7CisgICAg
TlNTaXplIGNhbnZhc1NpemUgPSBbW19wcml2YXRlIGRvY3VtZW50XSBjYW52YXNTaXplXTsKKyAg
ICBmbG9hdCB3aWR0aFNjYWxlID0gY2FudmFzU2l6ZS53aWR0aCAvIFtzZWxmIGJvdW5kc10uc2l6
ZS53aWR0aDsKKyAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IGNhbnZhc1NpemUuaGVpZ2h0IC8gW3Nl
bGYgYm91bmRzXS5zaXplLmhlaWdodDsKKyAgICAKKyAgICBmbG9hdCBtaW5TY2FsZSA9IE1BWCh3
aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7CisgICAgW3NlbGYgc2V0Q2FudmFzWm9vbTptaW5TY2Fs
ZV07Cit9CisKKy0gKHZvaWQpdXBkYXRlQ2FudmFzU2NhbGUKK3sKKyAgICBpZiAoX3NjYWxlUnVs
ZSA9PSBOU1NjYWxlUHJvcG9ydGlvbmFsbHkpIHsKKyAgICAgICAgW3NlbGYgem9vbVRvRml0Om5p
bF07CisgICAgfSBlbHNlIGlmIChfc2NhbGVSdWxlID09IE5TU2NhbGVUb0ZpdCkgeworICAgICAg
ICAvLyBOb3QgeWV0IHN1cHBvcnRlZCEKKyAgICB9IGVsc2UgaWYgKF9zY2FsZVJ1bGUgPT0gTlNT
Y2FsZU5vbmUpIHsKKyAgICAgICAgW3NlbGYgc2V0Q2FudmFzWm9vbToxLjBdOworICAgIH0KK30K
KworLSAodm9pZClzaXplVG9GaXRDYW52YXMKK3sKKyAgICBOU1NpemUgY2FudmFzU2l6ZSA9IFtb
X3ByaXZhdGUgZG9jdW1lbnRdIGNhbnZhc1NpemVdOworICAgIGlmICgoY2FudmFzU2l6ZS53aWR0
aCA9PSAwKSB8fCAoY2FudmFzU2l6ZS5oZWlnaHQgPT0gMCkpCisgICAgICAgIHJldHVybjsgLy8g
YXZvaWQgZGlzYXBwZWFyaW5nLgorICAgIFtzZWxmIHNldEZyYW1lU2l6ZTpjYW52YXNTaXplXTsK
K30KKworLSAodm9pZClzaXplVG9GaXRWaWV3Qm94Cit7CisgICAgLy8gRklYTUU6IHRoaXMgaXMg
YnJva2VuIQorICAgIFtzZWxmIHNpemVUb0ZpdENhbnZhc107Cit9CisKKy0gKElCQWN0aW9uKXpv
b21JbjooaWQpc2VuZGVyCit7CisgICAgTlNQb2ludCBjZW50ZXIgPSBbc2VsZiBjYW52YXN2aXNp
YmxlQ2VudGVyUG9pbnRdOworICAgIFtzZWxmIHNldENhbnZhc1pvb206KFtzZWxmIGNhbnZhc1pv
b21dICogMC45KV07CisgICAgW3NlbGYgcGFuVG9DYW52YXNDZW50ZXJQb2ludDpjZW50ZXJdOwor
fQorCistIChJQkFjdGlvbil6b29tT3V0OihpZClzZW5kZXIKK3sKKyAgICBOU1BvaW50IGNlbnRl
ciA9IFtzZWxmIGNhbnZhc3Zpc2libGVDZW50ZXJQb2ludF07CisgICAgW3NlbGYgc2V0Q2FudmFz
Wm9vbTooW3NlbGYgY2FudmFzWm9vbV0gKiAxLjEpXTsKKyAgICBbc2VsZiBwYW5Ub0NhbnZhc0Nl
bnRlclBvaW50OmNlbnRlcl07Cit9CisKKy0gKElCQWN0aW9uKXpvb21PcmlnaW5hbDooaWQpc2Vu
ZGVyCit7CisgICAgLy8gZG8gdGhlc2UgbmVlZCB0byBjYWxsIGludG8gdGhlIGNhbnZhcyBvciBk
b2N1bWVudCBpbnN0ZWFkPworICAgIFtzZWxmIHNldENhbnZhc1pvb206MS4wXTsKKyAgICBbc2Vs
ZiBzZXRDYW52YXNWaXNpYmxlT3JpZ2luOk5TTWFrZVBvaW50KDAsMCldOworfQorCistIChDR0Fm
ZmluZVRyYW5zZm9ybSl0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzCit7CisgICAgZmxvYXQgem9v
bSA9IFtzZWxmIGNhbnZhc1pvb21dOworICAgIENHQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybSA9
IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHpvb20sIHpvb20pOworICAgIE5TUG9pbnQgb3Jp
Z2luID0gW3NlbGYgY2FudmFzVmlzaWJsZU9yaWdpbl07CisgICAgcmV0dXJuIENHQWZmaW5lVHJh
bnNmb3JtVHJhbnNsYXRlKHRyYW5zZm9ybSxvcmlnaW4ueCxvcmlnaW4ueSk7Cit9CisKKy0gKE5T
UG9pbnQpbWFwVmlld1BvaW50VG9DYW52YXM6KE5TUG9pbnQpdmlld1BvaW50Cit7CisgICAgQ0dQ
b2ludCBjYW52YXNQb2ludCA9IENHUG9pbnRBcHBseUFmZmluZVRyYW5zZm9ybSgqKENHUG9pbnQg
Kikmdmlld1BvaW50LCBbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2FudmFzXSk7CisgICAgcmV0
dXJuICgqKE5TUG9pbnQgKikmY2FudmFzUG9pbnQpOworfQorLSAoTlNSZWN0KW1hcFZpZXdSZWN0
VG9DYW52YXM6KE5TUmVjdCl2aWV3UmVjdAoreworICAgIENHUmVjdCBjYW52YXNSZWN0ID0gQ0dS
ZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1JlY3QgKikmdmlld1JlY3QsIFtzZWxmIHRyYW5z
Zm9ybUZyb21WaWV3VG9DYW52YXNdKTsKKyAgICByZXR1cm4gKCooTlNSZWN0ICopJmNhbnZhc1Jl
Y3QpOworfQorLSAoTlNTaXplKW1hcFZpZXdTaXplVG9DYW52YXM6KE5TU2l6ZSl2aWV3U2l6ZQor
eworICAgIENHU2l6ZSBjYW52YXNTaXplID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihD
R1NpemUgKikmdmlld1NpemUsIFtzZWxmIHRyYW5zZm9ybUZyb21WaWV3VG9DYW52YXNdKTsKKyAg
ICByZXR1cm4gKCooTlNTaXplICopJmNhbnZhc1NpemUpOworfQorCistIChOU1BvaW50KW1hcENh
bnZhc1BvaW50VG9WaWV3OihOU1BvaW50KWNhbnZhc1BvaW50Cit7CisgICAgQ0dQb2ludCB2aWV3
UG9pbnQgPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1BvaW50ICopJmNhbnZhc1Bv
aW50LCBDR0FmZmluZVRyYW5zZm9ybUludmVydChbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2Fu
dmFzXSkpOworICAgIHJldHVybiAoKihOU1BvaW50ICopJnZpZXdQb2ludCk7Cit9CistIChOU1Jl
Y3QpbWFwQ2FudmFzUmVjdFRvVmlldzooTlNSZWN0KWNhbnZhc1JlY3QKK3sKKyAgICBDR1JlY3Qg
dmlld1JlY3QgPSBDR1JlY3RBcHBseUFmZmluZVRyYW5zZm9ybSgqKENHUmVjdCAqKSZjYW52YXNS
ZWN0LCBDR0FmZmluZVRyYW5zZm9ybUludmVydChbc2VsZiB0cmFuc2Zvcm1Gcm9tVmlld1RvQ2Fu
dmFzXSkpOworICAgIHJldHVybiAoKihOU1JlY3QgKikmdmlld1JlY3QpOworfQorLSAoTlNTaXpl
KW1hcENhbnZhc1NpemVUb1ZpZXc6KE5TU2l6ZSljYW5hdnNTaXplCit7CisgICAgQ0dTaXplIHZp
ZXdTaXplID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oKihDR1NpemUgKikmY2FuYXZzU2l6
ZSwgQ0dBZmZpbmVUcmFuc2Zvcm1JbnZlcnQoW3NlbGYgdHJhbnNmb3JtRnJvbVZpZXdUb0NhbnZh
c10pKTsKKyAgICByZXR1cm4gKCooTlNTaXplICopJnZpZXdTaXplKTsKK30KKyNwcmFnbWEgbWFy
ayAtCisjcHJhZ21hIG1hcmsgQ2FudmFzIFpvb20vUGFuIChIYWNrISkKKworLSAoTlNQb2ludClj
YW52YXNWaXNpYmxlT3JpZ2luCit7CisgICAgcmV0dXJuIF9wcml2YXRlLT5jYW52YXN2aXNpYmxl
T3JpZ2luOworfQorCistICh2b2lkKXNldENhbnZhc1Zpc2libGVPcmlnaW46KE5TUG9pbnQpbmV3
T3JpZ2luCit7CisgICAgLy8gd2lsbCBldmVudHVhbGx5IG1vdmUgaW50byBOU1Njcm9sbFZpZXcg
SSBmaWd1cmUuCisgICAgX3ByaXZhdGUtPmNhbnZhc3Zpc2libGVPcmlnaW4gPSBuZXdPcmlnaW47
CisgICAgW3NlbGYgc2V0TmVlZHNEaXNwbGF5OllFU107Cit9CisKKy0gKE5TUG9pbnQpY2FudmFz
dmlzaWJsZUNlbnRlclBvaW50Cit7CisgICAgTlNQb2ludCBjZW50ZXJQb2ludCA9IFtzZWxmIGNh
bnZhc1Zpc2libGVPcmlnaW5dOworICAgIE5TU2l6ZSBjYW52YXNWaXNpYmxlU2l6ZSA9IFtzZWxm
IG1hcFZpZXdTaXplVG9DYW52YXM6W3NlbGYgYm91bmRzXS5zaXplXTsKKyAgICBjZW50ZXJQb2lu
dC54ICs9IGNhbnZhc1Zpc2libGVTaXplLndpZHRoLzIuZjsKKyAgICBjZW50ZXJQb2ludC55ICs9
IGNhbnZhc1Zpc2libGVTaXplLmhlaWdodC8yLmY7CisgICAgLy8JTlNQb2ludCBjdm8gPSBbc2Vs
ZiBjYW52YXNWaXNpYmxlT3JpZ2luXTsKKyAgICAvLwlOU0xvZyhAIlZpc2libGUgY2VudGVyOiAl
QCAgdmlzaWJsZSBvcmlnaW46ICVAICB2aXNpYmxlIHNpemU6ICVAICBmYXJQb2ludDogJUAiLAor
ICAgIC8vCQlOU1N0cmluZ0Zyb21Qb2ludChjZW50ZXJQb2ludCksIE5TU3RyaW5nRnJvbVBvaW50
KGN2byksCisgICAgLy8JCU5TU3RyaW5nRnJvbVNpemUoY2FudmFzVmlzaWJsZVNpemUpLCBOU1N0
cmluZ0Zyb21Qb2ludChOU01ha2VQb2ludChjdm8ueCArIGNhbnZhc1Zpc2libGVTaXplLndpZHRo
LCBjdm8ueSArIGNhbnZhc1Zpc2libGVTaXplLmhlaWdodCkpKTsKKyAgICByZXR1cm4gY2VudGVy
UG9pbnQ7Cit9CisKKy0gKHZvaWQpcGFuVG9DYW52YXNDZW50ZXJQb2ludDooTlNQb2ludCluZXdD
ZW50ZXIKK3sKKyAgICBOU1BvaW50IG5ld1Zpc2libGVPcmlnaW4gPSBuZXdDZW50ZXI7CisgICAg
TlNTaXplIGNhbnZhc1Zpc2libGVTaXplID0gW3NlbGYgbWFwVmlld1NpemVUb0NhbnZhczpbc2Vs
ZiBib3VuZHNdLnNpemVdOworICAgIG5ld1Zpc2libGVPcmlnaW4ueCAtPSBjYW52YXNWaXNpYmxl
U2l6ZS53aWR0aC8yLmY7CisgICAgbmV3VmlzaWJsZU9yaWdpbi55IC09IGNhbnZhc1Zpc2libGVT
aXplLmhlaWdodC8yLmY7CisgICAgLy8JTlNMb2coQCJzZXR0aW5nIG5ldyBvcmlnaW46ICVAICB2
aXNpYmxlIHNpemU6ICVAIiwgTlNTdHJpbmdGcm9tUG9pbnQobmV3VmlzaWJsZU9yaWdpbiksIE5T
U3RyaW5nRnJvbVNpemUoY2FudmFzVmlzaWJsZVNpemUpKTsKKyAgICBbc2VsZiBzZXRDYW52YXNW
aXNpYmxlT3JpZ2luOm5ld1Zpc2libGVPcmlnaW5dOworfSAKKworLSAoZmxvYXQpY2FudmFzWm9v
bQoreworICAgIHJldHVybiBfcHJpdmF0ZS0+Y2FudmFzWm9vbTsKKyAgICAvL3JldHVybiBbc2Vs
ZiBzY2FsZV0ud2lkdGg7Cit9CisKKy0gKHZvaWQpc2V0Q2FudmFzWm9vbTooZmxvYXQpbmV3Wm9v
bQoreworICAgIGlmIChfcHJpdmF0ZS0+Y2FudmFzWm9vbSAhPSBuZXdab29tKSB7CisgICAgICAg
IF9wcml2YXRlLT5jYW52YXNab29tID0gbmV3Wm9vbTsKKyAgICAgICAgLy9bc2VsZiBzZXRTY2Fs
ZTpOU01ha2VTaXplKG5ld1pvb20sIG5ld1pvb20pXTsKKyAgICAgICAgW3NlbGYgc2V0TmVlZHNE
aXNwbGF5OllFU107CisgICAgfQorfQorCitAZW5kCisKSW5kZXg6IERyYXdWaWV3UHJpdmF0ZS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KUkNTIGZpbGU6IERyYXdWaWV3UHJpdmF0ZS5oCmRpZmYgLU4gRHJhd1ZpZXdQ
cml2YXRlLmgKLS0tIERyYXdWaWV3UHJpdmF0ZS5oCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAK
KysrIERyYXdWaWV3UHJpdmF0ZS5oCTI5IEp1bCAyMDA1IDE4OjQzOjI0IC0wMDAwCkBAIC0wLDAg
KzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKy8qCisgV0FSTklORzogVGhlc2UgZmlsZXMg
YXJlIHRlbXBvcmFyeSBhbmQgZXhpc3Qgc29sZWx5IGZvciB0aGUgcHVycG9zZQorIG9mIGFsbG93
aW5nIGdyZWF0ZXIgdGVzdGluZyBvZiBXZWJDb3JlK1NWRyBwcmlvciB0byBmdWxsIERPTSBpbnRl
Z3JhdGlvbi4KKyBEbyBOT1QgZGVwZW5kIG9uIHRoZXNlIFNQSXMgb3IgZmlsZXMgYXMgdGhleSB3
aWxsIHNvb24gYmUgZ29uZS4KKyovCisKKyNpbmNsdWRlIDxXZWJDb3JlK1NWRy9EcmF3Vmlldy5o
PgorCitleHRlcm4gTlNBcnJheSAqRHJhd1ZpZXdEcmFnVHlwZXM7CisKK0BpbnRlcmZhY2UgRHJh
d1ZpZXcgKFByaXZhdGVNZXRob2RzKQorCisvLyBGb3IgZGVidWdpbmcgKGZpbHRlciBzdXBwb3J0
IGlzIHBhcnRpYWxseSBicm9rZW4pCisrICh2b2lkKXNldEZpbHRlclN1cHBvcnRFbmFibGVkOihC
T09MKWVuYWJsZWQ7CisrIChCT09MKWlzRmlsdGVyU3VwcG9ydEVuYWJsZWQ7CisKKy0gKHZvaWQp
c2V0QmFja2dyb3VuZENvbG9yOihOU0NvbG9yICopY29sb3I7CistIChOU0NvbG9yICopYmFja2dy
b3VuZENvbG9yOworCisvLyBGSVhNRTogc2hvdWxkIGJlIE9iai1DIERPTSBvYmplY3RzLCBub3Qg
cmVuZGVyIHRyZWUgb2JqZWN0cy4KKy0gKE5TQXJyYXkgKilzZWxlY3RlZENhbnZhc0l0ZW1zOwor
CisvLyBab29tL1BhbgorCistIChDR0FmZmluZVRyYW5zZm9ybSl0cmFuc2Zvcm1Gcm9tVmlld1Rv
Q2FudmFzOworCistIChOU1BvaW50KW1hcFZpZXdQb2ludFRvQ2FudmFzOihOU1BvaW50KXZpZXdQ
b2ludDsKKy0gKE5TUmVjdCltYXBWaWV3UmVjdFRvQ2FudmFzOihOU1JlY3Qpdmlld1JlY3Q7Cist
IChOU1NpemUpbWFwVmlld1NpemVUb0NhbnZhczooTlNTaXplKXZpZXdTaXplOworLSAoTlNQb2lu
dCltYXBDYW52YXNQb2ludFRvVmlldzooTlNQb2ludCljYW52YXNQb2ludDsKKy0gKE5TUmVjdClt
YXBDYW52YXNSZWN0VG9WaWV3OihOU1JlY3QpY2FudmFzUmVjdDsKKy0gKE5TU2l6ZSltYXBDYW52
YXNTaXplVG9WaWV3OihOU1NpemUpdmlld1NpemU7CisKKy0gKE5TUG9pbnQpY2FudmFzVmlzaWJs
ZU9yaWdpbjsKKy0gKHZvaWQpc2V0Q2FudmFzVmlzaWJsZU9yaWdpbjooTlNQb2ludCluZXdPcmln
aW47CisKKy0gKE5TUG9pbnQpY2FudmFzdmlzaWJsZUNlbnRlclBvaW50OworLSAodm9pZClwYW5U
b0NhbnZhc0NlbnRlclBvaW50OihOU1BvaW50KW5ld0NlbnRlcjsKKworLSAoZmxvYXQpY2FudmFz
Wm9vbTsKKy0gKHZvaWQpc2V0Q2FudmFzWm9vbTooZmxvYXQpbmV3Wm9vbTsKKworQGVuZApJbmRl
eDogTlNTVkdJbWFnZVJlcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IE5TU1ZHSW1hZ2VSZXAuaApk
aWZmIC1OIE5TU1ZHSW1hZ2VSZXAuaAotLS0gTlNTVkdJbWFnZVJlcC5oCTEgSmFuIDE5NzAgMDA6
MDA6MDAgLTAwMDAKKysrIE5TU1ZHSW1hZ2VSZXAuaAkyOSBKdWwgMjAwNSAxODo0MzoyNCAtMDAw
MApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1
dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisvKgorIFdBUk5JTkc6IFRo
ZXNlIGZpbGVzIGFyZSB0ZW1wb3JhcnkgYW5kIGV4aXN0IHNvbGVseSBmb3IgdGhlIHB1cnBvc2UK
KyBvZiBhbGxvd2luZyBncmVhdGVyIHRlc3Rpbmcgb2YgV2ViQ29yZStTVkcgcHJpb3IgdG8gZnVs
bCBET00gaW50ZWdyYXRpb24uCisgRG8gTk9UIGRlcGVuZCBvbiB0aGVzZSBTUElzIG9yIGZpbGVz
IGFzIHRoZXkgd2lsbCBzb29uIGJlIGdvbmUuCisqLworCisvKgorIE5PVEU6IFRoaXMgc3BlY2lm
aWMgZmlsZSBleGlzdHMgYXMgYSBoYWNrIHRvIGFsbG93IFdlYktpdCAoYW5kIHRoZSB0ZXN0IAor
IGFwcHMgd2hpY2ggbGluayBhZ2FpbnN0IFdlYkNvcmUrU1ZHKSB0byBwYXNzIGFuIFNWRyBmaWxl
IHRvIE5TSW1hZ2UgCisgW05TSW1hZ2UgaW1hZ2VXaXRoQ29udGVudHNPZkZpbGU6XQorIGFuZCBo
YXZlIE5TSW1hZ2UgYmUgYWJsZSB0byBoYW5kbGUgdGhlIFNWRyBjb3JyZWN0bHkuCisqLworCisj
aW1wb3J0IDxDb2NvYS9Db2NvYS5oPgorCitAY2xhc3MgRHJhd0RvY3VtZW50OworQGNsYXNzIERy
YXdWaWV3OworCitAaW50ZXJmYWNlIE5TU1ZHSW1hZ2VSZXAgOiBOU0ltYWdlUmVwIHsKKyAgICBE
cmF3RG9jdW1lbnQgKl9kcmF3RG9jdW1lbnQ7CisgICAgRHJhd1ZpZXcgKl92aWV3OworICAgIAor
ICAgIE5TQml0bWFwSW1hZ2VSZXAgKl9jYWNoZWRSZXBIYWNrOyAvLyBGSVhNRTogdG90YWwgKHRl
bXBvcmFyeSkgSEFDSworfQorCisrIChpZClpbWFnZVJlcFdpdGhEYXRhOihOU0RhdGEgKilzdmdE
YXRhOworLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilzdmdEYXRhOworQGVuZApJbmRleDog
TlNTVkdJbWFnZVJlcC5tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IE5TU1ZHSW1hZ2VSZXAubQpkaWZm
IC1OIE5TU1ZHSW1hZ2VSZXAubQotLS0gTlNTVkdJbWFnZVJlcC5tCTEgSmFuIDE5NzAgMDA6MDA6
MDAgLTAwMDAKKysrIE5TU1ZHSW1hZ2VSZXAubQkyOSBKdWwgMjAwNSAxODo0MzoyNCAtMDAwMApA
QCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRl
ciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiTlNTVkdJbWFn
ZVJlcC5oIgorCisjaW1wb3J0IDxXZWJDb3JlK1NWRy9EcmF3RG9jdW1lbnRQcml2YXRlLmg+Cisj
aW1wb3J0IDxXZWJDb3JlK1NWRy9EcmF3Vmlldy5oPgorCitzdGF0aWMgTlNTdHJpbmcgKlNWR0Rh
dGFQYXN0ZWJvYXJkVHlwZSA9IEAiU1ZHRGF0YVBhc3RlYm9hcmRUeXBlIjsKKworQGltcGxlbWVu
dGF0aW9uIE5TU1ZHSW1hZ2VSZXAKKworKyAodm9pZClsb2FkCit7CisgICAgLy8gUmVnaXN0ZXIg
dGhpcyBJbWFnZVJlcCBzdWJjbGFzcyByaWdodCB3aGVuIFdlYkNvcmUrU1ZHIGlzIGxvYWRlZC4K
KyAgICBbTlNJbWFnZVJlcCByZWdpc3RlckltYWdlUmVwQ2xhc3M6c2VsZl07Cit9CisKKysgKEJP
T0wpY2FuSW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhCit7CisgICAgaWYgKCFkYXRhKQorICAg
ICAgICByZXR1cm4gTk87CisgICAgCisgICAgLy8gVGhpcyB0ZXN0cyB0byBzZWUgaWYgdGhlIGZp
cnN0IDFrIG9mIHRoZSBmaWxlIGhhcyB0aGUgc3RyaW5nICJzdmciCisgICAgLy8gSWYgaXQgZG9l
c24ndCwgd2UgYXNzdW1lIHRoaXMgaXMgbm90IGFuIFNWRyBmaWxlCisgICAgLy8gQ2xlYXJseSB0
aGlzIGRvZXNuJ3Qgd29yayB3aXRoIHN2Z3ogZmlsZXMuCisgICAgaW50IGxlbmd0aCA9IFtkYXRh
IGxlbmd0aF07CisgICAgaWYgKGxlbmd0aCA+IDEwMjQpCisgICAgICAgIGxlbmd0aCA9IDEwMjQ7
CisgICAgTlNTdHJpbmcgKnRlc3RTdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEJ5
dGVzOltkYXRhIGJ5dGVzXSBsZW5ndGg6bGVuZ3RoIGVuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29k
aW5nXTsKKyAgICBOU1JhbmdlIHJhbmdlID0gW3Rlc3RTdHJpbmcgcmFuZ2VPZlN0cmluZzpAInN2
ZyIgb3B0aW9uczpOU0Nhc2VJbnNlbnNpdGl2ZVNlYXJjaF07CisgICAgW3Rlc3RTdHJpbmcgcmVs
ZWFzZV07CisgICAgaWYgKChyYW5nZS5sb2NhdGlvbiA+IDApICYmIChyYW5nZS5sZW5ndGggPT0g
MykpCisgICAgICAgIHJldHVybiBZRVM7CisgICAgCisgICAgcmV0dXJuIE5POworfQorCisrIChC
T09MKWNhbkluaXRXaXRoUGFzdGVib2FyZDooTlNQYXN0ZWJvYXJkICopcGFzdGVib2FyZAorewor
ICAgIE5TU3RyaW5nICp0eXBlID0gW3Bhc3RlYm9hcmQgYXZhaWxhYmxlVHlwZUZyb21BcnJheTpb
c2VsZiBpbWFnZVVuZmlsdGVyZWRQYXN0ZWJvYXJkVHlwZXNdXTsKKyAgICBpZiAoW3R5cGUgaXNF
cXVhbFRvU3RyaW5nOk5TRmlsZW5hbWVzUGJvYXJkVHlwZV0pIHsKKyAgICAgICAgTlNBcnJheSAq
bmFtZXMgPSBbcGFzdGVib2FyZCBwcm9wZXJ0eUxpc3RGb3JUeXBlOk5TRmlsZW5hbWVzUGJvYXJk
VHlwZV07CisgICAgICAgIE5TRW51bWVyYXRvciAqZmlsZW5hbWVFbnVtZXJhdG9yID0gW25hbWVz
IG9iamVjdEVudW1lcmF0b3JdOworICAgICAgICBOU1N0cmluZyAqZmlsZW5hbWUgPSBuaWw7Cisg
ICAgICAgIHdoaWxlICgoZmlsZW5hbWUgPSBbZmlsZW5hbWVFbnVtZXJhdG9yIG5leHRPYmplY3Rd
KSkgeworICAgICAgICAgICAgaWYgKFtbZmlsZW5hbWUgcGF0aEV4dGVuc2lvbl0gaXNFcXVhbFRv
U3RyaW5nOkAic3ZnIl0pCisgICAgICAgICAgICAgICAgcmV0dXJuIFlFUzsKKyAgICAgICAgfQor
ICAgIH0KKyAgICByZXR1cm4gKHR5cGUgIT0gbmlsKTsKK30KKworKyAoTlNBcnJheSAqKWltYWdl
VW5maWx0ZXJlZEZpbGVUeXBlcworeworICAgIHN0YXRpYyBOU0FycmF5ICp0eXBlcyA9IG5pbDsK
KyAgICBpZiAoIXR5cGVzKQorICAgICAgICB0eXBlcyA9IFtbTlNBcnJheSBhbGxvY10gIGluaXRX
aXRoT2JqZWN0czpAInN2ZyIsIG5pbF07CisgICAgcmV0dXJuIHR5cGVzOworfQorCisrIChOU0Fy
cmF5ICopaW1hZ2VVbmZpbHRlcmVkUGFzdGVib2FyZFR5cGVzCit7CisgICAgc3RhdGljIE5TQXJy
YXkgKnR5cGVzID0gbmlsOworICAgIGlmICghdHlwZXMpCisgICAgICAgIHR5cGVzID0gW1tOU0Fy
cmF5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6U1ZHRGF0YVBhc3RlYm9hcmRUeXBlLCBOU0ZpbGVu
YW1lc1Bib2FyZFR5cGUsIG5pbF07CisgICAgcmV0dXJuIHR5cGVzOworfQorCistIChCT09MKWRy
YXcKK3sKKyAgICBOU0xvZyhAIk5TU1ZHSW1hZ2VSZXAgZHJhdyIpOworICAgIHJldHVybiBbX2Nh
Y2hlZFJlcEhhY2sgZHJhd107OworfQorCistIChCT09MKWRyYXdBdFBvaW50OihOU1BvaW50KXBv
aW50Cit7CisgICAgTlNMb2coQCJOU1NWR0ltYWdlUmVwIGRyYXdBdFBvaW50OiAlQCIsIE5TU3Ry
aW5nRnJvbVBvaW50KHBvaW50KSk7CisgICAgcmV0dXJuIFtfY2FjaGVkUmVwSGFjayBkcmF3QXRQ
b2ludDpwb2ludF07Cit9CisKKy0gKEJPT0wpZHJhd0luUmVjdDooTlNSZWN0KXJlY3QKK3sKKyAg
ICBOU0xvZyhAIk5TU1ZHSW1hZ2VSZXAgZHJhd0luUmVjdDogJUAiLCBOU1N0cmluZ0Zyb21SZWN0
KHJlY3QpKTsKKyAgICByZXR1cm4gW19jYWNoZWRSZXBIYWNrIGRyYXdJblJlY3Q6cmVjdF07Cit9
CisKKysgKGlkKWltYWdlUmVwV2l0aERhdGE6KE5TRGF0YSAqKXN2Z0RhdGEKK3sKKyAgICByZXR1
cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhEYXRhOnN2Z0RhdGFdIGF1dG9yZWxlYXNlXTsKK30K
KworLSAoaWQpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilzdmdEYXRhCit7CisgICAgTlNMb2coQCJO
U1NWR0ltYWdlUmVwIGluaXRXaXRoRGF0YSIpOworICAgIGlmICgoc2VsZiA9IFtzdXBlciBpbml0
XSkpIHsKKyAgICAgICAgX2RyYXdEb2N1bWVudCA9IFtbRHJhd0RvY3VtZW50IGFsbG9jXSBpbml0
V2l0aFNWR0RhdGE6c3ZnRGF0YV07CisgICAgICAgIGlmICghX2RyYXdEb2N1bWVudCkgeworICAg
ICAgICAgICAgW3NlbGYgcmVsZWFzZV07CisgICAgICAgICAgICByZXR1cm4gbmlsOworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICBbc2VsZiBzZXRBbHBoYTpZRVNdOworICAgICAgICAvL1tz
ZWxmIHNldEJpdHNQZXJTYW1wbGU6MzJdOworICAgICAgICBbc2VsZiBzZXRDb2xvclNwYWNlTmFt
ZTpOU0NhbGlicmF0ZWRSR0JDb2xvclNwYWNlXTsKKyAgICAgICAgW3NlbGYgc2V0T3BhcXVlOk5P
XTsKKyAgICAgICAgTlNTaXplIGRvY3VtZW50U2l6ZSA9IFtfZHJhd0RvY3VtZW50IGNhbnZhc1Np
emVdOworICAgICAgICBbc2VsZiBzZXRTaXplOmRvY3VtZW50U2l6ZV07CisgICAgICAgIFtzZWxm
IHNldFBpeGVsc1dpZGU6KGludClkb2N1bWVudFNpemUud2lkdGhdOworICAgICAgICBbc2VsZiBz
ZXRQaXhlbHNIaWdoOihpbnQpZG9jdW1lbnRTaXplLmhlaWdodF07CisgICAgICAgIAorICAgICAg
ICBfdmlldyA9IFtbRHJhd1ZpZXcgYWxsb2NdIGluaXRXaXRoRnJhbWU6TlNNYWtlUmVjdCgwLDAs
ZG9jdW1lbnRTaXplLndpZHRoLGRvY3VtZW50U2l6ZS53aWR0aCldOworICAgICAgICBbX3ZpZXcg
c2V0RG9jdW1lbnQ6X2RyYXdEb2N1bWVudF07CisgICAgICAgIFtfdmlldyBzaXplVG9GaXRWaWV3
Qm94XTsKKyAgICAgICAgCisgICAgICAgIC8vIERyYXdpbmcgYXQgb3RoZXIgdGhhbiAwLDAsIG9y
IGF0IHNvbWUgem9vbXMgd2FzIG5vdCB3b3JraW5nIGNvcnJlY3RseQorICAgICAgICAvLyB3aGVu
IEkgaGFja2VkIHRoaXMgY2xhc3MgdG9nZXRoZXIuICBIZW5jZSB0aGUgdGVtcG9yYXJ5CisgICAg
ICAgIC8vICJDb252ZXJ0IHRvIGEgTlNCaXRtYXBJbWFnZVJlcCBhbmQgbGV0IGl0IGRvIGV2ZXJ5
dGhpbmciIGhhY2suCisgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGZpeGVkIG9uY2UgdGhlIHJl
bmRlcmluZyBsb2dpYyBzZXR0bGVzIGRvd24gYSBiaXQgbW9yZS4KKyAgICAgICAgLy8gQ3VycmVu
dGx5IGRyYXdpbmcgTlNTVkdJbWFnZVJlcHMgYXQgc2NhbGVkIHNpemVzIGlzIHZlcnkgdWdseSBh
cyBhIHJlc3VsdC4KKyAgICAgICAgX2NhY2hlZFJlcEhhY2sgPSBbW192aWV3IGJpdG1hcEltYWdl
UmVwRm9yQ2FjaGluZ0Rpc3BsYXlJblJlY3Q6W192aWV3IGJvdW5kc11dIHJldGFpbl07CisgICAg
ICAgIFtfdmlldyBjYWNoZURpc3BsYXlJblJlY3Q6W192aWV3IGJvdW5kc10gdG9CaXRtYXBJbWFn
ZVJlcDpfY2FjaGVkUmVwSGFja107CisgICAgfQorICAgIHJldHVybiBzZWxmOworfQorCistIChO
U0RhdGEgKilyZXByZXNlbnRhdGlvblVzaW5nVHlwZTooTlNCaXRtYXBJbWFnZUZpbGVUeXBlKXN0
b3JhZ2VUeXBlIHByb3BlcnRpZXM6KE5TRGljdGlvbmFyeSAqKXByb3BlcnRpZXMKK3sKKyAgICBy
ZXR1cm4gW19jYWNoZWRSZXBIYWNrIHJlcHJlc2VudGF0aW9uVXNpbmdUeXBlOnN0b3JhZ2VUeXBl
IHByb3BlcnRpZXM6cHJvcGVydGllc107Cit9CisKKy0gKHZvaWQpc2V0U2l6ZTooTlNTaXplKW5l
d1NpemUKK3sKKyAgICBOU0xvZyhAIk5TU1ZHSW1hZ2VSZXAgc2V0U2l6ZToiKTsKKyAgICBbc3Vw
ZXIgc2V0U2l6ZTpuZXdTaXplXTsKK30KKworQGVuZAo=
</data>
<flag name="review"
          id="292"
          type_id="1"
          status="+"
          setter="sullivan"
    />
          </attachment>
      

    </bug>

</bugzilla>