<?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>58927</bug_id>
          
          <creation_ts>2011-04-19 14:11:28 -0700</creation_ts>
          <short_desc>Move and rename GLES2Canvas</short_desc>
          <delta_ts>2011-04-20 08:02:33 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Canvas</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Stephen White">senorblanco</reporter>
          <assigned_to name="Stephen White">senorblanco</assigned_to>
          <cc>kbr</cc>
    
    <cc>mdelaney7</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>388780</commentid>
    <comment_count>0</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-04-19 14:11:28 -0700</bug_when>
    <thetext>GLES2Canvas isn&apos;t really a canvas; it&apos;s a context.  It also has no particular ties to platform/graphics/chromium, and should live in platform/graphics/gpu where all the shaders are.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388797</commentid>
    <comment_count>1</comment_count>
      <attachid>90254</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-04-19 14:26:38 -0700</bug_when>
    <thetext>Created attachment 90254
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388862</commentid>
    <comment_count>2</comment_count>
      <attachid>90254</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-04-19 15:48:31 -0700</bug_when>
    <thetext>Comment on attachment 90254
Patch

This looks fine to me. Usually this sort of renaming is done with Tools/Scripts/do-webcore-rename, but I don&apos;t think that script supports moving files between subdirectories. It&apos;s clear that this patch contains only the straightforward renaming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>388949</commentid>
    <comment_count>3</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-04-19 17:46:49 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 90254 [details])
&gt; This looks fine to me. Usually this sort of renaming is done with Tools/Scripts/do-webcore-rename, but I don&apos;t think that script supports moving files between subdirectories. It&apos;s clear that this patch contains only the straightforward renaming.

Thanks!  I didn&apos;t know about that script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>389231</commentid>
    <comment_count>4</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-04-20 08:02:33 -0700</bug_when>
    <thetext>Committed r84374: &lt;http://trac.webkit.org/changeset/84374&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>90254</attachid>
            <date>2011-04-19 14:26:38 -0700</date>
            <delta_ts>2011-04-19 15:48:31 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-58927-20110419172637.patch</filename>
            <type>text/plain</type>
            <size>107518</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg0MjkxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzAgQEAKKzIwMTEtMDQtMTkgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTW92ZSBhbmQgcmVuYW1lIEdMRVMyQ2FudmFzLgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTg5MjcKKwor
