<?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>142401</bug_id>
          
          <creation_ts>2015-03-06 09:35:42 -0800</creation_ts>
          <short_desc>Rename NetworkCacheStorageCocoa.mm to NetworkCacheStorage.cpp</short_desc>
          <delta_ts>2015-03-06 10:10:09 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Page Loading</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>achristensen</cc>
    
    <cc>cgarcia</cc>
    
    <cc>commit-queue</cc>
    
    <cc>ossy</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1074975</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-03-06 09:35:42 -0800</bug_when>
    <thetext>It is now fully cross-platform.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074978</commentid>
    <comment_count>1</comment_count>
      <attachid>248072</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-03-06 09:39:12 -0800</bug_when>
    <thetext>Created attachment 248072
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074979</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-03-06 09:40:45 -0800</bug_when>
    <thetext>Attachment 248072 did not pass style-queue:


ERROR: Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.cpp:406:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 1 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1074989</commentid>
    <comment_count>3</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-03-06 10:10:09 -0800</bug_when>
    <thetext>https://trac.webkit.org/r181162</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>248072</attachid>
            <date>2015-03-06 09:39:12 -0800</date>
            <delta_ts>2015-03-06 09:43:28 -0800</delta_ts>
            <desc>patch</desc>
            <filename>disk-cache-storage-cpp.patch</filename>
            <type>text/plain</type>
            <size>53883</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTE2MSkKKysrIFNvdXJjZS9XZWJLaXQyL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE3IEBACisyMDE1LTAzLTA2ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBSZW5hbWUgTmV0d29ya0NhY2hl
U3RvcmFnZUNvY29hLm1tIHRvIE5ldHdvcmtDYWNoZVN0b3JhZ2UuY3BwCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDI0MDEKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJdCBpcyBub3cgZnVsbHkgY3Jvc3Mt
cGxhdGZvcm0uCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVT
dG9yYWdlLmNwcDogQ29waWVkIGZyb20gU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2Fj
aGUvTmV0d29ya0NhY2hlU3RvcmFnZUNvY29hLm1tLgorICAgICAgICAoV2ViS2l0OjpOZXR3b3Jr
Q2FjaGU6OlN0b3JhZ2U6OnNocmlua0lmTmVlZGVkKToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vz
cy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlQ29jb2EubW06IFJlbW92ZWQuCisgICAgICAgICog
V2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorCiAyMDE1LTAzLTA2ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KIAogICAgICAgICBEb24ndCB1c2UgZGlzcGF0Y2hf
c2VtYXBob3JlIGluIE5ldHdvcmtDYWNoZVN0b3JhZ2UKSW5kZXg6IFNvdXJjZS9XZWJLaXQyL05l
dHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2Uu
Y3BwCShyZXZpc2lvbiAxODExNjEpCShmcm9tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNz
L2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbToxODExNjEpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9OZXR3b3JrUHJvY2Vzcy9jYWNoZS9OZXR3b3JrQ2FjaGVTdG9yYWdlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDYzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIk5ldHdvcmtDYWNoZVN0b3JhZ2UuaCIKKworI2lmIEVOQUJMRShO
RVRXT1JLX0NBQ0hFKQorCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIk5ldHdvcmtD
YWNoZUNvZGVycy5oIgorI2luY2x1ZGUgIk5ldHdvcmtDYWNoZUZpbGVTeXN0ZW1Qb3NpeC5oIgor
I2luY2x1ZGUgIk5ldHdvcmtDYWNoZUlPQ2hhbm5lbC5oIgorI2luY2x1ZGUgPHd0Zi9QYWdlQmxv
Y2suaD4KKyNpbmNsdWRlIDx3dGYvUmFuZG9tTnVtYmVyLmg+CisjaW5jbHVkZSA8d3RmL1J1bkxv
b3AuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQv
U3RyaW5nQnVpbGRlci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKK25hbWVzcGFjZSBOZXR3b3Jr
Q2FjaGUgeworCitzdGF0aWMgY29uc3QgY2hhciBuZXR3b3JrQ2FjaGVTdWJkaXJlY3RvcnlbXSA9
ICJXZWJLaXRDYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciB2ZXJzaW9uRGlyZWN0b3J5UHJlZml4
W10gPSAiVmVyc2lvbiAiOworCitzdGQ6OnVuaXF1ZV9wdHI8U3RvcmFnZT4gU3RvcmFnZTo6b3Bl
bihjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWlu
KCkpOworCisgICAgU3RyaW5nIG5ldHdvcmtDYWNoZVBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBl
bmRpbmdDb21wb25lbnQoY2FjaGVQYXRoLCBuZXR3b3JrQ2FjaGVTdWJkaXJlY3RvcnkpOworICAg
IGlmICghV2ViQ29yZTo6bWFrZUFsbERpcmVjdG9yaWVzKG5ldHdvcmtDYWNoZVBhdGgpKQorICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFN0b3JhZ2U+
KG5ldyBTdG9yYWdlKG5ldHdvcmtDYWNoZVBhdGgpKTsKK30KKworc3RhdGljIFN0cmluZyBtYWtl
VmVyc2lvbmVkRGlyZWN0b3J5UGF0aChjb25zdCBTdHJpbmcmIGJhc2VEaXJlY3RvcnlQYXRoKQor
eworICAgIFN0cmluZyB2ZXJzaW9uU3ViZGlyZWN0b3J5ID0gdmVyc2lvbkRpcmVjdG9yeVByZWZp
eCArIFN0cmluZzo6bnVtYmVyKFN0b3JhZ2U6OnZlcnNpb24pOworICAgIHJldHVybiBXZWJDb3Jl
OjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoYmFzZURpcmVjdG9yeVBhdGgsIHZlcnNpb25TdWJk
aXJlY3RvcnkpOworfQorCitTdG9yYWdlOjpTdG9yYWdlKGNvbnN0IFN0cmluZyYgYmFzZURpcmVj
dG9yeVBhdGgpCisgICAgOiBtX2Jhc2VEaXJlY3RvcnlQYXRoKGJhc2VEaXJlY3RvcnlQYXRoKQor
ICAgICwgbV9kaXJlY3RvcnlQYXRoKG1ha2VWZXJzaW9uZWREaXJlY3RvcnlQYXRoKGJhc2VEaXJl
Y3RvcnlQYXRoKSkKKyAgICAsIG1faW9RdWV1ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29tLmFwcGxl
LldlYktpdC5DYWNoZS5TdG9yYWdlIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50KSkKKyAg
ICAsIG1fYmFja2dyb3VuZElPUXVldWUoV29ya1F1ZXVlOjpjcmVhdGUoImNvbS5hcHBsZS5XZWJL
aXQuQ2FjaGUuU3RvcmFnZSIsIFdvcmtRdWV1ZTo6VHlwZTo6Q29uY3VycmVudCwgV29ya1F1ZXVl
OjpRT1M6OkJhY2tncm91bmQpKQoreworICAgIGRlbGV0ZU9sZFZlcnNpb25zKCk7CisgICAgaW5p
dGlhbGl6ZSgpOworfQorCit2b2lkIFN0b3JhZ2U6OmluaXRpYWxpemUoKQoreworICAgIEFTU0VS
VChSdW5Mb29wOjppc01haW4oKSk7CisKKyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1
cmUobV9kaXJlY3RvcnlQYXRoKTsKKworICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2go
W3RoaXMsIGNhY2hlUGF0aENhcHR1cmVdIHsKKyAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNh
Y2hlUGF0aENhcHR1cmUuc3RyaW5nKCk7CisgICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNo
ZVBhdGgsIFt0aGlzXShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBTdHJpbmcmIHBhcnRp
dGlvblBhdGgpIHsKKyAgICAgICAgICAgIEtleTo6SGFzaFR5cGUgaGFzaDsKKyAgICAgICAgICAg
IGlmICghS2V5OjpzdHJpbmdUb0hhc2goZmlsZU5hbWUsIGhhc2gpKQorICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0SGFzaCA9IEtleTo6dG9TaG9ydEhh
c2goaGFzaCk7CisgICAgICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW3RoaXMsIHNo
b3J0SGFzaF0geworICAgICAgICAgICAgICAgIG1fY29udGVudHNGaWx0ZXIuYWRkKHNob3J0SGFz
aCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGF1dG8gZmlsZVBhdGggPSBXZWJDb3Jl
OjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGFydGl0aW9uUGF0aCwgZmlsZU5hbWUpOworICAg
ICAgICAgICAgbG9uZyBsb25nIGZpbGVTaXplID0gMDsKKyAgICAgICAgICAgIFdlYkNvcmU6Omdl
dEZpbGVTaXplKGZpbGVQYXRoLCBmaWxlU2l6ZSk7CisgICAgICAgICAgICBtX2FwcHJveGltYXRl
U2l6ZSArPSBmaWxlU2l6ZTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9CisKK3N0YXRpYyBTdHJp
bmcgZGlyZWN0b3J5UGF0aEZvcktleShjb25zdCBLZXkmIGtleSwgY29uc3QgU3RyaW5nJiBjYWNo
ZVBhdGgpCit7CisgICAgQVNTRVJUKCFrZXkucGFydGl0aW9uKCkuaXNFbXB0eSgpKTsKKyAgICBy
ZXR1cm4gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNhY2hlUGF0aCwga2V5LnBh
cnRpdGlvbigpKTsKK30KKworc3RhdGljIFN0cmluZyBmaWxlTmFtZUZvcktleShjb25zdCBLZXkm
IGtleSkKK3sKKyAgICByZXR1cm4ga2V5Lmhhc2hBc1N0cmluZygpOworfQorCitzdGF0aWMgU3Ry
aW5nIGZpbGVQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0
aCkKK3sKKyAgICByZXR1cm4gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGRpcmVj
dG9yeVBhdGhGb3JLZXkoa2V5LCBjYWNoZVBhdGgpLCBmaWxlTmFtZUZvcktleShrZXkpKTsKK30K
Kworc3RhdGljIFJlZjxJT0NoYW5uZWw+IG9wZW5GaWxlRm9yS2V5KGNvbnN0IEtleSYga2V5LCBJ
T0NoYW5uZWw6OlR5cGUgdHlwZSwgY29uc3QgU3RyaW5nJiBjYWNoZVBhdGgpCit7CisgICAgYXV0
byBkaXJlY3RvcnlQYXRoID0gZGlyZWN0b3J5UGF0aEZvcktleShrZXksIGNhY2hlUGF0aCk7Cisg
ICAgYXV0byBmaWxlUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChkaXJl
Y3RvcnlQYXRoLCBmaWxlTmFtZUZvcktleShrZXkpKTsKKyAgICBpZiAodHlwZSA9PSBJT0NoYW5u
ZWw6OlR5cGU6OkNyZWF0ZSkKKyAgICAgICAgV2ViQ29yZTo6bWFrZUFsbERpcmVjdG9yaWVzKGRp
cmVjdG9yeVBhdGgpOworICAgIHJldHVybiBJT0NoYW5uZWw6Om9wZW4oZmlsZVBhdGgsIHR5cGUp
OworfQorCitzdGF0aWMgdW5zaWduZWQgaGFzaERhdGEoY29uc3QgRGF0YSYgZGF0YSkKK3sKKyAg
ICBTdHJpbmdIYXNoZXIgaGFzaGVyOworICAgIGRhdGEuYXBwbHkoWyZoYXNoZXJdKGNvbnN0IHVp
bnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGhhc2hlci5hZGRDaGFyYWN0ZXJz
KGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9KTsKKyAgICByZXR1cm4g
aGFzaGVyLmhhc2goKTsKK30KKworc3RydWN0IEVudHJ5TWV0YURhdGEgeworICAgIEVudHJ5TWV0
YURhdGEoKSB7IH0KKyAgICBleHBsaWNpdCBFbnRyeU1ldGFEYXRhKGNvbnN0IEtleSYga2V5KQor
ICAgICAgICA6IGNhY2hlU3RvcmFnZVZlcnNpb24oU3RvcmFnZTo6dmVyc2lvbikKKyAgICAgICAg
LCBrZXkoa2V5KQorICAgIHsgfQorCisgICAgdW5zaWduZWQgY2FjaGVTdG9yYWdlVmVyc2lvbjsK
KyAgICBLZXkga2V5OworICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgdGltZVN0YW1wOwor
ICAgIHVuc2lnbmVkIGhlYWRlckNoZWNrc3VtOworICAgIHVpbnQ2NF90IGhlYWRlck9mZnNldDsK
KyAgICB1aW50NjRfdCBoZWFkZXJTaXplOworICAgIHVuc2lnbmVkIGJvZHlDaGVja3N1bTsKKyAg
ICB1aW50NjRfdCBib2R5T2Zmc2V0OworICAgIHVpbnQ2NF90IGJvZHlTaXplOworfTsKKworc3Rh
dGljIGJvb2wgZGVjb2RlRW50cnlNZXRhRGF0YShFbnRyeU1ldGFEYXRhJiBtZXRhRGF0YSwgY29u
c3QgRGF0YSYgZmlsZURhdGEpCit7CisgICAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgICAgZmls
ZURhdGEuYXBwbHkoWyZtZXRhRGF0YSwgJnN1Y2Nlc3NdKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNp
emVfdCBzaXplKSB7CisgICAgICAgIERlY29kZXIgZGVjb2RlcihkYXRhLCBzaXplKTsKKyAgICAg
ICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5jYWNoZVN0b3JhZ2VWZXJzaW9uKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRh
RGF0YS5rZXkpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWRlY29k
ZXIuZGVjb2RlKG1ldGFEYXRhLnRpbWVTdGFtcCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuaGVhZGVyQ2hlY2tzdW0pKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKG1l
dGFEYXRhLmhlYWRlclNpemUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBp
ZiAoIWRlY29kZXIuZGVjb2RlKG1ldGFEYXRhLmJvZHlDaGVja3N1bSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuYm9keVNp
emUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWRlY29kZXIudmVy
aWZ5Q2hlY2tzdW0oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbWV0YURh
dGEuaGVhZGVyT2Zmc2V0ID0gZGVjb2Rlci5jdXJyZW50T2Zmc2V0KCk7CisgICAgICAgIG1ldGFE
YXRhLmJvZHlPZmZzZXQgPSBXVEY6OnJvdW5kVXBUb011bHRpcGxlT2YocGFnZVNpemUoKSwgbWV0
YURhdGEuaGVhZGVyT2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVyU2l6ZSk7CisgICAgICAgIHN1Y2Nl
c3MgPSB0cnVlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSk7CisgICAgcmV0dXJuIHN1
Y2Nlc3M7Cit9CisKK3N0YXRpYyBib29sIGRlY29kZUVudHJ5SGVhZGVyKGNvbnN0IERhdGEmIGZp
bGVEYXRhLCBFbnRyeU1ldGFEYXRhJiBtZXRhRGF0YSwgRGF0YSYgZGF0YSkKK3sKKyAgICBpZiAo
IWRlY29kZUVudHJ5TWV0YURhdGEobWV0YURhdGEsIGZpbGVEYXRhKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIGlmIChtZXRhRGF0YS5jYWNoZVN0b3JhZ2VWZXJzaW9uICE9IFN0b3JhZ2U6
OnZlcnNpb24pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAobWV0YURhdGEuaGVhZGVy
T2Zmc2V0ICsgbWV0YURhdGEuaGVhZGVyU2l6ZSA+IG1ldGFEYXRhLmJvZHlPZmZzZXQpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gaGVhZGVyRGF0YSA9IGZpbGVEYXRhLnN1YnJh
bmdlKG1ldGFEYXRhLmhlYWRlck9mZnNldCwgbWV0YURhdGEuaGVhZGVyU2l6ZSk7CisgICAgaWYg
KG1ldGFEYXRhLmhlYWRlckNoZWNrc3VtICE9IGhhc2hEYXRhKGhlYWRlckRhdGEpKSB7CisgICAg
ICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBoZWFkZXIgY2hl
Y2tzdW0gbWlzbWF0Y2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkYXRh
ID0geyBoZWFkZXJEYXRhIH07CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdGQ6OnVu
aXF1ZV9wdHI8U3RvcmFnZTo6RW50cnk+IGRlY29kZUVudHJ5KGNvbnN0IERhdGEmIGZpbGVEYXRh
LCBpbnQgZmQsIGNvbnN0IEtleSYga2V5KQoreworICAgIEVudHJ5TWV0YURhdGEgbWV0YURhdGE7
CisgICAgRGF0YSBoZWFkZXJEYXRhOworICAgIGlmICghZGVjb2RlRW50cnlIZWFkZXIoZmlsZURh
dGEsIG1ldGFEYXRhLCBoZWFkZXJEYXRhKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAg
ICBpZiAobWV0YURhdGEua2V5ICE9IGtleSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAg
aWYgKG1ldGFEYXRhLmJvZHlPZmZzZXQgKyBtZXRhRGF0YS5ib2R5U2l6ZSAhPSBmaWxlRGF0YS5z
aXplKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgYXV0byBib2R5RGF0YSA9IG1h
cEZpbGUoZmQsIG1ldGFEYXRhLmJvZHlPZmZzZXQsIG1ldGFEYXRhLmJvZHlTaXplKTsKKyAgICBp
ZiAoYm9keURhdGEuaXNOdWxsKCkpIHsKKyAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2Us
ICIoTmV0d29ya1Byb2Nlc3MpIG1hcCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7
CisgICAgfQorCisgICAgaWYgKG1ldGFEYXRhLmJvZHlDaGVja3N1bSAhPSBoYXNoRGF0YShib2R5
RGF0YSkpIHsKKyAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nl
c3MpIGRhdGEgY2hlY2tzdW0gbWlzbWF0Y2giKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7Cisg
ICAgfQorCisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8U3RvcmFnZTo6RW50cnk+KFN0b3Jh
Z2U6OkVudHJ5IHsKKyAgICAgICAgbWV0YURhdGEua2V5LAorICAgICAgICBtZXRhRGF0YS50aW1l
U3RhbXAsCisgICAgICAgIGhlYWRlckRhdGEsCisgICAgICAgIGJvZHlEYXRhCisgICAgfSk7Cit9
CisKK3N0YXRpYyBEYXRhIGVuY29kZUVudHJ5TWV0YURhdGEoY29uc3QgRW50cnlNZXRhRGF0YSYg
ZW50cnkpCit7CisgICAgRW5jb2RlciBlbmNvZGVyOworCisgICAgZW5jb2RlciA8PCBlbnRyeS5j
YWNoZVN0b3JhZ2VWZXJzaW9uOworICAgIGVuY29kZXIgPDwgZW50cnkua2V5OworICAgIGVuY29k
ZXIgPDwgZW50cnkudGltZVN0YW1wOworICAgIGVuY29kZXIgPDwgZW50cnkuaGVhZGVyQ2hlY2tz
dW07CisgICAgZW5jb2RlciA8PCBlbnRyeS5oZWFkZXJTaXplOworICAgIGVuY29kZXIgPDwgZW50
cnkuYm9keUNoZWNrc3VtOworICAgIGVuY29kZXIgPDwgZW50cnkuYm9keVNpemU7CisKKyAgICBl
bmNvZGVyLmVuY29kZUNoZWNrc3VtKCk7CisKKyAgICByZXR1cm4gRGF0YShlbmNvZGVyLmJ1ZmZl
cigpLCBlbmNvZGVyLmJ1ZmZlclNpemUoKSk7Cit9CisKK3N0YXRpYyBEYXRhIGVuY29kZUVudHJ5
SGVhZGVyKGNvbnN0IFN0b3JhZ2U6OkVudHJ5JiBlbnRyeSkKK3sKKyAgICBFbnRyeU1ldGFEYXRh
IG1ldGFEYXRhKGVudHJ5LmtleSk7CisgICAgbWV0YURhdGEudGltZVN0YW1wID0gZW50cnkudGlt
ZVN0YW1wOworICAgIG1ldGFEYXRhLmhlYWRlckNoZWNrc3VtID0gaGFzaERhdGEoZW50cnkuaGVh
ZGVyKTsKKyAgICBtZXRhRGF0YS5oZWFkZXJTaXplID0gZW50cnkuaGVhZGVyLnNpemUoKTsKKyAg
ICBtZXRhRGF0YS5ib2R5Q2hlY2tzdW0gPSBoYXNoRGF0YShlbnRyeS5ib2R5KTsKKyAgICBtZXRh
RGF0YS5ib2R5U2l6ZSA9IGVudHJ5LmJvZHkuc2l6ZSgpOworCisgICAgYXV0byBlbmNvZGVkTWV0
YURhdGEgPSBlbmNvZGVFbnRyeU1ldGFEYXRhKG1ldGFEYXRhKTsKKyAgICBhdXRvIGhlYWRlckRh
dGEgPSBjb25jYXRlbmF0ZShlbmNvZGVkTWV0YURhdGEsIGVudHJ5LmhlYWRlcik7CisgICAgaWYg
KCFlbnRyeS5ib2R5LnNpemUoKSkKKyAgICAgICAgcmV0dXJuIHsgaGVhZGVyRGF0YSB9OworCisg
ICAgc2l6ZV90IGRhdGFPZmZzZXQgPSBXVEY6OnJvdW5kVXBUb011bHRpcGxlT2YocGFnZVNpemUo
KSwgaGVhZGVyRGF0YS5zaXplKCkpOworICAgIFZlY3Rvcjx1aW50OF90LCA0MDk2PiBmaWxsZXIo
ZGF0YU9mZnNldCAtIGhlYWRlckRhdGEuc2l6ZSgpLCAwKTsKKyAgICBEYXRhIGFsaWdubWVudERh
dGEoZmlsbGVyLmRhdGEoKSwgZmlsbGVyLnNpemUoKSk7CisKKyAgICByZXR1cm4gY29uY2F0ZW5h
dGUoaGVhZGVyRGF0YSwgYWxpZ25tZW50RGF0YSk7Cit9CisKK3ZvaWQgU3RvcmFnZTo6cmVtb3Zl
RW50cnkoY29uc3QgS2V5JiBrZXkpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsK
KworICAgIC8vIEZvciBzaW1wbGljaXR5IHdlIGRvbid0IHJlZHVjZSBtX2FwcHJveGltYXRlU2l6
ZSBvbiByZW1vdmFscyBjYXVzZWQgYnkgbG9hZCBvciBkZWNvZGUgZXJyb3JzLgorICAgIC8vIFRo
ZSBuZXh0IGNhY2hlIHNocmluayB3aWxsIHVwZGF0ZSB0aGUgc2l6ZS4KKworICAgIGlmIChtX2Nv
bnRlbnRzRmlsdGVyLm1heUNvbnRhaW4oa2V5LnNob3J0SGFzaCgpKSkKKyAgICAgICAgbV9jb250
ZW50c0ZpbHRlci5yZW1vdmUoa2V5LnNob3J0SGFzaCgpKTsKKworICAgIFN0cmluZ0NhcHR1cmUg
ZmlsZVBhdGhDYXB0dXJlKGZpbGVQYXRoRm9yS2V5KGtleSwgbV9kaXJlY3RvcnlQYXRoKSk7Cisg
ICAgYmFja2dyb3VuZElPUXVldWUoKS5kaXNwYXRjaChbdGhpcywgZmlsZVBhdGhDYXB0dXJlXSB7
CisgICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoZmlsZVBhdGhDYXB0dXJlLnN0cmluZygpKTsK
KyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlOjpkaXNwYXRjaFJlYWRPcGVyYXRpb24oY29uc3Qg
UmVhZE9wZXJhdGlvbiYgcmVhZCkKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwor
ICAgIEFTU0VSVChtX2FjdGl2ZVJlYWRPcGVyYXRpb25zLmNvbnRhaW5zKCZyZWFkKSk7CisKKyAg
ICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKKyAgICBp
b1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZyZWFkLCBjYWNoZVBhdGhDYXB0dXJlXSB7CisgICAg
ICAgIGF1dG8gY2hhbm5lbCA9IG9wZW5GaWxlRm9yS2V5KHJlYWQua2V5LCBJT0NoYW5uZWw6OlR5
cGU6OlJlYWQsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOworICAgICAgICBpbnQgZmQgPSBj
aGFubmVsLT5maWxlRGVzY3JpcHRvcigpOworICAgICAgICBjaGFubmVsLT5yZWFkKDAsIHN0ZDo6
bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCksIFt0aGlzLCAmcmVhZCwgZmRdKERhdGEmIGZp
bGVEYXRhLCBpbnQgZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAgICAgICAg
ICAgICAgIHJlbW92ZUVudHJ5KHJlYWQua2V5KTsKKyAgICAgICAgICAgICAgICByZWFkLmNvbXBs
ZXRpb25IYW5kbGVyKG51bGxwdHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBhdXRvIGVudHJ5ID0gZGVjb2RlRW50cnkoZmlsZURhdGEsIGZkLCByZWFkLmtleSk7Cisg
ICAgICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVhZC5jb21wbGV0aW9uSGFuZGxlcihXVEY6
Om1vdmUoZW50cnkpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgICAg
ICAgICAgICAgIHJlbW92ZUVudHJ5KHJlYWQua2V5KTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgQVNTRVJUKG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMuY29udGFpbnMoJnJlYWQpKTsKKyAg
ICAgICAgICAgIG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMucmVtb3ZlKCZyZWFkKTsKKyAgICAgICAg
ICAgIGRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCk7CisKKyAgICAgICAgICAgIExPRyhO
ZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSByZWFkIGNvbXBsZXRlIGVycm9y
PSVkIiwgZXJyb3IpOworICAgICAgICB9KTsKKyAgICB9KTsKK30KKwordm9pZCBTdG9yYWdlOjpk
aXNwYXRjaFBlbmRpbmdSZWFkT3BlcmF0aW9ucygpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6Omlz
TWFpbigpKTsKKworICAgIGNvbnN0IGludCBtYXhpbXVtQWN0aXZlUmVhZE9wZXJhdGlvbkNvdW50
ID0gNTsKKworICAgIGZvciAoaW50IHByaW9yaXR5ID0gbWF4aW11bVJldHJpZXZlUHJpb3JpdHk7
IHByaW9yaXR5ID49IDA7IC0tcHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKG1fYWN0aXZlUmVhZE9w
ZXJhdGlvbnMuc2l6ZSgpID4gbWF4aW11bUFjdGl2ZVJlYWRPcGVyYXRpb25Db3VudCkgeworICAg
ICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIGxpbWl0
aW5nIHBhcmFsbGVsIHJldHJpZXZlcyIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIGF1dG8mIHBlbmRpbmdSZXRyaWV2ZVF1ZXVlID0gbV9wZW5kaW5nUmVhZE9wZXJh
dGlvbnNCeVByaW9yaXR5W3ByaW9yaXR5XTsKKyAgICAgICAgaWYgKHBlbmRpbmdSZXRyaWV2ZVF1
ZXVlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBhdXRvIHJlYWRP
cGVyYXRpb24gPSBwZW5kaW5nUmV0cmlldmVRdWV1ZS50YWtlRmlyc3QoKTsKKyAgICAgICAgYXV0
byYgcmVhZCA9ICpyZWFkT3BlcmF0aW9uOworICAgICAgICBtX2FjdGl2ZVJlYWRPcGVyYXRpb25z
LmFkZChXVEY6Om1vdmUocmVhZE9wZXJhdGlvbikpOworICAgICAgICBkaXNwYXRjaFJlYWRPcGVy
YXRpb24ocmVhZCk7CisgICAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCByZXRyaWV2
ZUZyb21NZW1vcnkoY29uc3QgVCYgb3BlcmF0aW9ucywgY29uc3QgS2V5JiBrZXksIFN0b3JhZ2U6
OlJldHJpZXZlQ29tcGxldGlvbkhhbmRsZXImIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIGZv
ciAoYXV0byYgb3BlcmF0aW9uIDogb3BlcmF0aW9ucykgeworICAgICAgICBpZiAob3BlcmF0aW9u
LT5lbnRyeS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFn
ZSwgIihOZXR3b3JrUHJvY2VzcykgZm91bmQgd3JpdGUgb3BlcmF0aW9uIGluIHByb2dyZXNzIik7
CisgICAgICAgICAgICBhdXRvIGVudHJ5ID0gb3BlcmF0aW9uLT5lbnRyeTsKKyAgICAgICAgICAg
IFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbZW50cnksIGNvbXBsZXRpb25IYW5kbGVyXSB7Cisg
ICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoc3RkOjptYWtlX3VuaXF1ZTxTdG9yYWdl
OjpFbnRyeT4oZW50cnkpKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFN0b3Jh
Z2U6OnJldHJpZXZlKGNvbnN0IEtleSYga2V5LCB1bnNpZ25lZCBwcmlvcml0eSwgUmV0cmlldmVD
b21wbGV0aW9uSGFuZGxlciYmIGNvbXBsZXRpb25IYW5kbGVyKQoreworICAgIEFTU0VSVChSdW5M
b29wOjppc01haW4oKSk7CisgICAgQVNTRVJUKHByaW9yaXR5IDw9IG1heGltdW1SZXRyaWV2ZVBy
aW9yaXR5KTsKKyAgICBBU1NFUlQoIWtleS5pc051bGwoKSk7CisKKyAgICBpZiAoIW1fbWF4aW11
bVNpemUpIHsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbihrZXku
c2hvcnRIYXNoKCkpKSB7CisgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyKG51bGxwdHIpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHJldHJpZXZlRnJvbU1lbW9yeShtX3BlbmRp
bmdXcml0ZU9wZXJhdGlvbnMsIGtleSwgY29tcGxldGlvbkhhbmRsZXIpKQorICAgICAgICByZXR1
cm47CisgICAgaWYgKHJldHJpZXZlRnJvbU1lbW9yeShtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucywg
a2V5LCBjb21wbGV0aW9uSGFuZGxlcikpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcGVuZGlu
Z1JlYWRPcGVyYXRpb25zQnlQcmlvcml0eVtwcmlvcml0eV0uYXBwZW5kKG5ldyBSZWFkT3BlcmF0
aW9uIHsga2V5LCBXVEY6Om1vdmUoY29tcGxldGlvbkhhbmRsZXIpIH0pOworICAgIGRpc3BhdGNo
UGVuZGluZ1JlYWRPcGVyYXRpb25zKCk7Cit9CisKK3ZvaWQgU3RvcmFnZTo6c3RvcmUoY29uc3Qg
RW50cnkmIGVudHJ5LCBTdG9yZUNvbXBsZXRpb25IYW5kbGVyJiYgY29tcGxldGlvbkhhbmRsZXIp
Cit7CisgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBBU1NFUlQoIWVudHJ5Lmtl
eS5pc051bGwoKSk7CisKKyAgICBpZiAoIW1fbWF4aW11bVNpemUpIHsKKyAgICAgICAgY29tcGxl
dGlvbkhhbmRsZXIoZmFsc2UsIHsgfSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBt
X3BlbmRpbmdXcml0ZU9wZXJhdGlvbnMuYXBwZW5kKG5ldyBXcml0ZU9wZXJhdGlvbiB7IGVudHJ5
LCB7IH0sIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxlcikgfSk7CisKKyAgICAvLyBBZGQga2V5
IHRvIHRoZSBmaWx0ZXIgYWxyZWFkeSBoZXJlIGFzIHdlIGRvIGxvb2t1cHMgZnJvbSB0aGUgcGVu
ZGluZyBvcGVyYXRpb25zIHRvby4KKyAgICBtX2NvbnRlbnRzRmlsdGVyLmFkZChlbnRyeS5rZXku
c2hvcnRIYXNoKCkpOworCisgICAgZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7Cit9
CisKK3ZvaWQgU3RvcmFnZTo6dXBkYXRlKGNvbnN0IEVudHJ5JiB1cGRhdGVFbnRyeSwgY29uc3Qg
RW50cnkmIGV4aXN0aW5nRW50cnksIFN0b3JlQ29tcGxldGlvbkhhbmRsZXImJiBjb21wbGV0aW9u
SGFuZGxlcikKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworICAgIEFTU0VSVCgh
ZXhpc3RpbmdFbnRyeS5rZXkuaXNOdWxsKCkpOworICAgIEFTU0VSVChleGlzdGluZ0VudHJ5Lmtl
eSA9PSB1cGRhdGVFbnRyeS5rZXkpOworCisgICAgaWYgKCFtX21heGltdW1TaXplKSB7CisgICAg
ICAgIGNvbXBsZXRpb25IYW5kbGVyKGZhbHNlLCB7IH0pOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgbV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLmFwcGVuZChuZXcgV3JpdGVPcGVyYXRp
b24geyB1cGRhdGVFbnRyeSwgZXhpc3RpbmdFbnRyeSwgV1RGOjptb3ZlKGNvbXBsZXRpb25IYW5k
bGVyKSB9KTsKKworICAgIGRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpOworfQorCit2
b2lkIFN0b3JhZ2U6OnRyYXZlcnNlKHN0ZDo6ZnVuY3Rpb248dm9pZCAoY29uc3QgRW50cnkqKT4m
JiB0cmF2ZXJzZUhhbmRsZXIpCit7CisgICAgU3RyaW5nQ2FwdHVyZSBjYWNoZVBhdGhDYXB0dXJl
KG1fZGlyZWN0b3J5UGF0aCk7CisgICAgaW9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBjYWNoZVBh
dGhDYXB0dXJlLCB0cmF2ZXJzZUhhbmRsZXJdIHsKKyAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9
IGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCk7CisgICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhj
YWNoZVBhdGgsIFt0aGlzLCAmdHJhdmVyc2VIYW5kbGVyXShjb25zdCBTdHJpbmcmIGZpbGVOYW1l
LCBjb25zdCBTdHJpbmcmIHBhcnRpdGlvblBhdGgpIHsKKyAgICAgICAgICAgIGF1dG8gZmlsZVBh
dGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGFydGl0aW9uUGF0aCwgZmls
ZU5hbWUpOworICAgICAgICAgICAgYXV0byBjaGFubmVsID0gSU9DaGFubmVsOjpvcGVuKGZpbGVQ
YXRoLCBJT0NoYW5uZWw6OlR5cGU6OlJlYWQpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGhl
YWRlclJlYWRTaXplID0gMTYgPDwgMTA7CisgICAgICAgICAgICAvLyBGSVhNRTogVHJhdmVyc2Fs
IGlzIHNsb3dlciB0aGFuIGl0IHNob3VsZCBiZSBkdWUgdG8gbGFjayBvZiBwYXJhbGxlbGlzbS4K
KyAgICAgICAgICAgIGNoYW5uZWwtPnJlYWRTeW5jKDAsIGhlYWRlclJlYWRTaXplLCBbdGhpcywg
JnRyYXZlcnNlSGFuZGxlcl0oRGF0YSYgZmlsZURhdGEsIGludCkgeworICAgICAgICAgICAgICAg
IEVudHJ5TWV0YURhdGEgbWV0YURhdGE7CisgICAgICAgICAgICAgICAgRGF0YSBoZWFkZXJEYXRh
OworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVFbnRyeUhlYWRlcihmaWxlRGF0YSwgbWV0YURh
dGEsIGhlYWRlckRhdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5IGVudHJ5IHsgbWV0
YURhdGEua2V5LCBtZXRhRGF0YS50aW1lU3RhbXAsIGhlYWRlckRhdGEsIHsgfSB9OworICAgICAg
ICAgICAgICAgICAgICB0cmF2ZXJzZUhhbmRsZXIoJmVudHJ5KTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5k
aXNwYXRjaChbdGhpcywgdHJhdmVyc2VIYW5kbGVyXSB7CisgICAgICAgICAgICB0cmF2ZXJzZUhh
bmRsZXIobnVsbHB0cik7CisgICAgICAgIH0pOworICAgIH0pOworfQorCit2b2lkIFN0b3JhZ2U6
OmRpc3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpCit7CisgICAgQVNTRVJUKFJ1bkxvb3A6
OmlzTWFpbigpKTsKKworICAgIGNvbnN0IGludCBtYXhpbXVtQWN0aXZlV3JpdGVPcGVyYXRpb25D
b3VudCB7IDMgfTsKKworICAgIHdoaWxlICghbV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLmlzRW1w
dHkoKSkgeworICAgICAgICBpZiAobV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMuc2l6ZSgpID49IG1h
eGltdW1BY3RpdmVXcml0ZU9wZXJhdGlvbkNvdW50KSB7CisgICAgICAgICAgICBMT0coTmV0d29y
a0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgbGltaXRpbmcgcGFyYWxsZWwgd3JpdGVz
Iik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYXV0byB3cml0ZU9w
ZXJhdGlvbiA9IG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy50YWtlRmlyc3QoKTsKKyAgICAgICAg
YXV0byYgd3JpdGUgPSAqd3JpdGVPcGVyYXRpb247CisgICAgICAgIG1fYWN0aXZlV3JpdGVPcGVy
YXRpb25zLmFkZChXVEY6Om1vdmUod3JpdGVPcGVyYXRpb24pKTsKKworICAgICAgICBpZiAod3Jp
dGUuZXhpc3RpbmdFbnRyeSAmJiBtX2NvbnRlbnRzRmlsdGVyLm1heUNvbnRhaW4od3JpdGUuZW50
cnkua2V5LnNob3J0SGFzaCgpKSkgeworICAgICAgICAgICAgZGlzcGF0Y2hIZWFkZXJXcml0ZU9w
ZXJhdGlvbih3cml0ZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAg
ICBkaXNwYXRjaEZ1bGxXcml0ZU9wZXJhdGlvbih3cml0ZSk7CisgICAgfQorfQorCit2b2lkIFN0
b3JhZ2U6OmRpc3BhdGNoRnVsbFdyaXRlT3BlcmF0aW9uKGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3
cml0ZSkKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOworICAgIEFTU0VSVChtX2Fj
dGl2ZVdyaXRlT3BlcmF0aW9ucy5jb250YWlucygmd3JpdGUpKTsKKworICAgIGlmICghbV9jb250
ZW50c0ZpbHRlci5tYXlDb250YWluKHdyaXRlLmVudHJ5LmtleS5zaG9ydEhhc2goKSkpCisgICAg
ICAgIG1fY29udGVudHNGaWx0ZXIuYWRkKHdyaXRlLmVudHJ5LmtleS5zaG9ydEhhc2goKSk7CisK
KyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKKyAg
ICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hlUGF0aENh
cHR1cmVdIHsKKyAgICAgICAgYXV0byBlbmNvZGVkSGVhZGVyID0gZW5jb2RlRW50cnlIZWFkZXIo
d3JpdGUuZW50cnkpOworICAgICAgICBhdXRvIGhlYWRlckFuZEJvZHlEYXRhID0gY29uY2F0ZW5h
dGUoZW5jb2RlZEhlYWRlciwgd3JpdGUuZW50cnkuYm9keSk7CisKKyAgICAgICAgYXV0byBjaGFu
bmVsID0gb3BlbkZpbGVGb3JLZXkod3JpdGUuZW50cnkua2V5LCBJT0NoYW5uZWw6OlR5cGU6OkNy
ZWF0ZSwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7CisgICAgICAgIGludCBmZCA9IGNoYW5u
ZWwtPmZpbGVEZXNjcmlwdG9yKCk7CisgICAgICAgIHNpemVfdCBib2R5T2Zmc2V0ID0gZW5jb2Rl
ZEhlYWRlci5zaXplKCk7CisKKyAgICAgICAgY2hhbm5lbC0+d3JpdGUoMCwgaGVhZGVyQW5kQm9k
eURhdGEsIFt0aGlzLCAmd3JpdGUsIGJvZHlPZmZzZXQsIGZkXShpbnQgZXJyb3IpIHsKKyAgICAg
ICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSB3cml0ZSBj
b21wbGV0ZSBlcnJvcj0lZCIsIGVycm9yKTsKKyAgICAgICAgICAgIGlmIChlcnJvcikgeworICAg
ICAgICAgICAgICAgIGlmIChtX2NvbnRlbnRzRmlsdGVyLm1heUNvbnRhaW4od3JpdGUuZW50cnku
a2V5LnNob3J0SGFzaCgpKSkKKyAgICAgICAgICAgICAgICAgICAgbV9jb250ZW50c0ZpbHRlci5y
ZW1vdmUod3JpdGUuZW50cnkua2V5LnNob3J0SGFzaCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIHNpemVfdCBib2R5U2l6ZSA9IHdyaXRlLmVudHJ5LmJvZHkuc2l6ZSgpOworICAgICAg
ICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGJvZHlPZmZzZXQgKyBib2R5U2l6ZTsKKworICAgICAg
ICAgICAgbV9hcHByb3hpbWF0ZVNpemUgKz0gdG90YWxTaXplOworCisgICAgICAgICAgICBib29s
IHNob3VsZE1hcEJvZHkgPSAhZXJyb3IgJiYgYm9keVNpemUgPj0gcGFnZVNpemUoKTsKKyAgICAg
ICAgICAgIGF1dG8gYm9keU1hcCA9IHNob3VsZE1hcEJvZHkgPyBtYXBGaWxlKGZkLCBib2R5T2Zm
c2V0LCBib2R5U2l6ZSkgOiBEYXRhKCk7CisKKyAgICAgICAgICAgIHdyaXRlLmNvbXBsZXRpb25I
YW5kbGVyKCFlcnJvciwgYm9keU1hcCk7CisKKyAgICAgICAgICAgIEFTU0VSVChtX2FjdGl2ZVdy
aXRlT3BlcmF0aW9ucy5jb250YWlucygmd3JpdGUpKTsKKyAgICAgICAgICAgIG1fYWN0aXZlV3Jp
dGVPcGVyYXRpb25zLnJlbW92ZSgmd3JpdGUpOworICAgICAgICAgICAgZGlzcGF0Y2hQZW5kaW5n
V3JpdGVPcGVyYXRpb25zKCk7CisgICAgICAgIH0pOworICAgIH0pOworCisgICAgc2hyaW5rSWZO
ZWVkZWQoKTsKK30KKwordm9pZCBTdG9yYWdlOjpkaXNwYXRjaEhlYWRlcldyaXRlT3BlcmF0aW9u
KGNvbnN0IFdyaXRlT3BlcmF0aW9uJiB3cml0ZSkKK3sKKyAgICBBU1NFUlQoUnVuTG9vcDo6aXNN
YWluKCkpOworICAgIEFTU0VSVCh3cml0ZS5leGlzdGluZ0VudHJ5KTsKKyAgICBBU1NFUlQobV9h
Y3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7CisgICAgQVNTRVJUKG1fY29u
dGVudHNGaWx0ZXIubWF5Q29udGFpbih3cml0ZS5lbnRyeS5rZXkuc2hvcnRIYXNoKCkpKTsKKwor
ICAgIC8vIFRyeSB0byB1cGRhdGUgdGhlIGhlYWRlciBvZiBhbiBleGlzdGluZyBlbnRyeS4KKyAg
ICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKKyAgICBi
YWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCAmd3JpdGUsIGNhY2hlUGF0aENhcHR1
cmVdIHsKKyAgICAgICAgYXV0byBoZWFkZXJEYXRhID0gZW5jb2RlRW50cnlIZWFkZXIod3JpdGUu
ZW50cnkpOworICAgICAgICBhdXRvIGV4aXN0aW5nSGVhZGVyRGF0YSA9IGVuY29kZUVudHJ5SGVh
ZGVyKHdyaXRlLmV4aXN0aW5nRW50cnkudmFsdWUoKSk7CisKKyAgICAgICAgYm9vbCBwYWdlUm91
bmRlZEhlYWRlclNpemVDaGFuZ2VkID0gaGVhZGVyRGF0YS5zaXplKCkgIT0gZXhpc3RpbmdIZWFk
ZXJEYXRhLnNpemUoKTsKKyAgICAgICAgaWYgKHBhZ2VSb3VuZGVkSGVhZGVyU2l6ZUNoYW5nZWQp
IHsKKyAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNz
KSBwYWdlLXJvdW5kZWQgaGVhZGVyIHNpemUgY2hhbmdlZCwgc3RvcmluZyBmdWxsIGVudHJ5Iik7
CisgICAgICAgICAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZV0gewor
ICAgICAgICAgICAgICAgIGRpc3BhdGNoRnVsbFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKKyAgICAg
ICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXV0
byBjaGFubmVsID0gb3BlbkZpbGVGb3JLZXkod3JpdGUuZW50cnkua2V5LCBJT0NoYW5uZWw6OlR5
cGU6OldyaXRlLCBjYWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKKyAgICAgICAgY2hhbm5lbC0+
d3JpdGUoMCwgaGVhZGVyRGF0YSwgW3RoaXMsICZ3cml0ZV0oaW50IGVycm9yKSB7CisgICAgICAg
ICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgdXBkYXRlIGNv
bXBsZXRlIGVycm9yPSVkIiwgZXJyb3IpOworCisgICAgICAgICAgICBpZiAoZXJyb3IpCisgICAg
ICAgICAgICAgICAgcmVtb3ZlRW50cnkod3JpdGUuZW50cnkua2V5KTsKKworICAgICAgICAgICAg
d3JpdGUuY29tcGxldGlvbkhhbmRsZXIoIWVycm9yLCB7IH0pOworCisgICAgICAgICAgICBBU1NF
UlQobV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMuY29udGFpbnMoJndyaXRlKSk7CisgICAgICAgICAg
ICBtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5yZW1vdmUoJndyaXRlKTsKKyAgICAgICAgICAgIGRp
c3BhdGNoUGVuZGluZ1dyaXRlT3BlcmF0aW9ucygpOworICAgICAgICB9KTsKKyAgICB9KTsKK30K
Kwordm9pZCBTdG9yYWdlOjpzZXRNYXhpbXVtU2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyAgICBBU1NF
UlQoUnVuTG9vcDo6aXNNYWluKCkpOworICAgIG1fbWF4aW11bVNpemUgPSBzaXplOworCisgICAg
c2hyaW5rSWZOZWVkZWQoKTsKK30KKwordm9pZCBTdG9yYWdlOjpjbGVhcigpCit7CisgICAgQVNT
RVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKKyAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihO
ZXR3b3JrUHJvY2VzcykgY2xlYXJpbmcgY2FjaGUiKTsKKworICAgIG1fY29udGVudHNGaWx0ZXIu
Y2xlYXIoKTsKKyAgICBtX2FwcHJveGltYXRlU2l6ZSA9IDA7CisKKyAgICBTdHJpbmdDYXB0dXJl
IGRpcmVjdG9yeVBhdGhDYXB0dXJlKG1fZGlyZWN0b3J5UGF0aCk7CisKKyAgICBpb1F1ZXVlKCku
ZGlzcGF0Y2goW2RpcmVjdG9yeVBhdGhDYXB0dXJlXSB7CisgICAgICAgIFN0cmluZyBkaXJlY3Rv
cnlQYXRoID0gZGlyZWN0b3J5UGF0aENhcHR1cmUuc3RyaW5nKCk7CisgICAgICAgIHRyYXZlcnNl
RGlyZWN0b3J5KGRpcmVjdG9yeVBhdGgsIERUX0RJUiwgWyZkaXJlY3RvcnlQYXRoXShjb25zdCBT
dHJpbmcmIHN1YmRpck5hbWUpIHsKKyAgICAgICAgICAgIFN0cmluZyBzdWJkaXJQYXRoID0gV2Vi
Q29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGRpcmVjdG9yeVBhdGgsIHN1YmRpck5hbWUp
OworICAgICAgICAgICAgdHJhdmVyc2VEaXJlY3Rvcnkoc3ViZGlyUGF0aCwgRFRfUkVHLCBbJnN1
YmRpclBhdGhdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICAgICAgICAgICAgICBXZWJD
b3JlOjpkZWxldGVGaWxlKFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChzdWJkaXJQ
YXRoLCBmaWxlTmFtZSkpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBXZWJDb3JlOjpk
ZWxldGVFbXB0eURpcmVjdG9yeShzdWJkaXJQYXRoKTsKKyAgICAgICAgfSk7CisgICAgfSk7Cit9
CisKK3ZvaWQgU3RvcmFnZTo6c2hyaW5rSWZOZWVkZWQoKQoreworICAgIEFTU0VSVChSdW5Mb29w
Ojppc01haW4oKSk7CisKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGRlbGV0aW9uUHJvYmFiaWxp
dHkgeyAwLjI1IH07CisKKyAgICBpZiAobV9hcHByb3hpbWF0ZVNpemUgPD0gbV9tYXhpbXVtU2l6
ZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChtX3Nocmlua0luUHJvZ3Jlc3MpCisgICAgICAg
IHJldHVybjsKKyAgICBtX3Nocmlua0luUHJvZ3Jlc3MgPSB0cnVlOworCisgICAgTE9HKE5ldHdv
cmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNocmlua2luZyBjYWNoZSBhcHByb3hp
bWF0ZVNpemU9JWQsIG1fbWF4aW11bVNpemU9JWQiLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fYXBw
cm94aW1hdGVTaXplKSwgbV9tYXhpbXVtU2l6ZSk7CisKKyAgICBtX2FwcHJveGltYXRlU2l6ZSA9
IDA7CisKKyAgICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRo
KTsKKyAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBjYWNoZVBhdGhDYXB0
dXJlXSB7CisgICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBjYWNoZVBhdGhDYXB0dXJlLnN0cmlu
ZygpOworICAgICAgICB0cmF2ZXJzZUNhY2hlRmlsZXMoY2FjaGVQYXRoLCBbdGhpc10oY29uc3Qg
U3RyaW5nJiBmaWxlTmFtZSwgY29uc3QgU3RyaW5nJiBwYXJ0aXRpb25QYXRoKSB7CisgICAgICAg
ICAgICBhdXRvIGZpbGVQYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBh
cnRpdGlvblBhdGgsIGZpbGVOYW1lKTsKKworICAgICAgICAgICAgYm9vbCBzaG91bGREZWxldGUg
PSByYW5kb21OdW1iZXIoKSA8IGRlbGV0aW9uUHJvYmFiaWxpdHk7CisgICAgICAgICAgICBpZiAo
IXNob3VsZERlbGV0ZSkgeworICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBmaWxlU2l6ZSA9IDA7
CisgICAgICAgICAgICAgICAgV2ViQ29yZTo6Z2V0RmlsZVNpemUoZmlsZVBhdGgsIGZpbGVTaXpl
KTsKKyAgICAgICAgICAgICAgICBtX2FwcHJveGltYXRlU2l6ZSArPSBmaWxlU2l6ZTsKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdlYkNvcmU6
OmRlbGV0ZUZpbGUoZmlsZVBhdGgpOworICAgICAgICAgICAgS2V5OjpIYXNoVHlwZSBoYXNoOwor
ICAgICAgICAgICAgaWYgKCFLZXk6OnN0cmluZ1RvSGFzaChmaWxlTmFtZSwgaGFzaCkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgdW5zaWduZWQgc2hvcnRIYXNoID0gS2V5
Ojp0b1Nob3J0SGFzaChoYXNoKTsKKyAgICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRj
aChbdGhpcywgc2hvcnRIYXNoXSB7CisgICAgICAgICAgICAgICAgaWYgKG1fY29udGVudHNGaWx0
ZXIubWF5Q29udGFpbihzaG9ydEhhc2gpKQorICAgICAgICAgICAgICAgICAgICBtX2NvbnRlbnRz
RmlsdGVyLnJlbW92ZShzaG9ydEhhc2gpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0pOwor
CisgICAgICAgIC8vIExldCBzeXN0ZW0gZmlndXJlIG91dCBpZiB0aGV5IGFyZSByZWFsbHkgZW1w
dHkuCisgICAgICAgIHRyYXZlcnNlRGlyZWN0b3J5KGNhY2hlUGF0aCwgRFRfRElSLCBbJmNhY2hl
UGF0aF0oY29uc3QgU3RyaW5nJiBzdWJkaXJOYW1lKSB7CisgICAgICAgICAgICBhdXRvIHBhcnRp
dGlvblBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoY2FjaGVQYXRoLCBz
dWJkaXJOYW1lKTsKKyAgICAgICAgICAgIFdlYkNvcmU6OmRlbGV0ZUVtcHR5RGlyZWN0b3J5KHBh
cnRpdGlvblBhdGgpOworICAgICAgICB9KTsKKworICAgICAgICBtX3Nocmlua0luUHJvZ3Jlc3Mg
PSBmYWxzZTsKKworICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJv
Y2VzcykgY2FjaGUgc2hyaW5rIGNvbXBsZXRlZCBhcHByb3hpbWF0ZVNpemU9JWQiLCBzdGF0aWNf
Y2FzdDxzaXplX3Q+KG1fYXBwcm94aW1hdGVTaXplKSk7CisgICAgfSk7Cit9CisKK3ZvaWQgU3Rv
cmFnZTo6ZGVsZXRlT2xkVmVyc2lvbnMoKQoreworICAgIC8vIERlbGV0ZSBWMSBjYWNoZS4KKyAg
ICBTdHJpbmdDYXB0dXJlIGNhY2hlUGF0aENhcHR1cmUobV9iYXNlRGlyZWN0b3J5UGF0aCk7Cisg
ICAgYmFja2dyb3VuZElPUXVldWUoKS5kaXNwYXRjaChbY2FjaGVQYXRoQ2FwdHVyZV0geworICAg
ICAgICBTdHJpbmcgY2FjaGVQYXRoID0gY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKTsKKyAgICAg
ICAgdHJhdmVyc2VEaXJlY3RvcnkoY2FjaGVQYXRoLCBEVF9ESVIsIFsmY2FjaGVQYXRoXShjb25z
dCBTdHJpbmcmIHN1YmRpck5hbWUpIHsKKyAgICAgICAgICAgIGlmIChzdWJkaXJOYW1lLnN0YXJ0
c1dpdGgodmVyc2lvbkRpcmVjdG9yeVByZWZpeCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvblBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRp
bmdDb21wb25lbnQoY2FjaGVQYXRoLCBzdWJkaXJOYW1lKTsKKyAgICAgICAgICAgIHRyYXZlcnNl
RGlyZWN0b3J5KHBhcnRpdGlvblBhdGgsIERUX1JFRywgWyZwYXJ0aXRpb25QYXRoXShjb25zdCBT
dHJpbmcmIGZpbGVOYW1lKSB7CisgICAgICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShX
ZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQocGFydGl0aW9uUGF0aCwgZmlsZU5hbWUp
KTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRW1wdHlEaXJl
Y3RvcnkocGFydGl0aW9uUGF0aCk7CisgICAgICAgIH0pOworICAgIH0pOworfQorCit9Cit9CisK
KyNlbmRpZgpJbmRleDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29y
a0NhY2hlU3RvcmFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvTmV0d29ya1By
b2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZS5jcHAJKHdvcmtpbmcgY29weSkKKysrIFNv
dXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2NhY2hlL05ldHdvcmtDYWNoZVN0b3JhZ2UuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC01NzMsNyArNTczLDcgQEAgdm9pZCBTdG9yYWdlOjpzaHJpbmtJ
Zk5lZWRlZCgpCiAgICAgICAgIHJldHVybjsKICAgICBtX3Nocmlua0luUHJvZ3Jlc3MgPSB0cnVl
OwogCi0gICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNocmlu
a2luZyBjYWNoZSBhcHByb3hpbWF0ZVNpemU9JWQsIG1fbWF4aW11bVNpemU9JWQiLCBzdGF0aWNf
Y2FzdDxzaXplX3Q+KG1fYXBwcm94aW1hdGVTaXplKSwgbV9tYXhpbXVtU2l6ZSk7CisgICAgTE9H
KE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHNocmlua2luZyBjYWNoZSBh
cHByb3hpbWF0ZVNpemU9JXp1LCBtX21heGltdW1TaXplPSV6dSIsIHN0YXRpY19jYXN0PHNpemVf
dD4obV9hcHByb3hpbWF0ZVNpemUpLCBtX21heGltdW1TaXplKTsKIAogICAgIG1fYXBwcm94aW1h
dGVTaXplID0gMDsKIApAQCAtNjEwLDcgKzYxMCw3IEBAIHZvaWQgU3RvcmFnZTo6c2hyaW5rSWZO
ZWVkZWQoKQogCiAgICAgICAgIG1fc2hyaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCi0gICAgICAg
IExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBjYWNoZSBzaHJpbmsg
Y29tcGxldGVkIGFwcHJveGltYXRlU2l6ZT0lZCIsIHN0YXRpY19jYXN0PHNpemVfdD4obV9hcHBy
b3hpbWF0ZVNpemUpKTsKKyAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29y
a1Byb2Nlc3MpIGNhY2hlIHNocmluayBjb21wbGV0ZWQgYXBwcm94aW1hdGVTaXplPSV6dSIsIHN0
YXRpY19jYXN0PHNpemVfdD4obV9hcHByb3hpbWF0ZVNpemUpKTsKICAgICB9KTsKIH0KIApJbmRl
eDogU291cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFn
ZUNvY29hLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQyL05ldHdvcmtQcm9jZXNzL2Nh
Y2hlL05ldHdvcmtDYWNoZVN0b3JhZ2VDb2NvYS5tbQkocmV2aXNpb24gMTgxMTYxKQorKysgU291
cmNlL1dlYktpdDIvTmV0d29ya1Byb2Nlc3MvY2FjaGUvTmV0d29ya0NhY2hlU3RvcmFnZUNvY29h
Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDE0LTIwMTUgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
LSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycKLSAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YKLSAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0j
aW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiTmV0d29ya0NhY2hlU3RvcmFnZS5oIgotCi0j
aWYgRU5BQkxFKE5FVFdPUktfQ0FDSEUpCi0KLSNpbmNsdWRlICJMb2dnaW5nLmgiCi0jaW5jbHVk
ZSAiTmV0d29ya0NhY2hlQ29kZXJzLmgiCi0jaW5jbHVkZSAiTmV0d29ya0NhY2hlRmlsZVN5c3Rl
bVBvc2l4LmgiCi0jaW5jbHVkZSAiTmV0d29ya0NhY2hlSU9DaGFubmVsLmgiCi0jaW5jbHVkZSA8
d3RmL1BhZ2VCbG9jay5oPgotI2luY2x1ZGUgPHd0Zi9SYW5kb21OdW1iZXIuaD4KLSNpbmNsdWRl
IDx3dGYvUnVuTG9vcC5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KLSNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotbmFtZXNw
YWNlIE5ldHdvcmtDYWNoZSB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIG5ldHdvcmtDYWNoZVN1YmRp
cmVjdG9yeVtdID0gIldlYktpdENhY2hlIjsKLXN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25EaXJl
Y3RvcnlQcmVmaXhbXSA9ICJWZXJzaW9uICI7Ci0KLXN0ZDo6dW5pcXVlX3B0cjxTdG9yYWdlPiBT
dG9yYWdlOjpvcGVuKGNvbnN0IFN0cmluZyYgY2FjaGVQYXRoKQotewotICAgIEFTU0VSVChSdW5M
b29wOjppc01haW4oKSk7Ci0KLSAgICBTdHJpbmcgbmV0d29ya0NhY2hlUGF0aCA9IFdlYkNvcmU6
OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChjYWNoZVBhdGgsIG5ldHdvcmtDYWNoZVN1YmRpcmVj
dG9yeSk7Ci0gICAgaWYgKCFXZWJDb3JlOjptYWtlQWxsRGlyZWN0b3JpZXMobmV0d29ya0NhY2hl
UGF0aCkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9w
dHI8U3RvcmFnZT4obmV3IFN0b3JhZ2UobmV0d29ya0NhY2hlUGF0aCkpOwotfQotCi1zdGF0aWMg
U3RyaW5nIG1ha2VWZXJzaW9uZWREaXJlY3RvcnlQYXRoKGNvbnN0IFN0cmluZyYgYmFzZURpcmVj
dG9yeVBhdGgpCi17Ci0gICAgU3RyaW5nIHZlcnNpb25TdWJkaXJlY3RvcnkgPSB2ZXJzaW9uRGly
ZWN0b3J5UHJlZml4ICsgU3RyaW5nOjpudW1iZXIoU3RvcmFnZTo6dmVyc2lvbik7Ci0gICAgcmV0
dXJuIFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChiYXNlRGlyZWN0b3J5UGF0aCwg
dmVyc2lvblN1YmRpcmVjdG9yeSk7Ci19Ci0KLVN0b3JhZ2U6OlN0b3JhZ2UoY29uc3QgU3RyaW5n
JiBiYXNlRGlyZWN0b3J5UGF0aCkKLSAgICA6IG1fYmFzZURpcmVjdG9yeVBhdGgoYmFzZURpcmVj
dG9yeVBhdGgpCi0gICAgLCBtX2RpcmVjdG9yeVBhdGgobWFrZVZlcnNpb25lZERpcmVjdG9yeVBh
dGgoYmFzZURpcmVjdG9yeVBhdGgpKQotICAgICwgbV9pb1F1ZXVlKFdvcmtRdWV1ZTo6Y3JlYXRl
KCJjb20uYXBwbGUuV2ViS2l0LkNhY2hlLlN0b3JhZ2UiLCBXb3JrUXVldWU6OlR5cGU6OkNvbmN1
cnJlbnQpKQotICAgICwgbV9iYWNrZ3JvdW5kSU9RdWV1ZShXb3JrUXVldWU6OmNyZWF0ZSgiY29t
LmFwcGxlLldlYktpdC5DYWNoZS5TdG9yYWdlIiwgV29ya1F1ZXVlOjpUeXBlOjpDb25jdXJyZW50
LCBXb3JrUXVldWU6OlFPUzo6QmFja2dyb3VuZCkpCi17Ci0gICAgZGVsZXRlT2xkVmVyc2lvbnMo
KTsKLSAgICBpbml0aWFsaXplKCk7Ci19Ci0KLXZvaWQgU3RvcmFnZTo6aW5pdGlhbGl6ZSgpCi17
Ci0gICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLQotICAgIFN0cmluZ0NhcHR1cmUgY2Fj
aGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBhdGgpOwotCi0gICAgYmFja2dyb3VuZElPUXVldWUo
KS5kaXNwYXRjaChbdGhpcywgY2FjaGVQYXRoQ2FwdHVyZV0gewotICAgICAgICBTdHJpbmcgY2Fj
aGVQYXRoID0gY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKTsKLSAgICAgICAgdHJhdmVyc2VDYWNo
ZUZpbGVzKGNhY2hlUGF0aCwgW3RoaXNdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IFN0
cmluZyYgcGFydGl0aW9uUGF0aCkgewotICAgICAgICAgICAgS2V5OjpIYXNoVHlwZSBoYXNoOwot
ICAgICAgICAgICAgaWYgKCFLZXk6OnN0cmluZ1RvSGFzaChmaWxlTmFtZSwgaGFzaCkpCi0gICAg
ICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnRIYXNoID0gS2V5
Ojp0b1Nob3J0SGFzaChoYXNoKTsKLSAgICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRj
aChbdGhpcywgc2hvcnRIYXNoXSB7Ci0gICAgICAgICAgICAgICAgbV9jb250ZW50c0ZpbHRlci5h
ZGQoc2hvcnRIYXNoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgYXV0byBmaWxlUGF0
aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRoLCBmaWxl
TmFtZSk7Ci0gICAgICAgICAgICBsb25nIGxvbmcgZmlsZVNpemUgPSAwOwotICAgICAgICAgICAg
V2ViQ29yZTo6Z2V0RmlsZVNpemUoZmlsZVBhdGgsIGZpbGVTaXplKTsKLSAgICAgICAgICAgIG1f
YXBwcm94aW1hdGVTaXplICs9IGZpbGVTaXplOwotICAgICAgICB9KTsKLSAgICB9KTsKLX0KLQot
c3RhdGljIFN0cmluZyBkaXJlY3RvcnlQYXRoRm9yS2V5KGNvbnN0IEtleSYga2V5LCBjb25zdCBT
dHJpbmcmIGNhY2hlUGF0aCkKLXsKLSAgICBBU1NFUlQoIWtleS5wYXJ0aXRpb24oKS5pc0VtcHR5
KCkpOwotICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoY2FjaGVQ
YXRoLCBrZXkucGFydGl0aW9uKCkpOwotfQotCi1zdGF0aWMgU3RyaW5nIGZpbGVOYW1lRm9yS2V5
KGNvbnN0IEtleSYga2V5KQotewotICAgIHJldHVybiBrZXkuaGFzaEFzU3RyaW5nKCk7Ci19Ci0K
LXN0YXRpYyBTdHJpbmcgZmlsZVBhdGhGb3JLZXkoY29uc3QgS2V5JiBrZXksIGNvbnN0IFN0cmlu
ZyYgY2FjaGVQYXRoKQotewotICAgIHJldHVybiBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21w
b25lbnQoZGlyZWN0b3J5UGF0aEZvcktleShrZXksIGNhY2hlUGF0aCksIGZpbGVOYW1lRm9yS2V5
KGtleSkpOwotfQotCi1zdGF0aWMgUmVmPElPQ2hhbm5lbD4gb3BlbkZpbGVGb3JLZXkoY29uc3Qg
S2V5JiBrZXksIElPQ2hhbm5lbDo6VHlwZSB0eXBlLCBjb25zdCBTdHJpbmcmIGNhY2hlUGF0aCkK
LXsKLSAgICBhdXRvIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoRm9yS2V5KGtleSwgY2Fj
aGVQYXRoKTsKLSAgICBhdXRvIGZpbGVQYXRoID0gV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29t
cG9uZW50KGRpcmVjdG9yeVBhdGgsIGZpbGVOYW1lRm9yS2V5KGtleSkpOwotICAgIGlmICh0eXBl
ID09IElPQ2hhbm5lbDo6VHlwZTo6Q3JlYXRlKQotICAgICAgICBXZWJDb3JlOjptYWtlQWxsRGly
ZWN0b3JpZXMoZGlyZWN0b3J5UGF0aCk7Ci0gICAgcmV0dXJuIElPQ2hhbm5lbDo6b3BlbihmaWxl
UGF0aCwgdHlwZSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBoYXNoRGF0YShjb25zdCBEYXRhJiBk
YXRhKQotewotICAgIFN0cmluZ0hhc2hlciBoYXNoZXI7Ci0gICAgZGF0YS5hcHBseShbJmhhc2hl
cl0oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgaGFzaGVyLmFk
ZENoYXJhY3RlcnMoZGF0YSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0pOwot
ICAgIHJldHVybiBoYXNoZXIuaGFzaCgpOwotfQotCi1zdHJ1Y3QgRW50cnlNZXRhRGF0YSB7Ci0g
ICAgRW50cnlNZXRhRGF0YSgpIHsgfQotICAgIGV4cGxpY2l0IEVudHJ5TWV0YURhdGEoY29uc3Qg
S2V5JiBrZXkpCi0gICAgICAgIDogY2FjaGVTdG9yYWdlVmVyc2lvbihTdG9yYWdlOjp2ZXJzaW9u
KQotICAgICAgICAsIGtleShrZXkpCi0gICAgeyB9Ci0KLSAgICB1bnNpZ25lZCBjYWNoZVN0b3Jh
Z2VWZXJzaW9uOwotICAgIEtleSBrZXk7Ci0gICAgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyB0
aW1lU3RhbXA7Ci0gICAgdW5zaWduZWQgaGVhZGVyQ2hlY2tzdW07Ci0gICAgdWludDY0X3QgaGVh
ZGVyT2Zmc2V0OwotICAgIHVpbnQ2NF90IGhlYWRlclNpemU7Ci0gICAgdW5zaWduZWQgYm9keUNo
ZWNrc3VtOwotICAgIHVpbnQ2NF90IGJvZHlPZmZzZXQ7Ci0gICAgdWludDY0X3QgYm9keVNpemU7
Ci19OwotCi1zdGF0aWMgYm9vbCBkZWNvZGVFbnRyeU1ldGFEYXRhKEVudHJ5TWV0YURhdGEmIG1l
dGFEYXRhLCBjb25zdCBEYXRhJiBmaWxlRGF0YSkKLXsKLSAgICBib29sIHN1Y2Nlc3MgPSBmYWxz
ZTsKLSAgICBmaWxlRGF0YS5hcHBseShbJm1ldGFEYXRhLCAmc3VjY2Vzc10oY29uc3QgdWludDhf
dCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgRGVjb2RlciBkZWNvZGVyKGRhdGEsIHNp
emUpOwotICAgICAgICBpZiAoIWRlY29kZXIuZGVjb2RlKG1ldGFEYXRhLmNhY2hlU3RvcmFnZVZl
cnNpb24pKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWRlY29kZXIu
ZGVjb2RlKG1ldGFEYXRhLmtleSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEudGltZVN0YW1wKSkKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRhRGF0YS5oZWFkZXJD
aGVja3N1bSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghZGVjb2Rl
ci5kZWNvZGUobWV0YURhdGEuaGVhZGVyU2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIGlmICghZGVjb2Rlci5kZWNvZGUobWV0YURhdGEuYm9keUNoZWNrc3VtKSkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFkZWNvZGVyLmRlY29kZShtZXRh
RGF0YS5ib2R5U2l6ZSkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICgh
ZGVjb2Rlci52ZXJpZnlDaGVja3N1bSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICBtZXRhRGF0YS5oZWFkZXJPZmZzZXQgPSBkZWNvZGVyLmN1cnJlbnRPZmZzZXQoKTsKLSAg
ICAgICAgbWV0YURhdGEuYm9keU9mZnNldCA9IFdURjo6cm91bmRVcFRvTXVsdGlwbGVPZihwYWdl
U2l6ZSgpLCBtZXRhRGF0YS5oZWFkZXJPZmZzZXQgKyBtZXRhRGF0YS5oZWFkZXJTaXplKTsKLSAg
ICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9KTsKLSAg
ICByZXR1cm4gc3VjY2VzczsKLX0KLQotc3RhdGljIGJvb2wgZGVjb2RlRW50cnlIZWFkZXIoY29u
c3QgRGF0YSYgZmlsZURhdGEsIEVudHJ5TWV0YURhdGEmIG1ldGFEYXRhLCBEYXRhJiBkYXRhKQot
ewotICAgIGlmICghZGVjb2RlRW50cnlNZXRhRGF0YShtZXRhRGF0YSwgZmlsZURhdGEpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG1ldGFEYXRhLmNhY2hlU3RvcmFnZVZlcnNpb24g
IT0gU3RvcmFnZTo6dmVyc2lvbikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChtZXRh
RGF0YS5oZWFkZXJPZmZzZXQgKyBtZXRhRGF0YS5oZWFkZXJTaXplID4gbWV0YURhdGEuYm9keU9m
ZnNldCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYXV0byBoZWFkZXJEYXRhID0gZmls
ZURhdGEuc3VicmFuZ2UobWV0YURhdGEuaGVhZGVyT2Zmc2V0LCBtZXRhRGF0YS5oZWFkZXJTaXpl
KTsKLSAgICBpZiAobWV0YURhdGEuaGVhZGVyQ2hlY2tzdW0gIT0gaGFzaERhdGEoaGVhZGVyRGF0
YSkpIHsKLSAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3Mp
IGhlYWRlciBjaGVja3N1bSBtaXNtYXRjaCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIGRhdGEgPSB7IGhlYWRlckRhdGEgfTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3Rh
dGljIHN0ZDo6dW5pcXVlX3B0cjxTdG9yYWdlOjpFbnRyeT4gZGVjb2RlRW50cnkoY29uc3QgRGF0
YSYgZmlsZURhdGEsIGludCBmZCwgY29uc3QgS2V5JiBrZXkpCi17Ci0gICAgRW50cnlNZXRhRGF0
YSBtZXRhRGF0YTsKLSAgICBEYXRhIGhlYWRlckRhdGE7Ci0gICAgaWYgKCFkZWNvZGVFbnRyeUhl
YWRlcihmaWxlRGF0YSwgbWV0YURhdGEsIGhlYWRlckRhdGEpKQotICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLQotICAgIGlmIChtZXRhRGF0YS5rZXkgIT0ga2V5KQotICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICBpZiAobWV0YURhdGEuYm9keU9mZnNldCArIG1ldGFEYXRhLmJvZHlTaXplICE9
IGZpbGVEYXRhLnNpemUoKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICBhdXRvIGJv
ZHlEYXRhID0gbWFwRmlsZShmZCwgbWV0YURhdGEuYm9keU9mZnNldCwgbWV0YURhdGEuYm9keVNp
emUpOwotICAgIGlmIChib2R5RGF0YS5pc051bGwoKSkgewotICAgICAgICBMT0coTmV0d29ya0Nh
Y2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2VzcykgbWFwIGZhaWxlZCIpOwotICAgICAgICByZXR1
cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpZiAobWV0YURhdGEuYm9keUNoZWNrc3VtICE9IGhh
c2hEYXRhKGJvZHlEYXRhKSkgewotICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihO
ZXR3b3JrUHJvY2VzcykgZGF0YSBjaGVja3N1bSBtaXNtYXRjaCIpOwotICAgICAgICByZXR1cm4g
bnVsbHB0cjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxTdG9yYWdlOjpF
bnRyeT4oU3RvcmFnZTo6RW50cnkgewotICAgICAgICBtZXRhRGF0YS5rZXksCi0gICAgICAgIG1l
dGFEYXRhLnRpbWVTdGFtcCwKLSAgICAgICAgaGVhZGVyRGF0YSwKLSAgICAgICAgYm9keURhdGEK
LSAgICB9KTsKLX0KLQotc3RhdGljIERhdGEgZW5jb2RlRW50cnlNZXRhRGF0YShjb25zdCBFbnRy
eU1ldGFEYXRhJiBlbnRyeSkKLXsKLSAgICBFbmNvZGVyIGVuY29kZXI7Ci0KLSAgICBlbmNvZGVy
IDw8IGVudHJ5LmNhY2hlU3RvcmFnZVZlcnNpb247Ci0gICAgZW5jb2RlciA8PCBlbnRyeS5rZXk7
Ci0gICAgZW5jb2RlciA8PCBlbnRyeS50aW1lU3RhbXA7Ci0gICAgZW5jb2RlciA8PCBlbnRyeS5o
ZWFkZXJDaGVja3N1bTsKLSAgICBlbmNvZGVyIDw8IGVudHJ5LmhlYWRlclNpemU7Ci0gICAgZW5j
b2RlciA8PCBlbnRyeS5ib2R5Q2hlY2tzdW07Ci0gICAgZW5jb2RlciA8PCBlbnRyeS5ib2R5U2l6
ZTsKLQotICAgIGVuY29kZXIuZW5jb2RlQ2hlY2tzdW0oKTsKLQotICAgIHJldHVybiBEYXRhKGVu
Y29kZXIuYnVmZmVyKCksIGVuY29kZXIuYnVmZmVyU2l6ZSgpKTsKLX0KLQotc3RhdGljIERhdGEg
ZW5jb2RlRW50cnlIZWFkZXIoY29uc3QgU3RvcmFnZTo6RW50cnkmIGVudHJ5KQotewotICAgIEVu
dHJ5TWV0YURhdGEgbWV0YURhdGEoZW50cnkua2V5KTsKLSAgICBtZXRhRGF0YS50aW1lU3RhbXAg
PSBlbnRyeS50aW1lU3RhbXA7Ci0gICAgbWV0YURhdGEuaGVhZGVyQ2hlY2tzdW0gPSBoYXNoRGF0
YShlbnRyeS5oZWFkZXIpOwotICAgIG1ldGFEYXRhLmhlYWRlclNpemUgPSBlbnRyeS5oZWFkZXIu
c2l6ZSgpOwotICAgIG1ldGFEYXRhLmJvZHlDaGVja3N1bSA9IGhhc2hEYXRhKGVudHJ5LmJvZHkp
OwotICAgIG1ldGFEYXRhLmJvZHlTaXplID0gZW50cnkuYm9keS5zaXplKCk7Ci0KLSAgICBhdXRv
IGVuY29kZWRNZXRhRGF0YSA9IGVuY29kZUVudHJ5TWV0YURhdGEobWV0YURhdGEpOwotICAgIGF1
dG8gaGVhZGVyRGF0YSA9IGNvbmNhdGVuYXRlKGVuY29kZWRNZXRhRGF0YSwgZW50cnkuaGVhZGVy
KTsKLSAgICBpZiAoIWVudHJ5LmJvZHkuc2l6ZSgpKQotICAgICAgICByZXR1cm4geyBoZWFkZXJE
YXRhIH07Ci0KLSAgICBzaXplX3QgZGF0YU9mZnNldCA9IFdURjo6cm91bmRVcFRvTXVsdGlwbGVP
ZihwYWdlU2l6ZSgpLCBoZWFkZXJEYXRhLnNpemUoKSk7Ci0gICAgVmVjdG9yPHVpbnQ4X3QsIDQw
OTY+IGZpbGxlcihkYXRhT2Zmc2V0IC0gaGVhZGVyRGF0YS5zaXplKCksIDApOwotICAgIERhdGEg
YWxpZ25tZW50RGF0YShmaWxsZXIuZGF0YSgpLCBmaWxsZXIuc2l6ZSgpKTsKLQotICAgIHJldHVy
biBjb25jYXRlbmF0ZShoZWFkZXJEYXRhLCBhbGlnbm1lbnREYXRhKTsKLX0KLQotdm9pZCBTdG9y
YWdlOjpyZW1vdmVFbnRyeShjb25zdCBLZXkmIGtleSkKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6
aXNNYWluKCkpOwotCi0gICAgLy8gRm9yIHNpbXBsaWNpdHkgd2UgZG9uJ3QgcmVkdWNlIG1fYXBw
cm94aW1hdGVTaXplIG9uIHJlbW92YWxzIGNhdXNlZCBieSBsb2FkIG9yIGRlY29kZSBlcnJvcnMu
Ci0gICAgLy8gVGhlIG5leHQgY2FjaGUgc2hyaW5rIHdpbGwgdXBkYXRlIHRoZSBzaXplLgotCi0g
ICAgaWYgKG1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbihrZXkuc2hvcnRIYXNoKCkpKQotICAg
ICAgICBtX2NvbnRlbnRzRmlsdGVyLnJlbW92ZShrZXkuc2hvcnRIYXNoKCkpOwotCi0gICAgU3Ry
aW5nQ2FwdHVyZSBmaWxlUGF0aENhcHR1cmUoZmlsZVBhdGhGb3JLZXkoa2V5LCBtX2RpcmVjdG9y
eVBhdGgpKTsKLSAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFt0aGlzLCBmaWxlUGF0
aENhcHR1cmVdIHsKLSAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShmaWxlUGF0aENhcHR1cmUu
c3RyaW5nKCkpOwotICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2U6OmRpc3BhdGNoUmVhZE9wZXJh
dGlvbihjb25zdCBSZWFkT3BlcmF0aW9uJiByZWFkKQotewotICAgIEFTU0VSVChSdW5Mb29wOjpp
c01haW4oKSk7Ci0gICAgQVNTRVJUKG1fYWN0aXZlUmVhZE9wZXJhdGlvbnMuY29udGFpbnMoJnJl
YWQpKTsKLQotICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBh
dGgpOwotICAgIGlvUXVldWUoKS5kaXNwYXRjaChbdGhpcywgJnJlYWQsIGNhY2hlUGF0aENhcHR1
cmVdIHsKLSAgICAgICAgYXV0byBjaGFubmVsID0gb3BlbkZpbGVGb3JLZXkocmVhZC5rZXksIElP
Q2hhbm5lbDo6VHlwZTo6UmVhZCwgY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKSk7Ci0gICAgICAg
IGludCBmZCA9IGNoYW5uZWwtPmZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGNoYW5uZWwtPnJl
YWQoMCwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSwgW3RoaXMsICZyZWFkLCBm
ZF0oRGF0YSYgZmlsZURhdGEsIGludCBlcnJvcikgewotICAgICAgICAgICAgaWYgKGVycm9yKSB7
Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRW50cnkocmVhZC5rZXkpOwotICAgICAgICAgICAgICAg
IHJlYWQuY29tcGxldGlvbkhhbmRsZXIobnVsbHB0cik7Ci0gICAgICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgICAgIGF1dG8gZW50cnkgPSBkZWNvZGVFbnRyeShmaWxlRGF0YSwgZmQsIHJl
YWQua2V5KTsKLSAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSByZWFkLmNvbXBsZXRpb25I
YW5kbGVyKFdURjo6bW92ZShlbnRyeSkpOwotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcykK
LSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRW50cnkocmVhZC5rZXkpOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBBU1NFUlQobV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5jb250YWlucygm
cmVhZCkpOwotICAgICAgICAgICAgbV9hY3RpdmVSZWFkT3BlcmF0aW9ucy5yZW1vdmUoJnJlYWQp
OwotICAgICAgICAgICAgZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKLQotICAgICAg
ICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nlc3MpIHJlYWQgY29t
cGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0gICAgICAgIH0pOwotICAgIH0pOwotfQotCi12b2lk
IFN0b3JhZ2U6OmRpc3BhdGNoUGVuZGluZ1JlYWRPcGVyYXRpb25zKCkKLXsKLSAgICBBU1NFUlQo
UnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgY29uc3QgaW50IG1heGltdW1BY3RpdmVSZWFkT3Bl
cmF0aW9uQ291bnQgPSA1OwotCi0gICAgZm9yIChpbnQgcHJpb3JpdHkgPSBtYXhpbXVtUmV0cmll
dmVQcmlvcml0eTsgcHJpb3JpdHkgPj0gMDsgLS1wcmlvcml0eSkgewotICAgICAgICBpZiAobV9h
Y3RpdmVSZWFkT3BlcmF0aW9ucy5zaXplKCkgPiBtYXhpbXVtQWN0aXZlUmVhZE9wZXJhdGlvbkNv
dW50KSB7Ci0gICAgICAgICAgICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJv
Y2VzcykgbGltaXRpbmcgcGFyYWxsZWwgcmV0cmlldmVzIik7Ci0gICAgICAgICAgICByZXR1cm47
Ci0gICAgICAgIH0KLSAgICAgICAgYXV0byYgcGVuZGluZ1JldHJpZXZlUXVldWUgPSBtX3BlbmRp
bmdSZWFkT3BlcmF0aW9uc0J5UHJpb3JpdHlbcHJpb3JpdHldOwotICAgICAgICBpZiAocGVuZGlu
Z1JldHJpZXZlUXVldWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IGF1dG8gcmVhZE9wZXJhdGlvbiA9IHBlbmRpbmdSZXRyaWV2ZVF1ZXVlLnRha2VGaXJzdCgpOwot
ICAgICAgICBhdXRvJiByZWFkID0gKnJlYWRPcGVyYXRpb247Ci0gICAgICAgIG1fYWN0aXZlUmVh
ZE9wZXJhdGlvbnMuYWRkKFdURjo6bW92ZShyZWFkT3BlcmF0aW9uKSk7Ci0gICAgICAgIGRpc3Bh
dGNoUmVhZE9wZXJhdGlvbihyZWFkKTsKLSAgICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiBi
b29sIHJldHJpZXZlRnJvbU1lbW9yeShjb25zdCBUJiBvcGVyYXRpb25zLCBjb25zdCBLZXkmIGtl
eSwgU3RvcmFnZTo6UmV0cmlldmVDb21wbGV0aW9uSGFuZGxlciYgY29tcGxldGlvbkhhbmRsZXIp
Ci17Ci0gICAgZm9yIChhdXRvJiBvcGVyYXRpb24gOiBvcGVyYXRpb25zKSB7Ci0gICAgICAgIGlm
IChvcGVyYXRpb24tPmVudHJ5LmtleSA9PSBrZXkpIHsKLSAgICAgICAgICAgIExPRyhOZXR3b3Jr
Q2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBmb3VuZCB3cml0ZSBvcGVyYXRpb24gaW4g
cHJvZ3Jlc3MiKTsKLSAgICAgICAgICAgIGF1dG8gZW50cnkgPSBvcGVyYXRpb24tPmVudHJ5Owot
ICAgICAgICAgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFtlbnRyeSwgY29tcGxldGlvbkhh
bmRsZXJdIHsKLSAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihzdGQ6Om1ha2VfdW5p
cXVlPFN0b3JhZ2U6OkVudHJ5PihlbnRyeSkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LXZvaWQgU3RvcmFnZTo6cmV0cmlldmUoY29uc3QgS2V5JiBrZXksIHVuc2lnbmVkIHByaW9yaXR5
LCBSZXRyaWV2ZUNvbXBsZXRpb25IYW5kbGVyJiYgY29tcGxldGlvbkhhbmRsZXIpCi17Ci0gICAg
QVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLSAgICBBU1NFUlQocHJpb3JpdHkgPD0gbWF4aW11
bVJldHJpZXZlUHJpb3JpdHkpOwotICAgIEFTU0VSVCgha2V5LmlzTnVsbCgpKTsKLQotICAgIGlm
ICghbV9tYXhpbXVtU2l6ZSkgewotICAgICAgICBjb21wbGV0aW9uSGFuZGxlcihudWxscHRyKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbV9jb250ZW50c0ZpbHRlci5tYXlD
b250YWluKGtleS5zaG9ydEhhc2goKSkpIHsKLSAgICAgICAgY29tcGxldGlvbkhhbmRsZXIobnVs
bHB0cik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocmV0cmlldmVGcm9tTWVt
b3J5KG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucywga2V5LCBjb21wbGV0aW9uSGFuZGxlcikpCi0g
ICAgICAgIHJldHVybjsKLSAgICBpZiAocmV0cmlldmVGcm9tTWVtb3J5KG1fYWN0aXZlV3JpdGVP
cGVyYXRpb25zLCBrZXksIGNvbXBsZXRpb25IYW5kbGVyKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgbV9wZW5kaW5nUmVhZE9wZXJhdGlvbnNCeVByaW9yaXR5W3ByaW9yaXR5XS5hcHBlbmQobmV3
IFJlYWRPcGVyYXRpb24geyBrZXksIFdURjo6bW92ZShjb21wbGV0aW9uSGFuZGxlcikgfSk7Ci0g
ICAgZGlzcGF0Y2hQZW5kaW5nUmVhZE9wZXJhdGlvbnMoKTsKLX0KLQotdm9pZCBTdG9yYWdlOjpz
dG9yZShjb25zdCBFbnRyeSYgZW50cnksIFN0b3JlQ29tcGxldGlvbkhhbmRsZXImJiBjb21wbGV0
aW9uSGFuZGxlcikKLXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIEFTU0VS
VCghZW50cnkua2V5LmlzTnVsbCgpKTsKLQotICAgIGlmICghbV9tYXhpbXVtU2l6ZSkgewotICAg
ICAgICBjb21wbGV0aW9uSGFuZGxlcihmYWxzZSwgeyB9KTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIG1fcGVuZGluZ1dyaXRlT3BlcmF0aW9ucy5hcHBlbmQobmV3IFdyaXRlT3BlcmF0
aW9uIHsgZW50cnksIHsgfSwgV1RGOjptb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSB9KTsKLQotICAg
IC8vIEFkZCBrZXkgdG8gdGhlIGZpbHRlciBhbHJlYWR5IGhlcmUgYXMgd2UgZG8gbG9va3VwcyBm
cm9tIHRoZSBwZW5kaW5nIG9wZXJhdGlvbnMgdG9vLgotICAgIG1fY29udGVudHNGaWx0ZXIuYWRk
KGVudHJ5LmtleS5zaG9ydEhhc2goKSk7Ci0KLSAgICBkaXNwYXRjaFBlbmRpbmdXcml0ZU9wZXJh
dGlvbnMoKTsKLX0KLQotdm9pZCBTdG9yYWdlOjp1cGRhdGUoY29uc3QgRW50cnkmIHVwZGF0ZUVu
dHJ5LCBjb25zdCBFbnRyeSYgZXhpc3RpbmdFbnRyeSwgU3RvcmVDb21wbGV0aW9uSGFuZGxlciYm
IGNvbXBsZXRpb25IYW5kbGVyKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0g
ICAgQVNTRVJUKCFleGlzdGluZ0VudHJ5LmtleS5pc051bGwoKSk7Ci0gICAgQVNTRVJUKGV4aXN0
aW5nRW50cnkua2V5ID09IHVwZGF0ZUVudHJ5LmtleSk7Ci0KLSAgICBpZiAoIW1fbWF4aW11bVNp
emUpIHsKLSAgICAgICAgY29tcGxldGlvbkhhbmRsZXIoZmFsc2UsIHsgfSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0KLSAgICBtX3BlbmRpbmdXcml0ZU9wZXJhdGlvbnMuYXBwZW5kKG5ldyBX
cml0ZU9wZXJhdGlvbiB7IHVwZGF0ZUVudHJ5LCBleGlzdGluZ0VudHJ5LCBXVEY6Om1vdmUoY29t
cGxldGlvbkhhbmRsZXIpIH0pOwotCi0gICAgZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25z
KCk7Ci19Ci0KLXZvaWQgU3RvcmFnZTo6dHJhdmVyc2Uoc3RkOjpmdW5jdGlvbjx2b2lkIChjb25z
dCBFbnRyeSopPiYmIHRyYXZlcnNlSGFuZGxlcikKLXsKLSAgICBTdHJpbmdDYXB0dXJlIGNhY2hl
UGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKLSAgICBpb1F1ZXVlKCkuZGlzcGF0Y2goW3Ro
aXMsIGNhY2hlUGF0aENhcHR1cmUsIHRyYXZlcnNlSGFuZGxlcl0gewotICAgICAgICBTdHJpbmcg
Y2FjaGVQYXRoID0gY2FjaGVQYXRoQ2FwdHVyZS5zdHJpbmcoKTsKLSAgICAgICAgdHJhdmVyc2VD
YWNoZUZpbGVzKGNhY2hlUGF0aCwgW3RoaXMsICZ0cmF2ZXJzZUhhbmRsZXJdKGNvbnN0IFN0cmlu
ZyYgZmlsZU5hbWUsIGNvbnN0IFN0cmluZyYgcGFydGl0aW9uUGF0aCkgewotICAgICAgICAgICAg
YXV0byBmaWxlUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRp
b25QYXRoLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICBhdXRvIGNoYW5uZWwgPSBJT0NoYW5uZWw6
Om9wZW4oZmlsZVBhdGgsIElPQ2hhbm5lbDo6VHlwZTo6UmVhZCk7Ci0gICAgICAgICAgICBjb25z
dCBzaXplX3QgaGVhZGVyUmVhZFNpemUgPSAxNiA8PCAxMDsKLSAgICAgICAgICAgIC8vIEZJWE1F
OiBUcmF2ZXJzYWwgaXMgc2xvd2VyIHRoYW4gaXQgc2hvdWxkIGJlIGR1ZSB0byBsYWNrIG9mIHBh
cmFsbGVsaXNtLgotICAgICAgICAgICAgY2hhbm5lbC0+cmVhZFN5bmMoMCwgaGVhZGVyUmVhZFNp
emUsIFt0aGlzLCAmdHJhdmVyc2VIYW5kbGVyXShEYXRhJiBmaWxlRGF0YSwgaW50KSB7Ci0gICAg
ICAgICAgICAgICAgRW50cnlNZXRhRGF0YSBtZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBEYXRh
IGhlYWRlckRhdGE7Ci0gICAgICAgICAgICAgICAgaWYgKGRlY29kZUVudHJ5SGVhZGVyKGZpbGVE
YXRhLCBtZXRhRGF0YSwgaGVhZGVyRGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgRW50cnkg
ZW50cnkgeyBtZXRhRGF0YS5rZXksIG1ldGFEYXRhLnRpbWVTdGFtcCwgaGVhZGVyRGF0YSwgeyB9
IH07Ci0gICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlSGFuZGxlcigmZW50cnkpOwotICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICAgICAgUnVuTG9v
cDo6bWFpbigpLmRpc3BhdGNoKFt0aGlzLCB0cmF2ZXJzZUhhbmRsZXJdIHsKLSAgICAgICAgICAg
IHRyYXZlcnNlSGFuZGxlcihudWxscHRyKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19Ci0KLXZv
aWQgU3RvcmFnZTo6ZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCkKLXsKLSAgICBBU1NF
UlQoUnVuTG9vcDo6aXNNYWluKCkpOwotCi0gICAgY29uc3QgaW50IG1heGltdW1BY3RpdmVXcml0
ZU9wZXJhdGlvbkNvdW50IHsgMyB9OwotCi0gICAgd2hpbGUgKCFtX3BlbmRpbmdXcml0ZU9wZXJh
dGlvbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGlmIChtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5z
aXplKCkgPj0gbWF4aW11bUFjdGl2ZVdyaXRlT3BlcmF0aW9uQ291bnQpIHsKLSAgICAgICAgICAg
IExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBsaW1pdGluZyBwYXJh
bGxlbCB3cml0ZXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBh
dXRvIHdyaXRlT3BlcmF0aW9uID0gbV9wZW5kaW5nV3JpdGVPcGVyYXRpb25zLnRha2VGaXJzdCgp
OwotICAgICAgICBhdXRvJiB3cml0ZSA9ICp3cml0ZU9wZXJhdGlvbjsKLSAgICAgICAgbV9hY3Rp
dmVXcml0ZU9wZXJhdGlvbnMuYWRkKFdURjo6bW92ZSh3cml0ZU9wZXJhdGlvbikpOwotCi0gICAg
ICAgIGlmICh3cml0ZS5leGlzdGluZ0VudHJ5ICYmIG1fY29udGVudHNGaWx0ZXIubWF5Q29udGFp
bih3cml0ZS5lbnRyeS5rZXkuc2hvcnRIYXNoKCkpKSB7Ci0gICAgICAgICAgICBkaXNwYXRjaEhl
YWRlcldyaXRlT3BlcmF0aW9uKHdyaXRlKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICB9Ci0gICAgICAgIGRpc3BhdGNoRnVsbFdyaXRlT3BlcmF0aW9uKHdyaXRlKTsKLSAgICB9Ci19
Ci0KLXZvaWQgU3RvcmFnZTo6ZGlzcGF0Y2hGdWxsV3JpdGVPcGVyYXRpb24oY29uc3QgV3JpdGVP
cGVyYXRpb24mIHdyaXRlKQotewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAg
QVNTRVJUKG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOwotCi0gICAg
aWYgKCFtX2NvbnRlbnRzRmlsdGVyLm1heUNvbnRhaW4od3JpdGUuZW50cnkua2V5LnNob3J0SGFz
aCgpKSkKLSAgICAgICAgbV9jb250ZW50c0ZpbHRlci5hZGQod3JpdGUuZW50cnkua2V5LnNob3J0
SGFzaCgpKTsKLQotICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9y
eVBhdGgpOwotICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZSwg
Y2FjaGVQYXRoQ2FwdHVyZV0gewotICAgICAgICBhdXRvIGVuY29kZWRIZWFkZXIgPSBlbmNvZGVF
bnRyeUhlYWRlcih3cml0ZS5lbnRyeSk7Ci0gICAgICAgIGF1dG8gaGVhZGVyQW5kQm9keURhdGEg
PSBjb25jYXRlbmF0ZShlbmNvZGVkSGVhZGVyLCB3cml0ZS5lbnRyeS5ib2R5KTsKLQotICAgICAg
ICBhdXRvIGNoYW5uZWwgPSBvcGVuRmlsZUZvcktleSh3cml0ZS5lbnRyeS5rZXksIElPQ2hhbm5l
bDo6VHlwZTo6Q3JlYXRlLCBjYWNoZVBhdGhDYXB0dXJlLnN0cmluZygpKTsKLSAgICAgICAgaW50
IGZkID0gY2hhbm5lbC0+ZmlsZURlc2NyaXB0b3IoKTsKLSAgICAgICAgc2l6ZV90IGJvZHlPZmZz
ZXQgPSBlbmNvZGVkSGVhZGVyLnNpemUoKTsKLQotICAgICAgICBjaGFubmVsLT53cml0ZSgwLCBo
ZWFkZXJBbmRCb2R5RGF0YSwgW3RoaXMsICZ3cml0ZSwgYm9keU9mZnNldCwgZmRdKGludCBlcnJv
cikgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0d29ya1Byb2Nl
c3MpIHdyaXRlIGNvbXBsZXRlIGVycm9yPSVkIiwgZXJyb3IpOwotICAgICAgICAgICAgaWYgKGVy
cm9yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fY29udGVudHNGaWx0ZXIubWF5Q29udGFpbih3
cml0ZS5lbnRyeS5rZXkuc2hvcnRIYXNoKCkpKQotICAgICAgICAgICAgICAgICAgICBtX2NvbnRl
bnRzRmlsdGVyLnJlbW92ZSh3cml0ZS5lbnRyeS5rZXkuc2hvcnRIYXNoKCkpOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgc2l6ZV90IGJvZHlTaXplID0gd3JpdGUuZW50cnkuYm9keS5zaXpl
KCk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gYm9keU9mZnNldCArIGJvZHlTaXpl
OwotCi0gICAgICAgICAgICBtX2FwcHJveGltYXRlU2l6ZSArPSB0b3RhbFNpemU7Ci0KLSAgICAg
ICAgICAgIGJvb2wgc2hvdWxkTWFwQm9keSA9ICFlcnJvciAmJiBib2R5U2l6ZSA+PSBwYWdlU2l6
ZSgpOwotICAgICAgICAgICAgYXV0byBib2R5TWFwID0gc2hvdWxkTWFwQm9keSA/IG1hcEZpbGUo
ZmQsIGJvZHlPZmZzZXQsIGJvZHlTaXplKSA6IERhdGEoKTsKLQotICAgICAgICAgICAgd3JpdGUu
Y29tcGxldGlvbkhhbmRsZXIoIWVycm9yLCBib2R5TWFwKTsKLQotICAgICAgICAgICAgQVNTRVJU
KG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLmNvbnRhaW5zKCZ3cml0ZSkpOwotICAgICAgICAgICAg
bV9hY3RpdmVXcml0ZU9wZXJhdGlvbnMucmVtb3ZlKCZ3cml0ZSk7Ci0gICAgICAgICAgICBkaXNw
YXRjaFBlbmRpbmdXcml0ZU9wZXJhdGlvbnMoKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAg
ICBzaHJpbmtJZk5lZWRlZCgpOwotfQotCi12b2lkIFN0b3JhZ2U6OmRpc3BhdGNoSGVhZGVyV3Jp
dGVPcGVyYXRpb24oY29uc3QgV3JpdGVPcGVyYXRpb24mIHdyaXRlKQotewotICAgIEFTU0VSVChS
dW5Mb29wOjppc01haW4oKSk7Ci0gICAgQVNTRVJUKHdyaXRlLmV4aXN0aW5nRW50cnkpOwotICAg
IEFTU0VSVChtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5jb250YWlucygmd3JpdGUpKTsKLSAgICBB
U1NFUlQobV9jb250ZW50c0ZpbHRlci5tYXlDb250YWluKHdyaXRlLmVudHJ5LmtleS5zaG9ydEhh
c2goKSkpOwotCi0gICAgLy8gVHJ5IHRvIHVwZGF0ZSB0aGUgaGVhZGVyIG9mIGFuIGV4aXN0aW5n
IGVudHJ5LgotICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2RpcmVjdG9yeVBh
dGgpOwotICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsICZ3cml0ZSwgY2Fj
aGVQYXRoQ2FwdHVyZV0gewotICAgICAgICBhdXRvIGhlYWRlckRhdGEgPSBlbmNvZGVFbnRyeUhl
YWRlcih3cml0ZS5lbnRyeSk7Ci0gICAgICAgIGF1dG8gZXhpc3RpbmdIZWFkZXJEYXRhID0gZW5j
b2RlRW50cnlIZWFkZXIod3JpdGUuZXhpc3RpbmdFbnRyeS52YWx1ZSgpKTsKLQotICAgICAgICBi
b29sIHBhZ2VSb3VuZGVkSGVhZGVyU2l6ZUNoYW5nZWQgPSBoZWFkZXJEYXRhLnNpemUoKSAhPSBl
eGlzdGluZ0hlYWRlckRhdGEuc2l6ZSgpOwotICAgICAgICBpZiAocGFnZVJvdW5kZWRIZWFkZXJT
aXplQ2hhbmdlZCkgewotICAgICAgICAgICAgTE9HKE5ldHdvcmtDYWNoZVN0b3JhZ2UsICIoTmV0
d29ya1Byb2Nlc3MpIHBhZ2Utcm91bmRlZCBoZWFkZXIgc2l6ZSBjaGFuZ2VkLCBzdG9yaW5nIGZ1
bGwgZW50cnkiKTsKLSAgICAgICAgICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaChbdGhpcywg
JndyaXRlXSB7Ci0gICAgICAgICAgICAgICAgZGlzcGF0Y2hGdWxsV3JpdGVPcGVyYXRpb24od3Jp
dGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQot
ICAgICAgICBhdXRvIGNoYW5uZWwgPSBvcGVuRmlsZUZvcktleSh3cml0ZS5lbnRyeS5rZXksIElP
Q2hhbm5lbDo6VHlwZTo6V3JpdGUsIGNhY2hlUGF0aENhcHR1cmUuc3RyaW5nKCkpOwotICAgICAg
ICBjaGFubmVsLT53cml0ZSgwLCBoZWFkZXJEYXRhLCBbdGhpcywgJndyaXRlXShpbnQgZXJyb3Ip
IHsKLSAgICAgICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNz
KSB1cGRhdGUgY29tcGxldGUgZXJyb3I9JWQiLCBlcnJvcik7Ci0KLSAgICAgICAgICAgIGlmIChl
cnJvcikKLSAgICAgICAgICAgICAgICByZW1vdmVFbnRyeSh3cml0ZS5lbnRyeS5rZXkpOwotCi0g
ICAgICAgICAgICB3cml0ZS5jb21wbGV0aW9uSGFuZGxlcighZXJyb3IsIHsgfSk7Ci0KLSAgICAg
ICAgICAgIEFTU0VSVChtX2FjdGl2ZVdyaXRlT3BlcmF0aW9ucy5jb250YWlucygmd3JpdGUpKTsK
LSAgICAgICAgICAgIG1fYWN0aXZlV3JpdGVPcGVyYXRpb25zLnJlbW92ZSgmd3JpdGUpOwotICAg
ICAgICAgICAgZGlzcGF0Y2hQZW5kaW5nV3JpdGVPcGVyYXRpb25zKCk7Ci0gICAgICAgIH0pOwot
ICAgIH0pOwotfQotCi12b2lkIFN0b3JhZ2U6OnNldE1heGltdW1TaXplKHNpemVfdCBzaXplKQot
ewotICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7Ci0gICAgbV9tYXhpbXVtU2l6ZSA9IHNp
emU7Ci0KLSAgICBzaHJpbmtJZk5lZWRlZCgpOwotfQotCi12b2lkIFN0b3JhZ2U6OmNsZWFyKCkK
LXsKLSAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwotICAgIExPRyhOZXR3b3JrQ2FjaGVT
dG9yYWdlLCAiKE5ldHdvcmtQcm9jZXNzKSBjbGVhcmluZyBjYWNoZSIpOwotCi0gICAgbV9jb250
ZW50c0ZpbHRlci5jbGVhcigpOwotICAgIG1fYXBwcm94aW1hdGVTaXplID0gMDsKLQotICAgIFN0
cmluZ0NhcHR1cmUgZGlyZWN0b3J5UGF0aENhcHR1cmUobV9kaXJlY3RvcnlQYXRoKTsKLQotICAg
IGlvUXVldWUoKS5kaXNwYXRjaChbZGlyZWN0b3J5UGF0aENhcHR1cmVdIHsKLSAgICAgICAgU3Ry
aW5nIGRpcmVjdG9yeVBhdGggPSBkaXJlY3RvcnlQYXRoQ2FwdHVyZS5zdHJpbmcoKTsKLSAgICAg
ICAgdHJhdmVyc2VEaXJlY3RvcnkoZGlyZWN0b3J5UGF0aCwgRFRfRElSLCBbJmRpcmVjdG9yeVBh
dGhdKGNvbnN0IFN0cmluZyYgc3ViZGlyTmFtZSkgewotICAgICAgICAgICAgU3RyaW5nIHN1YmRp
clBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoZGlyZWN0b3J5UGF0aCwg
c3ViZGlyTmFtZSk7Ci0gICAgICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShzdWJkaXJQYXRoLCBE
VF9SRUcsIFsmc3ViZGlyUGF0aF0oY29uc3QgU3RyaW5nJiBmaWxlTmFtZSkgewotICAgICAgICAg
ICAgICAgIFdlYkNvcmU6OmRlbGV0ZUZpbGUoV2ViQ29yZTo6cGF0aEJ5QXBwZW5kaW5nQ29tcG9u
ZW50KHN1YmRpclBhdGgsIGZpbGVOYW1lKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAg
IFdlYkNvcmU6OmRlbGV0ZUVtcHR5RGlyZWN0b3J5KHN1YmRpclBhdGgpOwotICAgICAgICB9KTsK
LSAgICB9KTsKLX0KLQotdm9pZCBTdG9yYWdlOjpzaHJpbmtJZk5lZWRlZCgpCi17Ci0gICAgQVNT
RVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsKLQotICAgIHN0YXRpYyBjb25zdCBkb3VibGUgZGVsZXRp
b25Qcm9iYWJpbGl0eSB7IDAuMjUgfTsKLQotICAgIGlmIChtX2FwcHJveGltYXRlU2l6ZSA8PSBt
X21heGltdW1TaXplKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKG1fc2hyaW5rSW5Qcm9ncmVz
cykKLSAgICAgICAgcmV0dXJuOwotICAgIG1fc2hyaW5rSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLSAg
ICBMT0coTmV0d29ya0NhY2hlU3RvcmFnZSwgIihOZXR3b3JrUHJvY2Vzcykgc2hyaW5raW5nIGNh
Y2hlIGFwcHJveGltYXRlU2l6ZT0lZCwgbV9tYXhpbXVtU2l6ZT0lZCIsIHN0YXRpY19jYXN0PHNp
emVfdD4obV9hcHByb3hpbWF0ZVNpemUpLCBtX21heGltdW1TaXplKTsKLQotICAgIG1fYXBwcm94
aW1hdGVTaXplID0gMDsKLQotICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2Rp
cmVjdG9yeVBhdGgpOwotICAgIGJhY2tncm91bmRJT1F1ZXVlKCkuZGlzcGF0Y2goW3RoaXMsIGNh
Y2hlUGF0aENhcHR1cmVdIHsKLSAgICAgICAgU3RyaW5nIGNhY2hlUGF0aCA9IGNhY2hlUGF0aENh
cHR1cmUuc3RyaW5nKCk7Ci0gICAgICAgIHRyYXZlcnNlQ2FjaGVGaWxlcyhjYWNoZVBhdGgsIFt0
aGlzXShjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBTdHJpbmcmIHBhcnRpdGlvblBhdGgp
IHsKLSAgICAgICAgICAgIGF1dG8gZmlsZVBhdGggPSBXZWJDb3JlOjpwYXRoQnlBcHBlbmRpbmdD
b21wb25lbnQocGFydGl0aW9uUGF0aCwgZmlsZU5hbWUpOwotCi0gICAgICAgICAgICBib29sIHNo
b3VsZERlbGV0ZSA9IHJhbmRvbU51bWJlcigpIDwgZGVsZXRpb25Qcm9iYWJpbGl0eTsKLSAgICAg
ICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSB7Ci0gICAgICAgICAgICAgICAgbG9uZyBsb25nIGZp
bGVTaXplID0gMDsKLSAgICAgICAgICAgICAgICBXZWJDb3JlOjpnZXRGaWxlU2l6ZShmaWxlUGF0
aCwgZmlsZVNpemUpOwotICAgICAgICAgICAgICAgIG1fYXBwcm94aW1hdGVTaXplICs9IGZpbGVT
aXplOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgV2ViQ29yZTo6ZGVsZXRlRmlsZShmaWxlUGF0aCk7Ci0gICAgICAgICAgICBLZXk6Okhhc2hU
eXBlIGhhc2g7Ci0gICAgICAgICAgICBpZiAoIUtleTo6c3RyaW5nVG9IYXNoKGZpbGVOYW1lLCBo
YXNoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB1bnNpZ25lZCBzaG9y
dEhhc2ggPSBLZXk6OnRvU2hvcnRIYXNoKGhhc2gpOwotICAgICAgICAgICAgUnVuTG9vcDo6bWFp
bigpLmRpc3BhdGNoKFt0aGlzLCBzaG9ydEhhc2hdIHsKLSAgICAgICAgICAgICAgICBpZiAobV9j
b250ZW50c0ZpbHRlci5tYXlDb250YWluKHNob3J0SGFzaCkpCi0gICAgICAgICAgICAgICAgICAg
IG1fY29udGVudHNGaWx0ZXIucmVtb3ZlKHNob3J0SGFzaCk7Ci0gICAgICAgICAgICB9KTsKLSAg
ICAgICAgfSk7Ci0KLSAgICAgICAgLy8gTGV0IHN5c3RlbSBmaWd1cmUgb3V0IGlmIHRoZXkgYXJl
IHJlYWxseSBlbXB0eS4KLSAgICAgICAgdHJhdmVyc2VEaXJlY3RvcnkoY2FjaGVQYXRoLCBEVF9E
SVIsIFsmY2FjaGVQYXRoXShjb25zdCBTdHJpbmcmIHN1YmRpck5hbWUpIHsKLSAgICAgICAgICAg
IGF1dG8gcGFydGl0aW9uUGF0aCA9IFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChj
YWNoZVBhdGgsIHN1YmRpck5hbWUpOwotICAgICAgICAgICAgV2ViQ29yZTo6ZGVsZXRlRW1wdHlE
aXJlY3RvcnkocGFydGl0aW9uUGF0aCk7Ci0gICAgICAgIH0pOwotCi0gICAgICAgIG1fc2hyaW5r
SW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgICAgIExPRyhOZXR3b3JrQ2FjaGVTdG9yYWdlLCAi
KE5ldHdvcmtQcm9jZXNzKSBjYWNoZSBzaHJpbmsgY29tcGxldGVkIGFwcHJveGltYXRlU2l6ZT0l
ZCIsIHN0YXRpY19jYXN0PHNpemVfdD4obV9hcHByb3hpbWF0ZVNpemUpKTsKLSAgICB9KTsKLX0K
LQotdm9pZCBTdG9yYWdlOjpkZWxldGVPbGRWZXJzaW9ucygpCi17Ci0gICAgLy8gRGVsZXRlIFYx
IGNhY2hlLgotICAgIFN0cmluZ0NhcHR1cmUgY2FjaGVQYXRoQ2FwdHVyZShtX2Jhc2VEaXJlY3Rv
cnlQYXRoKTsKLSAgICBiYWNrZ3JvdW5kSU9RdWV1ZSgpLmRpc3BhdGNoKFtjYWNoZVBhdGhDYXB0
dXJlXSB7Ci0gICAgICAgIFN0cmluZyBjYWNoZVBhdGggPSBjYWNoZVBhdGhDYXB0dXJlLnN0cmlu
ZygpOwotICAgICAgICB0cmF2ZXJzZURpcmVjdG9yeShjYWNoZVBhdGgsIERUX0RJUiwgWyZjYWNo
ZVBhdGhdKGNvbnN0IFN0cmluZyYgc3ViZGlyTmFtZSkgewotICAgICAgICAgICAgaWYgKHN1YmRp
ck5hbWUuc3RhcnRzV2l0aCh2ZXJzaW9uRGlyZWN0b3J5UHJlZml4KSkKLSAgICAgICAgICAgICAg
ICByZXR1cm47Ci0gICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uUGF0aCA9IFdlYkNvcmU6OnBh
dGhCeUFwcGVuZGluZ0NvbXBvbmVudChjYWNoZVBhdGgsIHN1YmRpck5hbWUpOwotICAgICAgICAg
ICAgdHJhdmVyc2VEaXJlY3RvcnkocGFydGl0aW9uUGF0aCwgRFRfUkVHLCBbJnBhcnRpdGlvblBh
dGhdKGNvbnN0IFN0cmluZyYgZmlsZU5hbWUpIHsKLSAgICAgICAgICAgICAgICBXZWJDb3JlOjpk
ZWxldGVGaWxlKFdlYkNvcmU6OnBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChwYXJ0aXRpb25QYXRo
LCBmaWxlTmFtZSkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICBXZWJDb3JlOjpkZWxl
dGVFbXB0eURpcmVjdG9yeShwYXJ0aXRpb25QYXRoKTsKLSAgICAgICAgfSk7Ci0gICAgfSk7Ci19
Ci0KLX0KLX0KLQotI2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdDIvV2ViS2l0Mi54
Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxODEwOTEpCisrKyBTb3VyY2UvV2Vi
S2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAg
LTE3NjIsNyArMTc2Miw3IEBACiAJCUU0NDM2RUNEMUEwRDA0MEIwMEVBRDIwNCAvKiBOZXR3b3Jr
Q2FjaGVLZXkuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTQ0MzZFQzAxQTBDRkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZUtleS5jcHAgKi87IH07
CiAJCUU0NDM2RUNFMUEwRDA0MEIwMEVBRDIwNCAvKiBOZXR3b3JrQ2FjaGVLZXkuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0NDM2RUMxMUEwQ0ZEQjIw
MEVBRDIwNCAvKiBOZXR3b3JrQ2FjaGVLZXkuaCAqLzsgfTsKIAkJRTQ0MzZFQ0YxQTBEMDQwQjAw
RUFEMjA0IC8qIE5ldHdvcmtDYWNoZVN0b3JhZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0NDM2RUMyMUEwQ0ZEQjIwMEVBRDIwNCAvKiBOZXR3b3Jr
Q2FjaGVTdG9yYWdlLmggKi87IH07Ci0JCUU0NDM2RUQwMUEwRDA0MEIwMEVBRDIwNCAvKiBOZXR3
b3JrQ2FjaGVTdG9yYWdlQ29jb2EubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBFNDQzNkVDMzFBMENGREIyMDBFQUQyMDQgLyogTmV0d29ya0NhY2hlU3Rv
cmFnZUNvY29hLm1tICovOyB9OworCQlFNDQzNkVEMDFBMEQwNDBCMDBFQUQyMDQgLyogTmV0d29y
a0NhY2hlU3RvcmFnZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBFNDQzNkVDMzFBMENGREIyMDBFQUQyMDQgLyogTmV0d29ya0NhY2hlU3RvcmFnZS5j
cHAgKi87IH07CiAJCUU0ODlEMjhBMUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2Rl
ci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ4OUQy
ODMxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUNvZGVyLmggKi87IH07CiAJCUU0ODlE
MjhCMUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2RlcnMuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTQ4OUQyODQxQTBBMkRCODAwNzhD
MDZBIC8qIE5ldHdvcmtDYWNoZUNvZGVycy5jcHAgKi87IH07CiAJCUU0ODlEMjhDMUEwQTJEQjgw
MDc4QzA2QSAvKiBOZXR3b3JrQ2FjaGVDb2RlcnMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0ODlEMjg1MUEwQTJEQjgwMDc4QzA2QSAvKiBOZXR3b3Jr
Q2FjaGVDb2RlcnMuaCAqLzsgfTsKQEAgLTM5OTgsNyArMzk5OCw3IEBACiAJCUU0NDM2RUMwMUEw
Q0ZEQjIwMEVBRDIwNCAvKiBOZXR3b3JrQ2FjaGVLZXkuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlS2V5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKIAkJRTQ0MzZFQzExQTBDRkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZUtleS5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBOZXR3b3JrQ2FjaGVLZXkuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ0MzZFQzIxQTBDRkRCMjAwRUFEMjA0IC8qIE5l
dHdvcmtDYWNoZVN0b3JhZ2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gTmV0
d29ya0NhY2hlU3RvcmFnZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlFNDQzNkVD
MzFBMENGREIyMDBFQUQyMDQgLyogTmV0d29ya0NhY2hlU3RvcmFnZUNvY29hLm1tICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gTmV0d29ya0NhY2hlU3RvcmFnZUNvY29h
Lm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFNDQzNkVDMzFBMENGREIyMDBFQUQy
MDQgLyogTmV0d29ya0NhY2hlU3RvcmFnZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBOZXR3b3JrQ2FjaGVTdG9yYWdlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJRTQ4OUQyODMxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUNvZGVyLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IE5ldHdvcmtDYWNoZUNvZGVyLmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUU0ODlEMjg0MUEwQTJEQjgwMDc4QzA2QSAvKiBO
ZXR3b3JrQ2FjaGVDb2RlcnMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gTmV0d29ya0NhY2hlQ29kZXJzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RTQ4OUQyODUxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUNvZGVycy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBOZXR3b3JrQ2FjaGVDb2RlcnMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTc0MzgsOCArNzQzOCw4IEBACiAJCQkJRTQ0MzZFQzExQTBD
RkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZUtleS5oICovLAogCQkJCTgzNEIyNTEwMUE4NDJD
ODcwMENGQjE1MCAvKiBOZXR3b3JrQ2FjaGVTdGF0aXN0aWNzLmggKi8sCiAJCQkJODM0QjI1MTEx
QTg0MkM4NzAwQ0ZCMTUwIC8qIE5ldHdvcmtDYWNoZVN0YXRpc3RpY3NDb2NvYS5tbSAqLywKKwkJ
CQlFNDQzNkVDMzFBMENGREIyMDBFQUQyMDQgLyogTmV0d29ya0NhY2hlU3RvcmFnZS5jcHAgKi8s
CiAJCQkJRTQ0MzZFQzIxQTBDRkRCMjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZVN0b3JhZ2UuaCAq
LywKLQkJCQlFNDQzNkVDMzFBMENGREIyMDBFQUQyMDQgLyogTmV0d29ya0NhY2hlU3RvcmFnZUNv
Y29hLm1tICovLAogCQkJKTsKIAkJCW5hbWUgPSBjYWNoZTsKIAkJCXBhdGggPSBOZXR3b3JrUHJv
Y2Vzcy9jYWNoZTsKQEAgLTk0NjQsNyArOTQ2NCw3IEBACiAJCQkJRTQ4OUQyOEQxQTBBMkRCODAw
NzhDMDZBIC8qIE5ldHdvcmtDYWNoZURlY29kZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJRTQ4
OUQyOEYxQTBBMkRCODAwNzhDMDZBIC8qIE5ldHdvcmtDYWNoZUVuY29kZXIuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJRTQ0MzZFQ0QxQTBEMDQwQjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZUtleS5j
cHAgaW4gU291cmNlcyAqLywKLQkJCQlFNDQzNkVEMDFBMEQwNDBCMDBFQUQyMDQgLyogTmV0d29y
a0NhY2hlU3RvcmFnZUNvY29hLm1tIGluIFNvdXJjZXMgKi8sCisJCQkJRTQ0MzZFRDAxQTBEMDQw
QjAwRUFEMjA0IC8qIE5ldHdvcmtDYWNoZVN0b3JhZ2UuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
NTEzQTE2NEMxNjMwQTlCRjAwNUQ3RDIyIC8qIE5ldHdvcmtDb25uZWN0aW9uVG9XZWJQcm9jZXNz
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTdDODlEMkI5MUE2QjBGMkMwMDNBNUZERSAvKiBfV0tV
c2VyQ29udGVudEZpbHRlci5tbSBpbiBTb3VyY2VzICovLAogCQkJCTUxREQ5RjI4MTYzNjdEQTIw
MDE1NzhFOSAvKiBOZXR3b3JrQ29ubmVjdGlvblRvV2ViUHJvY2Vzc01lc3NhZ2VSZWNlaXZlci5j
cHAgaW4gU291cmNlcyAqLywK
</data>
<flag name="review"
          id="272993"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
      

    </bug>

</bugzilla>