ICAgICAgICBNb3ZlIEdMRVMyQ2FudmFzIHRvIHBsYXRmb3JtL2dyYXBoY3MvZ3B1LCB3aGVyZSBh
bGwgdGhlIG90aGVyCisgICAgICAgIGdwdS1yZWxhdGVkIGZpbGVzIGxpdmUsIGFuZCByZW5hbWUg
aXQgdG8gR3JhcGhpY3NDb250ZXh0R1BVIHRvIGJldHRlcgorICAgICAgICByZWZsZWN0IGl0cyBw
dXJwb3NlLgorCisgICAgICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMuCisKKyAgICAgICAg
KiBXZWJDb3JlLmd5cGk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xF
UzJDYW52YXMuY3BwOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMy
Q2FudmFzLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HcmFwaGljc0NvbnRl
eHRTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1ZmZlclNraWEuY3BwOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VTa2lhLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OmRyYXdCaXRtYXBHTEVTMik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9QbGF0Zm9ybUNvbnRleHRTa2lhLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3Jt
Q29udGV4dFNraWE6OnNldFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29udGV4dFNraWEuaDoKKyAgICAgICAgKFdlYkNv
cmU6OlBsYXRmb3JtQ29udGV4dFNraWE6OmdwdUNhbnZhcyk6CisKIDIwMTEtMDQtMTkgIFJlbmF0
YSBIb2RvdmFuICA8cmVuaUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMg
U2VpZGVsLgpJbmRleDogU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gODQyOTEpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTQwMTEsOCArNDAxMSw2IEBA
CiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udFJlbmRlclN0eWxl
LmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRVdGlsc0No
cm9taXVtV2luLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Rm9udFV0aWxzQ2hyb21pdW1XaW4uaCcsCi0gICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vR0xFUzJDYW52YXMuY3BwJywKLSAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9HZW9tZXRyeUJpbmRpbmcuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9HZW9tZXRyeUJpbmRpbmcuaCcsCiAgICAgICAgICAgICAncGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vR2x5cGhQYWdlVHJlZU5vZGVDaHJvbWl1bVdpbi5jcHAnLApA
QCAtNDE1MCw2ICs0MTQ4LDggQEAKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9ncHUv
Q29udm9sdXRpb25TaGFkZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvZ3B1
L0RyYXdpbmdCdWZmZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9ncHUv
RHJhd2luZ0J1ZmZlci5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9ncHUvR3Jh
cGhpY3NDb250ZXh0R1BVLmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvZ3B1
L0dyYXBoaWNzQ29udGV4dEdQVS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9n
cHUvTG9vcEJsaW5uQ2xhc3NpZmllci5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2dwdS9Mb29wQmxpbm5DbGFzc2lmaWVyLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9Mb29wQmxpbm5Db25zdGFudHMuaCcsCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZhcy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuY3Bw
CShyZXZpc2lvbiA4NDI5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0dMRVMyQ2FudmFzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw5MzEgKzAsMCBAQAot
LyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQot
ICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
LSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJHTEVTMkNhbnZhcy5oIgotCi0jaW5jbHVk
ZSAiRHJhd2luZ0J1ZmZlci5oIgotI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkZs
b2F0U2l6ZS5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCi0jaW5jbHVkZSAiaW50
ZXJuYWxfZ2x1LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotI2luY2x1ZGUgIkxvb3BCbGlubk1h
dGhVdGlscy5oIgotI2luY2x1ZGUgIkxvb3BCbGlublBhdGhQcm9jZXNzb3IuaCIKLSNpbmNsdWRl
ICJMb29wQmxpbm5Tb2xpZEZpbGxTaGFkZXIuaCIKLSNpbmNsdWRlICJQYXRoLmgiCi0jaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKLSNpbmNsdWRlICJTaGFyZWRHcmFwaGljc0NvbnRleHQzRC5o
IgotI2lmIFVTRShTS0lBKQotI2luY2x1ZGUgIlNrUGF0aC5oIgotI2VuZGlmCi0jaW5jbHVkZSAi
VGV4dHVyZS5oIgotCi0jZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTCi0jaW5jbHVkZSA8bWF0aC5o
PgotCi0jaW5jbHVkZSA8d3RmL093bkFycmF5UHRyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLS8vIE51bWJlciBvZiBsaW5lIHNlZ21l
bnRzIHVzZWQgdG8gYXBwcm94aW1hdGUgYmV6aWVyIGN1cnZlcy4KLWNvbnN0IGludCBwYXRoVGVz
c2VsYXRpb24gPSAzMDsKLXR5cGVkZWYgdm9pZCAoR0xBUElFTlRSWSAqVEVTU0NCKSgpOwotdHlw
ZWRlZiBXVEY6OlZlY3RvcjxmbG9hdD4gRmxvYXRWZWN0b3I7Ci10eXBlZGVmIFdURjo6VmVjdG9y
PEZsb2F0UG9pbnQ+IEZsb2F0UG9pbnRWZWN0b3I7Ci0KLXN0cnVjdCBQYXRoQW5kVHJhbnNmb3Jt
IHsKLSAgICBQYXRoQW5kVHJhbnNmb3JtKGNvbnN0IFBhdGgmIHAsIGNvbnN0IEFmZmluZVRyYW5z
Zm9ybSYgdCkKLSAgICAgICAgOiBwYXRoKHApCi0gICAgICAgICwgdHJhbnNmb3JtKHQpCi0gICAg
ewotICAgIH0KLSAgICBQYXRoIHBhdGg7Ci0gICAgQWZmaW5lVHJhbnNmb3JtIHRyYW5zZm9ybTsK
LX07Ci0KLXN0cnVjdCBHTEVTMkNhbnZhczo6U3RhdGUgewotICAgIFN0YXRlKCkKLSAgICAgICAg
OiBtX2ZpbGxDb2xvcigwLCAwLCAwLCAyNTUpCi0gICAgICAgICwgbV9zaGFkb3dDb2xvcigwLCAw
LCAwLCAwKQotICAgICAgICAsIG1fYWxwaGEoMS4wZikKLSAgICAgICAgLCBtX2NvbXBvc2l0ZU9w
KENvbXBvc2l0ZVNvdXJjZU92ZXIpCi0gICAgICAgICwgbV9udW1DbGlwcGluZ1BhdGhzKDApCi0g
ICAgICAgICwgbV9zaGFkb3dPZmZzZXQoMCwgMCkKLSAgICAgICAgLCBtX3NoYWRvd0JsdXIoMCkK
LSAgICAgICAgLCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKGZhbHNlKQotICAgIHsKLSAgICB9
Ci0gICAgU3RhdGUoY29uc3QgU3RhdGUmIG90aGVyKQotICAgICAgICA6IG1fZmlsbENvbG9yKG90
aGVyLm1fZmlsbENvbG9yKQotICAgICAgICAsIG1fc2hhZG93Q29sb3Iob3RoZXIubV9zaGFkb3dD
b2xvcikKLSAgICAgICAgLCBtX2FscGhhKG90aGVyLm1fYWxwaGEpCi0gICAgICAgICwgbV9jb21w
b3NpdGVPcChvdGhlci5tX2NvbXBvc2l0ZU9wKQotICAgICAgICAsIG1fY3RtKG90aGVyLm1fY3Rt
KQotICAgICAgICAsIG1fY2xpcHBpbmdQYXRocygpIC8vIERvbid0IGNvcHk7IGNsaXBwaW5nIHBh
dGhzIGFyZSB0cmFja2VkIHBlci1zdGF0ZS4KLSAgICAgICAgLCBtX251bUNsaXBwaW5nUGF0aHMo
b3RoZXIubV9udW1DbGlwcGluZ1BhdGhzKQotICAgICAgICAsIG1fc2hhZG93T2Zmc2V0KG90aGVy
Lm1fc2hhZG93T2Zmc2V0KQotICAgICAgICAsIG1fc2hhZG93Qmx1cihvdGhlci5tX3NoYWRvd0Js
dXIpCi0gICAgICAgICwgbV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcyhvdGhlci5tX3NoYWRvd3NJ
Z25vcmVUcmFuc2Zvcm1zKQotICAgIHsKLSAgICB9Ci0gICAgQ29sb3IgbV9maWxsQ29sb3I7Ci0g
ICAgQ29sb3IgbV9zaGFkb3dDb2xvcjsKLSAgICBmbG9hdCBtX2FscGhhOwotICAgIENvbXBvc2l0
ZU9wZXJhdG9yIG1fY29tcG9zaXRlT3A7Ci0gICAgQWZmaW5lVHJhbnNmb3JtIG1fY3RtOwotICAg
IFdURjo6VmVjdG9yPFBhdGhBbmRUcmFuc2Zvcm0+IG1fY2xpcHBpbmdQYXRoczsKLSAgICBpbnQg
bV9udW1DbGlwcGluZ1BhdGhzOwotICAgIEZsb2F0U2l6ZSBtX3NoYWRvd09mZnNldDsKLSAgICBm
bG9hdCBtX3NoYWRvd0JsdXI7Ci0gICAgYm9vbCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOwot
Ci0gICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBhcHBseWluZyB0aGUgc3RhdGUncyBhbHBoYSB2
YWx1ZSB0byB0aGUgZ2l2ZW4gaW5wdXQKLSAgICAvLyBjb2xvciB0byBwcm9kdWNlIGEgbmV3IG91
dHB1dCBjb2xvci4gVGhlIGxvZ2ljIGlzIHRoZSBzYW1lIGFzCi0gICAgLy8gUGxhdGZvcm1Db250
ZXh0U2tpYTo6U3RhdGU6OmFwcGx5QWxwaGEoKSwgYnV0IHRoZSB0eXBlIGlzIGRpZmZlcmVudC4K
LSAgICBDb2xvciBhcHBseUFscGhhKGNvbnN0IENvbG9yJiBjKQotICAgIHsKLSAgICAgICAgaW50
IHMgPSByb3VuZGYobV9hbHBoYSAqIDI1Nik7Ci0gICAgICAgIGlmIChzID49IDI1NikKLSAgICAg
ICAgICAgIHJldHVybiBjOwotICAgICAgICBpZiAocyA8IDApCi0gICAgICAgICAgICByZXR1cm4g
Q29sb3IoKTsKLQotICAgICAgICBpbnQgYSA9IChjLmFscGhhKCkgKiBzKSA+PiA4OwotICAgICAg
ICByZXR1cm4gQ29sb3IoYy5yZWQoKSwgYy5ncmVlbigpLCBjLmJsdWUoKSwgYSk7Ci0gICAgfQot
ICAgIGJvb2wgc2hhZG93QWN0aXZlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX3No
YWRvd0NvbG9yLmFscGhhKCkgPiAwICYmIChtX3NoYWRvd0JsdXIgfHwgbV9zaGFkb3dPZmZzZXQu
d2lkdGgoKSB8fCBtX3NoYWRvd09mZnNldC5oZWlnaHQoKSk7Ci0gICAgfQotICAgIGJvb2wgY2xp
cHBpbmdFbmFibGVkKCkgeyByZXR1cm4gbV9udW1DbGlwcGluZ1BhdGhzID4gMDsgfQotfTsKLQot
c3RhdGljIGlubGluZSBGbG9hdFBvaW50IG9wZXJhdG9yKihjb25zdCBGbG9hdFBvaW50JiBmLCBm
bG9hdCBzY2FsZSkKLXsKLSAgICByZXR1cm4gRmxvYXRQb2ludChmLngoKSAqIHNjYWxlLCBmLnko
KSAqIHNjYWxlKTsKLX0KLQotc3RhdGljIGlubGluZSBGbG9hdFBvaW50IG9wZXJhdG9yKihmbG9h
dCBzY2FsZSwgY29uc3QgRmxvYXRQb2ludCYgZikKLXsKLSAgICByZXR1cm4gRmxvYXRQb2ludChm
LngoKSAqIHNjYWxlLCBmLnkoKSAqIHNjYWxlKTsKLX0KLQotc3RhdGljIGlubGluZSBGbG9hdFNp
emUgb3BlcmF0b3IqKGNvbnN0IEZsb2F0U2l6ZSYgZiwgZmxvYXQgc2NhbGUpCi17Ci0gICAgcmV0
dXJuIEZsb2F0U2l6ZShmLndpZHRoKCkgKiBzY2FsZSwgZi5oZWlnaHQoKSAqIHNjYWxlKTsKLX0K
LQotc3RhdGljIGlubGluZSBGbG9hdFNpemUgb3BlcmF0b3IqKGZsb2F0IHNjYWxlLCBjb25zdCBG
bG9hdFNpemUmIGYpCi17Ci0gICAgcmV0dXJuIEZsb2F0U2l6ZShmLndpZHRoKCkgKiBzY2FsZSwg
Zi5oZWlnaHQoKSAqIHNjYWxlKTsKLX0KLQotY2xhc3MgUXVhZHJhdGljIHsKLSAgcHVibGljOgot
ICAgIFF1YWRyYXRpYyhGbG9hdFBvaW50IGEsIEZsb2F0UG9pbnQgYiwgRmxvYXRQb2ludCBjKSA6
Ci0gICAgICAgIG1fYShhKSwgbV9iKGIpLCBtX2MoYykKLSAgICB7Ci0gICAgfQotICAgIHN0YXRp
YyBRdWFkcmF0aWMgZnJvbUJlemllcihGbG9hdFBvaW50IHAwLCBGbG9hdFBvaW50IHAxLCBGbG9h
dFBvaW50IHAyKQotICAgIHsKLSAgICAgICAgRmxvYXRTaXplIHAxcyhwMS54KCksIHAxLnkoKSk7
Ci0gICAgICAgIEZsb2F0U2l6ZSBwMnMocDIueCgpLCBwMi55KCkpOwotICAgICAgICBGbG9hdFBv
aW50IGIgPSAtMi4wZiAqIHAwICsgMi4wZiAqIHAxczsKLSAgICAgICAgRmxvYXRQb2ludCBjID0g
ICAgICAgICBwMCAtIDIuMGYgKiBwMXMgKyBwMnM7Ci0gICAgICAgIHJldHVybiBRdWFkcmF0aWMo
cDAsIGIsIGMpOwotICAgIH0KLSAgICBpbmxpbmUgRmxvYXRQb2ludCBldmFsdWF0ZShmbG9hdCB0
KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fYSArIHQgKiAobV9iICsgdCAqIG1fYyk7Ci0gICAg
fQotICAgIEZsb2F0UG9pbnQgbV9hLCBtX2IsIG1fYywgbV9kOwotfTsKLQotY2xhc3MgQ3ViaWMg
ewotICBwdWJsaWM6Ci0gICAgQ3ViaWMoRmxvYXRQb2ludCBhLCBGbG9hdFBvaW50IGIsIEZsb2F0
UG9pbnQgYywgRmxvYXRQb2ludCBkKSA6Ci0gICAgICAgIG1fYShhKSwgbV9iKGIpLCBtX2MoYyks
IG1fZChkKSAKLSAgICB7Ci0gICAgfQotICAgIHN0YXRpYyBDdWJpYyBmcm9tQmV6aWVyKEZsb2F0
UG9pbnQgcDAsIEZsb2F0UG9pbnQgcDEsIEZsb2F0UG9pbnQgcDIsIEZsb2F0UG9pbnQgcDMpCi0g
ICAgewotICAgICAgICBGbG9hdFNpemUgcDFzKHAxLngoKSwgcDEueSgpKTsKLSAgICAgICAgRmxv
YXRTaXplIHAycyhwMi54KCksIHAyLnkoKSk7Ci0gICAgICAgIEZsb2F0U2l6ZSBwM3MocDMueCgp
LCBwMy55KCkpOwotICAgICAgICBGbG9hdFBvaW50IGIgPSAtMy4wZiAqIHAwICsgMy4wZiAqIHAx
czsKLSAgICAgICAgRmxvYXRQb2ludCBjID0gIDMuMGYgKiBwMCAtIDYuMGYgKiBwMXMgKyAzLjBm
ICogcDJzOwotICAgICAgICBGbG9hdFBvaW50IGQgPSAtMS4wZiAqIHAwICsgMy4wZiAqIHAxcyAt
IDMuMGYgKiBwMnMgKyBwM3M7Ci0gICAgICAgIHJldHVybiBDdWJpYyhwMCwgYiwgYywgZCk7Ci0g
ICAgfQotICAgIGlubGluZSBGbG9hdFBvaW50IGV2YWx1YXRlKGZsb2F0IHQpCi0gICAgewotICAg
ICAgICByZXR1cm4gbV9hICsgdCAqIChtX2IgKyB0ICogKG1fYyArIHQgKiBtX2QpKTsKLSAgICB9
Ci0gICAgRmxvYXRQb2ludCBtX2EsIG1fYiwgbV9jLCBtX2Q7Ci19OwotCi1HTEVTMkNhbnZhczo6
R0xFUzJDYW52YXMoU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQsIERyYXdpbmdCdWZm
ZXIqIGRyYXdpbmdCdWZmZXIsIGNvbnN0IEludFNpemUmIHNpemUpCi0gICAgOiBtX3NpemUoc2l6
ZSkKLSAgICAsIG1fY29udGV4dChjb250ZXh0KQotICAgICwgbV9kcmF3aW5nQnVmZmVyKGRyYXdp
bmdCdWZmZXIpCi0gICAgLCBtX3N0YXRlKDApCi0gICAgLCBtX3BhdGhJbmRleEJ1ZmZlcigwKQot
ICAgICwgbV9wYXRoVmVydGV4QnVmZmVyKDApCi17Ci0gICAgbV9mbGlwTWF0cml4LnRyYW5zbGF0
ZSgtMS4wZiwgMS4wZik7Ci0gICAgbV9mbGlwTWF0cml4LnNjYWxlKDIuMGYgLyBzaXplLndpZHRo
KCksIC0yLjBmIC8gc2l6ZS5oZWlnaHQoKSk7Ci0KLSAgICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0
YXRlKCkpOwotICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKLX0KLQotR0xFUzJD
YW52YXM6On5HTEVTMkNhbnZhcygpCi17Ci0gICAgaWYgKG1fcGF0aEluZGV4QnVmZmVyKQotICAg
ICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRlbGV0ZUJ1ZmZlcihtX3BhdGhJ
bmRleEJ1ZmZlcik7Ci0gICAgaWYgKG1fcGF0aFZlcnRleEJ1ZmZlcikKLSAgICAgICAgbV9jb250
ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5kZWxldGVCdWZmZXIobV9wYXRoVmVydGV4QnVmZmVy
KTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6YmluZEZyYW1lYnVmZmVyKCkKLXsKLSAgICBtX2Ry
YXdpbmdCdWZmZXItPmJpbmQoKTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6Y2xlYXJSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCkKLXsKLSAgICBiaW5kRnJhbWVidWZmZXIoKTsKLSAgICBpZiAo
bV9zdGF0ZS0+bV9jdG0uaXNJZGVudGl0eSgpICYmICFtX3N0YXRlLT5jbGlwcGluZ0VuYWJsZWQo
KSkgewotICAgICAgICBzY2lzc29yQ2xlYXIocmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRo
KCksIHJlY3QuaGVpZ2h0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNhdmUoKTsKLSAgICAg
ICAgc2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZUNsZWFyKTsKLSAgICAgICAgZmlsbFJl
Y3QocmVjdCwgQ29sb3IoUkdCQTMyKDApKSwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgICAg
IHJlc3RvcmUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmFwcGx5U3RhdGUoKQot
ewotICAgIGJpbmRGcmFtZWJ1ZmZlcigpOwotICAgIG1fY29udGV4dC0+YXBwbHlDb21wb3NpdGVP
cGVyYXRvcihtX3N0YXRlLT5tX2NvbXBvc2l0ZU9wKTsKLSAgICBhcHBseUNsaXBwaW5nKG1fc3Rh
dGUtPmNsaXBwaW5nRW5hYmxlZCgpKTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6c2Npc3NvckNs
ZWFyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpCi17Ci0gICAg
aW50IGludFggPSBzdGF0aWNfY2FzdDxpbnQ+KHggKyAwLjVmKTsKLSAgICBpbnQgaW50WSA9IHN0
YXRpY19jYXN0PGludD4oeSArIDAuNWYpOwotICAgIGludCBpbnRXaWR0aCA9IHN0YXRpY19jYXN0
PGludD4oeCArIHdpZHRoICsgMC41ZikgLSBpbnRYOwotICAgIGludCBpbnRIZWlnaHQgPSBzdGF0
aWNfY2FzdDxpbnQ+KHkgKyBoZWlnaHQgKyAwLjVmKSAtIGludFk7Ci0gICAgbV9jb250ZXh0LT5z
Y2lzc29yKGludFgsIG1fc2l6ZS5oZWlnaHQoKSAtIGludEhlaWdodCAtIGludFksIGludFdpZHRo
LCBpbnRIZWlnaHQpOwotICAgIG1fY29udGV4dC0+ZW5hYmxlKEdyYXBoaWNzQ29udGV4dDNEOjpT
Q0lTU09SX1RFU1QpOwotICAgIG1fY29udGV4dC0+Y2xlYXJDb2xvcihDb2xvcihSR0JBMzIoMCkp
KTsKLSAgICBtX2NvbnRleHQtPmNsZWFyKEdyYXBoaWNzQ29udGV4dDNEOjpDT0xPUl9CVUZGRVJf
QklUKTsKLSAgICBtX2NvbnRleHQtPmRpc2FibGUoR3JhcGhpY3NDb250ZXh0M0Q6OlNDSVNTT1Jf
VEVTVCk7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmZpbGxQYXRoKGNvbnN0IFBhdGgmIHBhdGgp
Ci17Ci0gICAgaWYgKG1fc3RhdGUtPnNoYWRvd0FjdGl2ZSgpKSB7Ci0gICAgICAgIGJlZ2luU2hh
ZG93RHJhdygpOwotICAgICAgICBmaWxsUGF0aEludGVybmFsKHBhdGgsIG1fc3RhdGUtPm1fc2hh
ZG93Q29sb3IpOwotICAgICAgICBlbmRTaGFkb3dEcmF3KHBhdGguYm91bmRpbmdSZWN0KCkpOwot
ICAgIH0KLQotICAgIGFwcGx5U3RhdGUoKTsKLSAgICBmaWxsUGF0aEludGVybmFsKHBhdGgsIG1f
c3RhdGUtPmFwcGx5QWxwaGEobV9zdGF0ZS0+bV9maWxsQ29sb3IpKTsKLX0KLQotdm9pZCBHTEVT
MkNhbnZhczo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0LCBjb25zdCBDb2xvciYgY29s
b3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKLXsKLSAgICBpZiAobV9zdGF0ZS0+c2hhZG93QWN0
aXZlKCkpIHsKLSAgICAgICAgYmVnaW5TaGFkb3dEcmF3KCk7Ci0gICAgICAgIGZpbGxSZWN0SW50
ZXJuYWwocmVjdCwgbV9zdGF0ZS0+bV9zaGFkb3dDb2xvcik7Ci0gICAgICAgIGVuZFNoYWRvd0Ry
YXcocmVjdCk7Ci0gICAgfQotCi0gICAgYXBwbHlTdGF0ZSgpOwotICAgIGZpbGxSZWN0SW50ZXJu
YWwocmVjdCwgY29sb3IpOwotfQotCi12b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBG
bG9hdFJlY3QmIHJlY3QpCi17Ci0gICAgZmlsbFJlY3QocmVjdCwgbV9zdGF0ZS0+YXBwbHlBbHBo
YShtX3N0YXRlLT5tX2ZpbGxDb2xvciksIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotfQotCi12b2lk
IEdMRVMyQ2FudmFzOjpmaWxsUmVjdEludGVybmFsKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yKQotewotICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXgobV9mbGlwTWF0
cml4KTsKLSAgICBtYXRyaXggKj0gbV9zdGF0ZS0+bV9jdG07Ci0gICAgbWF0cml4LnRyYW5zbGF0
ZShyZWN0LngoKSwgcmVjdC55KCkpOwotICAgIG1hdHJpeC5zY2FsZShyZWN0LndpZHRoKCksIHJl
Y3QuaGVpZ2h0KCkpOwotCi0gICAgbV9jb250ZXh0LT51c2VRdWFkVmVydGljZXMoKTsKLSAgICBt
X2NvbnRleHQtPnVzZUZpbGxTb2xpZFByb2dyYW0obWF0cml4LCBjb2xvcik7Ci0gICAgbV9jb250
ZXh0LT5kcmF3QXJyYXlzKEdyYXBoaWNzQ29udGV4dDNEOjpUUklBTkdMRV9TVFJJUCwgMCwgNCk7
Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnNldEZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sb3Is
IENvbG9yU3BhY2UgY29sb3JTcGFjZSkKLXsKLSAgICBtX3N0YXRlLT5tX2ZpbGxDb2xvciA9IGNv
bG9yOwotfQotCi12b2lkIEdMRVMyQ2FudmFzOjpzZXRBbHBoYShmbG9hdCBhbHBoYSkKLXsKLSAg
ICBtX3N0YXRlLT5tX2FscGhhID0gYWxwaGE7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnNldFNo
YWRvd0NvbG9yKGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSkKLXsKLSAgICBtX3N0YXRl
LT5tX3NoYWRvd0NvbG9yID0gY29sb3I7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnNldFNoYWRv
d09mZnNldChjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKLXsKLSAgICBtX3N0YXRlLT5tX3NoYWRv
d09mZnNldCA9IG9mZnNldDsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6c2V0U2hhZG93Qmx1cihm
bG9hdCBzaGFkb3dCbHVyKQotewotICAgIG1fc3RhdGUtPm1fc2hhZG93Qmx1ciA9IHNoYWRvd0Js
dXI7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnNldFNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKGJv
b2wgc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpCi17Ci0gICAgbV9zdGF0ZS0+bV9zaGFkb3dzSWdu
b3JlVHJhbnNmb3JtcyA9IHNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOwotfQotCi12b2lkIEdMRVMy
Q2FudmFzOjp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKLXsKLSAgICBtX3N0YXRlLT5tX2N0
bS50cmFuc2xhdGUoeCwgeSk7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnJvdGF0ZShmbG9hdCBh
bmdsZUluUmFkaWFucykKLXsKLSAgICBtX3N0YXRlLT5tX2N0bS5yb3RhdGUoYW5nbGVJblJhZGlh
bnMgKiAoMTgwLjBmIC8gTV9QSSkpOwotfQotCi12b2lkIEdMRVMyQ2FudmFzOjpzY2FsZShjb25z
dCBGbG9hdFNpemUmIHNpemUpCi17Ci0gICAgbV9zdGF0ZS0+bV9jdG0uc2NhbGUoc2l6ZS53aWR0
aCgpLCBzaXplLmhlaWdodCgpKTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6Y29uY2F0Q1RNKGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYgYWZmaW5lKQotewotICAgIG1fc3RhdGUtPm1fY3RtICo9IGFm
ZmluZTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6c2V0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9y
bSYgYWZmaW5lKQotewotICAgIG1fc3RhdGUtPm1fY3RtID0gYWZmaW5lOwotfQotCi12b2lkIEdM
RVMyQ2FudmFzOjpjbGlwUGF0aChjb25zdCBQYXRoJiBwYXRoKQotewotICAgIGJpbmRGcmFtZWJ1
ZmZlcigpOwotICAgIGNoZWNrR0xFcnJvcigiYmluZEZyYW1lYnVmZmVyIik7Ci0gICAgYmVnaW5T
dGVuY2lsRHJhdyhHcmFwaGljc0NvbnRleHQzRDo6SU5DUik7Ci0gICAgLy8gUmVkIGlzIHVzZWQg
c28gd2UgY2FuIHNlZSBpdCBpZiBpdCBlbmRzIHVwIGluIHRoZSBjb2xvciBidWZmZXIuCi0gICAg
Q29sb3IgcmVkKDI1NSwgMCwgMCwgMjU1KTsKLSAgICBmaWxsUGF0aEludGVybmFsKHBhdGgsIHJl
ZCk7Ci0gICAgbV9zdGF0ZS0+bV9jbGlwcGluZ1BhdGhzLmFwcGVuZChQYXRoQW5kVHJhbnNmb3Jt
KHBhdGgsIG1fc3RhdGUtPm1fY3RtKSk7Ci0gICAgbV9zdGF0ZS0+bV9udW1DbGlwcGluZ1BhdGhz
Kys7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0aCkKLXsK
LSAgICBBU1NFUlQoISJjbGlwT3V0IGlzIHVuc3VwcG9ydGVkIGluIEdMRVMyQ2FudmFzLlxuIik7
Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OnNhdmUoKQotewotICAgIG1fc3RhdGVTdGFjay5hcHBl
bmQoU3RhdGUobV9zdGF0ZVN0YWNrLmxhc3QoKSkpOwotICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0
YWNrLmxhc3QoKTsKLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6cmVzdG9yZSgpCi17Ci0gICAgQVNT
RVJUKCFtX3N0YXRlU3RhY2suaXNFbXB0eSgpKTsKLSAgICBjb25zdCBWZWN0b3I8UGF0aEFuZFRy
YW5zZm9ybT4mIGNsaXBwaW5nUGF0aHMgPSBtX3N0YXRlLT5tX2NsaXBwaW5nUGF0aHM7Ci0gICAg
aWYgKCFjbGlwcGluZ1BhdGhzLmlzRW1wdHkoKSkgewotICAgICAgICBiZWdpblN0ZW5jaWxEcmF3
KEdyYXBoaWNzQ29udGV4dDNEOjpERUNSKTsKLSAgICAgICAgV1RGOjpWZWN0b3I8UGF0aEFuZFRy
YW5zZm9ybT46OmNvbnN0X2l0ZXJhdG9yIHBhdGhJdGVyOwotICAgICAgICBmb3IgKHBhdGhJdGVy
ID0gY2xpcHBpbmdQYXRocy5iZWdpbigpOyBwYXRoSXRlciA8IGNsaXBwaW5nUGF0aHMuZW5kKCk7
ICsrcGF0aEl0ZXIpIHsKLSAgICAgICAgICAgIG1fc3RhdGUtPm1fY3RtID0gcGF0aEl0ZXItPnRy
YW5zZm9ybTsKLSAgICAgICAgICAgIC8vIFJlZCBpcyB1c2VkIHNvIHdlIGNhbiBzZWUgaXQgaWYg
aXQgZW5kcyB1cCBpbiB0aGUgY29sb3IgYnVmZmVyLgotICAgICAgICAgICAgQ29sb3IgcmVkKDI1
NSwgMCwgMCwgMjU1KTsKLSAgICAgICAgICAgIGZpbGxQYXRoSW50ZXJuYWwocGF0aEl0ZXItPnBh
dGgsIHJlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbV9zdGF0ZVN0YWNrLnJlbW92ZUxhc3Qo
KTsKLSAgICBtX3N0YXRlID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7Ci19Ci0KLXZvaWQgR0xFUzJD
YW52YXM6OmRyYXdUZXh0dXJlZFJlY3QodW5zaWduZWQgdGV4dHVyZSwgY29uc3QgSW50U2l6ZSYg
dGV4dHVyZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBk
c3RSZWN0LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0
ZU9wKQotewotICAgIGJpbmRGcmFtZWJ1ZmZlcigpOwotICAgIG1fY29udGV4dC0+YXBwbHlDb21w
b3NpdGVPcGVyYXRvcihjb21wb3NpdGVPcCk7Ci0gICAgYXBwbHlDbGlwcGluZyhmYWxzZSk7Ci0K
LSAgICBtX2NvbnRleHQtPnNldEFjdGl2ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRV
UkUwKTsKLQotICAgIG1fY29udGV4dC0+YmluZFRleHR1cmUoR3JhcGhpY3NDb250ZXh0M0Q6OlRF
WFRVUkVfMkQsIHRleHR1cmUpOwotCi0gICAgZHJhd1RleHR1cmVkUXVhZCh0ZXh0dXJlU2l6ZSwg
c3JjUmVjdCwgZHN0UmVjdCwgbV9zdGF0ZS0+bV9jdG0sIG1fc3RhdGUtPm1fYWxwaGEpOwotfQot
Ci12b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRSZWN0KFRleHR1cmUqIHRleHR1cmUsIGNv
bnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNw
YWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9wKQotewotICAgIGRy
YXdUZXh0dXJlZFJlY3QodGV4dHVyZSwgc3JjUmVjdCwgZHN0UmVjdCwgbV9zdGF0ZS0+bV9jdG0s
IG1fc3RhdGUtPm1fYWxwaGEsIGNvbG9yU3BhY2UsIGNvbXBvc2l0ZU9wLCBtX3N0YXRlLT5jbGlw
cGluZ0VuYWJsZWQoKSk7Ci19Ci0KLQotdm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVj
dChUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGZsb2F0IGFs
cGhhLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBvc2l0ZU9w
LCBib29sIGNsaXApCi17Ci0gICAgYmluZEZyYW1lYnVmZmVyKCk7Ci0gICAgbV9jb250ZXh0LT5h
cHBseUNvbXBvc2l0ZU9wZXJhdG9yKGNvbXBvc2l0ZU9wKTsKLSAgICBhcHBseUNsaXBwaW5nKGNs
aXApOwotICAgIGNvbnN0IFRpbGluZ0RhdGEmIHRpbGVzID0gdGV4dHVyZS0+dGlsZXMoKTsKLSAg
ICBJbnRSZWN0IHRpbGVJZHhSZWN0ID0gdGlsZXMub3ZlcmxhcHBlZFRpbGVJbmRpY2VzKHNyY1Jl
Y3QpOwotCi0gICAgbV9jb250ZXh0LT5zZXRBY3RpdmVUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNE
OjpURVhUVVJFMCk7Ci0KLSAgICBmb3IgKGludCB5ID0gdGlsZUlkeFJlY3QueSgpOyB5IDw9IHRp
bGVJZHhSZWN0Lm1heFkoKTsgeSsrKSB7Ci0gICAgICAgIGZvciAoaW50IHggPSB0aWxlSWR4UmVj
dC54KCk7IHggPD0gdGlsZUlkeFJlY3QubWF4WCgpOyB4KyspCi0gICAgICAgICAgICBkcmF3VGV4
dHVyZWRSZWN0VGlsZSh0ZXh0dXJlLCB0aWxlcy50aWxlSW5kZXgoeCwgeSksIHNyY1JlY3QsIGRz
dFJlY3QsIHRyYW5zZm9ybSwgYWxwaGEpOwotICAgIH0KLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6
ZHJhd1RleHR1cmVkUmVjdFRpbGUoVGV4dHVyZSogdGV4dHVyZSwgaW50IHRpbGUsIGNvbnN0IEZs
b2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxvYXQgYWxwaGEpCi17Ci0gICAgaWYgKGRzdFJlY3QuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBUaWxpbmdEYXRhJiB0aWxlcyA9
IHRleHR1cmUtPnRpbGVzKCk7Ci0KLSAgICB0ZXh0dXJlLT5iaW5kVGlsZSh0aWxlKTsKLQotICAg
IEZsb2F0UmVjdCBzcmNSZWN0Q2xpcHBlZEluVGlsZVNwYWNlOwotICAgIEZsb2F0UmVjdCBkc3RS
ZWN0SW50ZXJzZWN0ZWQ7Ci0gICAgdGlsZXMuaW50ZXJzZWN0RHJhd1F1YWQoc3JjUmVjdCwgZHN0
UmVjdCwgdGlsZSwgJnNyY1JlY3RDbGlwcGVkSW5UaWxlU3BhY2UsICZkc3RSZWN0SW50ZXJzZWN0
ZWQpOwotCi0gICAgSW50UmVjdCB0aWxlQm91bmRzV2l0aEJvcmRlciA9IHRpbGVzLnRpbGVCb3Vu
ZHNXaXRoQm9yZGVyKHRpbGUpOwotCi0gICAgZHJhd1RleHR1cmVkUXVhZCh0aWxlQm91bmRzV2l0
aEJvcmRlci5zaXplKCksIHNyY1JlY3RDbGlwcGVkSW5UaWxlU3BhY2UsIGRzdFJlY3RJbnRlcnNl
Y3RlZCwgdHJhbnNmb3JtLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmNvbnZvbHZl
UmVjdCh1bnNpZ25lZCB0ZXh0dXJlLCBjb25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29uc3Qg
RmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGZsb2F0IGltYWdl
SW5jcmVtZW50WzJdLCBjb25zdCBmbG9hdCoga2VybmVsLCBpbnQga2VybmVsV2lkdGgpCi17Ci0g
ICAgbV9jb250ZXh0LT5iaW5kVGV4dHVyZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwg
dGV4dHVyZSk7Ci0gICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNE
OjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9XUkFQX1MsIEdyYXBoaWNz
Q29udGV4dDNEOjpDTEFNUF9UT19FREdFKTsKLSAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmko
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJF
X1dSQVBfVCwgR3JhcGhpY3NDb250ZXh0M0Q6OkNMQU1QX1RPX0VER0UpOwotICAgIG1fY29udGV4
dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3ND
b250ZXh0M0Q6OlRFWFRVUkVfTUlOX0ZJTFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6Ok5FQVJFU1Qp
OwotICAgIG1fY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVS
RV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfTUFHX0ZJTFRFUiwgR3JhcGhpY3NDb250
ZXh0M0Q6Ok5FQVJFU1QpOwotCi0gICAgQWZmaW5lVHJhbnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRy
aXgpOwotICAgIG1hdHJpeC50cmFuc2xhdGUoZHN0UmVjdC54KCksIGRzdFJlY3QueSgpKTsKLSAg
ICBtYXRyaXguc2NhbGUoZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpKTsKLQotICAg
IEFmZmluZVRyYW5zZm9ybSB0ZXhNYXRyaXg7Ci0gICAgdGV4TWF0cml4LnNjYWxlKDEuMGYgLyB0
ZXh0dXJlU2l6ZS53aWR0aCgpLCAxLjBmIC8gdGV4dHVyZVNpemUuaGVpZ2h0KCkpOwotICAgIHRl
eE1hdHJpeC50cmFuc2xhdGUoc3JjUmVjdC54KCksIHNyY1JlY3QueSgpKTsKLSAgICB0ZXhNYXRy
aXguc2NhbGUoc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpKTsKLQotICAgIG1fY29u
dGV4dC0+dXNlUXVhZFZlcnRpY2VzKCk7Ci0gICAgbV9jb250ZXh0LT51c2VDb252b2x1dGlvblBy
b2dyYW0obWF0cml4LCB0ZXhNYXRyaXgsIGtlcm5lbCwga2VybmVsV2lkdGgsIGltYWdlSW5jcmVt
ZW50KTsKLSAgICBtX2NvbnRleHQtPmRyYXdBcnJheXMoR3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFO
R0xFX1NUUklQLCAwLCA0KTsKLSAgICBjaGVja0dMRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQot
Ci1zdGF0aWMgZmxvYXQgZ2F1c3MoZmxvYXQgeCwgZmxvYXQgc2lnbWEpCi17Ci0gICAgcmV0dXJu
IGV4cCgtICh4ICogeCkgLyAoMi4wZiAqIHNpZ21hICogc2lnbWEpKTsKLX0KLQotc3RhdGljIHZv
aWQgYnVpbGRLZXJuZWwoZmxvYXQgc2lnbWEsIGZsb2F0KiBrZXJuZWwsIGludCBrZXJuZWxXaWR0
aCkKLXsKLSAgICBmbG9hdCBoYWxmV2lkdGggPSAoa2VybmVsV2lkdGggLSAxLjBmKSAvIDIuMGY7
Ci0gICAgZmxvYXQgc3VtID0gMC4wZjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtlcm5lbFdp
ZHRoOyArK2kpIHsKLSAgICAgICAga2VybmVsW2ldID0gZ2F1c3MoaSAtIGhhbGZXaWR0aCwgc2ln
bWEpOwotICAgICAgICBzdW0gKz0ga2VybmVsW2ldOwotICAgIH0KLSAgICAvLyBOb3JtYWxpemUg
dGhlIGtlcm5lbAotICAgIGZsb2F0IHNjYWxlID0gMS4wZiAvIHN1bTsKLSAgICBmb3IgKGludCBp
ID0gMDsgaSA8IGtlcm5lbFdpZHRoOyArK2kpCi0gICAgICAgIGtlcm5lbFtpXSAqPSBzY2FsZTsK
LX0KLQotdm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUXVhZChjb25zdCBJbnRTaXplJiB0
ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRz
dFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9hdCBhbHBoYSkKLXsK
LSAgICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4KG1fZmxpcE1hdHJpeCk7Ci0gICAgbWF0cml4ICo9
IHRyYW5zZm9ybTsKLSAgICBtYXRyaXgudHJhbnNsYXRlKGRzdFJlY3QueCgpLCBkc3RSZWN0Lnko
KSk7Ci0gICAgbWF0cml4LnNjYWxlKGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSk7
Ci0KLSAgICBBZmZpbmVUcmFuc2Zvcm0gdGV4TWF0cml4OwotICAgIHRleE1hdHJpeC5zY2FsZSgx
LjBmIC8gdGV4dHVyZVNpemUud2lkdGgoKSwgMS4wZiAvIHRleHR1cmVTaXplLmhlaWdodCgpKTsK
LSAgICB0ZXhNYXRyaXgudHJhbnNsYXRlKHNyY1JlY3QueCgpLCBzcmNSZWN0LnkoKSk7Ci0gICAg
dGV4TWF0cml4LnNjYWxlKHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWlnaHQoKSk7Ci0KLSAg
ICBtX2NvbnRleHQtPnVzZVF1YWRWZXJ0aWNlcygpOwotICAgIG1fY29udGV4dC0+dXNlVGV4dHVy
ZVByb2dyYW0obWF0cml4LCB0ZXhNYXRyaXgsIGFscGhhKTsKLSAgICBtX2NvbnRleHQtPmRyYXdB
cnJheXMoR3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFX1NUUklQLCAwLCA0KTsKLSAgICBjaGVj
a0dMRXJyb3IoImdsRHJhd0FycmF5cyIpOwotfQotCi12b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4
dHVyZWRRdWFkTWl0Y2hlbGwoY29uc3QgSW50U2l6ZSYgdGV4dHVyZVNpemUsIGNvbnN0IEZsb2F0
UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFu
c2Zvcm0mIHRyYW5zZm9ybSwgZmxvYXQgYWxwaGEpCi17Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0
IG1pdGNoZWxsQ29lZmZpY2llbnRzWzE2XSA9IHsKLSAgICAgICAgIDAuMGYgLyAxOC4wZiwgICAx
LjBmIC8gMTguMGYsICAxNi4wZiAvIDE4LjBmLCAgIDEuMGYgLyAxOC4wZiwKLSAgICAgICAgIDAu
MGYgLyAxOC4wZiwgICA5LjBmIC8gMTguMGYsICAgMC4wZiAvIDE4LjBmLCAgLTkuMGYgLyAxOC4w
ZiwKLSAgICAgICAgLTYuMGYgLyAxOC4wZiwgIDI3LjBmIC8gMTguMGYsIC0zNi4wZiAvIDE4LjBm
LCAgMTUuMGYgLyAxOC4wZiwKLSAgICAgICAgIDcuMGYgLyAxOC4wZiwgLTIxLjBmIC8gMTguMGYs
ICAyMS4wZiAvIDE4LjBmLCAgLTcuMGYgLyAxOC4wZiwKLSAgICB9OwotCi0gICAgQWZmaW5lVHJh
bnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOwotICAgIG1hdHJpeCAqPSB0cmFuc2Zvcm07Ci0g
ICAgbWF0cml4LnRyYW5zbGF0ZShkc3RSZWN0LngoKSwgZHN0UmVjdC55KCkpOwotICAgIG1hdHJp
eC5zY2FsZShkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCkpOwotCi0gICAgZmxvYXQg
aW1hZ2VJbmNyZW1lbnRbMl0gPSB7IDEuMGYgLyB0ZXh0dXJlU2l6ZS53aWR0aCgpLCAxLjBmIC8g
dGV4dHVyZVNpemUuaGVpZ2h0KCkgfTsKLQotICAgIEFmZmluZVRyYW5zZm9ybSB0ZXhNYXRyaXg7
Ci0gICAgdGV4TWF0cml4LnNjYWxlKGltYWdlSW5jcmVtZW50WzBdLCBpbWFnZUluY3JlbWVudFsx
XSk7Ci0gICAgdGV4TWF0cml4LnRyYW5zbGF0ZShzcmNSZWN0LngoKSwgc3JjUmVjdC55KCkpOwot
ICAgIHRleE1hdHJpeC5zY2FsZShzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCkpOwot
Ci0gICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJF
XzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBHcmFwaGljc0NvbnRl
eHQzRDo6TkVBUkVTVCk7Ci0gICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29u
dGV4dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NQUdfRklMVEVS
LCBHcmFwaGljc0NvbnRleHQzRDo6TkVBUkVTVCk7Ci0KLSAgICBtX2NvbnRleHQtPnVzZVF1YWRW
ZXJ0aWNlcygpOwotICAgIG1fY29udGV4dC0+dXNlQmljdWJpY1Byb2dyYW0obWF0cml4LCB0ZXhN
YXRyaXgsIG1pdGNoZWxsQ29lZmZpY2llbnRzLCBpbWFnZUluY3JlbWVudCwgYWxwaGEpOwotICAg
IG1fY29udGV4dC0+ZHJhd0FycmF5cyhHcmFwaGljc0NvbnRleHQzRDo6VFJJQU5HTEVfU1RSSVAs
IDAsIDQpOwotICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Ci19Ci0KLXZvaWQgR0xF
UzJDYW52YXM6OnNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvciBvcCkKLXsK
LSAgICBtX3N0YXRlLT5tX2NvbXBvc2l0ZU9wID0gb3A7Ci19Ci0KLVRleHR1cmUqIEdMRVMyQ2Fu
dmFzOjpjcmVhdGVUZXh0dXJlKE5hdGl2ZUltYWdlUHRyIHB0ciwgVGV4dHVyZTo6Rm9ybWF0IGZv
cm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIHJldHVybiBtX2NvbnRleHQtPmNy
ZWF0ZVRleHR1cmUocHRyLCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi1UZXh0dXJlKiBH
TEVTMkNhbnZhczo6Z2V0VGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIpCi17Ci0gICAgcmV0dXJu
IG1fY29udGV4dC0+Z2V0VGV4dHVyZShwdHIpOwotfQotCi0jaWYgVVNFKFNLSUEpCi0vLyBUaGlz
IGlzIGFjdHVhbGx5IGNyb3NzLXBsYXRmb3JtIGNvZGUsIGJ1dCBzaW5jZSBpdHMgb25seSBjYWxs
ZXIgaXMgaW5zaWRlIGEKLS8vIFVTRShTS0lBKSwgaXQgd2lsbCBjYXVzZSBhIHdhcm5pbmctYXMt
ZXJyb3Igb24gQ2hyb21lL01hYy4KLXN0YXRpYyB2b2lkIGludGVycG9sYXRlUXVhZHJhdGljKEZs
b2F0UG9pbnRWZWN0b3IqIHZlcnRpY2VzLCBjb25zdCBGbG9hdFBvaW50JiBwMCwgY29uc3QgRmxv
YXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyKQotewotICAgIGZsb2F0IHRJbmNyZW1l
bnQgPSAxLjBmIC8gcGF0aFRlc3NlbGF0aW9uLCB0ID0gdEluY3JlbWVudDsKLSAgICBRdWFkcmF0
aWMgYyA9IFF1YWRyYXRpYzo6ZnJvbUJlemllcihwMCwgcDEsIHAyKTsKLSAgICBmb3IgKGludCBp
ID0gMDsgaSA8IHBhdGhUZXNzZWxhdGlvbjsgKytpLCB0ICs9IHRJbmNyZW1lbnQpCi0gICAgICAg
IHZlcnRpY2VzLT5hcHBlbmQoYy5ldmFsdWF0ZSh0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVy
cG9sYXRlQ3ViaWMoRmxvYXRQb2ludFZlY3RvciogdmVydGljZXMsIGNvbnN0IEZsb2F0UG9pbnQm
IHAwLCBjb25zdCBGbG9hdFBvaW50JiBwMSwgY29uc3QgRmxvYXRQb2ludCYgcDIsIGNvbnN0IEZs
b2F0UG9pbnQmIHAzKQotewotICAgIGZsb2F0IHRJbmNyZW1lbnQgPSAxLjBmIC8gcGF0aFRlc3Nl
bGF0aW9uLCB0ID0gdEluY3JlbWVudDsKLSAgICBDdWJpYyBjID0gQ3ViaWM6OmZyb21CZXppZXIo
cDAsIHAxLCBwMiwgcDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aFRlc3NlbGF0aW9u
OyArK2ksIHQgKz0gdEluY3JlbWVudCkKLSAgICAgICAgdmVydGljZXMtPmFwcGVuZChjLmV2YWx1
YXRlKHQpKTsKLX0KLSNlbmRpZgotCi1zdHJ1Y3QgUG9seWdvbkRhdGEgewotICAgIFBvbHlnb25E
YXRhKEZsb2F0UG9pbnRWZWN0b3IqIHZlcnRpY2VzLCBXVEY6OlZlY3RvcjxzaG9ydD4qIGluZGlj
ZXMpCi0gICAgICA6IG1fdmVydGljZXModmVydGljZXMpCi0gICAgICAsIG1faW5kaWNlcyhpbmRp
Y2VzKQotICAgIHsKLSAgICB9Ci0gICAgRmxvYXRQb2ludFZlY3RvciogbV92ZXJ0aWNlczsKLSAg
ICBXVEY6OlZlY3RvcjxzaG9ydD4qIG1faW5kaWNlczsKLX07Ci0KLXN0YXRpYyB2b2lkIGJlZ2lu
RGF0YShHTGVudW0gdHlwZSwgdm9pZCogZGF0YSkKLXsKLSAgICBBU1NFUlQodHlwZSA9PSBHTF9U
UklBTkdMRVMpOwotfQotCi1zdGF0aWMgdm9pZCBlZGdlRmxhZ0RhdGEoR0xib29sZWFuIGZsYWcs
IHZvaWQqIGRhdGEpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHZlcnRleERhdGEodm9pZCogdmVydGV4
RGF0YSwgdm9pZCogZGF0YSkKLXsKLSAgICBzdGF0aWNfY2FzdDxQb2x5Z29uRGF0YSo+KGRhdGEp
LT5tX2luZGljZXMtPmFwcGVuZChyZWludGVycHJldF9jYXN0PGxvbmc+KHZlcnRleERhdGEpKTsK
LX0KLQotc3RhdGljIHZvaWQgZW5kRGF0YSh2b2lkKiBkYXRhKQotewotfQotCi1zdGF0aWMgdm9p
ZCBjb21iaW5lRGF0YShHTGRvdWJsZSBjb29yZHNbM10sIHZvaWQqIHZlcnRleERhdGFbNF0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGZsb2F0IHdlaWdodFs0XSwgdm9pZCAq
Km91dERhdGEsIHZvaWQqIGRhdGEpCi17Ci0gICAgUG9seWdvbkRhdGEqIHBvbHlnb25EYXRhID0g
c3RhdGljX2Nhc3Q8UG9seWdvbkRhdGEqPihkYXRhKTsKLSAgICBpbnQgaW5kZXggPSBwb2x5Z29u
RGF0YS0+bV92ZXJ0aWNlcy0+c2l6ZSgpOwotICAgIHBvbHlnb25EYXRhLT5tX3ZlcnRpY2VzLT5h
cHBlbmQoRmxvYXRQb2ludChzdGF0aWNfY2FzdDxmbG9hdD4oY29vcmRzWzBdKSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGNvb3Jkc1sxXSkpKTsKLSAgICAqb3V0RGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8
dm9pZCo+KGluZGV4KTsKLX0KLQotdHlwZWRlZiB2b2lkICgqVEVTU0NCKSgpOwotCi12b2lkIEdM
RVMyQ2FudmFzOjp0ZXNzZWxhdGVBbmRGaWxsUGF0aChjb25zdCBQYXRoJiBwYXRoLCBjb25zdCBD
b2xvciYgY29sb3IpCi17Ci0gICAgaWYgKCFtX3BhdGhWZXJ0ZXhCdWZmZXIpCi0gICAgICAgIG1f
cGF0aFZlcnRleEJ1ZmZlciA9IG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+Y3JlYXRl
QnVmZmVyKCk7Ci0gICAgaWYgKCFtX3BhdGhJbmRleEJ1ZmZlcikKLSAgICAgICAgbV9wYXRoSW5k
ZXhCdWZmZXIgPSBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmNyZWF0ZUJ1ZmZlcigp
OwotCi0gICAgQWZmaW5lVHJhbnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOwotICAgIG1hdHJp
eCAqPSBtX3N0YXRlLT5tX2N0bTsKLQotICAgIEZsb2F0UG9pbnRWZWN0b3IgaW5WZXJ0aWNlczsK
LSAgICBXVEY6OlZlY3RvcjxzaXplX3Q+IGNvbnRvdXJzOwotI2lmIFVTRShTS0lBKQotICAgIGNv
bnN0IFNrUGF0aCogc2tQYXRoID0gcGF0aC5wbGF0Zm9ybVBhdGgoKTsKLSAgICBTa1BvaW50IHB0
c1s0XTsKLSAgICBTa1BhdGg6Okl0ZXIgaXRlcigqc2tQYXRoLCB0cnVlKTsKLSAgICBTa1BhdGg6
OlZlcmIgdmVyYjsKLSAgICB3aGlsZSAoKHZlcmIgPSBpdGVyLm5leHQocHRzKSkgIT0gU2tQYXRo
OjprRG9uZV9WZXJiKSB7Ci0gICAgICAgIHN3aXRjaCAodmVyYikgewotICAgICAgICBjYXNlIFNr
UGF0aDo6a01vdmVfVmVyYjoKLSAgICAgICAgICAgIGluVmVydGljZXMuYXBwZW5kKHB0c1swXSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTa1BhdGg6OmtMaW5lX1ZlcmI6Ci0g
ICAgICAgICAgICBpblZlcnRpY2VzLmFwcGVuZChwdHNbMV0pOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgU2tQYXRoOjprUXVhZF9WZXJiOgotICAgICAgICAgICAgaW50ZXJwb2xh
dGVRdWFkcmF0aWMoJmluVmVydGljZXMsIHB0c1swXSwgcHRzWzFdLCBwdHNbMl0pOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2tQYXRoOjprQ3ViaWNfVmVyYjoKLSAgICAgICAg
ICAgIGludGVycG9sYXRlQ3ViaWMoJmluVmVydGljZXMsIHB0c1swXSwgcHRzWzFdLCBwdHNbMl0s
IHB0c1szXSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTa1BhdGg6OmtDbG9z
ZV9WZXJiOgotICAgICAgICAgICAgY29udG91cnMuYXBwZW5kKGluVmVydGljZXMuc2l6ZSgpKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNrUGF0aDo6a0RvbmVfVmVyYjoKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotI2Vsc2UKLSAgICBBU1NFUlQoISJQ
YXRoIGV4dHJhY3Rpb24gbm90IGltcGxlbWVudGVkIG9uIHRoaXMgcGxhdGZvcm0uIik7Ci0jZW5k
aWYKLQotICAgIGlmIChjb250b3Vycy5zaXplKCkgPT0gMSAmJiBMb29wQmxpbm5NYXRoVXRpbHM6
OmlzQ29udmV4KGluVmVydGljZXMuYmVnaW4oKSwgaW5WZXJ0aWNlcy5zaXplKCkpKSB7Ci0gICAg
ICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+YmluZEJ1ZmZlcihHcmFwaGljc0Nv
bnRleHQzRDo6QVJSQVlfQlVGRkVSLCBtX3BhdGhWZXJ0ZXhCdWZmZXIpOwotICAgICAgICBtX2Nv
bnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmJ1ZmZlckRhdGEoR3JhcGhpY3NDb250ZXh0M0Q6
OkFSUkFZX0JVRkZFUiwgaW5WZXJ0aWNlcy5zaXplKCkgKiAyICogc2l6ZW9mKGZsb2F0KSwgaW5W
ZXJ0aWNlcy5kYXRhKCksIEdyYXBoaWNzQ29udGV4dDNEOjpTVFJFQU1fRFJBVyk7Ci0gICAgICAg
IG1fY29udGV4dC0+dXNlRmlsbFNvbGlkUHJvZ3JhbShtYXRyaXgsIGNvbG9yKTsKLSAgICAgICAg
bV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5kcmF3QXJyYXlzKEdyYXBoaWNzQ29udGV4
dDNEOjpUUklBTkdMRV9GQU4sIDAsIGluVmVydGljZXMuc2l6ZSgpKTsKLSAgICAgICAgcmV0dXJu
OwotICAgIH0KLQotICAgIE93bkFycmF5UHRyPGRvdWJsZT4gaW5WZXJ0aWNlc0RvdWJsZSA9IGFk
b3B0QXJyYXlQdHIobmV3IGRvdWJsZVtpblZlcnRpY2VzLnNpemUoKSAqIDNdKTsKLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGluVmVydGljZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaW5W
ZXJ0aWNlc0RvdWJsZVtpICogMyAgICBdID0gaW5WZXJ0aWNlc1tpXS54KCk7Ci0gICAgICAgIGlu
VmVydGljZXNEb3VibGVbaSAqIDMgKyAxXSA9IGluVmVydGljZXNbaV0ueSgpOwotICAgICAgICBp
blZlcnRpY2VzRG91YmxlW2kgKiAzICsgMl0gPSAxLjA7Ci0gICAgfQotCi0gICAgR0xVdGVzc2Vs
YXRvciogdGVzcyA9IGludGVybmFsX2dsdU5ld1Rlc3MoKTsKLSAgICBpbnRlcm5hbF9nbHVUZXNz
UHJvcGVydHkodGVzcywgR0xVX1RFU1NfV0lORElOR19SVUxFLCBHTFVfVEVTU19XSU5ESU5HX05P
TlpFUk8pOwotICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19CRUdJ
Tl9EQVRBLCAoVEVTU0NCKSAmYmVnaW5EYXRhKTsKLSAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJh
Y2sodGVzcywgR0xVX1RFU1NfVkVSVEVYX0RBVEEsIChURVNTQ0IpICZ2ZXJ0ZXhEYXRhKTsKLSAg
ICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2sodGVzcywgR0xVX1RFU1NfRU5EX0RBVEEsIChURVNT
Q0IpICZlbmREYXRhKTsKLSAgICBpbnRlcm5hbF9nbHVUZXNzQ2FsbGJhY2sodGVzcywgR0xVX1RF
U1NfRURHRV9GTEFHX0RBVEEsIChURVNTQ0IpICZlZGdlRmxhZ0RhdGEpOwotICAgIGludGVybmFs
X2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19DT01CSU5FX0RBVEEsIChURVNTQ0IpICZj
b21iaW5lRGF0YSk7Ci0gICAgV1RGOjpWZWN0b3I8c2hvcnQ+IGluZGljZXM7Ci0gICAgRmxvYXRQ
b2ludFZlY3RvciB2ZXJ0aWNlczsKLSAgICB2ZXJ0aWNlcy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5
KGluVmVydGljZXMuc2l6ZSgpKTsKLSAgICBQb2x5Z29uRGF0YSBkYXRhKCZ2ZXJ0aWNlcywgJmlu
ZGljZXMpOwotICAgIGludGVybmFsX2dsdVRlc3NCZWdpblBvbHlnb24odGVzcywgJmRhdGEpOwot
ICAgIFdURjo6VmVjdG9yPHNpemVfdD46OmNvbnN0X2l0ZXJhdG9yIGNvbnRvdXI7Ci0gICAgc2l6
ZV90IGkgPSAwOwotICAgIGZvciAoY29udG91ciA9IGNvbnRvdXJzLmJlZ2luKCk7IGNvbnRvdXIg
IT0gY29udG91cnMuZW5kKCk7ICsrY29udG91cikgewotICAgICAgICBpbnRlcm5hbF9nbHVUZXNz
QmVnaW5Db250b3VyKHRlc3MpOwotICAgICAgICBmb3IgKDsgaSA8ICpjb250b3VyOyArK2kpIHsK
LSAgICAgICAgICAgIGRvdWJsZSogaW5WZXJ0ZXggPSAmaW5WZXJ0aWNlc0RvdWJsZVtpICogM107
Ci0gICAgICAgICAgICB2ZXJ0aWNlcy5hcHBlbmQoRmxvYXRQb2ludChpblZlcnRleFswXSwgaW5W
ZXJ0ZXhbMV0pKTsKLSAgICAgICAgICAgIGludGVybmFsX2dsdVRlc3NWZXJ0ZXgodGVzcywgaW5W
ZXJ0ZXgsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGkpKTsKLSAgICAgICAgfQotICAgICAgICBp
bnRlcm5hbF9nbHVUZXNzRW5kQ29udG91cih0ZXNzKTsKLSAgICB9Ci0gICAgaW50ZXJuYWxfZ2x1
VGVzc0VuZFBvbHlnb24odGVzcyk7Ci0gICAgaW50ZXJuYWxfZ2x1RGVsZXRlVGVzcyh0ZXNzKTsK
LQotICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+YmluZEJ1ZmZlcihHcmFwaGlj
c0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCBtX3BhdGhWZXJ0ZXhCdWZmZXIpOwotICAgIGNoZWNr
R0xFcnJvcigiY3JlYXRlVmVydGV4QnVmZmVyRnJvbVBhdGgsIGJpbmRCdWZmZXIgQVJSQVlfQlVG
RkVSIik7Ci0gICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5idWZmZXJEYXRhKEdy
YXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIHZlcnRpY2VzLnNpemUoKSAqIDIgKiBzaXpl
b2YoZmxvYXQpLCB2ZXJ0aWNlcy5kYXRhKCksIEdyYXBoaWNzQ29udGV4dDNEOjpTVFJFQU1fRFJB
Vyk7Ci0gICAgY2hlY2tHTEVycm9yKCJjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tUGF0aCwgYnVmZmVy
RGF0YSBBUlJBWV9CVUZGRVIiKTsKLQotICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0Qo
KS0+YmluZEJ1ZmZlcihHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIsIG1f
cGF0aEluZGV4QnVmZmVyKTsKLSAgICBjaGVja0dMRXJyb3IoImNyZWF0ZVZlcnRleEJ1ZmZlckZy
b21QYXRoLCBiaW5kQnVmZmVyIEVMRU1FTlRfQVJSQVlfQlVGRkVSIik7Ci0gICAgbV9jb250ZXh0
LT5ncmFwaGljc0NvbnRleHQzRCgpLT5idWZmZXJEYXRhKEdyYXBoaWNzQ29udGV4dDNEOjpFTEVN
RU5UX0FSUkFZX0JVRkZFUiwgaW5kaWNlcy5zaXplKCkgKiBzaXplb2Yoc2hvcnQpLCBpbmRpY2Vz
LmRhdGEoKSwgR3JhcGhpY3NDb250ZXh0M0Q6OlNUUkVBTV9EUkFXKTsKLSAgICBjaGVja0dMRXJy
b3IoImNyZWF0ZVZlcnRleEJ1ZmZlckZyb21QYXRoLCBidWZmZXJEYXRhIEVMRU1FTlRfQVJSQVlf
QlVGRkVSIik7Ci0KLSAgICBtX2NvbnRleHQtPnVzZUZpbGxTb2xpZFByb2dyYW0obWF0cml4LCBj
b2xvcik7Ci0gICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5kcmF3RWxlbWVudHMo
R3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFUywgaW5kaWNlcy5zaXplKCksIEdyYXBoaWNzQ29u
dGV4dDNEOjpVTlNJR05FRF9TSE9SVCwgMCk7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmZpbGxQ
YXRoSW50ZXJuYWwoY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgQ29sb3ImIGNvbG9yKQotewotICAg
IGlmIChTaGFyZWRHcmFwaGljc0NvbnRleHQzRDo6dXNlTG9vcEJsaW5uRm9yUGF0aFJlbmRlcmlu
ZygpKSB7Ci0gICAgICAgIG1fcGF0aENhY2hlLmNsZWFyKCk7Ci0gICAgICAgIExvb3BCbGlublBh
dGhQcm9jZXNzb3IgcHJvY2Vzc29yOwotICAgICAgICBwcm9jZXNzb3IucHJvY2VzcyhwYXRoLCBt
X3BhdGhDYWNoZSk7Ci0gICAgICAgIGlmICghbV9wYXRoVmVydGV4QnVmZmVyKQotICAgICAgICAg
ICAgbV9wYXRoVmVydGV4QnVmZmVyID0gbV9jb250ZXh0LT5jcmVhdGVCdWZmZXIoKTsKLSAgICAg
ICAgbV9jb250ZXh0LT5iaW5kQnVmZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIs
IG1fcGF0aFZlcnRleEJ1ZmZlcik7Ci0gICAgICAgIGludCBieXRlU2l6ZU9mVmVydGljZXMgPSAy
ICogbV9wYXRoQ2FjaGUubnVtYmVyT2ZWZXJ0aWNlcygpICogc2l6ZW9mKGZsb2F0KTsKLSAgICAg
ICAgaW50IGJ5dGVTaXplT2ZUZXhDb29yZHMgPSAzICogbV9wYXRoQ2FjaGUubnVtYmVyT2ZWZXJ0
aWNlcygpICogc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgaW50IGJ5dGVTaXplT2ZJbnRlcmlvclZl
cnRpY2VzID0gMiAqIG1fcGF0aENhY2hlLm51bWJlck9mSW50ZXJpb3JWZXJ0aWNlcygpICogc2l6
ZW9mKGZsb2F0KTsKLSAgICAgICAgbV9jb250ZXh0LT5idWZmZXJEYXRhKEdyYXBoaWNzQ29udGV4
dDNEOjpBUlJBWV9CVUZGRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlU2l6
ZU9mVmVydGljZXMgKyBieXRlU2l6ZU9mVGV4Q29vcmRzICsgYnl0ZVNpemVPZkludGVyaW9yVmVy
dGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQzRDo6
U1RBVElDX0RSQVcpOwotICAgICAgICBtX2NvbnRleHQtPmJ1ZmZlclN1YkRhdGEoR3JhcGhpY3ND
b250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwgMCwgYnl0ZVNpemVPZlZlcnRpY2VzLCBtX3BhdGhDYWNo
ZS52ZXJ0aWNlcygpKTsKLSAgICAgICAgbV9jb250ZXh0LT5idWZmZXJTdWJEYXRhKEdyYXBoaWNz
Q29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIGJ5dGVTaXplT2ZWZXJ0aWNlcywgYnl0ZVNpemVPZlRl
eENvb3JkcywgbV9wYXRoQ2FjaGUudGV4Y29vcmRzKCkpOwotICAgICAgICBtX2NvbnRleHQtPmJ1
ZmZlclN1YkRhdGEoR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwgYnl0ZVNpemVPZlZl
cnRpY2VzICsgYnl0ZVNpemVPZlRleENvb3JkcywgYnl0ZVNpemVPZkludGVyaW9yVmVydGljZXMs
IG1fcGF0aENhY2hlLmludGVyaW9yVmVydGljZXMoKSk7Ci0KLSAgICAgICAgQWZmaW5lVHJhbnNm
b3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOwotICAgICAgICBtYXRyaXggKj0gbV9zdGF0ZS0+bV9j
dG07Ci0KLSAgICAgICAgLy8gRHJhdyB0aGUgZXh0ZXJpb3IKLSAgICAgICAgbV9jb250ZXh0LT51
c2VMb29wQmxpbm5FeHRlcmlvclByb2dyYW0oMCwgYnl0ZVNpemVPZlZlcnRpY2VzLCBtYXRyaXgs
IGNvbG9yKTsKLSAgICAgICAgbV9jb250ZXh0LT5kcmF3QXJyYXlzKEdyYXBoaWNzQ29udGV4dDNE
OjpUUklBTkdMRVMsIDAsIG1fcGF0aENhY2hlLm51bWJlck9mVmVydGljZXMoKSk7Ci0KLSAgICAg
ICAgLy8gRHJhdyB0aGUgaW50ZXJpb3IKLSAgICAgICAgbV9jb250ZXh0LT51c2VMb29wQmxpbm5J
bnRlcmlvclByb2dyYW0oYnl0ZVNpemVPZlZlcnRpY2VzICsgYnl0ZVNpemVPZlRleENvb3Jkcywg
bWF0cml4LCBjb2xvcik7Ci0gICAgICAgIG1fY29udGV4dC0+ZHJhd0FycmF5cyhHcmFwaGljc0Nv
bnRleHQzRDo6VFJJQU5HTEVTLCAwLCBtX3BhdGhDYWNoZS5udW1iZXJPZkludGVyaW9yVmVydGlj
ZXMoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGVzc2VsYXRlQW5kRmlsbFBhdGgocGF0aCwg
Y29sb3IpOwotICAgIH0KLX0KLQotRmxvYXRSZWN0IEdMRVMyQ2FudmFzOjpmbGlwUmVjdChjb25z
dCBGbG9hdFJlY3QmIHJlY3QpCi17Ci0gICAgRmxvYXRSZWN0IGZsaXBwZWRSZWN0KHJlY3QpOwot
ICAgIGZsaXBwZWRSZWN0LnNldFkobV9zaXplLmhlaWdodCgpIC0gcmVjdC55KCkpOwotICAgIGZs
aXBwZWRSZWN0LnNldEhlaWdodCgtcmVjdC5oZWlnaHQoKSk7Ci0gICAgcmV0dXJuIGZsaXBwZWRS
ZWN0OwotfQotCi12b2lkIEdMRVMyQ2FudmFzOjpjbGVhckJvcmRlcnMoY29uc3QgRmxvYXRSZWN0
JiByZWN0LCBpbnQgd2lkdGgpCi17Ci0gICAgc2Npc3NvckNsZWFyKHJlY3QueCgpLCByZWN0Lnko
KSAtIHdpZHRoLCByZWN0LndpZHRoKCkgKyB3aWR0aCwgd2lkdGgpOwotICAgIHNjaXNzb3JDbGVh
cihyZWN0Lm1heFgoKSwgcmVjdC55KCksIHdpZHRoLCByZWN0LmhlaWdodCgpICsgd2lkdGgpOwot
ICAgIHNjaXNzb3JDbGVhcihyZWN0LngoKSAtIHdpZHRoLCByZWN0Lm1heFkoKSwgcmVjdC53aWR0
aCgpICsgd2lkdGgsIHdpZHRoKTsKLSAgICBzY2lzc29yQ2xlYXIocmVjdC54KCkgLSB3aWR0aCwg
cmVjdC55KCkgLSB3aWR0aCwgd2lkdGgsIHJlY3QuaGVpZ2h0KCkgKyB3aWR0aCk7Ci19Ci0KLXZv
aWQgR0xFUzJDYW52YXM6OmJlZ2luU2hhZG93RHJhdygpCi17Ci0gICAgZmxvYXQgb2Zmc2V0WCA9
IG1fc3RhdGUtPm1fc2hhZG93T2Zmc2V0LndpZHRoKCk7Ci0gICAgZmxvYXQgb2Zmc2V0WSA9IG1f
c3RhdGUtPm1fc2hhZG93T2Zmc2V0LmhlaWdodCgpOwotICAgIHNhdmUoKTsKLSAgICBpZiAobV9z
dGF0ZS0+bV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykgewotICAgICAgICBBZmZpbmVUcmFuc2Zv
cm0gbmV3Q1RNOwotICAgICAgICBuZXdDVE0udHJhbnNsYXRlKG9mZnNldFgsIC1vZmZzZXRZKTsK
LSAgICAgICAgbmV3Q1RNICo9IG1fc3RhdGUtPm1fY3RtOwotICAgICAgICBtX3N0YXRlLT5tX2N0
bSA9IG5ld0NUTTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV9zdGF0ZS0+bV9jdG0udHJhbnNsYXRl
KG9mZnNldFgsIG9mZnNldFkpOwotCi0gICAgaWYgKG1fc3RhdGUtPm1fc2hhZG93Qmx1ciA+IDAp
IHsKLSAgICAgICAgLy8gRHJhdyBoYXJkIHNoYWRvdyB0byBvZmZzY3JlZW4gYnVmZmVyIDAuCi0g
ICAgICAgIERyYXdpbmdCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fY29udGV4dC0+Z2V0T2Zmc2NyZWVu
QnVmZmVyKDAsIG1fc2l6ZSk7Ci0gICAgICAgIGRzdEJ1ZmZlci0+YmluZCgpOwotICAgICAgICBt
X2NvbnRleHQtPmFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoQ29tcG9zaXRlQ29weSk7Ci0gICAgICAg
IGFwcGx5Q2xpcHBpbmcoZmFsc2UpOwotICAgICAgICBtX2NvbnRleHQtPmNsZWFyQ29sb3IoQ29s
b3IoUkdCQTMyKDApKSk7Ci0gICAgICAgIG1fY29udGV4dC0+Y2xlYXIoR3JhcGhpY3NDb250ZXh0
M0Q6OkNPTE9SX0JVRkZFUl9CSVQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFwcGx5U3RhdGUo
KTsKLSAgICB9Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmVuZFNoYWRvd0RyYXcoY29uc3QgRmxv
YXRSZWN0JiBib3VuZGluZ0JveCkKLXsKLSAgICBpZiAobV9zdGF0ZS0+bV9zaGFkb3dCbHVyID4g
MCkgewotICAgICAgICAvLyBCdWZmZXIgMCBjb250YWlucyB0aGUgcHJpbWl0aXZlIGRyYXduIHdp
dGggYSBoYXJkIHNoYWRvdy4KLSAgICAgICAgRHJhd2luZ0J1ZmZlciogc3JjQnVmZmVyID0gbV9j
b250ZXh0LT5nZXRPZmZzY3JlZW5CdWZmZXIoMCwgbV9zaXplKTsKLSAgICAgICAgRHJhd2luZ0J1
ZmZlciogZHN0QnVmZmVyID0gbV9jb250ZXh0LT5nZXRPZmZzY3JlZW5CdWZmZXIoMSwgbV9zaXpl
KTsKLQotICAgICAgICBmbG9hdCBzaWdtYSA9IG1fc3RhdGUtPm1fc2hhZG93Qmx1ciAqIDAuMzMz
MzMzZjsKLSAgICAgICAgRmxvYXRSZWN0IHNoYWRvd0JvdW5kaW5nQm94KG1fc3RhdGUtPm1fY3Rt
Lm1hcFJlY3QoYm91bmRpbmdCb3gpKTsKLSAgICAgICAgRmxvYXRSZWN0IHJlY3QoRmxvYXRQb2lu
dCgwLCAwKSwgbV9zaXplKTsKLSAgICAgICAgRmxvYXRSZWN0IHNyY1JlY3Qoc2hhZG93Qm91bmRp
bmdCb3gpOwotCi0gICAgICAgIGludCBzY2FsZUZhY3RvciA9IDE7Ci0gICAgICAgIHdoaWxlIChz
aWdtYSA+IGNNYXhTaWdtYSkgewotICAgICAgICAgICAgc3JjUmVjdC5zY2FsZSgwLjVmKTsKLSAg
ICAgICAgICAgIHNjYWxlRmFjdG9yICo9IDI7Ci0gICAgICAgICAgICBzaWdtYSAqPSAwLjVmOwot
ICAgICAgICB9Ci0gICAgICAgIHNyY1JlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHNyY1JlY3QpOwot
ICAgICAgICBzcmNSZWN0LnNjYWxlKHNjYWxlRmFjdG9yKTsKLSAgICAgICAgZm9yIChpbnQgaSA9
IDE7IGkgPCBzY2FsZUZhY3RvcjsgaSAqPSAyKSB7Ci0gICAgICAgICAgICBkc3RCdWZmZXItPmJp
bmQoKTsKLSAgICAgICAgICAgIG1fY29udGV4dC0+YmluZFRleHR1cmUoR3JhcGhpY3NDb250ZXh0
M0Q6OlRFWFRVUkVfMkQsIHNyY0J1ZmZlci0+Y29sb3JCdWZmZXIoKSk7Ci0gICAgICAgICAgICBt
X2NvbnRleHQtPnRleFBhcmFtZXRlcmkoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdy
YXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX1dSQVBfUywgR3JhcGhpY3NDb250ZXh0M0Q6OkNMQU1Q
X1RPX0VER0UpOwotICAgICAgICAgICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNz
Q29udGV4dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9XUkFQX1Qs
IEdyYXBoaWNzQ29udGV4dDNEOjpDTEFNUF9UT19FREdFKTsKLSAgICAgICAgICAgIG1fY29udGV4
dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3ND
b250ZXh0M0Q6OlRFWFRVUkVfTUlOX0ZJTFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTkVBUik7
Ci0gICAgICAgICAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmkoR3JhcGhpY3NDb250ZXh0M0Q6
OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX01BR19GSUxURVIsIEdyYXBo
aWNzQ29udGV4dDNEOjpMSU5FQVIpOwotICAgICAgICAgICAgRmxvYXRSZWN0IGRzdFJlY3Qoc3Jj
UmVjdCk7Ci0gICAgICAgICAgICBkc3RSZWN0LnNjYWxlKDAuNWYpOwotICAgICAgICAgICAgLy8g
Q2xlYXIgb3V0IDEgcGl4ZWwgYm9yZGVyIGZvciBsaW5lYXIgZmlsdGVyaW5nLgotICAgICAgICAg
ICAgY2xlYXJCb3JkZXJzKGRzdFJlY3QsIDEpOwotICAgICAgICAgICAgZHJhd1RleHR1cmVkUXVh
ZChzcmNCdWZmZXItPnNpemUoKSwgZmxpcFJlY3Qoc3JjUmVjdCksIGRzdFJlY3QsIEFmZmluZVRy
YW5zZm9ybSgpLCAxLjApOwotICAgICAgICAgICAgc3JjUmVjdCA9IGRzdFJlY3Q7Ci0gICAgICAg
ICAgICBzdGQ6OnN3YXAoc3JjQnVmZmVyLCBkc3RCdWZmZXIpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaW50IGhhbGZXaWR0aCA9IHN0YXRpY19jYXN0PGludD4oc2lnbWEgKiAzLjBmKTsKLSAgICAg
ICAgaW50IGtlcm5lbFdpZHRoID0gaGFsZldpZHRoICogMiArIDE7Ci0gICAgICAgIE93bkFycmF5
UHRyPGZsb2F0PiBrZXJuZWwgPSBhZG9wdEFycmF5UHRyKG5ldyBmbG9hdFtrZXJuZWxXaWR0aF0p
OwotICAgICAgICBidWlsZEtlcm5lbChzaWdtYSwga2VybmVsLmdldCgpLCBrZXJuZWxXaWR0aCk7
Ci0KLSAgICAgICAgaWYgKHNjYWxlRmFjdG9yID4gMSkgewotICAgICAgICAgICAgc2Npc3NvckNs
ZWFyKHNyY1JlY3QubWF4WCgpLCBzcmNSZWN0LnkoKSwga2VybmVsV2lkdGgsIHNyY1JlY3QuaGVp
Z2h0KCkpOwotICAgICAgICAgICAgc2Npc3NvckNsZWFyKHNyY1JlY3QueCgpIC0ga2VybmVsV2lk
dGgsIHNyY1JlY3QueSgpLCBrZXJuZWxXaWR0aCwgc3JjUmVjdC5oZWlnaHQoKSk7Ci0gICAgICAg
IH0KLQotICAgICAgICAvLyBCbHVyIGluIFggb2Zmc2NyZWVuLgotICAgICAgICBkc3RCdWZmZXIt
PmJpbmQoKTsKLSAgICAgICAgc3JjUmVjdC5pbmZsYXRlWChoYWxmV2lkdGgpOwotICAgICAgICBz
cmNSZWN0LmludGVyc2VjdChyZWN0KTsKLSAgICAgICAgZmxvYXQgaW1hZ2VJbmNyZW1lbnRYWzJd
ID0gezEuMGYgLyBzcmNCdWZmZXItPnNpemUoKS53aWR0aCgpLCAwLjBmfTsKLSAgICAgICAgY29u
dm9sdmVSZWN0KHNyY0J1ZmZlci0+Y29sb3JCdWZmZXIoKSwgc3JjQnVmZmVyLT5zaXplKCksIGZs
aXBSZWN0KHNyY1JlY3QpLCBzcmNSZWN0LCBpbWFnZUluY3JlbWVudFgsIGtlcm5lbC5nZXQoKSwg
a2VybmVsV2lkdGgpOwotCi0gICAgICAgIGlmIChzY2FsZUZhY3RvciA+IDEpIHsKLSAgICAgICAg
ICAgIHNjaXNzb3JDbGVhcihzcmNSZWN0LngoKSwgc3JjUmVjdC5tYXhZKCksIHNyY1JlY3Qud2lk
dGgoKSwga2VybmVsV2lkdGgpOwotICAgICAgICAgICAgc2Npc3NvckNsZWFyKHNyY1JlY3QueCgp
LCBzcmNSZWN0LnkoKSAtIGtlcm5lbFdpZHRoLCBzcmNSZWN0LndpZHRoKCksIGtlcm5lbFdpZHRo
KTsKLSAgICAgICAgfQotICAgICAgICBzcmNSZWN0LmluZmxhdGVZKGhhbGZXaWR0aCk7Ci0gICAg
ICAgIHNyY1JlY3QuaW50ZXJzZWN0KHJlY3QpOwotICAgICAgICBzdGQ6OnN3YXAoc3JjQnVmZmVy
LCBkc3RCdWZmZXIpOwotCi0gICAgICAgIGZsb2F0IGltYWdlSW5jcmVtZW50WVsyXSA9IHswLjBm
LCAxLjBmIC8gc3JjQnVmZmVyLT5zaXplKCkuaGVpZ2h0KCl9OwotICAgICAgICBpZiAoc2NhbGVG
YWN0b3IgPiAxKSB7Ci0gICAgICAgICAgICAvLyBCbHVyIGluIFkgb2Zmc2NyZWVuLgotICAgICAg
ICAgICAgZHN0QnVmZmVyLT5iaW5kKCk7Ci0gICAgICAgICAgICBjb252b2x2ZVJlY3Qoc3JjQnVm
ZmVyLT5jb2xvckJ1ZmZlcigpLCBzcmNCdWZmZXItPnNpemUoKSwgZmxpcFJlY3Qoc3JjUmVjdCks
IHNyY1JlY3QsIGltYWdlSW5jcmVtZW50WSwga2VybmVsLmdldCgpLCBrZXJuZWxXaWR0aCk7Ci0g
ICAgICAgICAgICAvLyBDbGVhciBvdXQgMiBwaXhlbCBib3JkZXIgZm9yIGJpY3ViaWMgZmlsdGVy
aW5nLgotICAgICAgICAgICAgY2xlYXJCb3JkZXJzKHNyY1JlY3QsIDIpOwotICAgICAgICAgICAg
c3RkOjpzd2FwKHNyY0J1ZmZlciwgZHN0QnVmZmVyKTsKLQotICAgICAgICAgICAgLy8gVXBzYW1w
bGUgc3JjQnVmZmVyIC0+IG1haW4gZnJhbWVidWZmZXIgdXNpbmcgYmljdWJpYyBmaWx0ZXJpbmcu
Ci0gICAgICAgICAgICBhcHBseVN0YXRlKCk7Ci0gICAgICAgICAgICBtX2NvbnRleHQtPmJpbmRU
ZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJELCBzcmNCdWZmZXItPmNvbG9yQnVm
ZmVyKCkpOwotICAgICAgICAgICAgRmxvYXRSZWN0IGRzdFJlY3QgPSBzcmNSZWN0OwotICAgICAg
ICAgICAgZHN0UmVjdC5zY2FsZShzY2FsZUZhY3Rvcik7Ci0gICAgICAgICAgICBkcmF3VGV4dHVy
ZWRRdWFkTWl0Y2hlbGwoc3JjQnVmZmVyLT5zaXplKCksIGZsaXBSZWN0KHNyY1JlY3QpLCBkc3RS
ZWN0LCBBZmZpbmVUcmFuc2Zvcm0oKSwgMS4wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIC8vIEJsdXIgaW4gWSBkaXJlY3RseSB0byBmcmFtZWJ1ZmZlci4KLSAgICAgICAgICAgIGFw
cGx5U3RhdGUoKTsKLSAgICAgICAgICAgIGNvbnZvbHZlUmVjdChzcmNCdWZmZXItPmNvbG9yQnVm
ZmVyKCksIHNyY0J1ZmZlci0+c2l6ZSgpLCBmbGlwUmVjdChzcmNSZWN0KSwgc3JjUmVjdCwgaW1h
Z2VJbmNyZW1lbnRZLCBrZXJuZWwuZ2V0KCksIGtlcm5lbFdpZHRoKTsKLSAgICAgICAgfQotICAg
IH0KLSAgICByZXN0b3JlKCk7Ci19Ci0KLXZvaWQgR0xFUzJDYW52YXM6OmJlZ2luU3RlbmNpbERy
YXcodW5zaWduZWQgb3ApCi17Ci0gICAgLy8gVHVybiBvbiBzdGVuY2lsIHRlc3QuCi0gICAgbV9j
b250ZXh0LT5lbmFibGVTdGVuY2lsKHRydWUpOwotICAgIGNoZWNrR0xFcnJvcigiZW5hYmxlIFNU
RU5DSUxfVEVTVCIpOwotCi0gICAgLy8gU3RlbmNpbCB0ZXN0IG5ldmVyIHBhc3Nlcywgc28gY29s
b3JidWZmZXIgaXMgbm90IGRyYXduLgotICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0Qo
KS0+c3RlbmNpbEZ1bmMoR3JhcGhpY3NDb250ZXh0M0Q6Ok5FVkVSLCAxLCAxKTsKLSAgICBjaGVj
a0dMRXJyb3IoInN0ZW5jaWxGdW5jIik7Ci0KLSAgICAvLyBBbGwgd3JpdGVzIGluY3JlbWVtZW50
IHRoZSBzdGVuY2lsIGJ1ZmZlci4KLSAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCkt
PnN0ZW5jaWxPcChvcCwgb3AsIG9wKTsKLSAgICBjaGVja0dMRXJyb3IoInN0ZW5jaWxPcCIpOwot
fQotCi12b2lkIEdMRVMyQ2FudmFzOjphcHBseUNsaXBwaW5nKGJvb2wgZW5hYmxlKQotewotICAg
IG1fY29udGV4dC0+ZW5hYmxlU3RlbmNpbChlbmFibGUpOwotICAgIGlmIChlbmFibGUpIHsKLSAg
ICAgICAgLy8gRW5hYmxlIGRyYXdpbmcgb25seSB3aGVyZSBzdGVuY2lsIGlzIG5vbi16ZXJvLgot
ICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPnN0ZW5jaWxGdW5jKEdyYXBo
aWNzQ29udGV4dDNEOjpFUVVBTCwgbV9zdGF0ZS0+bV9udW1DbGlwcGluZ1BhdGhzLCAtMSk7Ci0g
ICAgICAgIGNoZWNrR0xFcnJvcigic3RlbmNpbEZ1bmMiKTsKLSAgICAgICAgLy8gS2VlcCBhbGwg
c3RlbmNpbCB2YWx1ZXMgdGhlIHNhbWUuCi0gICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+c3RlbmNpbE9wKEdyYXBoaWNzQ29udGV4dDNEOjpLRUVQLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQzRDo6
S0VFUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R3JhcGhpY3NDb250ZXh0M0Q6OktFRVApOwotICAgICAgICBjaGVja0dMRXJyb3IoInN0ZW5jaWxP
cCIpOwotICAgIH0KLX0KLQotdm9pZCBHTEVTMkNhbnZhczo6Y2hlY2tHTEVycm9yKGNvbnN0IGNo
YXIqIGhlYWRlcikKLXsKLSNpZm5kZWYgTkRFQlVHCi0gICAgdW5zaWduZWQgZXJyOwotICAgIHdo
aWxlICgoZXJyID0gbV9jb250ZXh0LT5nZXRFcnJvcigpKSAhPSBHcmFwaGljc0NvbnRleHQzRDo6
Tk9fRVJST1IpIHsKLSAgICAgICAgY29uc3QgY2hhciogZXJyb3JTdHIgPSAiKioqIFVOS05PV04g
RVJST1IgKioqIjsKLSAgICAgICAgc3dpdGNoIChlcnIpIHsKLSAgICAgICAgY2FzZSBHcmFwaGlj
c0NvbnRleHQzRDo6SU5WQUxJRF9FTlVNOgotICAgICAgICAgICAgZXJyb3JTdHIgPSAiR3JhcGhp
Y3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9WQUxVRToKLSAgICAgICAgICAgIGVycm9y
U3RyID0gIkdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX1ZBTFVFIjsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJBVElPTjoK
LSAgICAgICAgICAgIGVycm9yU3RyID0gIkdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX09QRVJB
VElPTiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQz
RDo6SU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT046Ci0gICAgICAgICAgICBlcnJvclN0ciA9
ICJHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6Ok9VVF9PRl9N
RU1PUlk6Ci0gICAgICAgICAgICBlcnJvclN0ciA9ICJHcmFwaGljc0NvbnRleHQzRDo6T1VUX09G
X01FTU9SWSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaGVh
ZGVyKQotICAgICAgICAgICAgTE9HX0VSUk9SKCIlczogICVzIiwgaGVhZGVyLCBlcnJvclN0cik7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIExPR19FUlJPUigiJXMiLCBlcnJvclN0cik7Ci0g
ICAgfQotI2VuZGlmCi19Ci0KLX0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR0xFUzJDYW52YXMuaAkocmV2aXNpb24gODQyOTEp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HTEVTMkNhbnZh
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDE0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChj
KSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0g
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAot
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgR0xFUzJDYW52YXNf
aAotI2RlZmluZSBHTEVTMkNhbnZhc19oCi0KLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIK
LSNpbmNsdWRlICJDb2xvci5oIgotI2luY2x1ZGUgIkNvbG9yU3BhY2UuaCIKLSNpbmNsdWRlICJH
cmFwaGljc1R5cGVzLmgiCi0jaW5jbHVkZSAiSW1hZ2VTb3VyY2UuaCIKLSNpbmNsdWRlICJMb29w
Qmxpbm5QYXRoQ2FjaGUuaCIKLSNpbmNsdWRlICJUZXh0dXJlLmgiCi0KLSNpbmNsdWRlIDx3dGYv
SGFzaE1hcC5oPgotI2luY2x1ZGUgPHd0Zi9Ob25jb3B5YWJsZS5oPgotI2luY2x1ZGUgPHd0Zi9W
ZWN0b3IuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBDb2xvcjsKLWNsYXNzIERy
YXdpbmdCdWZmZXI7Ci1jbGFzcyBGbG9hdFJlY3Q7Ci1jbGFzcyBHcmFwaGljc0NvbnRleHQzRDsK
LWNsYXNzIFBhdGg7Ci1jbGFzcyBTaGFyZWRHcmFwaGljc0NvbnRleHQzRDsKLQotY2xhc3MgR0xF
UzJDYW52YXMgewotICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKEdMRVMyQ2FudmFzKTsKLXB1Ymxp
YzoKLSAgICBHTEVTMkNhbnZhcyhTaGFyZWRHcmFwaGljc0NvbnRleHQzRCosIERyYXdpbmdCdWZm
ZXIqLCBjb25zdCBJbnRTaXplJik7Ci0gICAgfkdMRVMyQ2FudmFzKCk7Ci0KLSAgICB2b2lkIGZp
bGxQYXRoKGNvbnN0IFBhdGgmKTsKLSAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYs
IGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSk7Ci0gICAgdm9pZCBmaWxsUmVjdChjb25zdCBGbG9h
dFJlY3QmKTsKLSAgICB2b2lkIGNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmKTsKLSAgICB2b2lk
IHNldEZpbGxDb2xvcihjb25zdCBDb2xvciYsIENvbG9yU3BhY2UpOwotICAgIHZvaWQgc2V0QWxw
aGEoZmxvYXQgYWxwaGEpOwotICAgIHZvaWQgc2V0U2hhZG93Q29sb3IoY29uc3QgQ29sb3ImLCBD
b2xvclNwYWNlKTsKLSAgICB2b2lkIHNldFNoYWRvd09mZnNldChjb25zdCBGbG9hdFNpemUmKTsK
LSAgICB2b2lkIHNldFNoYWRvd0JsdXIoZmxvYXQpOwotICAgIHZvaWQgc2V0U2hhZG93c0lnbm9y
ZVRyYW5zZm9ybXMoYm9vbCk7Ci0gICAgdm9pZCBzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9z
aXRlT3BlcmF0b3IpOwotICAgIHZvaWQgdHJhbnNsYXRlKGZsb2F0IHgsIGZsb2F0IHkpOwotICAg
IHZvaWQgcm90YXRlKGZsb2F0IGFuZ2xlSW5SYWRpYW5zKTsKLSAgICB2b2lkIHNjYWxlKGNvbnN0
IEZsb2F0U2l6ZSYpOwotICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYp
OwotICAgIHZvaWQgc2V0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpOwotICAgIHZvaWQgY2xp
cFBhdGgoY29uc3QgUGF0aCYpOwotICAgIHZvaWQgY2xpcE91dChjb25zdCBQYXRoJik7Ci0KLSAg
ICB2b2lkIHNhdmUoKTsKLSAgICB2b2lkIHJlc3RvcmUoKTsKLQotICAgIC8vIG5vbi1zdGFuZGFy
ZCBmdW5jdGlvbnMKLSAgICAvLyBUaGVzZSBhcmUgbm90IHN0YW5kYXJkIEdyYXBoaWNzQ29udGV4
dCBmdW5jdGlvbnMsIGFuZCBzaG91bGQgYmUgcHVzaGVkCi0gICAgLy8gZG93biBpbnRvIGEgUGxh
dGZvcm1Db250ZXh0R0xFUzIgYXQgc29tZSBwb2ludC4KLQotICAgIC8vIFRoaXMgdmVyc2lvbiBp
cyBjYWxsZWQgYnkgdGhlIGNhbnZhcy0+Y2FudmFzIGRyYXdzLgotICAgIHZvaWQgZHJhd1RleHR1
cmVkUmVjdCh1bnNpZ25lZCB0ZXh0dXJlLCBjb25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29u
c3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIENvbG9yU3Bh
Y2UsIENvbXBvc2l0ZU9wZXJhdG9yKTsKLSAgICAvLyBUaGlzIHZlcnNpb24gaXMgY2FsbGVkIGJ5
IEJpdG1hcEltYWdlOjpkcmF3KCkuCi0gICAgdm9pZCBkcmF3VGV4dHVyZWRSZWN0KFRleHR1cmUq
LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgQ29s
b3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IpOwotICAgIC8vIFRoaXMgdmVyc2lvbiBpcyBjYWxs
ZWQgYnkgdGhlIGFib3ZlLCBhbmQgYnkgdGhlIHNvZnR3YXJlLT5oYXJkd2FyZSB1cGxvYWRzLgot
ICAgIHZvaWQgZHJhd1RleHR1cmVkUmVjdChUZXh0dXJlKiwgY29uc3QgRmxvYXRSZWN0JiBzcmNS
ZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGZs
b2F0IGFscGhhLCBDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciwgYm9vbCBjbGlwKTsKLSAg
ICBUZXh0dXJlKiBjcmVhdGVUZXh0dXJlKE5hdGl2ZUltYWdlUHRyLCBUZXh0dXJlOjpGb3JtYXQs
IGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgVGV4dHVyZSogZ2V0VGV4dHVyZShOYXRpdmVJ
bWFnZVB0cik7Ci0KLSAgICBTaGFyZWRHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCgpIGNvbnN0
IHsgcmV0dXJuIG1fY29udGV4dDsgfQotCi0gICAgdm9pZCBiaW5kRnJhbWVidWZmZXIoKTsKLQot
ICAgIERyYXdpbmdCdWZmZXIqIGRyYXdpbmdCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX2RyYXdp
bmdCdWZmZXI7IH0KLQotcHJpdmF0ZToKLSAgICB2b2lkIGFwcGx5U3RhdGUoKTsKLSAgICB2b2lk
IHNjaXNzb3JDbGVhcihmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0
KTsKLSAgICB2b2lkIGRyYXdUZXh0dXJlZFJlY3RUaWxlKFRleHR1cmUqIHRleHR1cmUsIGludCB0
aWxlLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgZmxvYXQgYWxwaGEpOwotICAgIHZvaWQgZHJhd1RleHR1
cmVkUXVhZChjb25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNS
ZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGZs
b2F0IGFscGhhKTsKLSAgICB2b2lkIGRyYXdUZXh0dXJlZFF1YWRNaXRjaGVsbChjb25zdCBJbnRT
aXplJiB0ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYsIGZsb2F0IGFscGhhKTsKLSAgICB2
b2lkIGNvbnZvbHZlUmVjdCh1bnNpZ25lZCB0ZXh0dXJlLCBjb25zdCBJbnRTaXplJiB0ZXh0dXJl
U2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3Qs
IGZsb2F0IGltYWdlSW5jcmVtZW50WzJdLCBjb25zdCBmbG9hdCoga2VybmVsLCBpbnQga2VybmVs
V2lkdGgpOwotCi0gICAgdm9pZCB0ZXNzZWxhdGVBbmRGaWxsUGF0aChjb25zdCBQYXRoJiwgY29u
c3QgQ29sb3ImKTsKLSAgICB2b2lkIGZpbGxQYXRoSW50ZXJuYWwoY29uc3QgUGF0aCYsIGNvbnN0
IENvbG9yJik7Ci0gICAgdm9pZCBmaWxsUmVjdEludGVybmFsKGNvbnN0IEZsb2F0UmVjdCYsIGNv
bnN0IENvbG9yJik7Ci0gICAgRmxvYXRSZWN0IGZsaXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYpOwot
ICAgIHZvaWQgY2xlYXJCb3JkZXJzKGNvbnN0IEZsb2F0UmVjdCYsIGludCB3aWR0aCk7Ci0gICAg
dm9pZCBiZWdpblNoYWRvd0RyYXcoKTsKLSAgICB2b2lkIGVuZFNoYWRvd0RyYXcoY29uc3QgRmxv
YXRSZWN0JiBib3VuZGluZ0JveCk7Ci0gICAgdm9pZCBiZWdpblN0ZW5jaWxEcmF3KHVuc2lnbmVk
IG9wKTsKLSAgICB2b2lkIGFwcGx5Q2xpcHBpbmcoYm9vbCBlbmFibGUpOwotICAgIHZvaWQgY2hl
Y2tHTEVycm9yKGNvbnN0IGNoYXIqIGhlYWRlcik7Ci0KLSAgICBJbnRTaXplIG1fc2l6ZTsKLQot
ICAgIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKiBtX2NvbnRleHQ7Ci0gICAgRHJhd2luZ0J1ZmZl
ciogbV9kcmF3aW5nQnVmZmVyOwotCi0gICAgc3RydWN0IFN0YXRlOwotICAgIHR5cGVkZWYgV1RG
OjpWZWN0b3I8U3RhdGU+IFN0YXRlVmVjdG9yOwotICAgIFN0YXRlVmVjdG9yIG1fc3RhdGVTdGFj
azsKLSAgICBTdGF0ZSogbV9zdGF0ZTsKLSAgICBBZmZpbmVUcmFuc2Zvcm0gbV9mbGlwTWF0cml4
OwotCi0gICAgLy8gTWVtYmVycyBmb3IgR1BVLWFjY2VsZXJhdGVkIHBhdGggcmVuZGVyaW5nLgot
ICAgIExvb3BCbGlublBhdGhDYWNoZSBtX3BhdGhDYWNoZTsKLSAgICB1bnNpZ25lZCBtX3BhdGhJ
bmRleEJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBtX3BhdGhWZXJ0ZXhCdWZmZXI7Ci19OwotCi19Ci0K
LSNlbmRpZiAvLyBHTEVTMkNhbnZhc19oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ncHUvR3JhcGhpY3NDb250ZXh0R1BVLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvR3JhcGhpY3NDb250ZXh0R1BVLmNwcAkocmV2
aXNpb24gODQyOTEpCShmcm9tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dMRVMyQ2FudmFzLmNwcDo4NDI5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2dwdS9HcmFwaGljc0NvbnRleHRHUFUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkdMRVMyQ2FudmFzLmgi
CisKKyNpbmNsdWRlICJEcmF3aW5nQnVmZmVyLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisj
aW5jbHVkZSAiRmxvYXRTaXplLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNp
bmNsdWRlICJpbnRlcm5hbF9nbHUuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAi
TG9vcEJsaW5uTWF0aFV0aWxzLmgiCisjaW5jbHVkZSAiTG9vcEJsaW5uUGF0aFByb2Nlc3Nvci5o
IgorI2luY2x1ZGUgIkxvb3BCbGlublNvbGlkRmlsbFNoYWRlci5oIgorI2luY2x1ZGUgIlBhdGgu
aCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNoYXJlZEdyYXBoaWNz
Q29udGV4dDNELmgiCisjaWYgVVNFKFNLSUEpCisjaW5jbHVkZSAiU2tQYXRoLmgiCisjZW5kaWYK
KyNpbmNsdWRlICJUZXh0dXJlLmgiCisKKyNkZWZpbmUgX1VTRV9NQVRIX0RFRklORVMKKyNpbmNs
dWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gTnVtYmVyIG9m
IGxpbmUgc2VnbWVudHMgdXNlZCB0byBhcHByb3hpbWF0ZSBiZXppZXIgY3VydmVzLgorY29uc3Qg
aW50IHBhdGhUZXNzZWxhdGlvbiA9IDMwOwordHlwZWRlZiB2b2lkIChHTEFQSUVOVFJZICpURVNT
Q0IpKCk7Cit0eXBlZGVmIFdURjo6VmVjdG9yPGZsb2F0PiBGbG9hdFZlY3RvcjsKK3R5cGVkZWYg
V1RGOjpWZWN0b3I8RmxvYXRQb2ludD4gRmxvYXRQb2ludFZlY3RvcjsKKworc3RydWN0IFBhdGhB
bmRUcmFuc2Zvcm0geworICAgIFBhdGhBbmRUcmFuc2Zvcm0oY29uc3QgUGF0aCYgcCwgY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJiB0KQorICAgICAgICA6IHBhdGgocCkKKyAgICAgICAgLCB0cmFuc2Zv
cm0odCkKKyAgICB7CisgICAgfQorICAgIFBhdGggcGF0aDsKKyAgICBBZmZpbmVUcmFuc2Zvcm0g
dHJhbnNmb3JtOworfTsKKworc3RydWN0IEdMRVMyQ2FudmFzOjpTdGF0ZSB7CisgICAgU3RhdGUo
KQorICAgICAgICA6IG1fZmlsbENvbG9yKDAsIDAsIDAsIDI1NSkKKyAgICAgICAgLCBtX3NoYWRv
d0NvbG9yKDAsIDAsIDAsIDApCisgICAgICAgICwgbV9hbHBoYSgxLjBmKQorICAgICAgICAsIG1f
Y29tcG9zaXRlT3AoQ29tcG9zaXRlU291cmNlT3ZlcikKKyAgICAgICAgLCBtX251bUNsaXBwaW5n
UGF0aHMoMCkKKyAgICAgICAgLCBtX3NoYWRvd09mZnNldCgwLCAwKQorICAgICAgICAsIG1fc2hh
ZG93Qmx1cigwKQorICAgICAgICAsIG1fc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMoZmFsc2UpCisg
ICAgeworICAgIH0KKyAgICBTdGF0ZShjb25zdCBTdGF0ZSYgb3RoZXIpCisgICAgICAgIDogbV9m
aWxsQ29sb3Iob3RoZXIubV9maWxsQ29sb3IpCisgICAgICAgICwgbV9zaGFkb3dDb2xvcihvdGhl
ci5tX3NoYWRvd0NvbG9yKQorICAgICAgICAsIG1fYWxwaGEob3RoZXIubV9hbHBoYSkKKyAgICAg
ICAgLCBtX2NvbXBvc2l0ZU9wKG90aGVyLm1fY29tcG9zaXRlT3ApCisgICAgICAgICwgbV9jdG0o
b3RoZXIubV9jdG0pCisgICAgICAgICwgbV9jbGlwcGluZ1BhdGhzKCkgLy8gRG9uJ3QgY29weTsg
Y2xpcHBpbmcgcGF0aHMgYXJlIHRyYWNrZWQgcGVyLXN0YXRlLgorICAgICAgICAsIG1fbnVtQ2xp
cHBpbmdQYXRocyhvdGhlci5tX251bUNsaXBwaW5nUGF0aHMpCisgICAgICAgICwgbV9zaGFkb3dP
ZmZzZXQob3RoZXIubV9zaGFkb3dPZmZzZXQpCisgICAgICAgICwgbV9zaGFkb3dCbHVyKG90aGVy
Lm1fc2hhZG93Qmx1cikKKyAgICAgICAgLCBtX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKG90aGVy
Lm1fc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpCisgICAgeworICAgIH0KKyAgICBDb2xvciBtX2Zp
bGxDb2xvcjsKKyAgICBDb2xvciBtX3NoYWRvd0NvbG9yOworICAgIGZsb2F0IG1fYWxwaGE7Cisg
ICAgQ29tcG9zaXRlT3BlcmF0b3IgbV9jb21wb3NpdGVPcDsKKyAgICBBZmZpbmVUcmFuc2Zvcm0g
bV9jdG07CisgICAgV1RGOjpWZWN0b3I8UGF0aEFuZFRyYW5zZm9ybT4gbV9jbGlwcGluZ1BhdGhz
OworICAgIGludCBtX251bUNsaXBwaW5nUGF0aHM7CisgICAgRmxvYXRTaXplIG1fc2hhZG93T2Zm
c2V0OworICAgIGZsb2F0IG1fc2hhZG93Qmx1cjsKKyAgICBib29sIG1fc2hhZG93c0lnbm9yZVRy
YW5zZm9ybXM7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIGFwcGx5aW5nIHRoZSBzdGF0
ZSdzIGFscGhhIHZhbHVlIHRvIHRoZSBnaXZlbiBpbnB1dAorICAgIC8vIGNvbG9yIHRvIHByb2R1
Y2UgYSBuZXcgb3V0cHV0IGNvbG9yLiBUaGUgbG9naWMgaXMgdGhlIHNhbWUgYXMKKyAgICAvLyBQ
bGF0Zm9ybUNvbnRleHRTa2lhOjpTdGF0ZTo6YXBwbHlBbHBoYSgpLCBidXQgdGhlIHR5cGUgaXMg
ZGlmZmVyZW50LgorICAgIENvbG9yIGFwcGx5QWxwaGEoY29uc3QgQ29sb3ImIGMpCisgICAgewor
ICAgICAgICBpbnQgcyA9IHJvdW5kZihtX2FscGhhICogMjU2KTsKKyAgICAgICAgaWYgKHMgPj0g
MjU2KQorICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIGlmIChzIDwgMCkKKyAgICAgICAg
ICAgIHJldHVybiBDb2xvcigpOworCisgICAgICAgIGludCBhID0gKGMuYWxwaGEoKSAqIHMpID4+
IDg7CisgICAgICAgIHJldHVybiBDb2xvcihjLnJlZCgpLCBjLmdyZWVuKCksIGMuYmx1ZSgpLCBh
KTsKKyAgICB9CisgICAgYm9vbCBzaGFkb3dBY3RpdmUoKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1fc2hhZG93Q29sb3IuYWxwaGEoKSA+IDAgJiYgKG1fc2hhZG93Qmx1ciB8fCBtX3No
YWRvd09mZnNldC53aWR0aCgpIHx8IG1fc2hhZG93T2Zmc2V0LmhlaWdodCgpKTsKKyAgICB9Cisg
ICAgYm9vbCBjbGlwcGluZ0VuYWJsZWQoKSB7IHJldHVybiBtX251bUNsaXBwaW5nUGF0aHMgPiAw
OyB9Cit9OworCitzdGF0aWMgaW5saW5lIEZsb2F0UG9pbnQgb3BlcmF0b3IqKGNvbnN0IEZsb2F0
UG9pbnQmIGYsIGZsb2F0IHNjYWxlKQoreworICAgIHJldHVybiBGbG9hdFBvaW50KGYueCgpICog
c2NhbGUsIGYueSgpICogc2NhbGUpOworfQorCitzdGF0aWMgaW5saW5lIEZsb2F0UG9pbnQgb3Bl
cmF0b3IqKGZsb2F0IHNjYWxlLCBjb25zdCBGbG9hdFBvaW50JiBmKQoreworICAgIHJldHVybiBG
bG9hdFBvaW50KGYueCgpICogc2NhbGUsIGYueSgpICogc2NhbGUpOworfQorCitzdGF0aWMgaW5s
aW5lIEZsb2F0U2l6ZSBvcGVyYXRvciooY29uc3QgRmxvYXRTaXplJiBmLCBmbG9hdCBzY2FsZSkK
K3sKKyAgICByZXR1cm4gRmxvYXRTaXplKGYud2lkdGgoKSAqIHNjYWxlLCBmLmhlaWdodCgpICog
c2NhbGUpOworfQorCitzdGF0aWMgaW5saW5lIEZsb2F0U2l6ZSBvcGVyYXRvciooZmxvYXQgc2Nh
bGUsIGNvbnN0IEZsb2F0U2l6ZSYgZikKK3sKKyAgICByZXR1cm4gRmxvYXRTaXplKGYud2lkdGgo
KSAqIHNjYWxlLCBmLmhlaWdodCgpICogc2NhbGUpOworfQorCitjbGFzcyBRdWFkcmF0aWMgewor
ICBwdWJsaWM6CisgICAgUXVhZHJhdGljKEZsb2F0UG9pbnQgYSwgRmxvYXRQb2ludCBiLCBGbG9h
dFBvaW50IGMpIDoKKyAgICAgICAgbV9hKGEpLCBtX2IoYiksIG1fYyhjKQorICAgIHsKKyAgICB9
CisgICAgc3RhdGljIFF1YWRyYXRpYyBmcm9tQmV6aWVyKEZsb2F0UG9pbnQgcDAsIEZsb2F0UG9p
bnQgcDEsIEZsb2F0UG9pbnQgcDIpCisgICAgeworICAgICAgICBGbG9hdFNpemUgcDFzKHAxLngo
KSwgcDEueSgpKTsKKyAgICAgICAgRmxvYXRTaXplIHAycyhwMi54KCksIHAyLnkoKSk7CisgICAg
ICAgIEZsb2F0UG9pbnQgYiA9IC0yLjBmICogcDAgKyAyLjBmICogcDFzOworICAgICAgICBGbG9h
dFBvaW50IGMgPSAgICAgICAgIHAwIC0gMi4wZiAqIHAxcyArIHAyczsKKyAgICAgICAgcmV0dXJu
IFF1YWRyYXRpYyhwMCwgYiwgYyk7CisgICAgfQorICAgIGlubGluZSBGbG9hdFBvaW50IGV2YWx1
YXRlKGZsb2F0IHQpCisgICAgeworICAgICAgICByZXR1cm4gbV9hICsgdCAqIChtX2IgKyB0ICog
bV9jKTsKKyAgICB9CisgICAgRmxvYXRQb2ludCBtX2EsIG1fYiwgbV9jLCBtX2Q7Cit9OworCitj
bGFzcyBDdWJpYyB7CisgIHB1YmxpYzoKKyAgICBDdWJpYyhGbG9hdFBvaW50IGEsIEZsb2F0UG9p
bnQgYiwgRmxvYXRQb2ludCBjLCBGbG9hdFBvaW50IGQpIDoKKyAgICAgICAgbV9hKGEpLCBtX2Io
YiksIG1fYyhjKSwgbV9kKGQpIAorICAgIHsKKyAgICB9CisgICAgc3RhdGljIEN1YmljIGZyb21C
ZXppZXIoRmxvYXRQb2ludCBwMCwgRmxvYXRQb2ludCBwMSwgRmxvYXRQb2ludCBwMiwgRmxvYXRQ
b2ludCBwMykKKyAgICB7CisgICAgICAgIEZsb2F0U2l6ZSBwMXMocDEueCgpLCBwMS55KCkpOwor
ICAgICAgICBGbG9hdFNpemUgcDJzKHAyLngoKSwgcDIueSgpKTsKKyAgICAgICAgRmxvYXRTaXpl
IHAzcyhwMy54KCksIHAzLnkoKSk7CisgICAgICAgIEZsb2F0UG9pbnQgYiA9IC0zLjBmICogcDAg
KyAzLjBmICogcDFzOworICAgICAgICBGbG9hdFBvaW50IGMgPSAgMy4wZiAqIHAwIC0gNi4wZiAq
IHAxcyArIDMuMGYgKiBwMnM7CisgICAgICAgIEZsb2F0UG9pbnQgZCA9IC0xLjBmICogcDAgKyAz
LjBmICogcDFzIC0gMy4wZiAqIHAycyArIHAzczsKKyAgICAgICAgcmV0dXJuIEN1YmljKHAwLCBi
LCBjLCBkKTsKKyAgICB9CisgICAgaW5saW5lIEZsb2F0UG9pbnQgZXZhbHVhdGUoZmxvYXQgdCkK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2EgKyB0ICogKG1fYiArIHQgKiAobV9jICsgdCAqIG1f
ZCkpOworICAgIH0KKyAgICBGbG9hdFBvaW50IG1fYSwgbV9iLCBtX2MsIG1fZDsKK307CisKK0dM
RVMyQ2FudmFzOjpHTEVTMkNhbnZhcyhTaGFyZWRHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCwg
RHJhd2luZ0J1ZmZlciogZHJhd2luZ0J1ZmZlciwgY29uc3QgSW50U2l6ZSYgc2l6ZSkKKyAgICA6
IG1fc2l6ZShzaXplKQorICAgICwgbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX2RyYXdpbmdC
dWZmZXIoZHJhd2luZ0J1ZmZlcikKKyAgICAsIG1fc3RhdGUoMCkKKyAgICAsIG1fcGF0aEluZGV4
QnVmZmVyKDApCisgICAgLCBtX3BhdGhWZXJ0ZXhCdWZmZXIoMCkKK3sKKyAgICBtX2ZsaXBNYXRy
aXgudHJhbnNsYXRlKC0xLjBmLCAxLjBmKTsKKyAgICBtX2ZsaXBNYXRyaXguc2NhbGUoMi4wZiAv
IHNpemUud2lkdGgoKSwgLTIuMGYgLyBzaXplLmhlaWdodCgpKTsKKworICAgIG1fc3RhdGVTdGFj
ay5hcHBlbmQoU3RhdGUoKSk7CisgICAgbV9zdGF0ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOwor
fQorCitHTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKCkKK3sKKyAgICBpZiAobV9wYXRoSW5kZXhC
dWZmZXIpCisgICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+ZGVsZXRlQnVm
ZmVyKG1fcGF0aEluZGV4QnVmZmVyKTsKKyAgICBpZiAobV9wYXRoVmVydGV4QnVmZmVyKQorICAg
ICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRlbGV0ZUJ1ZmZlcihtX3BhdGhW
ZXJ0ZXhCdWZmZXIpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpiaW5kRnJhbWVidWZmZXIoKQor
eworICAgIG1fZHJhd2luZ0J1ZmZlci0+YmluZCgpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpj
bGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIGJpbmRGcmFtZWJ1ZmZlcigp
OworICAgIGlmIChtX3N0YXRlLT5tX2N0bS5pc0lkZW50aXR5KCkgJiYgIW1fc3RhdGUtPmNsaXBw
aW5nRW5hYmxlZCgpKSB7CisgICAgICAgIHNjaXNzb3JDbGVhcihyZWN0LngoKSwgcmVjdC55KCks
IHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2F2
ZSgpOworICAgICAgICBzZXRDb21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlQ2xlYXIpOworICAg
ICAgICBmaWxsUmVjdChyZWN0LCBDb2xvcihSR0JBMzIoMCkpLCBDb2xvclNwYWNlRGV2aWNlUkdC
KTsKKyAgICAgICAgcmVzdG9yZSgpOworICAgIH0KK30KKwordm9pZCBHTEVTMkNhbnZhczo6YXBw
bHlTdGF0ZSgpCit7CisgICAgYmluZEZyYW1lYnVmZmVyKCk7CisgICAgbV9jb250ZXh0LT5hcHBs
eUNvbXBvc2l0ZU9wZXJhdG9yKG1fc3RhdGUtPm1fY29tcG9zaXRlT3ApOworICAgIGFwcGx5Q2xp
cHBpbmcobV9zdGF0ZS0+Y2xpcHBpbmdFbmFibGVkKCkpOworfQorCit2b2lkIEdMRVMyQ2FudmFz
OjpzY2lzc29yQ2xlYXIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdo
dCkKK3sKKyAgICBpbnQgaW50WCA9IHN0YXRpY19jYXN0PGludD4oeCArIDAuNWYpOworICAgIGlu
dCBpbnRZID0gc3RhdGljX2Nhc3Q8aW50Pih5ICsgMC41Zik7CisgICAgaW50IGludFdpZHRoID0g
c3RhdGljX2Nhc3Q8aW50Pih4ICsgd2lkdGggKyAwLjVmKSAtIGludFg7CisgICAgaW50IGludEhl
aWdodCA9IHN0YXRpY19jYXN0PGludD4oeSArIGhlaWdodCArIDAuNWYpIC0gaW50WTsKKyAgICBt
X2NvbnRleHQtPnNjaXNzb3IoaW50WCwgbV9zaXplLmhlaWdodCgpIC0gaW50SGVpZ2h0IC0gaW50
WSwgaW50V2lkdGgsIGludEhlaWdodCk7CisgICAgbV9jb250ZXh0LT5lbmFibGUoR3JhcGhpY3ND
b250ZXh0M0Q6OlNDSVNTT1JfVEVTVCk7CisgICAgbV9jb250ZXh0LT5jbGVhckNvbG9yKENvbG9y
KFJHQkEzMigwKSkpOworICAgIG1fY29udGV4dC0+Y2xlYXIoR3JhcGhpY3NDb250ZXh0M0Q6OkNP
TE9SX0JVRkZFUl9CSVQpOworICAgIG1fY29udGV4dC0+ZGlzYWJsZShHcmFwaGljc0NvbnRleHQz
RDo6U0NJU1NPUl9URVNUKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6ZmlsbFBhdGgoY29uc3Qg
UGF0aCYgcGF0aCkKK3sKKyAgICBpZiAobV9zdGF0ZS0+c2hhZG93QWN0aXZlKCkpIHsKKyAgICAg
ICAgYmVnaW5TaGFkb3dEcmF3KCk7CisgICAgICAgIGZpbGxQYXRoSW50ZXJuYWwocGF0aCwgbV9z
dGF0ZS0+bV9zaGFkb3dDb2xvcik7CisgICAgICAgIGVuZFNoYWRvd0RyYXcocGF0aC5ib3VuZGlu
Z1JlY3QoKSk7CisgICAgfQorCisgICAgYXBwbHlTdGF0ZSgpOworICAgIGZpbGxQYXRoSW50ZXJu
YWwocGF0aCwgbV9zdGF0ZS0+YXBwbHlBbHBoYShtX3N0YXRlLT5tX2ZpbGxDb2xvcikpOworfQor
Cit2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0
IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIGlmIChtX3N0YXRl
LT5zaGFkb3dBY3RpdmUoKSkgeworICAgICAgICBiZWdpblNoYWRvd0RyYXcoKTsKKyAgICAgICAg
ZmlsbFJlY3RJbnRlcm5hbChyZWN0LCBtX3N0YXRlLT5tX3NoYWRvd0NvbG9yKTsKKyAgICAgICAg
ZW5kU2hhZG93RHJhdyhyZWN0KTsKKyAgICB9CisKKyAgICBhcHBseVN0YXRlKCk7CisgICAgZmls
bFJlY3RJbnRlcm5hbChyZWN0LCBjb2xvcik7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmZpbGxS
ZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBmaWxsUmVjdChyZWN0LCBtX3N0YXRl
LT5hcHBseUFscGhhKG1fc3RhdGUtPm1fZmlsbENvbG9yKSwgQ29sb3JTcGFjZURldmljZVJHQik7
Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmZpbGxSZWN0SW50ZXJuYWwoY29uc3QgRmxvYXRSZWN0
JiByZWN0LCBjb25zdCBDb2xvciYgY29sb3IpCit7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1hdHJp
eChtX2ZsaXBNYXRyaXgpOworICAgIG1hdHJpeCAqPSBtX3N0YXRlLT5tX2N0bTsKKyAgICBtYXRy
aXgudHJhbnNsYXRlKHJlY3QueCgpLCByZWN0LnkoKSk7CisgICAgbWF0cml4LnNjYWxlKHJlY3Qu
d2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBtX2NvbnRleHQtPnVzZVF1YWRWZXJ0aWNl
cygpOworICAgIG1fY29udGV4dC0+dXNlRmlsbFNvbGlkUHJvZ3JhbShtYXRyaXgsIGNvbG9yKTsK
KyAgICBtX2NvbnRleHQtPmRyYXdBcnJheXMoR3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFX1NU
UklQLCAwLCA0KTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2V0RmlsbENvbG9yKGNvbnN0IENv
bG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xvclNwYWNlKQoreworICAgIG1fc3RhdGUtPm1fZmls
bENvbG9yID0gY29sb3I7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OnNldEFscGhhKGZsb2F0IGFs
cGhhKQoreworICAgIG1fc3RhdGUtPm1fYWxwaGEgPSBhbHBoYTsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6c2V0U2hhZG93Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlKQorewor
ICAgIG1fc3RhdGUtPm1fc2hhZG93Q29sb3IgPSBjb2xvcjsKK30KKwordm9pZCBHTEVTMkNhbnZh
czo6c2V0U2hhZG93T2Zmc2V0KGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQoreworICAgIG1fc3Rh
dGUtPm1fc2hhZG93T2Zmc2V0ID0gb2Zmc2V0OworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpzZXRT
aGFkb3dCbHVyKGZsb2F0IHNoYWRvd0JsdXIpCit7CisgICAgbV9zdGF0ZS0+bV9zaGFkb3dCbHVy
ID0gc2hhZG93Qmx1cjsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2V0U2hhZG93c0lnbm9yZVRy
YW5zZm9ybXMoYm9vbCBzaGFkb3dzSWdub3JlVHJhbnNmb3JtcykKK3sKKyAgICBtX3N0YXRlLT5t
X3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zID0gc2hhZG93c0lnbm9yZVRyYW5zZm9ybXM7Cit9CisK
K3ZvaWQgR0xFUzJDYW52YXM6OnRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5KQoreworICAgIG1f
c3RhdGUtPm1fY3RtLnRyYW5zbGF0ZSh4LCB5KTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6cm90
YXRlKGZsb2F0IGFuZ2xlSW5SYWRpYW5zKQoreworICAgIG1fc3RhdGUtPm1fY3RtLnJvdGF0ZShh
bmdsZUluUmFkaWFucyAqICgxODAuMGYgLyBNX1BJKSk7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6
OnNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKK3sKKyAgICBtX3N0YXRlLT5tX2N0bS5zY2Fs
ZShzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpj
b25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBhZmZpbmUpCit7CisgICAgbV9zdGF0ZS0+
bV9jdG0gKj0gYWZmaW5lOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpzZXRDVE0oY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiBhZmZpbmUpCit7CisgICAgbV9zdGF0ZS0+bV9jdG0gPSBhZmZpbmU7Cit9
CisKK3ZvaWQgR0xFUzJDYW52YXM6OmNsaXBQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAg
YmluZEZyYW1lYnVmZmVyKCk7CisgICAgY2hlY2tHTEVycm9yKCJiaW5kRnJhbWVidWZmZXIiKTsK
KyAgICBiZWdpblN0ZW5jaWxEcmF3KEdyYXBoaWNzQ29udGV4dDNEOjpJTkNSKTsKKyAgICAvLyBS
ZWQgaXMgdXNlZCBzbyB3ZSBjYW4gc2VlIGl0IGlmIGl0IGVuZHMgdXAgaW4gdGhlIGNvbG9yIGJ1
ZmZlci4KKyAgICBDb2xvciByZWQoMjU1LCAwLCAwLCAyNTUpOworICAgIGZpbGxQYXRoSW50ZXJu
YWwocGF0aCwgcmVkKTsKKyAgICBtX3N0YXRlLT5tX2NsaXBwaW5nUGF0aHMuYXBwZW5kKFBhdGhB
bmRUcmFuc2Zvcm0ocGF0aCwgbV9zdGF0ZS0+bV9jdG0pKTsKKyAgICBtX3N0YXRlLT5tX251bUNs
aXBwaW5nUGF0aHMrKzsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6Y2xpcE91dChjb25zdCBQYXRo
JiBwYXRoKQoreworICAgIEFTU0VSVCghImNsaXBPdXQgaXMgdW5zdXBwb3J0ZWQgaW4gR0xFUzJD
YW52YXMuXG4iKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6c2F2ZSgpCit7CisgICAgbV9zdGF0
ZVN0YWNrLmFwcGVuZChTdGF0ZShtX3N0YXRlU3RhY2subGFzdCgpKSk7CisgICAgbV9zdGF0ZSA9
ICZtX3N0YXRlU3RhY2subGFzdCgpOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpyZXN0b3JlKCkK
K3sKKyAgICBBU1NFUlQoIW1fc3RhdGVTdGFjay5pc0VtcHR5KCkpOworICAgIGNvbnN0IFZlY3Rv
cjxQYXRoQW5kVHJhbnNmb3JtPiYgY2xpcHBpbmdQYXRocyA9IG1fc3RhdGUtPm1fY2xpcHBpbmdQ
YXRoczsKKyAgICBpZiAoIWNsaXBwaW5nUGF0aHMuaXNFbXB0eSgpKSB7CisgICAgICAgIGJlZ2lu
U3RlbmNpbERyYXcoR3JhcGhpY3NDb250ZXh0M0Q6OkRFQ1IpOworICAgICAgICBXVEY6OlZlY3Rv
cjxQYXRoQW5kVHJhbnNmb3JtPjo6Y29uc3RfaXRlcmF0b3IgcGF0aEl0ZXI7CisgICAgICAgIGZv
ciAocGF0aEl0ZXIgPSBjbGlwcGluZ1BhdGhzLmJlZ2luKCk7IHBhdGhJdGVyIDwgY2xpcHBpbmdQ
YXRocy5lbmQoKTsgKytwYXRoSXRlcikgeworICAgICAgICAgICAgbV9zdGF0ZS0+bV9jdG0gPSBw
YXRoSXRlci0+dHJhbnNmb3JtOworICAgICAgICAgICAgLy8gUmVkIGlzIHVzZWQgc28gd2UgY2Fu
IHNlZSBpdCBpZiBpdCBlbmRzIHVwIGluIHRoZSBjb2xvciBidWZmZXIuCisgICAgICAgICAgICBD
b2xvciByZWQoMjU1LCAwLCAwLCAyNTUpOworICAgICAgICAgICAgZmlsbFBhdGhJbnRlcm5hbChw
YXRoSXRlci0+cGF0aCwgcmVkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3N0YXRlU3RhY2su
cmVtb3ZlTGFzdCgpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKK30KKwor
dm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVjdCh1bnNpZ25lZCB0ZXh0dXJlLCBjb25z
dCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIGRzdFJlY3QsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0
b3IgY29tcG9zaXRlT3ApCit7CisgICAgYmluZEZyYW1lYnVmZmVyKCk7CisgICAgbV9jb250ZXh0
LT5hcHBseUNvbXBvc2l0ZU9wZXJhdG9yKGNvbXBvc2l0ZU9wKTsKKyAgICBhcHBseUNsaXBwaW5n
KGZhbHNlKTsKKworICAgIG1fY29udGV4dC0+c2V0QWN0aXZlVGV4dHVyZShHcmFwaGljc0NvbnRl
eHQzRDo6VEVYVFVSRTApOworCisgICAgbV9jb250ZXh0LT5iaW5kVGV4dHVyZShHcmFwaGljc0Nv
bnRleHQzRDo6VEVYVFVSRV8yRCwgdGV4dHVyZSk7CisKKyAgICBkcmF3VGV4dHVyZWRRdWFkKHRl
eHR1cmVTaXplLCBzcmNSZWN0LCBkc3RSZWN0LCBtX3N0YXRlLT5tX2N0bSwgbV9zdGF0ZS0+bV9h
bHBoYSk7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFJlY3QoVGV4dHVyZSog
dGV4dHVyZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJl
Y3QsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3IgY29tcG9zaXRlT3Ap
Cit7CisgICAgZHJhd1RleHR1cmVkUmVjdCh0ZXh0dXJlLCBzcmNSZWN0LCBkc3RSZWN0LCBtX3N0
YXRlLT5tX2N0bSwgbV9zdGF0ZS0+bV9hbHBoYSwgY29sb3JTcGFjZSwgY29tcG9zaXRlT3AsIG1f
c3RhdGUtPmNsaXBwaW5nRW5hYmxlZCgpKTsKK30KKworCit2b2lkIEdMRVMyQ2FudmFzOjpkcmF3
VGV4dHVyZWRSZWN0KFRleHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwg
Y29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9y
bSwgZmxvYXQgYWxwaGEsIENvbG9yU3BhY2UgY29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Ig
Y29tcG9zaXRlT3AsIGJvb2wgY2xpcCkKK3sKKyAgICBiaW5kRnJhbWVidWZmZXIoKTsKKyAgICBt
X2NvbnRleHQtPmFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoY29tcG9zaXRlT3ApOworICAgIGFwcGx5
Q2xpcHBpbmcoY2xpcCk7CisgICAgY29uc3QgVGlsaW5nRGF0YSYgdGlsZXMgPSB0ZXh0dXJlLT50
aWxlcygpOworICAgIEludFJlY3QgdGlsZUlkeFJlY3QgPSB0aWxlcy5vdmVybGFwcGVkVGlsZUlu
ZGljZXMoc3JjUmVjdCk7CisKKyAgICBtX2NvbnRleHQtPnNldEFjdGl2ZVRleHR1cmUoR3JhcGhp
Y3NDb250ZXh0M0Q6OlRFWFRVUkUwKTsKKworICAgIGZvciAoaW50IHkgPSB0aWxlSWR4UmVjdC55
KCk7IHkgPD0gdGlsZUlkeFJlY3QubWF4WSgpOyB5KyspIHsKKyAgICAgICAgZm9yIChpbnQgeCA9
IHRpbGVJZHhSZWN0LngoKTsgeCA8PSB0aWxlSWR4UmVjdC5tYXhYKCk7IHgrKykKKyAgICAgICAg
ICAgIGRyYXdUZXh0dXJlZFJlY3RUaWxlKHRleHR1cmUsIHRpbGVzLnRpbGVJbmRleCh4LCB5KSwg
c3JjUmVjdCwgZHN0UmVjdCwgdHJhbnNmb3JtLCBhbHBoYSk7CisgICAgfQorfQorCit2b2lkIEdM
RVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRSZWN0VGlsZShUZXh0dXJlKiB0ZXh0dXJlLCBpbnQgdGls
ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNv
bnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9hdCBhbHBoYSkKK3sKKyAgICBpZiAo
ZHN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IFRpbGluZ0Rh
dGEmIHRpbGVzID0gdGV4dHVyZS0+dGlsZXMoKTsKKworICAgIHRleHR1cmUtPmJpbmRUaWxlKHRp
bGUpOworCisgICAgRmxvYXRSZWN0IHNyY1JlY3RDbGlwcGVkSW5UaWxlU3BhY2U7CisgICAgRmxv
YXRSZWN0IGRzdFJlY3RJbnRlcnNlY3RlZDsKKyAgICB0aWxlcy5pbnRlcnNlY3REcmF3UXVhZChz
cmNSZWN0LCBkc3RSZWN0LCB0aWxlLCAmc3JjUmVjdENsaXBwZWRJblRpbGVTcGFjZSwgJmRzdFJl
Y3RJbnRlcnNlY3RlZCk7CisKKyAgICBJbnRSZWN0IHRpbGVCb3VuZHNXaXRoQm9yZGVyID0gdGls
ZXMudGlsZUJvdW5kc1dpdGhCb3JkZXIodGlsZSk7CisKKyAgICBkcmF3VGV4dHVyZWRRdWFkKHRp
bGVCb3VuZHNXaXRoQm9yZGVyLnNpemUoKSwgc3JjUmVjdENsaXBwZWRJblRpbGVTcGFjZSwgZHN0
UmVjdEludGVyc2VjdGVkLCB0cmFuc2Zvcm0sIGFscGhhKTsKK30KKwordm9pZCBHTEVTMkNhbnZh
czo6Y29udm9sdmVSZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVT
aXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwg
ZmxvYXQgaW1hZ2VJbmNyZW1lbnRbMl0sIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBrZXJuZWxX
aWR0aCkKK3sKKyAgICBtX2NvbnRleHQtPmJpbmRUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpU
RVhUVVJFXzJELCB0ZXh0dXJlKTsKKyAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmkoR3JhcGhp
Y3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX1dSQVBf
UywgR3JhcGhpY3NDb250ZXh0M0Q6OkNMQU1QX1RPX0VER0UpOworICAgIG1fY29udGV4dC0+dGV4
UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0
M0Q6OlRFWFRVUkVfV1JBUF9ULCBHcmFwaGljc0NvbnRleHQzRDo6Q0xBTVBfVE9fRURHRSk7Cisg
ICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJE
LCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBHcmFwaGljc0NvbnRleHQz
RDo6TkVBUkVTVCk7CisgICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4
dDNEOjpURVhUVVJFXzJELCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NQUdfRklMVEVSLCBH
cmFwaGljc0NvbnRleHQzRDo6TkVBUkVTVCk7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4
KG1fZmxpcE1hdHJpeCk7CisgICAgbWF0cml4LnRyYW5zbGF0ZShkc3RSZWN0LngoKSwgZHN0UmVj
dC55KCkpOworICAgIG1hdHJpeC5zY2FsZShkc3RSZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0
KCkpOworCisgICAgQWZmaW5lVHJhbnNmb3JtIHRleE1hdHJpeDsKKyAgICB0ZXhNYXRyaXguc2Nh
bGUoMS4wZiAvIHRleHR1cmVTaXplLndpZHRoKCksIDEuMGYgLyB0ZXh0dXJlU2l6ZS5oZWlnaHQo
KSk7CisgICAgdGV4TWF0cml4LnRyYW5zbGF0ZShzcmNSZWN0LngoKSwgc3JjUmVjdC55KCkpOwor
ICAgIHRleE1hdHJpeC5zY2FsZShzcmNSZWN0LndpZHRoKCksIHNyY1JlY3QuaGVpZ2h0KCkpOwor
CisgICAgbV9jb250ZXh0LT51c2VRdWFkVmVydGljZXMoKTsKKyAgICBtX2NvbnRleHQtPnVzZUNv
bnZvbHV0aW9uUHJvZ3JhbShtYXRyaXgsIHRleE1hdHJpeCwga2VybmVsLCBrZXJuZWxXaWR0aCwg
aW1hZ2VJbmNyZW1lbnQpOworICAgIG1fY29udGV4dC0+ZHJhd0FycmF5cyhHcmFwaGljc0NvbnRl
eHQzRDo6VFJJQU5HTEVfU1RSSVAsIDAsIDQpOworICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3QXJy
YXlzIik7Cit9CisKK3N0YXRpYyBmbG9hdCBnYXVzcyhmbG9hdCB4LCBmbG9hdCBzaWdtYSkKK3sK
KyAgICByZXR1cm4gZXhwKC0gKHggKiB4KSAvICgyLjBmICogc2lnbWEgKiBzaWdtYSkpOworfQor
CitzdGF0aWMgdm9pZCBidWlsZEtlcm5lbChmbG9hdCBzaWdtYSwgZmxvYXQqIGtlcm5lbCwgaW50
IGtlcm5lbFdpZHRoKQoreworICAgIGZsb2F0IGhhbGZXaWR0aCA9IChrZXJuZWxXaWR0aCAtIDEu
MGYpIC8gMi4wZjsKKyAgICBmbG9hdCBzdW0gPSAwLjBmOworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwga2VybmVsV2lkdGg7ICsraSkgeworICAgICAgICBrZXJuZWxbaV0gPSBnYXVzcyhpIC0gaGFs
ZldpZHRoLCBzaWdtYSk7CisgICAgICAgIHN1bSArPSBrZXJuZWxbaV07CisgICAgfQorICAgIC8v
IE5vcm1hbGl6ZSB0aGUga2VybmVsCisgICAgZmxvYXQgc2NhbGUgPSAxLjBmIC8gc3VtOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwga2VybmVsV2lkdGg7ICsraSkKKyAgICAgICAga2VybmVsW2ld
ICo9IHNjYWxlOworfQorCit2b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRRdWFkKGNvbnN0
IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGZsb2F0
IGFscGhhKQoreworICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXgobV9mbGlwTWF0cml4KTsKKyAg
ICBtYXRyaXggKj0gdHJhbnNmb3JtOworICAgIG1hdHJpeC50cmFuc2xhdGUoZHN0UmVjdC54KCks
IGRzdFJlY3QueSgpKTsKKyAgICBtYXRyaXguc2NhbGUoZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0
LmhlaWdodCgpKTsKKworICAgIEFmZmluZVRyYW5zZm9ybSB0ZXhNYXRyaXg7CisgICAgdGV4TWF0
cml4LnNjYWxlKDEuMGYgLyB0ZXh0dXJlU2l6ZS53aWR0aCgpLCAxLjBmIC8gdGV4dHVyZVNpemUu
aGVpZ2h0KCkpOworICAgIHRleE1hdHJpeC50cmFuc2xhdGUoc3JjUmVjdC54KCksIHNyY1JlY3Qu
eSgpKTsKKyAgICB0ZXhNYXRyaXguc2NhbGUoc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdo
dCgpKTsKKworICAgIG1fY29udGV4dC0+dXNlUXVhZFZlcnRpY2VzKCk7CisgICAgbV9jb250ZXh0
LT51c2VUZXh0dXJlUHJvZ3JhbShtYXRyaXgsIHRleE1hdHJpeCwgYWxwaGEpOworICAgIG1fY29u
dGV4dC0+ZHJhd0FycmF5cyhHcmFwaGljc0NvbnRleHQzRDo6VFJJQU5HTEVfU1RSSVAsIDAsIDQp
OworICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3QXJyYXlzIik7Cit9CisKK3ZvaWQgR0xFUzJDYW52
YXM6OmRyYXdUZXh0dXJlZFF1YWRNaXRjaGVsbChjb25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwg
Y29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9hdCBhbHBoYSkKK3sKKyAgICBzdGF0aWMg
Y29uc3QgZmxvYXQgbWl0Y2hlbGxDb2VmZmljaWVudHNbMTZdID0geworICAgICAgICAgMC4wZiAv
IDE4LjBmLCAgIDEuMGYgLyAxOC4wZiwgIDE2LjBmIC8gMTguMGYsICAgMS4wZiAvIDE4LjBmLAor
ICAgICAgICAgMC4wZiAvIDE4LjBmLCAgIDkuMGYgLyAxOC4wZiwgICAwLjBmIC8gMTguMGYsICAt
OS4wZiAvIDE4LjBmLAorICAgICAgICAtNi4wZiAvIDE4LjBmLCAgMjcuMGYgLyAxOC4wZiwgLTM2
LjBmIC8gMTguMGYsICAxNS4wZiAvIDE4LjBmLAorICAgICAgICAgNy4wZiAvIDE4LjBmLCAtMjEu
MGYgLyAxOC4wZiwgIDIxLjBmIC8gMTguMGYsICAtNy4wZiAvIDE4LjBmLAorICAgIH07CisKKyAg
ICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4KG1fZmxpcE1hdHJpeCk7CisgICAgbWF0cml4ICo9IHRy
YW5zZm9ybTsKKyAgICBtYXRyaXgudHJhbnNsYXRlKGRzdFJlY3QueCgpLCBkc3RSZWN0LnkoKSk7
CisgICAgbWF0cml4LnNjYWxlKGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSk7CisK
KyAgICBmbG9hdCBpbWFnZUluY3JlbWVudFsyXSA9IHsgMS4wZiAvIHRleHR1cmVTaXplLndpZHRo
KCksIDEuMGYgLyB0ZXh0dXJlU2l6ZS5oZWlnaHQoKSB9OworCisgICAgQWZmaW5lVHJhbnNmb3Jt
IHRleE1hdHJpeDsKKyAgICB0ZXhNYXRyaXguc2NhbGUoaW1hZ2VJbmNyZW1lbnRbMF0sIGltYWdl
SW5jcmVtZW50WzFdKTsKKyAgICB0ZXhNYXRyaXgudHJhbnNsYXRlKHNyY1JlY3QueCgpLCBzcmNS
ZWN0LnkoKSk7CisgICAgdGV4TWF0cml4LnNjYWxlKHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5o
ZWlnaHQoKSk7CisKKyAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmkoR3JhcGhpY3NDb250ZXh0
M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX01JTl9GSUxURVIsIEdy
YXBoaWNzQ29udGV4dDNEOjpORUFSRVNUKTsKKyAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmko
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJF
X01BR19GSUxURVIsIEdyYXBoaWNzQ29udGV4dDNEOjpORUFSRVNUKTsKKworICAgIG1fY29udGV4
dC0+dXNlUXVhZFZlcnRpY2VzKCk7CisgICAgbV9jb250ZXh0LT51c2VCaWN1YmljUHJvZ3JhbSht
YXRyaXgsIHRleE1hdHJpeCwgbWl0Y2hlbGxDb2VmZmljaWVudHMsIGltYWdlSW5jcmVtZW50LCBh
bHBoYSk7CisgICAgbV9jb250ZXh0LT5kcmF3QXJyYXlzKEdyYXBoaWNzQ29udGV4dDNEOjpUUklB
TkdMRV9TVFJJUCwgMCwgNCk7CisgICAgY2hlY2tHTEVycm9yKCJnbERyYXdBcnJheXMiKTsKK30K
Kwordm9pZCBHTEVTMkNhbnZhczo6c2V0Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJh
dG9yIG9wKQoreworICAgIG1fc3RhdGUtPm1fY29tcG9zaXRlT3AgPSBvcDsKK30KKworVGV4dHVy
ZSogR0xFUzJDYW52YXM6OmNyZWF0ZVRleHR1cmUoTmF0aXZlSW1hZ2VQdHIgcHRyLCBUZXh0dXJl
OjpGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIG1f
Y29udGV4dC0+Y3JlYXRlVGV4dHVyZShwdHIsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Cit9CisK
K1RleHR1cmUqIEdMRVMyQ2FudmFzOjpnZXRUZXh0dXJlKE5hdGl2ZUltYWdlUHRyIHB0cikKK3sK
KyAgICByZXR1cm4gbV9jb250ZXh0LT5nZXRUZXh0dXJlKHB0cik7Cit9CisKKyNpZiBVU0UoU0tJ
QSkKKy8vIFRoaXMgaXMgYWN0dWFsbHkgY3Jvc3MtcGxhdGZvcm0gY29kZSwgYnV0IHNpbmNlIGl0
cyBvbmx5IGNhbGxlciBpcyBpbnNpZGUgYQorLy8gVVNFKFNLSUEpLCBpdCB3aWxsIGNhdXNlIGEg
d2FybmluZy1hcy1lcnJvciBvbiBDaHJvbWUvTWFjLgorc3RhdGljIHZvaWQgaW50ZXJwb2xhdGVR
dWFkcmF0aWMoRmxvYXRQb2ludFZlY3RvciogdmVydGljZXMsIGNvbnN0IEZsb2F0UG9pbnQmIHAw
LCBjb25zdCBGbG9hdFBvaW50JiBwMSwgY29uc3QgRmxvYXRQb2ludCYgcDIpCit7CisgICAgZmxv
YXQgdEluY3JlbWVudCA9IDEuMGYgLyBwYXRoVGVzc2VsYXRpb24sIHQgPSB0SW5jcmVtZW50Owor
ICAgIFF1YWRyYXRpYyBjID0gUXVhZHJhdGljOjpmcm9tQmV6aWVyKHAwLCBwMSwgcDIpOworICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aFRlc3NlbGF0aW9uOyArK2ksIHQgKz0gdEluY3JlbWVu
dCkKKyAgICAgICAgdmVydGljZXMtPmFwcGVuZChjLmV2YWx1YXRlKHQpKTsKK30KKworc3RhdGlj
IHZvaWQgaW50ZXJwb2xhdGVDdWJpYyhGbG9hdFBvaW50VmVjdG9yKiB2ZXJ0aWNlcywgY29uc3Qg
RmxvYXRQb2ludCYgcDAsIGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBvaW50JiBw
MiwgY29uc3QgRmxvYXRQb2ludCYgcDMpCit7CisgICAgZmxvYXQgdEluY3JlbWVudCA9IDEuMGYg
LyBwYXRoVGVzc2VsYXRpb24sIHQgPSB0SW5jcmVtZW50OworICAgIEN1YmljIGMgPSBDdWJpYzo6
ZnJvbUJlemllcihwMCwgcDEsIHAyLCBwMyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRo
VGVzc2VsYXRpb247ICsraSwgdCArPSB0SW5jcmVtZW50KQorICAgICAgICB2ZXJ0aWNlcy0+YXBw
ZW5kKGMuZXZhbHVhdGUodCkpOworfQorI2VuZGlmCisKK3N0cnVjdCBQb2x5Z29uRGF0YSB7Cisg
ICAgUG9seWdvbkRhdGEoRmxvYXRQb2ludFZlY3RvciogdmVydGljZXMsIFdURjo6VmVjdG9yPHNo
b3J0PiogaW5kaWNlcykKKyAgICAgIDogbV92ZXJ0aWNlcyh2ZXJ0aWNlcykKKyAgICAgICwgbV9p
bmRpY2VzKGluZGljZXMpCisgICAgeworICAgIH0KKyAgICBGbG9hdFBvaW50VmVjdG9yKiBtX3Zl
cnRpY2VzOworICAgIFdURjo6VmVjdG9yPHNob3J0PiogbV9pbmRpY2VzOworfTsKKworc3RhdGlj
IHZvaWQgYmVnaW5EYXRhKEdMZW51bSB0eXBlLCB2b2lkKiBkYXRhKQoreworICAgIEFTU0VSVCh0
eXBlID09IEdMX1RSSUFOR0xFUyk7Cit9CisKK3N0YXRpYyB2b2lkIGVkZ2VGbGFnRGF0YShHTGJv
b2xlYW4gZmxhZywgdm9pZCogZGF0YSkKK3sKK30KKworc3RhdGljIHZvaWQgdmVydGV4RGF0YSh2
b2lkKiB2ZXJ0ZXhEYXRhLCB2b2lkKiBkYXRhKQoreworICAgIHN0YXRpY19jYXN0PFBvbHlnb25E
YXRhKj4oZGF0YSktPm1faW5kaWNlcy0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4odmVy
dGV4RGF0YSkpOworfQorCitzdGF0aWMgdm9pZCBlbmREYXRhKHZvaWQqIGRhdGEpCit7Cit9CisK
K3N0YXRpYyB2b2lkIGNvbWJpbmVEYXRhKEdMZG91YmxlIGNvb3Jkc1szXSwgdm9pZCogdmVydGV4
RGF0YVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZmxvYXQgd2VpZ2h0
WzRdLCB2b2lkICoqb3V0RGF0YSwgdm9pZCogZGF0YSkKK3sKKyAgICBQb2x5Z29uRGF0YSogcG9s
eWdvbkRhdGEgPSBzdGF0aWNfY2FzdDxQb2x5Z29uRGF0YSo+KGRhdGEpOworICAgIGludCBpbmRl
eCA9IHBvbHlnb25EYXRhLT5tX3ZlcnRpY2VzLT5zaXplKCk7CisgICAgcG9seWdvbkRhdGEtPm1f
dmVydGljZXMtPmFwcGVuZChGbG9hdFBvaW50KHN0YXRpY19jYXN0PGZsb2F0Pihjb29yZHNbMF0p
LCBzdGF0aWNfY2FzdDxmbG9hdD4oY29vcmRzWzFdKSkpOworICAgICpvdXREYXRhID0gcmVpbnRl
cnByZXRfY2FzdDx2b2lkKj4oaW5kZXgpOworfQorCit0eXBlZGVmIHZvaWQgKCpURVNTQ0IpKCk7
CisKK3ZvaWQgR0xFUzJDYW52YXM6OnRlc3NlbGF0ZUFuZEZpbGxQYXRoKGNvbnN0IFBhdGgmIHBh
dGgsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAoIW1fcGF0aFZlcnRleEJ1ZmZlcikK
KyAgICAgICAgbV9wYXRoVmVydGV4QnVmZmVyID0gbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQz
RCgpLT5jcmVhdGVCdWZmZXIoKTsKKyAgICBpZiAoIW1fcGF0aEluZGV4QnVmZmVyKQorICAgICAg
ICBtX3BhdGhJbmRleEJ1ZmZlciA9IG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+Y3Jl
YXRlQnVmZmVyKCk7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gbWF0cml4KG1fZmxpcE1hdHJpeCk7
CisgICAgbWF0cml4ICo9IG1fc3RhdGUtPm1fY3RtOworCisgICAgRmxvYXRQb2ludFZlY3RvciBp
blZlcnRpY2VzOworICAgIFdURjo6VmVjdG9yPHNpemVfdD4gY29udG91cnM7CisjaWYgVVNFKFNL
SUEpCisgICAgY29uc3QgU2tQYXRoKiBza1BhdGggPSBwYXRoLnBsYXRmb3JtUGF0aCgpOworICAg
IFNrUG9pbnQgcHRzWzRdOworICAgIFNrUGF0aDo6SXRlciBpdGVyKCpza1BhdGgsIHRydWUpOwor
ICAgIFNrUGF0aDo6VmVyYiB2ZXJiOworICAgIHdoaWxlICgodmVyYiA9IGl0ZXIubmV4dChwdHMp
KSAhPSBTa1BhdGg6OmtEb25lX1ZlcmIpIHsKKyAgICAgICAgc3dpdGNoICh2ZXJiKSB7CisgICAg
ICAgIGNhc2UgU2tQYXRoOjprTW92ZV9WZXJiOgorICAgICAgICAgICAgaW5WZXJ0aWNlcy5hcHBl
bmQocHRzWzBdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNrUGF0aDo6a0xp
bmVfVmVyYjoKKyAgICAgICAgICAgIGluVmVydGljZXMuYXBwZW5kKHB0c1sxXSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtRdWFkX1ZlcmI6CisgICAgICAgICAg
ICBpbnRlcnBvbGF0ZVF1YWRyYXRpYygmaW5WZXJ0aWNlcywgcHRzWzBdLCBwdHNbMV0sIHB0c1sy
XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTa1BhdGg6OmtDdWJpY19WZXJi
OgorICAgICAgICAgICAgaW50ZXJwb2xhdGVDdWJpYygmaW5WZXJ0aWNlcywgcHRzWzBdLCBwdHNb
MV0sIHB0c1syXSwgcHRzWzNdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNr
UGF0aDo6a0Nsb3NlX1ZlcmI6CisgICAgICAgICAgICBjb250b3Vycy5hcHBlbmQoaW5WZXJ0aWNl
cy5zaXplKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2tQYXRoOjprRG9u
ZV9WZXJiOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAg
IEFTU0VSVCghIlBhdGggZXh0cmFjdGlvbiBub3QgaW1wbGVtZW50ZWQgb24gdGhpcyBwbGF0Zm9y
bS4iKTsKKyNlbmRpZgorCisgICAgaWYgKGNvbnRvdXJzLnNpemUoKSA9PSAxICYmIExvb3BCbGlu
bk1hdGhVdGlsczo6aXNDb252ZXgoaW5WZXJ0aWNlcy5iZWdpbigpLCBpblZlcnRpY2VzLnNpemUo
KSkpIHsKKyAgICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5iaW5kQnVmZmVy
KEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIG1fcGF0aFZlcnRleEJ1ZmZlcik7Cisg
ICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+YnVmZmVyRGF0YShHcmFwaGlj
c0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCBpblZlcnRpY2VzLnNpemUoKSAqIDIgKiBzaXplb2Yo
ZmxvYXQpLCBpblZlcnRpY2VzLmRhdGEoKSwgR3JhcGhpY3NDb250ZXh0M0Q6OlNUUkVBTV9EUkFX
KTsKKyAgICAgICAgbV9jb250ZXh0LT51c2VGaWxsU29saWRQcm9ncmFtKG1hdHJpeCwgY29sb3Ip
OworICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRyYXdBcnJheXMoR3Jh
cGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFX0ZBTiwgMCwgaW5WZXJ0aWNlcy5zaXplKCkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgT3duQXJyYXlQdHI8ZG91YmxlPiBpblZlcnRpY2Vz
RG91YmxlID0gYWRvcHRBcnJheVB0cihuZXcgZG91YmxlW2luVmVydGljZXMuc2l6ZSgpICogM10p
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5WZXJ0aWNlcy5zaXplKCk7ICsraSkgewor
ICAgICAgICBpblZlcnRpY2VzRG91YmxlW2kgKiAzICAgIF0gPSBpblZlcnRpY2VzW2ldLngoKTsK
KyAgICAgICAgaW5WZXJ0aWNlc0RvdWJsZVtpICogMyArIDFdID0gaW5WZXJ0aWNlc1tpXS55KCk7
CisgICAgICAgIGluVmVydGljZXNEb3VibGVbaSAqIDMgKyAyXSA9IDEuMDsKKyAgICB9CisKKyAg
ICBHTFV0ZXNzZWxhdG9yKiB0ZXNzID0gaW50ZXJuYWxfZ2x1TmV3VGVzcygpOworICAgIGludGVy
bmFsX2dsdVRlc3NQcm9wZXJ0eSh0ZXNzLCBHTFVfVEVTU19XSU5ESU5HX1JVTEUsIEdMVV9URVNT
X1dJTkRJTkdfTk9OWkVSTyk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0NhbGxiYWNrKHRlc3MsIEdM
VV9URVNTX0JFR0lOX0RBVEEsIChURVNTQ0IpICZiZWdpbkRhdGEpOworICAgIGludGVybmFsX2ds
dVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19WRVJURVhfREFUQSwgKFRFU1NDQikgJnZlcnRl
eERhdGEpOworICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0ZXNzLCBHTFVfVEVTU19FTkRf
REFUQSwgKFRFU1NDQikgJmVuZERhdGEpOworICAgIGludGVybmFsX2dsdVRlc3NDYWxsYmFjayh0
ZXNzLCBHTFVfVEVTU19FREdFX0ZMQUdfREFUQSwgKFRFU1NDQikgJmVkZ2VGbGFnRGF0YSk7Cisg
ICAgaW50ZXJuYWxfZ2x1VGVzc0NhbGxiYWNrKHRlc3MsIEdMVV9URVNTX0NPTUJJTkVfREFUQSwg
KFRFU1NDQikgJmNvbWJpbmVEYXRhKTsKKyAgICBXVEY6OlZlY3RvcjxzaG9ydD4gaW5kaWNlczsK
KyAgICBGbG9hdFBvaW50VmVjdG9yIHZlcnRpY2VzOworICAgIHZlcnRpY2VzLnJlc2VydmVJbml0
aWFsQ2FwYWNpdHkoaW5WZXJ0aWNlcy5zaXplKCkpOworICAgIFBvbHlnb25EYXRhIGRhdGEoJnZl
cnRpY2VzLCAmaW5kaWNlcyk7CisgICAgaW50ZXJuYWxfZ2x1VGVzc0JlZ2luUG9seWdvbih0ZXNz
LCAmZGF0YSk7CisgICAgV1RGOjpWZWN0b3I8c2l6ZV90Pjo6Y29uc3RfaXRlcmF0b3IgY29udG91
cjsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb250b3VyID0gY29udG91cnMuYmVnaW4o
KTsgY29udG91ciAhPSBjb250b3Vycy5lbmQoKTsgKytjb250b3VyKSB7CisgICAgICAgIGludGVy
bmFsX2dsdVRlc3NCZWdpbkNvbnRvdXIodGVzcyk7CisgICAgICAgIGZvciAoOyBpIDwgKmNvbnRv
dXI7ICsraSkgeworICAgICAgICAgICAgZG91YmxlKiBpblZlcnRleCA9ICZpblZlcnRpY2VzRG91
YmxlW2kgKiAzXTsKKyAgICAgICAgICAgIHZlcnRpY2VzLmFwcGVuZChGbG9hdFBvaW50KGluVmVy
dGV4WzBdLCBpblZlcnRleFsxXSkpOworICAgICAgICAgICAgaW50ZXJuYWxfZ2x1VGVzc1ZlcnRl
eCh0ZXNzLCBpblZlcnRleCwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oaSkpOworICAgICAgICB9
CisgICAgICAgIGludGVybmFsX2dsdVRlc3NFbmRDb250b3VyKHRlc3MpOworICAgIH0KKyAgICBp
bnRlcm5hbF9nbHVUZXNzRW5kUG9seWdvbih0ZXNzKTsKKyAgICBpbnRlcm5hbF9nbHVEZWxldGVU
ZXNzKHRlc3MpOworCisgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5iaW5kQnVm
ZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIsIG1fcGF0aFZlcnRleEJ1ZmZlcik7
CisgICAgY2hlY2tHTEVycm9yKCJjcmVhdGVWZXJ0ZXhCdWZmZXJGcm9tUGF0aCwgYmluZEJ1ZmZl
ciBBUlJBWV9CVUZGRVIiKTsKKyAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmJ1
ZmZlckRhdGEoR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwgdmVydGljZXMuc2l6ZSgp
ICogMiAqIHNpemVvZihmbG9hdCksIHZlcnRpY2VzLmRhdGEoKSwgR3JhcGhpY3NDb250ZXh0M0Q6
OlNUUkVBTV9EUkFXKTsKKyAgICBjaGVja0dMRXJyb3IoImNyZWF0ZVZlcnRleEJ1ZmZlckZyb21Q
YXRoLCBidWZmZXJEYXRhIEFSUkFZX0JVRkZFUiIpOworCisgICAgbV9jb250ZXh0LT5ncmFwaGlj
c0NvbnRleHQzRCgpLT5iaW5kQnVmZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZ
X0JVRkZFUiwgbV9wYXRoSW5kZXhCdWZmZXIpOworICAgIGNoZWNrR0xFcnJvcigiY3JlYXRlVmVy
dGV4QnVmZmVyRnJvbVBhdGgsIGJpbmRCdWZmZXIgRUxFTUVOVF9BUlJBWV9CVUZGRVIiKTsKKyAg
ICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmJ1ZmZlckRhdGEoR3JhcGhpY3NDb250
ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzLnNpemUoKSAqIHNpemVvZihzaG9y
dCksIGluZGljZXMuZGF0YSgpLCBHcmFwaGljc0NvbnRleHQzRDo6U1RSRUFNX0RSQVcpOworICAg
IGNoZWNrR0xFcnJvcigiY3JlYXRlVmVydGV4QnVmZmVyRnJvbVBhdGgsIGJ1ZmZlckRhdGEgRUxF
TUVOVF9BUlJBWV9CVUZGRVIiKTsKKworICAgIG1fY29udGV4dC0+dXNlRmlsbFNvbGlkUHJvZ3Jh
bShtYXRyaXgsIGNvbG9yKTsKKyAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRy
YXdFbGVtZW50cyhHcmFwaGljc0NvbnRleHQzRDo6VFJJQU5HTEVTLCBpbmRpY2VzLnNpemUoKSwg
R3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVEX1NIT1JULCAwKTsKK30KKwordm9pZCBHTEVTMkNh
bnZhczo6ZmlsbFBhdGhJbnRlcm5hbChjb25zdCBQYXRoJiBwYXRoLCBjb25zdCBDb2xvciYgY29s
b3IpCit7CisgICAgaWYgKFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOjp1c2VMb29wQmxpbm5Gb3JQ
YXRoUmVuZGVyaW5nKCkpIHsKKyAgICAgICAgbV9wYXRoQ2FjaGUuY2xlYXIoKTsKKyAgICAgICAg
TG9vcEJsaW5uUGF0aFByb2Nlc3NvciBwcm9jZXNzb3I7CisgICAgICAgIHByb2Nlc3Nvci5wcm9j
ZXNzKHBhdGgsIG1fcGF0aENhY2hlKTsKKyAgICAgICAgaWYgKCFtX3BhdGhWZXJ0ZXhCdWZmZXIp
CisgICAgICAgICAgICBtX3BhdGhWZXJ0ZXhCdWZmZXIgPSBtX2NvbnRleHQtPmNyZWF0ZUJ1ZmZl
cigpOworICAgICAgICBtX2NvbnRleHQtPmJpbmRCdWZmZXIoR3JhcGhpY3NDb250ZXh0M0Q6OkFS
UkFZX0JVRkZFUiwgbV9wYXRoVmVydGV4QnVmZmVyKTsKKyAgICAgICAgaW50IGJ5dGVTaXplT2ZW
ZXJ0aWNlcyA9IDIgKiBtX3BhdGhDYWNoZS5udW1iZXJPZlZlcnRpY2VzKCkgKiBzaXplb2YoZmxv
YXQpOworICAgICAgICBpbnQgYnl0ZVNpemVPZlRleENvb3JkcyA9IDMgKiBtX3BhdGhDYWNoZS5u
dW1iZXJPZlZlcnRpY2VzKCkgKiBzaXplb2YoZmxvYXQpOworICAgICAgICBpbnQgYnl0ZVNpemVP
ZkludGVyaW9yVmVydGljZXMgPSAyICogbV9wYXRoQ2FjaGUubnVtYmVyT2ZJbnRlcmlvclZlcnRp
Y2VzKCkgKiBzaXplb2YoZmxvYXQpOworICAgICAgICBtX2NvbnRleHQtPmJ1ZmZlckRhdGEoR3Jh
cGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGJ5dGVTaXplT2ZWZXJ0aWNlcyArIGJ5dGVTaXplT2ZUZXhDb29yZHMgKyBieXRlU2l6ZU9m
SW50ZXJpb3JWZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNz
Q29udGV4dDNEOjpTVEFUSUNfRFJBVyk7CisgICAgICAgIG1fY29udGV4dC0+YnVmZmVyU3ViRGF0
YShHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCAwLCBieXRlU2l6ZU9mVmVydGljZXMs
IG1fcGF0aENhY2hlLnZlcnRpY2VzKCkpOworICAgICAgICBtX2NvbnRleHQtPmJ1ZmZlclN1YkRh
dGEoR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUiwgYnl0ZVNpemVPZlZlcnRpY2VzLCBi
eXRlU2l6ZU9mVGV4Q29vcmRzLCBtX3BhdGhDYWNoZS50ZXhjb29yZHMoKSk7CisgICAgICAgIG1f
Y29udGV4dC0+YnVmZmVyU3ViRGF0YShHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSLCBi
eXRlU2l6ZU9mVmVydGljZXMgKyBieXRlU2l6ZU9mVGV4Q29vcmRzLCBieXRlU2l6ZU9mSW50ZXJp
b3JWZXJ0aWNlcywgbV9wYXRoQ2FjaGUuaW50ZXJpb3JWZXJ0aWNlcygpKTsKKworICAgICAgICBB
ZmZpbmVUcmFuc2Zvcm0gbWF0cml4KG1fZmxpcE1hdHJpeCk7CisgICAgICAgIG1hdHJpeCAqPSBt
X3N0YXRlLT5tX2N0bTsKKworICAgICAgICAvLyBEcmF3IHRoZSBleHRlcmlvcgorICAgICAgICBt
X2NvbnRleHQtPnVzZUxvb3BCbGlubkV4dGVyaW9yUHJvZ3JhbSgwLCBieXRlU2l6ZU9mVmVydGlj
ZXMsIG1hdHJpeCwgY29sb3IpOworICAgICAgICBtX2NvbnRleHQtPmRyYXdBcnJheXMoR3JhcGhp
Y3NDb250ZXh0M0Q6OlRSSUFOR0xFUywgMCwgbV9wYXRoQ2FjaGUubnVtYmVyT2ZWZXJ0aWNlcygp
KTsKKworICAgICAgICAvLyBEcmF3IHRoZSBpbnRlcmlvcgorICAgICAgICBtX2NvbnRleHQtPnVz
ZUxvb3BCbGlubkludGVyaW9yUHJvZ3JhbShieXRlU2l6ZU9mVmVydGljZXMgKyBieXRlU2l6ZU9m
VGV4Q29vcmRzLCBtYXRyaXgsIGNvbG9yKTsKKyAgICAgICAgbV9jb250ZXh0LT5kcmF3QXJyYXlz
KEdyYXBoaWNzQ29udGV4dDNEOjpUUklBTkdMRVMsIDAsIG1fcGF0aENhY2hlLm51bWJlck9mSW50
ZXJpb3JWZXJ0aWNlcygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXNzZWxhdGVBbmRGaWxs
UGF0aChwYXRoLCBjb2xvcik7CisgICAgfQorfQorCitGbG9hdFJlY3QgR0xFUzJDYW52YXM6OmZs
aXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBGbG9hdFJlY3QgZmxpcHBlZFJl
Y3QocmVjdCk7CisgICAgZmxpcHBlZFJlY3Quc2V0WShtX3NpemUuaGVpZ2h0KCkgLSByZWN0Lnko
KSk7CisgICAgZmxpcHBlZFJlY3Quc2V0SGVpZ2h0KC1yZWN0LmhlaWdodCgpKTsKKyAgICByZXR1
cm4gZmxpcHBlZFJlY3Q7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmNsZWFyQm9yZGVycyhjb25z
dCBGbG9hdFJlY3QmIHJlY3QsIGludCB3aWR0aCkKK3sKKyAgICBzY2lzc29yQ2xlYXIocmVjdC54
KCksIHJlY3QueSgpIC0gd2lkdGgsIHJlY3Qud2lkdGgoKSArIHdpZHRoLCB3aWR0aCk7CisgICAg
c2Npc3NvckNsZWFyKHJlY3QubWF4WCgpLCByZWN0LnkoKSwgd2lkdGgsIHJlY3QuaGVpZ2h0KCkg
KyB3aWR0aCk7CisgICAgc2Npc3NvckNsZWFyKHJlY3QueCgpIC0gd2lkdGgsIHJlY3QubWF4WSgp
LCByZWN0LndpZHRoKCkgKyB3aWR0aCwgd2lkdGgpOworICAgIHNjaXNzb3JDbGVhcihyZWN0Lngo
KSAtIHdpZHRoLCByZWN0LnkoKSAtIHdpZHRoLCB3aWR0aCwgcmVjdC5oZWlnaHQoKSArIHdpZHRo
KTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6YmVnaW5TaGFkb3dEcmF3KCkKK3sKKyAgICBmbG9h
dCBvZmZzZXRYID0gbV9zdGF0ZS0+bV9zaGFkb3dPZmZzZXQud2lkdGgoKTsKKyAgICBmbG9hdCBv
ZmZzZXRZID0gbV9zdGF0ZS0+bV9zaGFkb3dPZmZzZXQuaGVpZ2h0KCk7CisgICAgc2F2ZSgpOwor
ICAgIGlmIChtX3N0YXRlLT5tX3NoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKSB7CisgICAgICAgIEFm
ZmluZVRyYW5zZm9ybSBuZXdDVE07CisgICAgICAgIG5ld0NUTS50cmFuc2xhdGUob2Zmc2V0WCwg
LW9mZnNldFkpOworICAgICAgICBuZXdDVE0gKj0gbV9zdGF0ZS0+bV9jdG07CisgICAgICAgIG1f
c3RhdGUtPm1fY3RtID0gbmV3Q1RNOworICAgIH0gZWxzZQorICAgICAgICBtX3N0YXRlLT5tX2N0
bS50cmFuc2xhdGUob2Zmc2V0WCwgb2Zmc2V0WSk7CisKKyAgICBpZiAobV9zdGF0ZS0+bV9zaGFk
b3dCbHVyID4gMCkgeworICAgICAgICAvLyBEcmF3IGhhcmQgc2hhZG93IHRvIG9mZnNjcmVlbiBi
dWZmZXIgMC4KKyAgICAgICAgRHJhd2luZ0J1ZmZlciogZHN0QnVmZmVyID0gbV9jb250ZXh0LT5n
ZXRPZmZzY3JlZW5CdWZmZXIoMCwgbV9zaXplKTsKKyAgICAgICAgZHN0QnVmZmVyLT5iaW5kKCk7
CisgICAgICAgIG1fY29udGV4dC0+YXBwbHlDb21wb3NpdGVPcGVyYXRvcihDb21wb3NpdGVDb3B5
KTsKKyAgICAgICAgYXBwbHlDbGlwcGluZyhmYWxzZSk7CisgICAgICAgIG1fY29udGV4dC0+Y2xl
YXJDb2xvcihDb2xvcihSR0JBMzIoMCkpKTsKKyAgICAgICAgbV9jb250ZXh0LT5jbGVhcihHcmFw
aGljc0NvbnRleHQzRDo6Q09MT1JfQlVGRkVSX0JJVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAg
YXBwbHlTdGF0ZSgpOworICAgIH0KK30KKwordm9pZCBHTEVTMkNhbnZhczo6ZW5kU2hhZG93RHJh
dyhjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nQm94KQoreworICAgIGlmIChtX3N0YXRlLT5tX3No
YWRvd0JsdXIgPiAwKSB7CisgICAgICAgIC8vIEJ1ZmZlciAwIGNvbnRhaW5zIHRoZSBwcmltaXRp
dmUgZHJhd24gd2l0aCBhIGhhcmQgc2hhZG93LgorICAgICAgICBEcmF3aW5nQnVmZmVyKiBzcmNC
dWZmZXIgPSBtX2NvbnRleHQtPmdldE9mZnNjcmVlbkJ1ZmZlcigwLCBtX3NpemUpOworICAgICAg
ICBEcmF3aW5nQnVmZmVyKiBkc3RCdWZmZXIgPSBtX2NvbnRleHQtPmdldE9mZnNjcmVlbkJ1ZmZl
cigxLCBtX3NpemUpOworCisgICAgICAgIGZsb2F0IHNpZ21hID0gbV9zdGF0ZS0+bV9zaGFkb3dC
bHVyICogMC4zMzMzMzNmOworICAgICAgICBGbG9hdFJlY3Qgc2hhZG93Qm91bmRpbmdCb3gobV9z
dGF0ZS0+bV9jdG0ubWFwUmVjdChib3VuZGluZ0JveCkpOworICAgICAgICBGbG9hdFJlY3QgcmVj
dChGbG9hdFBvaW50KDAsIDApLCBtX3NpemUpOworICAgICAgICBGbG9hdFJlY3Qgc3JjUmVjdChz
aGFkb3dCb3VuZGluZ0JveCk7CisKKyAgICAgICAgaW50IHNjYWxlRmFjdG9yID0gMTsKKyAgICAg
ICAgd2hpbGUgKHNpZ21hID4gY01heFNpZ21hKSB7CisgICAgICAgICAgICBzcmNSZWN0LnNjYWxl
KDAuNWYpOworICAgICAgICAgICAgc2NhbGVGYWN0b3IgKj0gMjsKKyAgICAgICAgICAgIHNpZ21h
ICo9IDAuNWY7CisgICAgICAgIH0KKyAgICAgICAgc3JjUmVjdCA9IGVuY2xvc2luZ0ludFJlY3Qo
c3JjUmVjdCk7CisgICAgICAgIHNyY1JlY3Quc2NhbGUoc2NhbGVGYWN0b3IpOworICAgICAgICBm
b3IgKGludCBpID0gMTsgaSA8IHNjYWxlRmFjdG9yOyBpICo9IDIpIHsKKyAgICAgICAgICAgIGRz
dEJ1ZmZlci0+YmluZCgpOworICAgICAgICAgICAgbV9jb250ZXh0LT5iaW5kVGV4dHVyZShHcmFw
aGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgc3JjQnVmZmVyLT5jb2xvckJ1ZmZlcigpKTsKKyAg
ICAgICAgICAgIG1fY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVY
VFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfV1JBUF9TLCBHcmFwaGljc0NvbnRl
eHQzRDo6Q0xBTVBfVE9fRURHRSk7CisgICAgICAgICAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRl
cmkoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhU
VVJFX1dSQVBfVCwgR3JhcGhpY3NDb250ZXh0M0Q6OkNMQU1QX1RPX0VER0UpOworICAgICAgICAg
ICAgbV9jb250ZXh0LT50ZXhQYXJhbWV0ZXJpKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJE
LCBHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV9NSU5fRklMVEVSLCBHcmFwaGljc0NvbnRleHQz
RDo6TElORUFSKTsKKyAgICAgICAgICAgIG1fY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGlj
c0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfTUFHX0ZJ
TFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTkVBUik7CisgICAgICAgICAgICBGbG9hdFJlY3Qg
ZHN0UmVjdChzcmNSZWN0KTsKKyAgICAgICAgICAgIGRzdFJlY3Quc2NhbGUoMC41Zik7CisgICAg
ICAgICAgICAvLyBDbGVhciBvdXQgMSBwaXhlbCBib3JkZXIgZm9yIGxpbmVhciBmaWx0ZXJpbmcu
CisgICAgICAgICAgICBjbGVhckJvcmRlcnMoZHN0UmVjdCwgMSk7CisgICAgICAgICAgICBkcmF3
VGV4dHVyZWRRdWFkKHNyY0J1ZmZlci0+c2l6ZSgpLCBmbGlwUmVjdChzcmNSZWN0KSwgZHN0UmVj
dCwgQWZmaW5lVHJhbnNmb3JtKCksIDEuMCk7CisgICAgICAgICAgICBzcmNSZWN0ID0gZHN0UmVj
dDsKKyAgICAgICAgICAgIHN0ZDo6c3dhcChzcmNCdWZmZXIsIGRzdEJ1ZmZlcik7CisgICAgICAg
IH0KKworICAgICAgICBpbnQgaGFsZldpZHRoID0gc3RhdGljX2Nhc3Q8aW50PihzaWdtYSAqIDMu
MGYpOworICAgICAgICBpbnQga2VybmVsV2lkdGggPSBoYWxmV2lkdGggKiAyICsgMTsKKyAgICAg
ICAgT3duQXJyYXlQdHI8ZmxvYXQ+IGtlcm5lbCA9IGFkb3B0QXJyYXlQdHIobmV3IGZsb2F0W2tl
cm5lbFdpZHRoXSk7CisgICAgICAgIGJ1aWxkS2VybmVsKHNpZ21hLCBrZXJuZWwuZ2V0KCksIGtl
cm5lbFdpZHRoKTsKKworICAgICAgICBpZiAoc2NhbGVGYWN0b3IgPiAxKSB7CisgICAgICAgICAg
ICBzY2lzc29yQ2xlYXIoc3JjUmVjdC5tYXhYKCksIHNyY1JlY3QueSgpLCBrZXJuZWxXaWR0aCwg
c3JjUmVjdC5oZWlnaHQoKSk7CisgICAgICAgICAgICBzY2lzc29yQ2xlYXIoc3JjUmVjdC54KCkg
LSBrZXJuZWxXaWR0aCwgc3JjUmVjdC55KCksIGtlcm5lbFdpZHRoLCBzcmNSZWN0LmhlaWdodCgp
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJsdXIgaW4gWCBvZmZzY3JlZW4uCisgICAgICAg
IGRzdEJ1ZmZlci0+YmluZCgpOworICAgICAgICBzcmNSZWN0LmluZmxhdGVYKGhhbGZXaWR0aCk7
CisgICAgICAgIHNyY1JlY3QuaW50ZXJzZWN0KHJlY3QpOworICAgICAgICBmbG9hdCBpbWFnZUlu
Y3JlbWVudFhbMl0gPSB7MS4wZiAvIHNyY0J1ZmZlci0+c2l6ZSgpLndpZHRoKCksIDAuMGZ9Owor
ICAgICAgICBjb252b2x2ZVJlY3Qoc3JjQnVmZmVyLT5jb2xvckJ1ZmZlcigpLCBzcmNCdWZmZXIt
PnNpemUoKSwgZmxpcFJlY3Qoc3JjUmVjdCksIHNyY1JlY3QsIGltYWdlSW5jcmVtZW50WCwga2Vy
bmVsLmdldCgpLCBrZXJuZWxXaWR0aCk7CisKKyAgICAgICAgaWYgKHNjYWxlRmFjdG9yID4gMSkg
eworICAgICAgICAgICAgc2Npc3NvckNsZWFyKHNyY1JlY3QueCgpLCBzcmNSZWN0Lm1heFkoKSwg
c3JjUmVjdC53aWR0aCgpLCBrZXJuZWxXaWR0aCk7CisgICAgICAgICAgICBzY2lzc29yQ2xlYXIo
c3JjUmVjdC54KCksIHNyY1JlY3QueSgpIC0ga2VybmVsV2lkdGgsIHNyY1JlY3Qud2lkdGgoKSwg
a2VybmVsV2lkdGgpOworICAgICAgICB9CisgICAgICAgIHNyY1JlY3QuaW5mbGF0ZVkoaGFsZldp
ZHRoKTsKKyAgICAgICAgc3JjUmVjdC5pbnRlcnNlY3QocmVjdCk7CisgICAgICAgIHN0ZDo6c3dh
cChzcmNCdWZmZXIsIGRzdEJ1ZmZlcik7CisKKyAgICAgICAgZmxvYXQgaW1hZ2VJbmNyZW1lbnRZ
WzJdID0gezAuMGYsIDEuMGYgLyBzcmNCdWZmZXItPnNpemUoKS5oZWlnaHQoKX07CisgICAgICAg
IGlmIChzY2FsZUZhY3RvciA+IDEpIHsKKyAgICAgICAgICAgIC8vIEJsdXIgaW4gWSBvZmZzY3Jl
ZW4uCisgICAgICAgICAgICBkc3RCdWZmZXItPmJpbmQoKTsKKyAgICAgICAgICAgIGNvbnZvbHZl
UmVjdChzcmNCdWZmZXItPmNvbG9yQnVmZmVyKCksIHNyY0J1ZmZlci0+c2l6ZSgpLCBmbGlwUmVj
dChzcmNSZWN0KSwgc3JjUmVjdCwgaW1hZ2VJbmNyZW1lbnRZLCBrZXJuZWwuZ2V0KCksIGtlcm5l
bFdpZHRoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIG91dCAyIHBpeGVsIGJvcmRlciBmb3IgYmlj
dWJpYyBmaWx0ZXJpbmcuCisgICAgICAgICAgICBjbGVhckJvcmRlcnMoc3JjUmVjdCwgMik7Cisg
ICAgICAgICAgICBzdGQ6OnN3YXAoc3JjQnVmZmVyLCBkc3RCdWZmZXIpOworCisgICAgICAgICAg
ICAvLyBVcHNhbXBsZSBzcmNCdWZmZXIgLT4gbWFpbiBmcmFtZWJ1ZmZlciB1c2luZyBiaWN1Ymlj
IGZpbHRlcmluZy4KKyAgICAgICAgICAgIGFwcGx5U3RhdGUoKTsKKyAgICAgICAgICAgIG1fY29u
dGV4dC0+YmluZFRleHR1cmUoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIHNyY0J1ZmZl
ci0+Y29sb3JCdWZmZXIoKSk7CisgICAgICAgICAgICBGbG9hdFJlY3QgZHN0UmVjdCA9IHNyY1Jl
Y3Q7CisgICAgICAgICAgICBkc3RSZWN0LnNjYWxlKHNjYWxlRmFjdG9yKTsKKyAgICAgICAgICAg
IGRyYXdUZXh0dXJlZFF1YWRNaXRjaGVsbChzcmNCdWZmZXItPnNpemUoKSwgZmxpcFJlY3Qoc3Jj
UmVjdCksIGRzdFJlY3QsIEFmZmluZVRyYW5zZm9ybSgpLCAxLjApOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgLy8gQmx1ciBpbiBZIGRpcmVjdGx5IHRvIGZyYW1lYnVmZmVyLgorICAg
ICAgICAgICAgYXBwbHlTdGF0ZSgpOworICAgICAgICAgICAgY29udm9sdmVSZWN0KHNyY0J1ZmZl
ci0+Y29sb3JCdWZmZXIoKSwgc3JjQnVmZmVyLT5zaXplKCksIGZsaXBSZWN0KHNyY1JlY3QpLCBz
cmNSZWN0LCBpbWFnZUluY3JlbWVudFksIGtlcm5lbC5nZXQoKSwga2VybmVsV2lkdGgpOworICAg
ICAgICB9CisgICAgfQorICAgIHJlc3RvcmUoKTsKK30KKwordm9pZCBHTEVTMkNhbnZhczo6YmVn
aW5TdGVuY2lsRHJhdyh1bnNpZ25lZCBvcCkKK3sKKyAgICAvLyBUdXJuIG9uIHN0ZW5jaWwgdGVz
dC4KKyAgICBtX2NvbnRleHQtPmVuYWJsZVN0ZW5jaWwodHJ1ZSk7CisgICAgY2hlY2tHTEVycm9y
KCJlbmFibGUgU1RFTkNJTF9URVNUIik7CisKKyAgICAvLyBTdGVuY2lsIHRlc3QgbmV2ZXIgcGFz
c2VzLCBzbyBjb2xvcmJ1ZmZlciBpcyBub3QgZHJhd24uCisgICAgbV9jb250ZXh0LT5ncmFwaGlj
c0NvbnRleHQzRCgpLT5zdGVuY2lsRnVuYyhHcmFwaGljc0NvbnRleHQzRDo6TkVWRVIsIDEsIDEp
OworICAgIGNoZWNrR0xFcnJvcigic3RlbmNpbEZ1bmMiKTsKKworICAgIC8vIEFsbCB3cml0ZXMg
aW5jcmVtZW1lbnQgdGhlIHN0ZW5jaWwgYnVmZmVyLgorICAgIG1fY29udGV4dC0+Z3JhcGhpY3ND
b250ZXh0M0QoKS0+c3RlbmNpbE9wKG9wLCBvcCwgb3ApOworICAgIGNoZWNrR0xFcnJvcigic3Rl
bmNpbE9wIik7Cit9CisKK3ZvaWQgR0xFUzJDYW52YXM6OmFwcGx5Q2xpcHBpbmcoYm9vbCBlbmFi
bGUpCit7CisgICAgbV9jb250ZXh0LT5lbmFibGVTdGVuY2lsKGVuYWJsZSk7CisgICAgaWYgKGVu
YWJsZSkgeworICAgICAgICAvLyBFbmFibGUgZHJhd2luZyBvbmx5IHdoZXJlIHN0ZW5jaWwgaXMg
bm9uLXplcm8uCisgICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+c3RlbmNp
bEZ1bmMoR3JhcGhpY3NDb250ZXh0M0Q6OkVRVUFMLCBtX3N0YXRlLT5tX251bUNsaXBwaW5nUGF0
aHMsIC0xKTsKKyAgICAgICAgY2hlY2tHTEVycm9yKCJzdGVuY2lsRnVuYyIpOworICAgICAgICAv
LyBLZWVwIGFsbCBzdGVuY2lsIHZhbHVlcyB0aGUgc2FtZS4KKyAgICAgICAgbV9jb250ZXh0LT5n
cmFwaGljc0NvbnRleHQzRCgpLT5zdGVuY2lsT3AoR3JhcGhpY3NDb250ZXh0M0Q6OktFRVAsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNz
Q29udGV4dDNEOjpLRUVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBHcmFwaGljc0NvbnRleHQzRDo6S0VFUCk7CisgICAgICAgIGNoZWNrR0xFcnJv
cigic3RlbmNpbE9wIik7CisgICAgfQorfQorCit2b2lkIEdMRVMyQ2FudmFzOjpjaGVja0dMRXJy
b3IoY29uc3QgY2hhciogaGVhZGVyKQoreworI2lmbmRlZiBOREVCVUcKKyAgICB1bnNpZ25lZCBl
cnI7CisgICAgd2hpbGUgKChlcnIgPSBtX2NvbnRleHQtPmdldEVycm9yKCkpICE9IEdyYXBoaWNz
Q29udGV4dDNEOjpOT19FUlJPUikgeworICAgICAgICBjb25zdCBjaGFyKiBlcnJvclN0ciA9ICIq
KiogVU5LTk9XTiBFUlJPUiAqKioiOworICAgICAgICBzd2l0Y2ggKGVycikgeworICAgICAgICBj
YXNlIEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0VOVU06CisgICAgICAgICAgICBlcnJvclN0
ciA9ICJHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9FTlVNIjsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX1ZBTFVFOgorICAgICAg
ICAgICAgZXJyb3JTdHIgPSAiR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfVkFMVUUiOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURf
T1BFUkFUSU9OOgorICAgICAgICAgICAgZXJyb3JTdHIgPSAiR3JhcGhpY3NDb250ZXh0M0Q6OklO
VkFMSURfT1BFUkFUSU9OIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEdyYXBo
aWNzQ29udGV4dDNEOjpJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjoKKyAgICAgICAgICAg
IGVycm9yU3RyID0gIkdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJB
VElPTiI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQz
RDo6T1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIGVycm9yU3RyID0gIkdyYXBoaWNzQ29udGV4
dDNEOjpPVVRfT0ZfTUVNT1JZIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAg
ICAgIGlmIChoZWFkZXIpCisgICAgICAgICAgICBMT0dfRVJST1IoIiVzOiAgJXMiLCBoZWFkZXIs
IGVycm9yU3RyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTE9HX0VSUk9SKCIlcyIsIGVy
cm9yU3RyKTsKKyAgICB9CisjZW5kaWYKK30KKworfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvZ3B1L0dyYXBoaWNzQ29udGV4dEdQVS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0dyYXBoaWNzQ29udGV4dEdQVS5j
cHAJKHJldmlzaW9uIDg0MjkxKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3B1L0dyYXBoaWNzQ29udGV4dEdQVS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcg
QEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaW5jbHVkZSAiR0xFUzJDYW52YXMuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHRHUFUuaCIKIAogI2luY2x1ZGUgIkRyYXdpbmdCdWZmZXIu
aCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKQEAgLTczLDcgKzczLDcgQEAgc3RydWN0IFBhdGhB
bmRUcmFuc2Zvcm0gewogICAgIEFmZmluZVRyYW5zZm9ybSB0cmFuc2Zvcm07CiB9OwogCi1zdHJ1
Y3QgR0xFUzJDYW52YXM6OlN0YXRlIHsKK3N0cnVjdCBHcmFwaGljc0NvbnRleHRHUFU6OlN0YXRl
IHsKICAgICBTdGF0ZSgpCiAgICAgICAgIDogbV9maWxsQ29sb3IoMCwgMCwgMCwgMjU1KQogICAg
ICAgICAsIG1fc2hhZG93Q29sb3IoMCwgMCwgMCwgMCkKQEAgLTE5NCw3ICsxOTQsNyBAQCBjbGFz
cyBDdWJpYyB7CiAgICAgRmxvYXRQb2ludCBtX2EsIG1fYiwgbV9jLCBtX2Q7CiB9OwogCi1HTEVT
MkNhbnZhczo6R0xFUzJDYW52YXMoU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQsIERy
YXdpbmdCdWZmZXIqIGRyYXdpbmdCdWZmZXIsIGNvbnN0IEludFNpemUmIHNpemUpCitHcmFwaGlj
c0NvbnRleHRHUFU6OkdyYXBoaWNzQ29udGV4dEdQVShTaGFyZWRHcmFwaGljc0NvbnRleHQzRCog
Y29udGV4dCwgRHJhd2luZ0J1ZmZlciogZHJhd2luZ0J1ZmZlciwgY29uc3QgSW50U2l6ZSYgc2l6
ZSkKICAgICA6IG1fc2l6ZShzaXplKQogICAgICwgbV9jb250ZXh0KGNvbnRleHQpCiAgICAgLCBt
X2RyYXdpbmdCdWZmZXIoZHJhd2luZ0J1ZmZlcikKQEAgLTIwOSw3ICsyMDksNyBAQCBHTEVTMkNh
bnZhczo6R0xFUzJDYW52YXMoU2hhcmVkR3JhcGhpY3NDCiAgICAgbV9zdGF0ZSA9ICZtX3N0YXRl
U3RhY2subGFzdCgpOwogfQogCi1HTEVTMkNhbnZhczo6fkdMRVMyQ2FudmFzKCkKK0dyYXBoaWNz
Q29udGV4dEdQVTo6fkdyYXBoaWNzQ29udGV4dEdQVSgpCiB7CiAgICAgaWYgKG1fcGF0aEluZGV4
QnVmZmVyKQogICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRlbGV0ZUJ1
ZmZlcihtX3BhdGhJbmRleEJ1ZmZlcik7CkBAIC0yMTcsMTIgKzIxNywxMiBAQCBHTEVTMkNhbnZh
czo6fkdMRVMyQ2FudmFzKCkKICAgICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgp
LT5kZWxldGVCdWZmZXIobV9wYXRoVmVydGV4QnVmZmVyKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZh
czo6YmluZEZyYW1lYnVmZmVyKCkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpiaW5kRnJhbWVi
dWZmZXIoKQogewogICAgIG1fZHJhd2luZ0J1ZmZlci0+YmluZCgpOwogfQogCi12b2lkIEdMRVMy
Q2FudmFzOjpjbGVhclJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQordm9pZCBHcmFwaGljc0Nv
bnRleHRHUFU6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCiB7CiAgICAgYmluZEZy
YW1lYnVmZmVyKCk7CiAgICAgaWYgKG1fc3RhdGUtPm1fY3RtLmlzSWRlbnRpdHkoKSAmJiAhbV9z
dGF0ZS0+Y2xpcHBpbmdFbmFibGVkKCkpIHsKQEAgLTIzNSwxNCArMjM1LDE0IEBAIHZvaWQgR0xF
UzJDYW52YXM6OmNsZWFyUmVjdChjb25zdCBGbG9hdFIKICAgICB9CiB9CiAKLXZvaWQgR0xFUzJD
YW52YXM6OmFwcGx5U3RhdGUoKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OmFwcGx5U3RhdGUo
KQogewogICAgIGJpbmRGcmFtZWJ1ZmZlcigpOwogICAgIG1fY29udGV4dC0+YXBwbHlDb21wb3Np
dGVPcGVyYXRvcihtX3N0YXRlLT5tX2NvbXBvc2l0ZU9wKTsKICAgICBhcHBseUNsaXBwaW5nKG1f
c3RhdGUtPmNsaXBwaW5nRW5hYmxlZCgpKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2Npc3Nv
ckNsZWFyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpCit2b2lk
IEdyYXBoaWNzQ29udGV4dEdQVTo6c2Npc3NvckNsZWFyKGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0
IHdpZHRoLCBmbG9hdCBoZWlnaHQpCiB7CiAgICAgaW50IGludFggPSBzdGF0aWNfY2FzdDxpbnQ+
KHggKyAwLjVmKTsKICAgICBpbnQgaW50WSA9IHN0YXRpY19jYXN0PGludD4oeSArIDAuNWYpOwpA
QCAtMjU1LDcgKzI1NSw3IEBAIHZvaWQgR0xFUzJDYW52YXM6OnNjaXNzb3JDbGVhcihmbG9hdCB4
LCAKICAgICBtX2NvbnRleHQtPmRpc2FibGUoR3JhcGhpY3NDb250ZXh0M0Q6OlNDSVNTT1JfVEVT
VCk7CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OmZpbGxQYXRoKGNvbnN0IFBhdGgmIHBhdGgpCit2
b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6ZmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCkKIHsKICAg
ICBpZiAobV9zdGF0ZS0+c2hhZG93QWN0aXZlKCkpIHsKICAgICAgICAgYmVnaW5TaGFkb3dEcmF3
KCk7CkBAIC0yNjcsNyArMjY3LDcgQEAgdm9pZCBHTEVTMkNhbnZhczo6ZmlsbFBhdGgoY29uc3Qg
UGF0aCYgcAogICAgIGZpbGxQYXRoSW50ZXJuYWwocGF0aCwgbV9zdGF0ZS0+YXBwbHlBbHBoYSht
X3N0YXRlLT5tX2ZpbGxDb2xvcikpOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdChj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvciwgQ29sb3JTcGFjZSBjb2xv
clNwYWNlKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCiB7CiAg
ICAgaWYgKG1fc3RhdGUtPnNoYWRvd0FjdGl2ZSgpKSB7CiAgICAgICAgIGJlZ2luU2hhZG93RHJh
dygpOwpAQCAtMjc5LDEyICsyNzksMTIgQEAgdm9pZCBHTEVTMkNhbnZhczo6ZmlsbFJlY3QoY29u
c3QgRmxvYXRSZQogICAgIGZpbGxSZWN0SW50ZXJuYWwocmVjdCwgY29sb3IpOwogfQogCi12b2lk
IEdMRVMyQ2FudmFzOjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit2b2lkIEdyYXBo
aWNzQ29udGV4dEdQVTo6ZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KQogewogICAgIGZp
bGxSZWN0KHJlY3QsIG1fc3RhdGUtPmFwcGx5QWxwaGEobV9zdGF0ZS0+bV9maWxsQ29sb3IpLCBD
b2xvclNwYWNlRGV2aWNlUkdCKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6ZmlsbFJlY3RJbnRl
cm5hbChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENvbG9yJiBjb2xvcikKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0R1BVOjpmaWxsUmVjdEludGVybmFsKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwg
Y29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIEFmZmluZVRyYW5zZm9ybSBtYXRyaXgobV9mbGlw
TWF0cml4KTsKICAgICBtYXRyaXggKj0gbV9zdGF0ZS0+bV9jdG07CkBAIC0yOTYsNjIgKzI5Niw2
MiBAQCB2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUmVjdEludGVybmFsKGNvbnN0CiAgICAgbV9jb250
ZXh0LT5kcmF3QXJyYXlzKEdyYXBoaWNzQ29udGV4dDNEOjpUUklBTkdMRV9TVFJJUCwgMCwgNCk7
CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OnNldEZpbGxDb2xvcihjb25zdCBDb2xvciYgY29sb3Is
IENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpzZXRGaWxs
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCiB7CiAgICAg
bV9zdGF0ZS0+bV9maWxsQ29sb3IgPSBjb2xvcjsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2V0
QWxwaGEoZmxvYXQgYWxwaGEpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6c2V0QWxwaGEoZmxv
YXQgYWxwaGEpCiB7CiAgICAgbV9zdGF0ZS0+bV9hbHBoYSA9IGFscGhhOwogfQogCi12b2lkIEdM
RVMyQ2FudmFzOjpzZXRTaGFkb3dDb2xvcihjb25zdCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2Up
Cit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6c2V0U2hhZG93Q29sb3IoY29uc3QgQ29sb3ImIGNv
bG9yLCBDb2xvclNwYWNlKQogewogICAgIG1fc3RhdGUtPm1fc2hhZG93Q29sb3IgPSBjb2xvcjsK
IH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2V0U2hhZG93T2Zmc2V0KGNvbnN0IEZsb2F0U2l6ZSYg
b2Zmc2V0KQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNldFNoYWRvd09mZnNldChjb25zdCBG
bG9hdFNpemUmIG9mZnNldCkKIHsKICAgICBtX3N0YXRlLT5tX3NoYWRvd09mZnNldCA9IG9mZnNl
dDsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2V0U2hhZG93Qmx1cihmbG9hdCBzaGFkb3dCbHVy
KQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNldFNoYWRvd0JsdXIoZmxvYXQgc2hhZG93Qmx1
cikKIHsKICAgICBtX3N0YXRlLT5tX3NoYWRvd0JsdXIgPSBzaGFkb3dCbHVyOwogfQogCi12b2lk
IEdMRVMyQ2FudmFzOjpzZXRTaGFkb3dzSWdub3JlVHJhbnNmb3Jtcyhib29sIHNoYWRvd3NJZ25v
cmVUcmFuc2Zvcm1zKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNldFNoYWRvd3NJZ25vcmVU
cmFuc2Zvcm1zKGJvb2wgc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpCiB7CiAgICAgbV9zdGF0ZS0+
bV9zaGFkb3dzSWdub3JlVHJhbnNmb3JtcyA9IHNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zOwogfQog
Ci12b2lkIEdMRVMyQ2FudmFzOjp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0R1BVOjp0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSkKIHsKICAgICBtX3N0
YXRlLT5tX2N0bS50cmFuc2xhdGUoeCwgeSk7CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OnJvdGF0
ZShmbG9hdCBhbmdsZUluUmFkaWFucykKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpyb3RhdGUo
ZmxvYXQgYW5nbGVJblJhZGlhbnMpCiB7CiAgICAgbV9zdGF0ZS0+bV9jdG0ucm90YXRlKGFuZ2xl
SW5SYWRpYW5zICogKDE4MC4wZiAvIE1fUEkpKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2Nh
bGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNjYWxl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSkKIHsKICAgICBtX3N0YXRlLT5tX2N0bS5zY2FsZShzaXpl
LndpZHRoKCksIHNpemUuaGVpZ2h0KCkpOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpjb25jYXRD
VE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBhZmZpbmUpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQ
VTo6Y29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgYWZmaW5lKQogewogICAgIG1fc3Rh
dGUtPm1fY3RtICo9IGFmZmluZTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6c2V0Q1RNKGNvbnN0
IEFmZmluZVRyYW5zZm9ybSYgYWZmaW5lKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNldENU
TShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGFmZmluZSkKIHsKICAgICBtX3N0YXRlLT5tX2N0bSA9
IGFmZmluZTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6Y2xpcFBhdGgoY29uc3QgUGF0aCYgcGF0
aCkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpjbGlwUGF0aChjb25zdCBQYXRoJiBwYXRoKQog
ewogICAgIGJpbmRGcmFtZWJ1ZmZlcigpOwogICAgIGNoZWNrR0xFcnJvcigiYmluZEZyYW1lYnVm
ZmVyIik7CkBAIC0zNjMsMTggKzM2MywxOCBAQCB2b2lkIEdMRVMyQ2FudmFzOjpjbGlwUGF0aChj
b25zdCBQYXRoJiBwCiAgICAgbV9zdGF0ZS0+bV9udW1DbGlwcGluZ1BhdGhzKys7CiB9CiAKLXZv
aWQgR0xFUzJDYW52YXM6OmNsaXBPdXQoY29uc3QgUGF0aCYgcGF0aCkKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0R1BVOjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgpCiB7Ci0gICAgQVNTRVJUKCEiY2xp
cE91dCBpcyB1bnN1cHBvcnRlZCBpbiBHTEVTMkNhbnZhcy5cbiIpOworICAgIEFTU0VSVCghImNs
aXBPdXQgaXMgdW5zdXBwb3J0ZWQgaW4gR3JhcGhpY3NDb250ZXh0R1BVLlxuIik7CiB9CiAKLXZv
aWQgR0xFUzJDYW52YXM6OnNhdmUoKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OnNhdmUoKQog
ewogICAgIG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUobV9zdGF0ZVN0YWNrLmxhc3QoKSkpOwog
ICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZh
czo6cmVzdG9yZSgpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6cmVzdG9yZSgpCiB7CiAgICAg
QVNTRVJUKCFtX3N0YXRlU3RhY2suaXNFbXB0eSgpKTsKICAgICBjb25zdCBWZWN0b3I8UGF0aEFu
ZFRyYW5zZm9ybT4mIGNsaXBwaW5nUGF0aHMgPSBtX3N0YXRlLT5tX2NsaXBwaW5nUGF0aHM7CkBA
IC0zOTIsNyArMzkyLDcgQEAgdm9pZCBHTEVTMkNhbnZhczo6cmVzdG9yZSgpCiAgICAgbV9zdGF0
ZSA9ICZtX3N0YXRlU3RhY2subGFzdCgpOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4
dHVyZWRSZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVTaXplLCBj
b25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgQ29sb3JT
cGFjZSBjb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3NpdGVPcCkKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0R1BVOjpkcmF3VGV4dHVyZWRSZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0
IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRv
ciBjb21wb3NpdGVPcCkKIHsKICAgICBiaW5kRnJhbWVidWZmZXIoKTsKICAgICBtX2NvbnRleHQt
PmFwcGx5Q29tcG9zaXRlT3BlcmF0b3IoY29tcG9zaXRlT3ApOwpAQCAtNDA1LDEzICs0MDUsMTMg
QEAgdm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVjdCh1bnNpZwogICAgIGRyYXdUZXh0
dXJlZFF1YWQodGV4dHVyZVNpemUsIHNyY1JlY3QsIGRzdFJlY3QsIG1fc3RhdGUtPm1fY3RtLCBt
X3N0YXRlLT5tX2FscGhhKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6ZHJhd1RleHR1cmVkUmVj
dChUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0
UmVjdCYgZHN0UmVjdCwgQ29sb3JTcGFjZSBjb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBj
b21wb3NpdGVPcCkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpkcmF3VGV4dHVyZWRSZWN0KFRl
eHR1cmUqIHRleHR1cmUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0
JiBkc3RSZWN0LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIGNvbXBv
c2l0ZU9wKQogewogICAgIGRyYXdUZXh0dXJlZFJlY3QodGV4dHVyZSwgc3JjUmVjdCwgZHN0UmVj
dCwgbV9zdGF0ZS0+bV9jdG0sIG1fc3RhdGUtPm1fYWxwaGEsIGNvbG9yU3BhY2UsIGNvbXBvc2l0
ZU9wLCBtX3N0YXRlLT5jbGlwcGluZ0VuYWJsZWQoKSk7CiB9CiAKIAotdm9pZCBHTEVTMkNhbnZh
czo6ZHJhd1RleHR1cmVkUmVjdChUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBGbG9hdFJlY3QmIHNy
Y1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0
cmFuc2Zvcm0sIGZsb2F0IGFscGhhLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9w
ZXJhdG9yIGNvbXBvc2l0ZU9wLCBib29sIGNsaXApCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6
ZHJhd1RleHR1cmVkUmVjdChUZXh0dXJlKiB0ZXh0dXJlLCBjb25zdCBGbG9hdFJlY3QmIHNyY1Jl
Y3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFu
c2Zvcm0sIGZsb2F0IGFscGhhLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJh
dG9yIGNvbXBvc2l0ZU9wLCBib29sIGNsaXApCiB7CiAgICAgYmluZEZyYW1lYnVmZmVyKCk7CiAg
ICAgbV9jb250ZXh0LT5hcHBseUNvbXBvc2l0ZU9wZXJhdG9yKGNvbXBvc2l0ZU9wKTsKQEAgLTQy
Nyw3ICs0MjcsNyBAQCB2b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRSZWN0KFRleHR1CiAg
ICAgfQogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRSZWN0VGlsZShUZXh0dXJl
KiB0ZXh0dXJlLCBpbnQgdGlsZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9h
dFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9hdCBh
bHBoYSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpkcmF3VGV4dHVyZWRSZWN0VGlsZShUZXh0
dXJlKiB0ZXh0dXJlLCBpbnQgdGlsZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBmbG9h
dCBhbHBoYSkKIHsKICAgICBpZiAoZHN0UmVjdC5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybjsK
QEAgLTQ0NSw3ICs0NDUsNyBAQCB2b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRSZWN0VGls
ZShUCiAgICAgZHJhd1RleHR1cmVkUXVhZCh0aWxlQm91bmRzV2l0aEJvcmRlci5zaXplKCksIHNy
Y1JlY3RDbGlwcGVkSW5UaWxlU3BhY2UsIGRzdFJlY3RJbnRlcnNlY3RlZCwgdHJhbnNmb3JtLCBh
bHBoYSk7CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OmNvbnZvbHZlUmVjdCh1bnNpZ25lZCB0ZXh0
dXJlLCBjb25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0
LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJlY3QsIGZsb2F0IGltYWdlSW5jcmVtZW50WzJdLCBjb25z
dCBmbG9hdCoga2VybmVsLCBpbnQga2VybmVsV2lkdGgpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQ
VTo6Y29udm9sdmVSZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVT
aXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwg
ZmxvYXQgaW1hZ2VJbmNyZW1lbnRbMl0sIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBrZXJuZWxX
aWR0aCkKIHsKICAgICBtX2NvbnRleHQtPmJpbmRUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpU
RVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgICBtX2NvbnRleHQtPnRleFBhcmFtZXRlcmkoR3JhcGhp
Y3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFX1dSQVBf
UywgR3JhcGhpY3NDb250ZXh0M0Q6OkNMQU1QX1RPX0VER0UpOwpAQCAtNDg3LDcgKzQ4Nyw3IEBA
IHN0YXRpYyB2b2lkIGJ1aWxkS2VybmVsKGZsb2F0IHNpZ21hLCBmbG8KICAgICAgICAga2VybmVs
W2ldICo9IHNjYWxlOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpkcmF3VGV4dHVyZWRRdWFkKGNv
bnN0IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0
IEZsb2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm0sIGZs
b2F0IGFscGhhKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OmRyYXdUZXh0dXJlZFF1YWQoY29u
c3QgSW50U2l6ZSYgdGV4dHVyZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3Qg
RmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSwgZmxv
YXQgYWxwaGEpCiB7CiAgICAgQWZmaW5lVHJhbnNmb3JtIG1hdHJpeChtX2ZsaXBNYXRyaXgpOwog
ICAgIG1hdHJpeCAqPSB0cmFuc2Zvcm07CkBAIC01MDUsNyArNTA1LDcgQEAgdm9pZCBHTEVTMkNh
bnZhczo6ZHJhd1RleHR1cmVkUXVhZChjb25zdAogICAgIGNoZWNrR0xFcnJvcigiZ2xEcmF3QXJy
YXlzIik7CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFF1YWRNaXRjaGVsbChj
b25zdCBJbnRTaXplJiB0ZXh0dXJlU2l6ZSwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25z
dCBGbG9hdFJlY3QmIGRzdFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtLCBm
bG9hdCBhbHBoYSkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0R1BVOjpkcmF3VGV4dHVyZWRRdWFkTWl0
Y2hlbGwoY29uc3QgSW50U2l6ZSYgdGV4dHVyZVNpemUsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVj
dCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5z
Zm9ybSwgZmxvYXQgYWxwaGEpCiB7CiAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1pdGNoZWxsQ29l
ZmZpY2llbnRzWzE2XSA9IHsKICAgICAgICAgIDAuMGYgLyAxOC4wZiwgICAxLjBmIC8gMTguMGYs
ICAxNi4wZiAvIDE4LjBmLCAgIDEuMGYgLyAxOC4wZiwKQEAgLTUzNSwxNyArNTM1LDE3IEBAIHZv
aWQgR0xFUzJDYW52YXM6OmRyYXdUZXh0dXJlZFF1YWRNaXRjaGUKICAgICBjaGVja0dMRXJyb3Io
ImdsRHJhd0FycmF5cyIpOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpzZXRDb21wb3NpdGVPcGVy
YXRpb24oQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6c2V0
Q29tcG9zaXRlT3BlcmF0aW9uKENvbXBvc2l0ZU9wZXJhdG9yIG9wKQogewogICAgIG1fc3RhdGUt
Pm1fY29tcG9zaXRlT3AgPSBvcDsKIH0KIAotVGV4dHVyZSogR0xFUzJDYW52YXM6OmNyZWF0ZVRl
eHR1cmUoTmF0aXZlSW1hZ2VQdHIgcHRyLCBUZXh0dXJlOjpGb3JtYXQgZm9ybWF0LCBpbnQgd2lk
dGgsIGludCBoZWlnaHQpCitUZXh0dXJlKiBHcmFwaGljc0NvbnRleHRHUFU6OmNyZWF0ZVRleHR1
cmUoTmF0aXZlSW1hZ2VQdHIgcHRyLCBUZXh0dXJlOjpGb3JtYXQgZm9ybWF0LCBpbnQgd2lkdGgs
IGludCBoZWlnaHQpCiB7CiAgICAgcmV0dXJuIG1fY29udGV4dC0+Y3JlYXRlVGV4dHVyZShwdHIs
IGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CiB9CiAKLVRleHR1cmUqIEdMRVMyQ2FudmFzOjpnZXRU
ZXh0dXJlKE5hdGl2ZUltYWdlUHRyIHB0cikKK1RleHR1cmUqIEdyYXBoaWNzQ29udGV4dEdQVTo6
Z2V0VGV4dHVyZShOYXRpdmVJbWFnZVB0ciBwdHIpCiB7CiAgICAgcmV0dXJuIG1fY29udGV4dC0+
Z2V0VGV4dHVyZShwdHIpOwogfQpAQCAtNjA5LDcgKzYwOSw3IEBAIHN0YXRpYyB2b2lkIGNvbWJp
bmVEYXRhKEdMZG91YmxlIGNvb3Jkc1sKIAogdHlwZWRlZiB2b2lkICgqVEVTU0NCKSgpOwogCi12
b2lkIEdMRVMyQ2FudmFzOjp0ZXNzZWxhdGVBbmRGaWxsUGF0aChjb25zdCBQYXRoJiBwYXRoLCBj
b25zdCBDb2xvciYgY29sb3IpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6dGVzc2VsYXRlQW5k
RmlsbFBhdGgoY29uc3QgUGF0aCYgcGF0aCwgY29uc3QgQ29sb3ImIGNvbG9yKQogewogICAgIGlm
ICghbV9wYXRoVmVydGV4QnVmZmVyKQogICAgICAgICBtX3BhdGhWZXJ0ZXhCdWZmZXIgPSBtX2Nv
bnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmNyZWF0ZUJ1ZmZlcigpOwpAQCAtNzA2LDcgKzcw
Niw3IEBAIHZvaWQgR0xFUzJDYW52YXM6OnRlc3NlbGF0ZUFuZEZpbGxQYXRoKGMKICAgICBtX2Nv
bnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmRyYXdFbGVtZW50cyhHcmFwaGljc0NvbnRleHQz
RDo6VFJJQU5HTEVTLCBpbmRpY2VzLnNpemUoKSwgR3JhcGhpY3NDb250ZXh0M0Q6OlVOU0lHTkVE
X1NIT1JULCAwKTsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6ZmlsbFBhdGhJbnRlcm5hbChjb25z
dCBQYXRoJiBwYXRoLCBjb25zdCBDb2xvciYgY29sb3IpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQ
VTo6ZmlsbFBhdGhJbnRlcm5hbChjb25zdCBQYXRoJiBwYXRoLCBjb25zdCBDb2xvciYgY29sb3Ip
CiB7CiAgICAgaWYgKFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOjp1c2VMb29wQmxpbm5Gb3JQYXRo
UmVuZGVyaW5nKCkpIHsKICAgICAgICAgbV9wYXRoQ2FjaGUuY2xlYXIoKTsKQEAgLTc0MCw3ICs3
NDAsNyBAQCB2b2lkIEdMRVMyQ2FudmFzOjpmaWxsUGF0aEludGVybmFsKGNvbnN0CiAgICAgfQog
fQogCi1GbG9hdFJlY3QgR0xFUzJDYW52YXM6OmZsaXBSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVj
dCkKK0Zsb2F0UmVjdCBHcmFwaGljc0NvbnRleHRHUFU6OmZsaXBSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKIHsKICAgICBGbG9hdFJlY3QgZmxpcHBlZFJlY3QocmVjdCk7CiAgICAgZmxpcHBl
ZFJlY3Quc2V0WShtX3NpemUuaGVpZ2h0KCkgLSByZWN0LnkoKSk7CkBAIC03NDgsNyArNzQ4LDcg
QEAgRmxvYXRSZWN0IEdMRVMyQ2FudmFzOjpmbGlwUmVjdChjb25zdCBGbAogICAgIHJldHVybiBm
bGlwcGVkUmVjdDsKIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6Y2xlYXJCb3JkZXJzKGNvbnN0IEZs
b2F0UmVjdCYgcmVjdCwgaW50IHdpZHRoKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OmNsZWFy
Qm9yZGVycyhjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGludCB3aWR0aCkKIHsKICAgICBzY2lzc29y
Q2xlYXIocmVjdC54KCksIHJlY3QueSgpIC0gd2lkdGgsIHJlY3Qud2lkdGgoKSArIHdpZHRoLCB3
aWR0aCk7CiAgICAgc2Npc3NvckNsZWFyKHJlY3QubWF4WCgpLCByZWN0LnkoKSwgd2lkdGgsIHJl
Y3QuaGVpZ2h0KCkgKyB3aWR0aCk7CkBAIC03NTYsNyArNzU2LDcgQEAgdm9pZCBHTEVTMkNhbnZh
czo6Y2xlYXJCb3JkZXJzKGNvbnN0IEZsbwogICAgIHNjaXNzb3JDbGVhcihyZWN0LngoKSAtIHdp
ZHRoLCByZWN0LnkoKSAtIHdpZHRoLCB3aWR0aCwgcmVjdC5oZWlnaHQoKSArIHdpZHRoKTsKIH0K
IAotdm9pZCBHTEVTMkNhbnZhczo6YmVnaW5TaGFkb3dEcmF3KCkKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0R1BVOjpiZWdpblNoYWRvd0RyYXcoKQogewogICAgIGZsb2F0IG9mZnNldFggPSBtX3N0YXRl
LT5tX3NoYWRvd09mZnNldC53aWR0aCgpOwogICAgIGZsb2F0IG9mZnNldFkgPSBtX3N0YXRlLT5t
X3NoYWRvd09mZnNldC5oZWlnaHQoKTsKQEAgLTc4Miw3ICs3ODIsNyBAQCB2b2lkIEdMRVMyQ2Fu
dmFzOjpiZWdpblNoYWRvd0RyYXcoKQogICAgIH0KIH0KIAotdm9pZCBHTEVTMkNhbnZhczo6ZW5k
U2hhZG93RHJhdyhjb25zdCBGbG9hdFJlY3QmIGJvdW5kaW5nQm94KQordm9pZCBHcmFwaGljc0Nv
bnRleHRHUFU6OmVuZFNoYWRvd0RyYXcoY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ0JveCkKIHsK
ICAgICBpZiAobV9zdGF0ZS0+bV9zaGFkb3dCbHVyID4gMCkgewogICAgICAgICAvLyBCdWZmZXIg
MCBjb250YWlucyB0aGUgcHJpbWl0aXZlIGRyYXduIHdpdGggYSBoYXJkIHNoYWRvdy4KQEAgLTg2
Nyw3ICs4NjcsNyBAQCB2b2lkIEdMRVMyQ2FudmFzOjplbmRTaGFkb3dEcmF3KGNvbnN0IEZsCiAg
ICAgcmVzdG9yZSgpOwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjpiZWdpblN0ZW5jaWxEcmF3KHVu
c2lnbmVkIG9wKQordm9pZCBHcmFwaGljc0NvbnRleHRHUFU6OmJlZ2luU3RlbmNpbERyYXcodW5z
aWduZWQgb3ApCiB7CiAgICAgLy8gVHVybiBvbiBzdGVuY2lsIHRlc3QuCiAgICAgbV9jb250ZXh0
LT5lbmFibGVTdGVuY2lsKHRydWUpOwpAQCAtODgyLDcgKzg4Miw3IEBAIHZvaWQgR0xFUzJDYW52
YXM6OmJlZ2luU3RlbmNpbERyYXcodW5zaWcKICAgICBjaGVja0dMRXJyb3IoInN0ZW5jaWxPcCIp
OwogfQogCi12b2lkIEdMRVMyQ2FudmFzOjphcHBseUNsaXBwaW5nKGJvb2wgZW5hYmxlKQordm9p
ZCBHcmFwaGljc0NvbnRleHRHUFU6OmFwcGx5Q2xpcHBpbmcoYm9vbCBlbmFibGUpCiB7CiAgICAg
bV9jb250ZXh0LT5lbmFibGVTdGVuY2lsKGVuYWJsZSk7CiAgICAgaWYgKGVuYWJsZSkgewpAQCAt
ODk3LDcgKzg5Nyw3IEBAIHZvaWQgR0xFUzJDYW52YXM6OmFwcGx5Q2xpcHBpbmcoYm9vbCBlbmEK
ICAgICB9CiB9CiAKLXZvaWQgR0xFUzJDYW52YXM6OmNoZWNrR0xFcnJvcihjb25zdCBjaGFyKiBo
ZWFkZXIpCit2b2lkIEdyYXBoaWNzQ29udGV4dEdQVTo6Y2hlY2tHTEVycm9yKGNvbnN0IGNoYXIq
IGhlYWRlcikKIHsKICNpZm5kZWYgTkRFQlVHCiAgICAgdW5zaWduZWQgZXJyOwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0dyYXBoaWNzQ29udGV4dEdQVS5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9HcmFwaGlj
c0NvbnRleHRHUFUuaAkocmV2aXNpb24gODQyOTEpCShmcm9tIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dMRVMyQ2FudmFzLmg6ODQyOTEpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ncHUvR3JhcGhpY3NDb250ZXh0R1BVLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBHTEVTMkNhbnZhc19oCisjZGVmaW5lIEdM
RVMyQ2FudmFzX2gKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1ZGUgIkNv
bG9yLmgiCisjaW5jbHVkZSAiQ29sb3JTcGFjZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzVHlwZXMu
aCIKKyNpbmNsdWRlICJJbWFnZVNvdXJjZS5oIgorI2luY2x1ZGUgIkxvb3BCbGlublBhdGhDYWNo
ZS5oIgorI2luY2x1ZGUgIlRleHR1cmUuaCIKKworI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Cisj
aW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvbG9yOworY2xhc3MgRHJhd2luZ0J1ZmZlcjsK
K2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDNEOworY2xhc3MgUGF0aDsK
K2NsYXNzIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOworCitjbGFzcyBHTEVTMkNhbnZhcyB7Cisg
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoR0xFUzJDYW52YXMpOworcHVibGljOgorICAgIEdMRVMy
Q2FudmFzKFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKiwgRHJhd2luZ0J1ZmZlciosIGNvbnN0IElu
dFNpemUmKTsKKyAgICB+R0xFUzJDYW52YXMoKTsKKworICAgIHZvaWQgZmlsbFBhdGgoY29uc3Qg
UGF0aCYpOworICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQ29sb3Im
LCBDb2xvclNwYWNlKTsKKyAgICB2b2lkIGZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAg
IHZvaWQgY2xlYXJSZWN0KGNvbnN0IEZsb2F0UmVjdCYpOworICAgIHZvaWQgc2V0RmlsbENvbG9y
KGNvbnN0IENvbG9yJiwgQ29sb3JTcGFjZSk7CisgICAgdm9pZCBzZXRBbHBoYShmbG9hdCBhbHBo
YSk7CisgICAgdm9pZCBzZXRTaGFkb3dDb2xvcihjb25zdCBDb2xvciYsIENvbG9yU3BhY2UpOwor
ICAgIHZvaWQgc2V0U2hhZG93T2Zmc2V0KGNvbnN0IEZsb2F0U2l6ZSYpOworICAgIHZvaWQgc2V0
U2hhZG93Qmx1cihmbG9hdCk7CisgICAgdm9pZCBzZXRTaGFkb3dzSWdub3JlVHJhbnNmb3Jtcyhi
b29sKTsKKyAgICB2b2lkIHNldENvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVPcGVyYXRvcik7
CisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSk7CisgICAgdm9pZCByb3RhdGUo
ZmxvYXQgYW5nbGVJblJhZGlhbnMpOworICAgIHZvaWQgc2NhbGUoY29uc3QgRmxvYXRTaXplJik7
CisgICAgdm9pZCBjb25jYXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAgdm9pZCBz
ZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAgdm9pZCBjbGlwUGF0aChjb25zdCBQ
YXRoJik7CisgICAgdm9pZCBjbGlwT3V0KGNvbnN0IFBhdGgmKTsKKworICAgIHZvaWQgc2F2ZSgp
OworICAgIHZvaWQgcmVzdG9yZSgpOworCisgICAgLy8gbm9uLXN0YW5kYXJkIGZ1bmN0aW9ucwor
ICAgIC8vIFRoZXNlIGFyZSBub3Qgc3RhbmRhcmQgR3JhcGhpY3NDb250ZXh0IGZ1bmN0aW9ucywg
YW5kIHNob3VsZCBiZSBwdXNoZWQKKyAgICAvLyBkb3duIGludG8gYSBQbGF0Zm9ybUNvbnRleHRH
TEVTMiBhdCBzb21lIHBvaW50LgorCisgICAgLy8gVGhpcyB2ZXJzaW9uIGlzIGNhbGxlZCBieSB0
aGUgY2FudmFzLT5jYW52YXMgZHJhd3MuCisgICAgdm9pZCBkcmF3VGV4dHVyZWRSZWN0KHVuc2ln
bmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBGbG9hdFJlY3Qm
IHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgQ29sb3JTcGFjZSwgQ29tcG9zaXRl
T3BlcmF0b3IpOworICAgIC8vIFRoaXMgdmVyc2lvbiBpcyBjYWxsZWQgYnkgQml0bWFwSW1hZ2U6
OmRyYXcoKS4KKyAgICB2b2lkIGRyYXdUZXh0dXJlZFJlY3QoVGV4dHVyZSosIGNvbnN0IEZsb2F0
UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBDb2xvclNwYWNlLCBDb21w
b3NpdGVPcGVyYXRvcik7CisgICAgLy8gVGhpcyB2ZXJzaW9uIGlzIGNhbGxlZCBieSB0aGUgYWJv
dmUsIGFuZCBieSB0aGUgc29mdHdhcmUtPmhhcmR3YXJlIHVwbG9hZHMuCisgICAgdm9pZCBkcmF3
VGV4dHVyZWRSZWN0KFRleHR1cmUqLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgZmxvYXQgYWxwaGEsIENv
bG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yLCBib29sIGNsaXApOworICAgIFRleHR1cmUqIGNy
ZWF0ZVRleHR1cmUoTmF0aXZlSW1hZ2VQdHIsIFRleHR1cmU6OkZvcm1hdCwgaW50IHdpZHRoLCBp
bnQgaGVpZ2h0KTsKKyAgICBUZXh0dXJlKiBnZXRUZXh0dXJlKE5hdGl2ZUltYWdlUHRyKTsKKwor
ICAgIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9j
b250ZXh0OyB9CisKKyAgICB2b2lkIGJpbmRGcmFtZWJ1ZmZlcigpOworCisgICAgRHJhd2luZ0J1
ZmZlciogZHJhd2luZ0J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd2luZ0J1ZmZlcjsgfQor
Citwcml2YXRlOgorICAgIHZvaWQgYXBwbHlTdGF0ZSgpOworICAgIHZvaWQgc2Npc3NvckNsZWFy
KGZsb2F0IHgsIGZsb2F0IHksIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpOworICAgIHZvaWQg
ZHJhd1RleHR1cmVkUmVjdFRpbGUoVGV4dHVyZSogdGV4dHVyZSwgaW50IHRpbGUsIGNvbnN0IEZs
b2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgRmxvYXRSZWN0JiBkc3RSZWN0LCBjb25zdCBBZmZpbmVU
cmFuc2Zvcm0mLCBmbG9hdCBhbHBoYSk7CisgICAgdm9pZCBkcmF3VGV4dHVyZWRRdWFkKGNvbnN0
IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZs
b2F0UmVjdCYgZHN0UmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgZmxvYXQgYWxwaGEpOwor
ICAgIHZvaWQgZHJhd1RleHR1cmVkUXVhZE1pdGNoZWxsKGNvbnN0IEludFNpemUmIHRleHR1cmVT
aXplLCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwg
Y29uc3QgQWZmaW5lVHJhbnNmb3JtJiwgZmxvYXQgYWxwaGEpOworICAgIHZvaWQgY29udm9sdmVS
ZWN0KHVuc2lnbmVkIHRleHR1cmUsIGNvbnN0IEludFNpemUmIHRleHR1cmVTaXplLCBjb25zdCBG
bG9hdFJlY3QmIHNyY1JlY3QsIGNvbnN0IEZsb2F0UmVjdCYgZHN0UmVjdCwgZmxvYXQgaW1hZ2VJ
bmNyZW1lbnRbMl0sIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGludCBrZXJuZWxXaWR0aCk7CisKKyAg
ICB2b2lkIHRlc3NlbGF0ZUFuZEZpbGxQYXRoKGNvbnN0IFBhdGgmLCBjb25zdCBDb2xvciYpOwor
ICAgIHZvaWQgZmlsbFBhdGhJbnRlcm5hbChjb25zdCBQYXRoJiwgY29uc3QgQ29sb3ImKTsKKyAg
ICB2b2lkIGZpbGxSZWN0SW50ZXJuYWwoY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQ29sb3ImKTsK
KyAgICBGbG9hdFJlY3QgZmxpcFJlY3QoY29uc3QgRmxvYXRSZWN0Jik7CisgICAgdm9pZCBjbGVh
ckJvcmRlcnMoY29uc3QgRmxvYXRSZWN0JiwgaW50IHdpZHRoKTsKKyAgICB2b2lkIGJlZ2luU2hh
ZG93RHJhdygpOworICAgIHZvaWQgZW5kU2hhZG93RHJhdyhjb25zdCBGbG9hdFJlY3QmIGJvdW5k
aW5nQm94KTsKKyAgICB2b2lkIGJlZ2luU3RlbmNpbERyYXcodW5zaWduZWQgb3ApOworICAgIHZv
aWQgYXBwbHlDbGlwcGluZyhib29sIGVuYWJsZSk7CisgICAgdm9pZCBjaGVja0dMRXJyb3IoY29u
c3QgY2hhciogaGVhZGVyKTsKKworICAgIEludFNpemUgbV9zaXplOworCisgICAgU2hhcmVkR3Jh
cGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKKyAgICBEcmF3aW5nQnVmZmVyKiBtX2RyYXdpbmdC
dWZmZXI7CisKKyAgICBzdHJ1Y3QgU3RhdGU7CisgICAgdHlwZWRlZiBXVEY6OlZlY3RvcjxTdGF0
ZT4gU3RhdGVWZWN0b3I7CisgICAgU3RhdGVWZWN0b3IgbV9zdGF0ZVN0YWNrOworICAgIFN0YXRl
KiBtX3N0YXRlOworICAgIEFmZmluZVRyYW5zZm9ybSBtX2ZsaXBNYXRyaXg7CisKKyAgICAvLyBN
ZW1iZXJzIGZvciBHUFUtYWNjZWxlcmF0ZWQgcGF0aCByZW5kZXJpbmcuCisgICAgTG9vcEJsaW5u
UGF0aENhY2hlIG1fcGF0aENhY2hlOworICAgIHVuc2lnbmVkIG1fcGF0aEluZGV4QnVmZmVyOwor
ICAgIHVuc2lnbmVkIG1fcGF0aFZlcnRleEJ1ZmZlcjsKK307CisKK30KKworI2VuZGlmIC8vIEdM
RVMyQ2FudmFzX2gKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dwdS9H
cmFwaGljc0NvbnRleHRHUFUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ncHUvR3JhcGhpY3NDb250ZXh0R1BVLmgJKHJldmlzaW9uIDg0MjkxKQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3B1L0dyYXBoaWNzQ29udGV4dEdQVS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0yOCw4ICsyOCw4IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAK
LSNpZm5kZWYgR0xFUzJDYW52YXNfaAotI2RlZmluZSBHTEVTMkNhbnZhc19oCisjaWZuZGVmIEdy
YXBoaWNzQ29udGV4dEdQVV9oCisjZGVmaW5lIEdyYXBoaWNzQ29udGV4dEdQVV9oCiAKICNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJDb2xvci5oIgpAQCAtNTIsMTEgKzUy
LDExIEBAIGNsYXNzIEdyYXBoaWNzQ29udGV4dDNEOwogY2xhc3MgUGF0aDsKIGNsYXNzIFNoYXJl
ZEdyYXBoaWNzQ29udGV4dDNEOwogCi1jbGFzcyBHTEVTMkNhbnZhcyB7Ci0gICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoR0xFUzJDYW52YXMpOworY2xhc3MgR3JhcGhpY3NDb250ZXh0R1BVIHsKKyAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShHcmFwaGljc0NvbnRleHRHUFUpOwogcHVibGljOgotICAg
IEdMRVMyQ2FudmFzKFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKiwgRHJhd2luZ0J1ZmZlciosIGNv
bnN0IEludFNpemUmKTsKLSAgICB+R0xFUzJDYW52YXMoKTsKKyAgICBHcmFwaGljc0NvbnRleHRH
UFUoU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QqLCBEcmF3aW5nQnVmZmVyKiwgY29uc3QgSW50U2l6
ZSYpOworICAgIH5HcmFwaGljc0NvbnRleHRHUFUoKTsKIAogICAgIHZvaWQgZmlsbFBhdGgoY29u
c3QgUGF0aCYpOwogICAgIHZvaWQgZmlsbFJlY3QoY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgQ29s
b3ImLCBDb2xvclNwYWNlKTsKQEAgLTEzNyw0ICsxMzcsNCBAQCBwcml2YXRlOgogCiB9CiAKLSNl
bmRpZiAvLyBHTEVTMkNhbnZhc19oCisjZW5kaWYgLy8gR3JhcGhpY3NDb250ZXh0R1BVX2gKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR3JhcGhpY3NDb250ZXh0
U2tpYS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
c2tpYS9HcmFwaGljc0NvbnRleHRTa2lhLmNwcAkocmV2aXNpb24gODQyOTEpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dyYXBoaWNzQ29udGV4dFNraWEuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zNCw4ICszNCw4IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3Jt
LmgiCiAjaW5jbHVkZSAiQ29sb3IuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKLSNpbmNsdWRl
ICJHTEVTMkNhbnZhcy5oIgogI2luY2x1ZGUgIkdyYWRpZW50LmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0R1BVLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRl
LmgiCiAjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCkBAIC03
MzMsNyArNzMzLDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKGNvbnN0IFBhdAog
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIC8vIEZJ
WE1FOiBhZGQgc3VwcG9ydCB0byBHTEVTMkNhbnZhcyBmb3IgbW9yZSB0aGFuIGp1c3Qgc29saWQg
ZmlsbHMuCisgICAgLy8gRklYTUU6IGFkZCBzdXBwb3J0IHRvIEdyYXBoaWNzQ29udGV4dEdQVSBm
b3IgbW9yZSB0aGFuIGp1c3Qgc29saWQgZmlsbHMuCiAgICAgaWYgKHBsYXRmb3JtQ29udGV4dCgp
LT51c2VHUFUoKSAmJiBwbGF0Zm9ybUNvbnRleHQoKS0+Y2FuQWNjZWxlcmF0ZSgpKSB7CiAgICAg
ICAgIHBsYXRmb3JtQ29udGV4dCgpLT5wcmVwYXJlRm9ySGFyZHdhcmVEcmF3KCk7CiAgICAgICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5ncHVDYW52YXMoKS0+ZmlsbFBhdGgocGF0aFRvRmlsbCk7CkBA
IC0xMDI5LDcgKzEwMjksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaGFk
b3coCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmIChwbGF0Zm9ybUNvbnRleHQoKS0+dXNlR1BV
KCkpIHsKLSAgICAgICAgR0xFUzJDYW52YXMqIGNhbnZhcyA9IHBsYXRmb3JtQ29udGV4dCgpLT5n
cHVDYW52YXMoKTsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0R1BVKiBjYW52YXMgPSBwbGF0Zm9y
bUNvbnRleHQoKS0+Z3B1Q2FudmFzKCk7CiAgICAgICAgIGNhbnZhcy0+c2V0U2hhZG93T2Zmc2V0
KHNpemUpOwogICAgICAgICBjYW52YXMtPnNldFNoYWRvd0JsdXIoYmx1ckZsb2F0KTsKICAgICAg
ICAgY2FudmFzLT5zZXRTaGFkb3dDb2xvcihjb2xvciwgY29sb3JTcGFjZSk7CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0ltYWdlQnVmZmVyU2tpYS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZUJ1
ZmZlclNraWEuY3BwCShyZXZpc2lvbiA4NDI5MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3NraWEvSW1hZ2VCdWZmZXJTa2lhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcs
OCArMzcsOCBAQAogI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCiAjaW5jbHVkZSAiQml0bWFwSW1h
Z2VTaW5nbGVGcmFtZVNraWEuaCIKICNpbmNsdWRlICJEcmF3aW5nQnVmZmVyLmgiCi0jaW5jbHVk
ZSAiR0xFUzJDYW52YXMuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHRHUFUuaCIKICNpbmNsdWRlICJJbWFnZURhdGEuaCIKICNpbmNsdWRl
ICJKUEVHSW1hZ2VFbmNvZGVyLmgiCiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9JbWFnZVNraWEuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvSW1hZ2VT
a2lhLmNwcAkocmV2aXNpb24gODQyOTEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9za2lhL0ltYWdlU2tpYS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDggKzM1LDggQEAK
ICNpbmNsdWRlICJCaXRtYXBJbWFnZVNpbmdsZUZyYW1lU2tpYS5oIgogI2luY2x1ZGUgIkZsb2F0
Q29udmVyc2lvbi5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgotI2luY2x1ZGUgIkdMRVMyQ2Fu
dmFzLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0R1BVLmgiCiAjaW5jbHVkZSAiTG9nZ2luZy5oIgogI2luY2x1ZGUgIk5hdGl2ZUltYWdl
U2tpYS5oIgogI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEuaCIKQEAgLTQzNCw3ICs0MzQs
NyBAQCB2b2lkIEltYWdlOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqCiBzdGF0aWMgdm9p
ZCBkcmF3Qml0bWFwR0xFUzIoR3JhcGhpY3NDb250ZXh0KiBjdHh0LCBOYXRpdmVJbWFnZVNraWEq
IGJpdG1hcCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGRzdFJl
Y3QsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBjb21wb3Np
dGVPcCkKIHsKICAgICBjdHh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+cHJlcGFyZUZvckhhcmR3YXJl
RHJhdygpOwotICAgIEdMRVMyQ2FudmFzKiBncHVDYW52YXMgPSBjdHh0LT5wbGF0Zm9ybUNvbnRl
eHQoKS0+Z3B1Q2FudmFzKCk7CisgICAgR3JhcGhpY3NDb250ZXh0R1BVKiBncHVDYW52YXMgPSBj
dHh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Z3B1Q2FudmFzKCk7CiAgICAgVGV4dHVyZSogdGV4dHVy
ZSA9IGdwdUNhbnZhcy0+Z2V0VGV4dHVyZShiaXRtYXApOwogICAgIGlmICghdGV4dHVyZSkgewog
ICAgICAgICBBU1NFUlQoYml0bWFwLT5jb25maWcoKSA9PSBTa0JpdG1hcDo6a0FSR0JfODg4OF9D
b25maWcpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9QbGF0
Zm9ybUNvbnRleHRTa2lhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29udGV4dFNraWEuY3BwCShyZXZpc2lvbiA4NDI5MSkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvUGxhdGZvcm1Db250ZXh0
U2tpYS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYyLDcgKzYyLDcgQEAKICNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CiAKICNpZiBFTkFCTEUoQUNDRUxFUkFURURfMkRfQ0FOVkFTKQotI2luY2x1ZGUg
IkdMRVMyQ2FudmFzLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0R1BVLmgiCiAjaW5jbHVk
ZSAiU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QuaCIKICNlbmRpZgogCkBAIC03MjksNyArNzI5LDcg
QEAgdm9pZCBQbGF0Zm9ybUNvbnRleHRTa2lhOjpzZXRTaGFyZWRHcmFwaAogI2lmIEVOQUJMRShB
Q0NFTEVSQVRFRF8yRF9DQU5WQVMpCiAgICAgaWYgKGNvbnRleHQgJiYgZHJhd2luZ0J1ZmZlcikg
ewogICAgICAgICBtX3VzZUdQVSA9IHRydWU7Ci0gICAgICAgIG1fZ3B1Q2FudmFzID0gbmV3IEdM
RVMyQ2FudmFzKGNvbnRleHQsIGRyYXdpbmdCdWZmZXIsIHNpemUpOworICAgICAgICBtX2dwdUNh
bnZhcyA9IG5ldyBHcmFwaGljc0NvbnRleHRHUFUoY29udGV4dCwgZHJhd2luZ0J1ZmZlciwgc2l6
ZSk7CiAgICAgICAgIG1fdXBsb2FkVGV4dHVyZS5jbGVhcigpOwogICAgICAgICBkcmF3aW5nQnVm
ZmVyLT5zZXRXaWxsUHVibGlzaENhbGxiYWNrKFdpbGxQdWJsaXNoQ2FsbGJhY2tJbXBsOjpjcmVh
dGUodGhpcykpOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lh
L1BsYXRmb3JtQ29udGV4dFNraWEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29udGV4dFNraWEuaAkocmV2aXNpb24gODQyOTEp
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL1BsYXRmb3JtQ29udGV4
dFNraWEuaAkod29ya2luZyBjb3B5KQpAQCAtNDYsOCArNDYsOCBAQCBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIGVudW0gQ29tcG9zaXRlT3BlcmF0b3I7CiBjbGFzcyBEcmF3aW5nQnVmZmVyOwotY2xh
c3MgR0xFUzJDYW52YXM7CiBjbGFzcyBHcmFwaGljc0NvbnRleHQzRDsKK2NsYXNzIEdyYXBoaWNz
Q29udGV4dEdQVTsKIGNsYXNzIFRleHR1cmU7CiAKIC8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHBs
YXRmb3JtLXNwZWNpZmljIHN0YXRlIGZvciBHcmFwaGljc0NvbnRleHQuIFdlIHB1dApAQCAtMTgx
LDEyICsxODEsMTIgQEAgcHVibGljOgogICAgIGJvb2wgdXNlR1BVKCkgeyByZXR1cm4gbV91c2VH
UFU7IH0KICAgICB2b2lkIHNldFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEKFNoYXJlZEdyYXBoaWNz
Q29udGV4dDNEKiwgRHJhd2luZ0J1ZmZlciosIGNvbnN0IEludFNpemUmKTsKICNpZiBFTkFCTEUo
QUNDRUxFUkFURURfMkRfQ0FOVkFTKQotICAgIEdMRVMyQ2FudmFzKiBncHVDYW52YXMoKSBjb25z
dCB7IHJldHVybiBtX2dwdUNhbnZhcy5nZXQoKTsgfQorICAgIEdyYXBoaWNzQ29udGV4dEdQVSog
Z3B1Q2FudmFzKCkgY29uc3QgeyByZXR1cm4gbV9ncHVDYW52YXMuZ2V0KCk7IH0KICNlbHNlCi0g
ICAgR0xFUzJDYW52YXMqIGdwdUNhbnZhcygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICBHcmFw
aGljc0NvbnRleHRHUFUqIGdwdUNhbnZhcygpIGNvbnN0IHsgcmV0dXJuIDA7IH0KICNlbmRpZgog
ICAgIC8vIENhbGwgdGhlc2UgYmVmb3JlIG1ha2luZyBhIGNhbGwgdGhhdCBtYW5pcHVsYXRlcyB0
aGUgdW5kZXJseWluZwotICAgIC8vIFNrQ2FudmFzIG9yIFdlYkNvcmU6OkdMRVMyQ2FudmFzCisg
ICAgLy8gU2tDYW52YXMgb3IgV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0R1BVCiAgICAgdm9pZCBw
cmVwYXJlRm9yU29mdHdhcmVEcmF3KCkgY29uc3Q7CiAgICAgdm9pZCBwcmVwYXJlRm9ySGFyZHdh
cmVEcmF3KCkgY29uc3Q7CiAgICAgLy8gQ2FsbCB0byBmb3JjZSB0aGUgU2tDYW52YXMgdG8gY29u
dGFpbiBhbGwgcmVuZGVyaW5nIHJlc3VsdHMuCkBAIC0yMjMsNyArMjIzLDcgQEAgcHJpdmF0ZToK
ICAgICBib29sIG1fZHJhd2luZ1RvSW1hZ2VCdWZmZXI7CiAgICAgYm9vbCBtX3VzZUdQVTsKICNp
ZiBFTkFCTEUoQUNDRUxFUkFURURfMkRfQ0FOVkFTKQotICAgIE93blB0cjxHTEVTMkNhbnZhcz4g
bV9ncHVDYW52YXM7CisgICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dEdQVT4gbV9ncHVDYW52YXM7
CiAgICAgbXV0YWJsZSBSZWZQdHI8VGV4dHVyZT4gbV91cGxvYWRUZXh0dXJlOwogI2VuZGlmCiAg
ICAgbXV0YWJsZSBlbnVtIHsgTm9uZSwgU29mdHdhcmUsIE1peGVkLCBIYXJkd2FyZSB9IG1fYmFj
a2luZ1N0b3JlU3RhdGU7Cg==
</data>
<flag name="review"
          id="82987"
          type_id="1"
          status="+"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>