<?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>121804</bug_id>
          
          <creation_ts>2013-09-23 14:26:03 -0700</creation_ts>
          <short_desc>Move LevelDB specific IDB files into their own subdirectory</short_desc>
          <delta_ts>2013-09-23 14:44:21 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</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="Brady Eidson">beidson</reporter>
          <assigned_to name="Brady Eidson">beidson</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>932292</commentid>
    <comment_count>0</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-09-23 14:26:03 -0700</bug_when>
    <thetext>Move LevelDB specific IDB files into their own subdirectory

There&apos;s at least three files that are obviously LevelDB specific and they have no business pretending to be generic IDB related.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>932293</commentid>
    <comment_count>1</comment_count>
      <attachid>212392</attachid>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-09-23 14:29:52 -0700</bug_when>
    <thetext>Created attachment 212392
Patch v1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>932294</commentid>
    <comment_count>2</comment_count>
      <attachid>212392</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-09-23 14:31:22 -0700</bug_when>
    <thetext>Comment on attachment 212392
Patch v1 

rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>932299</commentid>
    <comment_count>3</comment_count>
    <who name="Brady Eidson">beidson</who>
    <bug_when>2013-09-23 14:44:21 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/156296</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>212392</attachid>
            <date>2013-09-23 14:29:52 -0700</date>
            <delta_ts>2013-09-23 14:31:21 -0700</delta_ts>
            <desc>Patch v1 </desc>
            <filename>patch</filename>
            <type>text/plain</type>
            <size>322293</size>
            <attacher name="Brady Eidson">beidson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNv
cmUvQ01ha2VMaXN0cy50eHQKaW5kZXggMGE1MWZjOC4uNDI5NTJmMiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTgxOSw4ICs4MTksNiBAQCBzZXQoV2ViQ29yZV9TT1VSQ0VTCiAgICAgTW9kdWxl
cy9pbmRleGVkZGIvSURCS2V5LmNwcAogICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVJhbmdl
LmNwcAogICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVBhdGguY3BwCi0gICAgTW9kdWxlcy9p
bmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcAotICAgIE1vZHVsZXMvaW5kZXhlZGRiL0lEQkxl
dmVsREJDb2RpbmcuY3BwCiAgICAgTW9kdWxlcy9pbmRleGVkZGIvSURCT2JqZWN0U3RvcmUuY3Bw
CiAgICAgTW9kdWxlcy9pbmRleGVkZGIvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAKICAg
ICBNb2R1bGVzL2luZGV4ZWRkYi9JREJPcGVuREJSZXF1ZXN0LmNwcApAQCAtODMyLDYgKzgzMCw4
IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBNb2R1bGVzL2luZGV4ZWRkYi9JREJWZXJzaW9u
Q2hhbmdlRXZlbnQuY3BwCiAgICAgTW9kdWxlcy9pbmRleGVkZGIvUGFnZUdyb3VwSW5kZXhlZERh
dGFiYXNlLmNwcAogICAgIE1vZHVsZXMvaW5kZXhlZGRiL1dvcmtlckdsb2JhbFNjb3BlSW5kZXhl
ZERhdGFiYXNlLmNwcAorICAgIE1vZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIvSURCQmFja2luZ1N0
b3JlTGV2ZWxEQi5jcHAKKyAgICBNb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkxldmVsREJD
b2RpbmcuY3BwCiAKICAgICBNb2R1bGVzL21lZGlhc291cmNlL01lZGlhU291cmNlLmNwcAogICAg
IE1vZHVsZXMvbWVkaWFzb3VyY2UvTWVkaWFTb3VyY2VSZWdpc3RyeS5jcHAKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRl
eCA1YjkyOWU3Li5lOTg2MjEwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cK
KysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjI4IEBACisyMDEzLTA5
LTIzICBCcmFkeSBFaWRzb24gIDxiZWlkc29uQGFwcGxlLmNvbT4KKworICAgICAgICBNb3ZlIExl
dmVsREIgc3BlY2lmaWMgSURCIGZpbGVzIGludG8gdGhlaXIgb3duIHN1YmRpcmVjdG9yeS4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMTgwNAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogQ01ha2VMaXN0
cy50eHQ6CisgICAgICAgICogR05VbWFrZWZpbGUubGlzdC5hbToKKyAgICAgICAgKiBXZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRk
Yi9sZXZlbGRiL0lEQkJhY2tpbmdTdG9yZUxldmVsREIuY3BwOiBSZW5hbWVkIGZyb20gU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcC4KKyAgICAgICAg
KFdlYkNvcmU6OnJlY29yZEludGVybmFsRXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6cHV0Qm9v
bCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRJbnQpOgorICAgICAgICAoV2ViQ29yZTo6cHV0SW50
KToKKyAgICAgICAgKFdlYkNvcmU6OmdldFZhckludCk6CisgICAgICAgIChXZWJDb3JlOjpwdXRW
YXJJbnQpOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6
OnB1dFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpwdXRJREJLZXlQYXRoKToKKyAgICAgICAg
KFdlYkNvcmU6OmNvbXBhcmVLZXlzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvbXBhcmVJbmRleEtl
eXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29tcGFyYXRvcjo6Y29tcGFyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpDb21wYXJhdG9yOjpuYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OmlzU2NoZW1hS25v
d24pOgorICAgICAgICAoV2ViQ29yZTo6c2V0VXBNZXRhZGF0YSk6CisgICAgICAgIChXZWJDb3Jl
OjpnZXRNYXhPYmplY3RTdG9yZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OkRlZmF1bHRMZXZlbERC
RmFjdG9yeTo6b3BlbkxldmVsREIpOgorICAgICAgICAoV2ViQ29yZTo6RGVmYXVsdExldmVsREJG
YWN0b3J5OjpkZXN0cm95TGV2ZWxEQik6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3Rv
cmU6OklEQkJhY2tpbmdTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6
On5JREJCYWNraW5nU3RvcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpv
cGVuKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6b3BlbkluTWVtb3J5KToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Z2V0RGF0YWJhc2VOYW1lcyk6CisgICAgICAgIChXZWJD
b3JlOjpJREJCYWNraW5nU3RvcmU6OmdldElEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAo
V2ViQ29yZTo6Z2V0TmV3RGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5n
U3RvcmU6OmNyZWF0ZUlEQkRhdGFiYXNlTWV0YURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6SURC
QmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZUludFZlcnNpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SURCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZU1ldGFEYXRhKToKKyAgICAg
ICAgKFdlYkNvcmU6OmRlbGV0ZVJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdT
dG9yZTo6ZGVsZXRlRGF0YWJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tPYmplY3RTdG9y
ZUFuZE1ldGFEYXRhVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6Omdl
dE9iamVjdFN0b3Jlcyk6CisgICAgICAgIChXZWJDb3JlOjpzZXRNYXhPYmplY3RTdG9yZUlkKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6OmdldFJlY29yZCk6CisgICAgICAgIChX
ZWJDb3JlOjpnZXROZXdWZXJzaW9uTnVtYmVyKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tp
bmdTdG9yZTo6cHV0UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6
Y2xlYXJPYmplY3RTdG9yZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6OmRl
bGV0ZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6OmdldEtleUdl
bmVyYXRvckN1cnJlbnROdW1iZXIpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3Jl
OjptYXliZVVwZGF0ZUtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKToKKyAgICAgICAgKFdl
YkNvcmU6OmNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJC
YWNraW5nU3RvcmU6OmdldEluZGV4ZXMpOgorICAgICAgICAoV2ViQ29yZTo6c2V0TWF4SW5kZXhJ
ZCk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgpOgorICAgICAgICAo
V2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpwdXRJbmRleERhdGFGb3JSZWNvcmQpOgorICAgICAg
ICAoV2ViQ29yZTo6ZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKToKKyAgICAgICAgKFdl
YkNvcmU6OnZlcnNpb25FeGlzdHMpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3Jl
OjpmaW5kS2V5SW5JbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6Omdl
dFByaW1hcnlLZXlWaWFJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6
OmtleUV4aXN0c0luSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpD
dXJzb3I6OkN1cnNvcik6CisgICAgICAgIChXZWJDb3JlOjpJREJCYWNraW5nU3RvcmU6OkN1cnNv
cjo6Zmlyc3RTZWVrKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
OjphZHZhbmNlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpj
b250aW51ZUZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yOjpoYXZlRW50ZXJlZFJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yOjppc1Bhc3RCb3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6T2JqZWN0U3RvcmVL
ZXlDdXJzb3JJbXBsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6T2JqZWN0U3RvcmVLZXlD
dXJzb3JJbXBsOjpjbG9uZSk6CisgICAgICAgIChXZWJDb3JlOjpPYmplY3RTdG9yZUtleUN1cnNv
ckltcGw6OnZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0b3JlS2V5Q3Vyc29ySW1w
bDo6ZW5jb2RlS2V5KToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0b3JlS2V5Q3Vyc29ySW1w
bDo6T2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0
b3JlS2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRSb3cpOgorICAgICAgICAoV2ViQ29yZTo6T2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6T2JqZWN0U3Rv
cmVDdXJzb3JJbXBsOjpjbG9uZSk6CisgICAgICAgIChXZWJDb3JlOjpPYmplY3RTdG9yZUN1cnNv
ckltcGw6OnZhbHVlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6
ZW5jb2RlS2V5KToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0b3JlQ3Vyc29ySW1wbDo6T2Jq
ZWN0U3RvcmVDdXJzb3JJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6Ok9iamVjdFN0b3JlQ3Vyc29y
SW1wbDo6bG9hZEN1cnJlbnRSb3cpOgorICAgICAgICAoV2ViQ29yZTo6SW5kZXhLZXlDdXJzb3JJ
bXBsOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6SW5kZXhLZXlDdXJzb3JJbXBsOjpjbG9u
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbmRleEtleUN1cnNvckltcGw6OnZhbHVlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkluZGV4S2V5Q3Vyc29ySW1wbDo6cHJpbWFyeUtleSk6CisgICAgICAgIChX
ZWJDb3JlOjpJbmRleEtleUN1cnNvckltcGw6OnJlY29yZElkZW50aWZpZXIpOgorICAgICAgICAo
V2ViQ29yZTo6SW5kZXhLZXlDdXJzb3JJbXBsOjplbmNvZGVLZXkpOgorICAgICAgICAoV2ViQ29y
ZTo6SW5kZXhLZXlDdXJzb3JJbXBsOjpJbmRleEtleUN1cnNvckltcGwpOgorICAgICAgICAoV2Vi
Q29yZTo6SW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdyk6CisgICAgICAgIChXZWJD
b3JlOjpJbmRleEN1cnNvckltcGw6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbmRleEN1
cnNvckltcGw6OmNsb25lKToKKyAgICAgICAgKFdlYkNvcmU6OkluZGV4Q3Vyc29ySW1wbDo6dmFs
dWUpOgorICAgICAgICAoV2ViQ29yZTo6SW5kZXhDdXJzb3JJbXBsOjpwcmltYXJ5S2V5KToKKyAg
ICAgICAgKFdlYkNvcmU6OkluZGV4Q3Vyc29ySW1wbDo6cmVjb3JkSWRlbnRpZmllcik6CisgICAg
ICAgIChXZWJDb3JlOjpJbmRleEN1cnNvckltcGw6OmVuY29kZUtleSk6CisgICAgICAgIChXZWJD
b3JlOjpJbmRleEN1cnNvckltcGw6OkluZGV4Q3Vyc29ySW1wbCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KToKKyAgICAgICAgKFdlYkNvcmU6Om9i
amVjdFN0b3JlQ3Vyc29yT3B0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjppbmRleEN1cnNvck9w
dGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0U3Rv
cmVDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0
U3RvcmVLZXlDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpvcGVu
SW5kZXhLZXlDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpvcGVu
SW5kZXhDdXJzb3IpOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpUcmFuc2Fj
dGlvbjo6VHJhbnNhY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbjo6YmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6SURCQmFja2luZ1N0b3JlOjpU
cmFuc2FjdGlvbjo6Y29tbWl0KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb246OnJvbGxiYWNrKToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9sZXZl
bGRiL0lEQkxldmVsREJDb2RpbmcuY3BwOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvTW9k
dWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkNvZGluZy5jcHAuCisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjplbmNvZGVCeXRlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVs
REJDb2Rpbmc6OmRlY29kZUJ5dGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6bWF4SURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Om1pbklE
QktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVCb29sKToK
KyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUJvb2wpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlSW50KToKKyAgICAgICAgKFdlYkNv
cmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUludCk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpjb21wYXJlSW50cyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERC
Q29kaW5nOjplbmNvZGVWYXJJbnQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGlu
Zzo6ZGVjb2RlVmFySW50KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmVu
Y29kZVN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVT
dHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZW5jb2RlU3RyaW5n
V2l0aExlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVT
dHJpbmdXaXRoTGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmNv
bXBhcmVFbmNvZGVkU3RyaW5nc1dpdGhMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkNvZGluZzo6ZW5jb2RlRG91YmxlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJD
b2Rpbmc6OmRlY29kZURvdWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVJREJLZXkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6ZGVj
b2RlSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmV4dHJhY3RF
bmNvZGVkSURCS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmtleVR5
cGVCeXRlVG9LZXlUeXBlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmNv
bXBhcmVFbmNvZGVkSURCS2V5cyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjplbmNvZGVJREJLZXlQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6
OmRlY29kZUlEQktleVBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6
OktleVByZWZpeCk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVm
aXg6OmNyZWF0ZVdpdGhTcGVjaWFsSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6S2V5UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZCk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6OmlzVmFsaWRPYmplY3RTdG9yZUlkKToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OktleVByZWZpeDo6aXNWYWxpZEluZGV4
SWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4OjpkZWNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4OjplbmNv
ZGVFbXB0eSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6
OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpLZXlQcmVmaXg6
OmVuY29kZUludGVybmFsKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Oktl
eVByZWZpeDo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpL
ZXlQcmVmaXg6OnR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6U2No
ZW1hVmVyc2lvbktleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rp
bmc6Ok1heERhdGFiYXNlSWRLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjpEYXRhVmVyc2lvbktleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlRnJlZUxpc3RLZXk6OkRhdGFiYXNlRnJlZUxpc3RLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtl
eTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNl
RnJlZUxpc3RLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjpEYXRhYmFzZUZyZWVMaXN0S2V5OjplbmNvZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VGcmVlTGlzdEtleTo6ZGF0YWJhc2VJZCk6CisgICAg
ICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZUZyZWVMaXN0S2V5Ojpjb21w
YXJlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtl
eTo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNl
TmFtZUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkRh
dGFiYXNlTmFtZUtleTo6ZW5jb2RlTWluS2V5Rm9yT3JpZ2luKToKKyAgICAgICAgKFdlYkNvcmU6
OklEQkxldmVsREJDb2Rpbmc6OkRhdGFiYXNlTmFtZUtleTo6ZW5jb2RlU3RvcEtleUZvck9yaWdp
bik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFzZU5hbWVLZXk6
OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6RGF0YWJhc2VN
ZXRhRGF0YUtleTo6ZW5jb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6
Ok9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok9iamVjdFN0b3JlTWV0YURhdGFLZXkpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVj
b2RlKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTWV0
YURhdGFLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGVNYXhLZXkpOgorICAgICAgICAoV2ViQ29yZTo6
SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6b2JqZWN0U3RvcmVJZCk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjptZXRhRGF0YVR5cGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJM
ZXZlbERCQ29kaW5nOjpJbmRleE1ldGFEYXRhS2V5OjpJbmRleE1ldGFEYXRhS2V5KToKKyAgICAg
ICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TWV0YURhdGFLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleE1ldGFEYXRhS2V5Ojpl
bmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhNZXRhRGF0
YUtleTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6
OkluZGV4TWV0YURhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhNZXRhRGF0YUtleTo6aW5kZXhJZCk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpPYmplY3RTdG9yZUZyZWVM
aXN0S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3Jl
RnJlZUxpc3RLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjpPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURC
TGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6ZW5jb2RlTWF4S2V5KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXk6
Om9iamVjdFN0b3JlSWQpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjpJbmRleEZyZWVMaXN0S2V5KToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RnJlZUxpc3RLZXk6OmRlY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjplbmNv
ZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhGcmVlTGlzdEtl
eTo6ZW5jb2RlTWF4S2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Oklu
ZGV4RnJlZUxpc3RLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNv
ZGluZzo6SW5kZXhGcmVlTGlzdEtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChXZWJDb3Jl
OjpJREJMZXZlbERCQ29kaW5nOjpJbmRleEZyZWVMaXN0S2V5OjppbmRleElkKToKKyAgICAgICAg
KFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6Ok9iamVjdFN0b3JlTmFtZXNLZXk6OmRlY29kZSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZU5hbWVzS2V5
OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3Rv
cmVOYW1lc0tleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5n
OjpJbmRleE5hbWVzS2V5OjpJbmRleE5hbWVzS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxl
dmVsREJDb2Rpbmc6OkluZGV4TmFtZXNLZXk6OmRlY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjpJbmRleE5hbWVzS2V5OjplbmNvZGUpOgorICAgICAgICAoV2ViQ29y
ZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhOYW1lc0tleTo6Y29tcGFyZSk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURhdGFLZXk6OmVu
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpPYmplY3RTdG9yZURh
dGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2Jq
ZWN0U3RvcmVEYXRhS2V5Ojp1c2VyS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJD
b2Rpbmc6OkV4aXN0c0VudHJ5S2V5OjpkZWNvZGUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2
ZWxEQkNvZGluZzo6RXhpc3RzRW50cnlLZXk6OmVuY29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJ
REJMZXZlbERCQ29kaW5nOjpFeGlzdHNFbnRyeUtleTo6Y29tcGFyZSk6CisgICAgICAgIChXZWJD
b3JlOjpJREJMZXZlbERCQ29kaW5nOjpFeGlzdHNFbnRyeUtleTo6dXNlcktleSk6CisgICAgICAg
IChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OkluZGV4RGF0YUtleSk6
CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmRlY29k
ZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmVu
Y29kZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6
OmVuY29kZU1pbktleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRl
eERhdGFLZXk6OmVuY29kZU1heEtleSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29k
aW5nOjpJbmRleERhdGFLZXk6OmNvbXBhcmUpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxE
QkNvZGluZzo6SW5kZXhEYXRhS2V5OjpkYXRhYmFzZUlkKToKKyAgICAgICAgKFdlYkNvcmU6OklE
QkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6b2JqZWN0U3RvcmVJZCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpJbmRleERhdGFLZXk6OmluZGV4SWQpOgorICAgICAg
ICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6SW5kZXhEYXRhS2V5Ojp1c2VyS2V5KToKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4RGF0YUtleTo6cHJpbWFyeUtl
eSk6CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJMZXZlbERCQ29kaW5n
Lmg6IFJlbmFtZWQgZnJvbSBTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZl
bERCQ29kaW5nLmguCisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjplbmNvZGVJ
bnRTYWZlbHkpOgorICAgICAgICAoV2ViQ29yZTo6SURCTGV2ZWxEQkNvZGluZzo6S2V5UHJlZml4
Ojp2YWxpZElkcyk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpEYXRhYmFz
ZU5hbWVLZXk6Om9yaWdpbik6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpE
YXRhYmFzZU5hbWVLZXk6OmRhdGFiYXNlTmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpJREJMZXZl
bERCQ29kaW5nOjpJbmRleE1ldGFEYXRhS2V5OjptZXRhRGF0YVR5cGUpOgorICAgICAgICAoV2Vi
Q29yZTo6SURCTGV2ZWxEQkNvZGluZzo6T2JqZWN0U3RvcmVOYW1lc0tleTo6b2JqZWN0U3RvcmVO
YW1lKToKKyAgICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OkluZGV4TmFtZXNLZXk6
OmluZGV4TmFtZSk6CisKIDIwMTMtMDktMTkgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBs
ZS5jb20+CiAKICAgICAgICAgTGF5b3V0IFRlc3QgaHR0cC90ZXN0cy9zZWN1cml0eS9jYW52YXMt
cmVtb3RlLXJlYWQtcmVtb3RlLWltYWdlLXJlZGlyZWN0Lmh0bWwgaXMgZmxha3kKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0gYi9Tb3VyY2UvV2ViQ29yZS9H
TlVtYWtlZmlsZS5saXN0LmFtCmluZGV4IGMyZjlmZWYuLmEzMjgwYzUgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL0dOVW1ha2VmaWxlLmxpc3QuYW0KKysrIGIvU291cmNlL1dlYkNvcmUvR05V
bWFrZWZpbGUubGlzdC5hbQpAQCAtMTg4NSw3ICsxODg1LDcgQEAgd2ViY29yZV9tb2R1bGVzX3Nv
dXJjZXMgKz0gXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0RPTVdpbmRvd0lu
ZGV4ZWREYXRhYmFzZS5oIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJB
bnkuY3BwIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJBbnkuaCBcCi0J
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCQmFja2luZ1N0b3JlLmNwcCBcCisJ
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJCYWNraW5nU3RvcmVM
ZXZlbERCLmNwcCBcCiAJU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCQmFja2lu
Z1N0b3JlLmggXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkNhbGxiYWNr
cy5oIFwKIAlTb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJDdXJzb3JCYWNrZW5k
SW1wbC5jcHAgXApAQCAtMTkyMyw4ICsxOTIzLDggQEAgd2ViY29yZV9tb2R1bGVzX3NvdXJjZXMg
Kz0gXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQktleVBhdGguaCBcCiAJ
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCS2V5UmFuZ2UuY3BwIFwKIAlTb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5oIFwKLQlTb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmNwcCBcCi0JU291cmNlL1dl
YkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTGV2ZWxEQkNvZGluZy5oIFwKKwlTb3VyY2UvV2Vi
Q29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkxldmVsREJDb2RpbmcuY3BwIFwKKwlT
b3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkxldmVsREJDb2Rpbmcu
aCBcCiAJU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCTWV0YWRhdGEuaCBcCiAJ
U291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1w
bC5jcHAgXAogCVNvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQk9iamVjdFN0b3Jl
QmFja2VuZEltcGwuaCBcCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4
ZWRkYi9JREJCYWNraW5nU3RvcmUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVk
ZGIvSURCQmFja2luZ1N0b3JlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhl
MGQzMS4uMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJC
YWNraW5nU3RvcmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5NiArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgot
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgotICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
LSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklEQkJhY2tpbmdTdG9yZS5oIgotCi0jaWYg
RU5BQkxFKElOREVYRURfREFUQUJBU0UpCi0KLSNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCi0jaW5j
bHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgotI2luY2x1ZGUgIklEQktleS5oIgotI2luY2x1ZGUg
IklEQktleVBhdGguaCIKLSNpbmNsdWRlICJJREJLZXlSYW5nZS5oIgotI2luY2x1ZGUgIklEQkxl
dmVsREJDb2RpbmcuaCIKLSNpbmNsdWRlICJJREJNZXRhZGF0YS5oIgotI2luY2x1ZGUgIklEQlRy
YWNpbmcuaCIKLSNpbmNsdWRlICJMZXZlbERCQ29tcGFyYXRvci5oIgotI2luY2x1ZGUgIkxldmVs
REJEYXRhYmFzZS5oIgotI2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5oIgotI2luY2x1ZGUgIkxl
dmVsREJTbGljZS5oIgotI2luY2x1ZGUgIkxldmVsREJUcmFuc2FjdGlvbi5oIgotI2luY2x1ZGUg
IlNlY3VyaXR5T3JpZ2luLmgiCi0jaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCi0jaW5jbHVkZSA8
d3RmL0Fzc2VydGlvbnMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi11c2luZyBuYW1lc3Bh
Y2UgSURCTGV2ZWxEQkNvZGluZzsKLQotY29uc3QgaW50NjRfdCBLZXlHZW5lcmF0b3JJbml0aWFs
TnVtYmVyID0gMTsgLy8gRnJvbSB0aGUgSW5kZXhlZERCIHNwZWNpZmljYXRpb24uCi0KLWVudW0g
SURCQmFja2luZ1N0b3JlRXJyb3JTb3VyY2UgewotICAgIC8vIDAgLSAyIGFyZSBubyBsb25nZXIg
dXNlZC4KLSAgICBGaW5kS2V5SW5JbmRleCA9IDMsCi0gICAgR2V0SURCRGF0YWJhc2VNZXRhRGF0
YSwKLSAgICBHZXRJbmRleGVzLAotICAgIEdldEtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIsCi0g
ICAgR2V0T2JqZWN0U3RvcmVzLAotICAgIEdldFJlY29yZCwKLSAgICBLZXlFeGlzdHNJbk9iamVj
dFN0b3JlLAotICAgIExvYWRDdXJyZW50Um93LAotICAgIFNldHVwTWV0YWRhdGEsCi0gICAgR2V0
UHJpbWFyeUtleVZpYUluZGV4LAotICAgIEtleUV4aXN0c0luSW5kZXgsCi0gICAgVmVyc2lvbkV4
aXN0cywKLSAgICBEZWxldGVPYmplY3RTdG9yZSwKLSAgICBTZXRNYXhPYmplY3RTdG9yZUlkLAot
ICAgIFNldE1heEluZGV4SWQsCi0gICAgR2V0TmV3RGF0YWJhc2VJZCwKLSAgICBHZXROZXdWZXJz
aW9uTnVtYmVyLAotICAgIENyZWF0ZUlEQkRhdGFiYXNlTWV0YURhdGEsCi0gICAgRGVsZXRlRGF0
YWJhc2UsCi0gICAgVHJhbnNhY3Rpb25Db21taXQsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZUludGVybmFsRXJyb3JNYXgsCi19OwotCi1zdGF0aWMgdm9pZCByZWNvcmRJbnRlcm5hbEVycm9y
KGNvbnN0IGNoYXIqIHR5cGUsIElEQkJhY2tpbmdTdG9yZUVycm9yU291cmNlIGxvY2F0aW9uKQot
ewotICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIldlYkNvcmUuSW5kZXhlZERCLkJh
Y2tpbmdTdG9yZS4lc0Vycm9yIiwgdHlwZSk7Ci0gICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9n
cmFtRW51bWVyYXRpb24obmFtZS51dGY4KCkuZGF0YSgpLCBsb2NhdGlvbiwgSURCTGV2ZWxEQkJh
Y2tpbmdTdG9yZUludGVybmFsRXJyb3JNYXgpOwotfQotCi0vLyBVc2UgdG8gc2lnbmFsIGNvbmRp
dGlvbnMgdGhhdCB1c3VhbGx5IGluZGljYXRlIGRldmVsb3BlciBlcnJvciwgYnV0IGNvdWxkIGJl
IGNhdXNlZCBieSBkYXRhIGNvcnJ1cHRpb24uCi0vLyBBIG1hY3JvIGlzIHVzZWQgaW5zdGVhZCBv
ZiBhbiBpbmxpbmUgZnVuY3Rpb24gc28gdGhhdCB0aGUgYXNzZXJ0IGFuZCBsb2cgcmVwb3J0IHRo
ZSBsaW5lIG51bWJlci4KLSNkZWZpbmUgUkVQT1JUX0VSUk9SKHR5cGUsIGxvY2F0aW9uKSBcCi0g
ICAgZG8geyBcCi0gICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCICVzIEVycm9yOiAlcyIsIHR5
cGUsICNsb2NhdGlvbik7IFwKLSAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IFwKLSAgICAg
ICAgcmVjb3JkSW50ZXJuYWxFcnJvcih0eXBlLCBsb2NhdGlvbik7IFwKLSAgICB9IHdoaWxlICgw
KQotCi0jZGVmaW5lIElOVEVSTkFMX1JFQURfRVJST1IobG9jYXRpb24pIFJFUE9SVF9FUlJPUigi
UmVhZCIsIGxvY2F0aW9uKQotI2RlZmluZSBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihsb2Nh
dGlvbikgUkVQT1JUX0VSUk9SKCJDb25zaXN0ZW5jeSIsIGxvY2F0aW9uKQotI2RlZmluZSBJTlRF
Uk5BTF9XUklURV9FUlJPUihsb2NhdGlvbikgUkVQT1JUX0VSUk9SKCJXcml0ZSIsIGxvY2F0aW9u
KQotCi1zdGF0aWMgdm9pZCBwdXRCb29sKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24s
IGNvbnN0IExldmVsREJTbGljZSYga2V5LCBib29sIHZhbHVlKQotewotICAgIHRyYW5zYWN0aW9u
LT5wdXQoa2V5LCBlbmNvZGVCb29sKHZhbHVlKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBE
Qk9yVHJhbnNhY3Rpb24+Ci1zdGF0aWMgYm9vbCBnZXRJbnQoREJPclRyYW5zYWN0aW9uKiBkYiwg
Y29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QmIGZvdW5kSW50LCBib29sJiBmb3VuZCkK
LXsKLSAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwotICAgIGJvb2wgb2sgPSBkYi0+c2FmZUdldChr
ZXksIHJlc3VsdCwgZm91bmQpOwotICAgIGlmICghb2spCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBpZiAoIWZvdW5kKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGZvdW5kSW50ID0g
ZGVjb2RlSW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1zdGF0aWMgdm9pZCBwdXRJbnQoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QgdmFsdWUpCi17Ci0gICAgQVNTRVJU
KHZhbHVlID49IDApOwotICAgIHRyYW5zYWN0aW9uLT5wdXQoa2V5LCBlbmNvZGVJbnQodmFsdWUp
KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KLVdBUk5fVU5VU0VE
X1JFVFVSTiBzdGF0aWMgYm9vbCBnZXRWYXJJbnQoREJPclRyYW5zYWN0aW9uKiBkYiwgY29uc3Qg
TGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QmIGZvdW5kSW50LCBib29sJiBmb3VuZCkKLXsKLSAg
ICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwotICAgIGJvb2wgb2sgPSBkYi0+c2FmZUdldChrZXksIHJl
c3VsdCwgZm91bmQpOwotICAgIGlmICghb2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
ZiAoIWZvdW5kKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGZvdW5kID0gZGVjb2RlVmFy
SW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIGZvdW5kSW50KSA9PSByZXN1bHQuZW5k
KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dFZhckludChMZXZlbERC
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBMZXZlbERCU2xpY2UmIGtleSwgaW50NjRf
dCB2YWx1ZSkKLXsKLSAgICB0cmFuc2FjdGlvbi0+cHV0KGtleSwgZW5jb2RlVmFySW50KHZhbHVl
KSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1XQVJOX1VOVVNF
RF9SRVRVUk4gc3RhdGljIGJvb2wgZ2V0U3RyaW5nKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0
IExldmVsREJTbGljZSYga2V5LCBTdHJpbmcmIGZvdW5kU3RyaW5nLCBib29sJiBmb3VuZCkKLXsK
LSAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OwotICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgYm9vbCBv
ayA9IGRiLT5zYWZlR2V0KGtleSwgcmVzdWx0LCBmb3VuZCk7Ci0gICAgaWYgKCFvaykKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghZm91bmQpCi0gICAgICAgIHJldHVybiB0cnVlOwot
Ci0gICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5l
bmQoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dFN0cmluZyhMZXZl
bERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBMZXZlbERCU2xpY2UmIGtleSwgY29u
c3QgU3RyaW5nJiB2YWx1ZSkKLXsKLSAgICB0cmFuc2FjdGlvbi0+cHV0KGtleSwgZW5jb2RlU3Ry
aW5nKHZhbHVlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dElEQktleVBhdGgoTGV2ZWxEQlRyYW5z
YWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGNvbnN0IElEQktl
eVBhdGgmIHZhbHVlKQotewotICAgIHRyYW5zYWN0aW9uLT5wdXQoa2V5LCBlbmNvZGVJREJLZXlQ
YXRoKHZhbHVlKSk7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGFyZUtleXMoY29uc3QgTGV2ZWxEQlNs
aWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCi17Ci0gICAgcmV0dXJuIGNvbXBhcmUoYSwg
Yik7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGFyZUluZGV4S2V5cyhjb25zdCBMZXZlbERCU2xpY2Um
IGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKLXsKLSAgICByZXR1cm4gY29tcGFyZShhLCBiLCB0
cnVlKTsKLX0KLQotY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBMZXZlbERCQ29tcGFyYXRvciB7
Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBpbnQgY29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEs
IGNvbnN0IExldmVsREJTbGljZSYgYikgY29uc3QgeyByZXR1cm4gSURCTGV2ZWxEQkNvZGluZzo6
Y29tcGFyZShhLCBiKTsgfQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0IHsg
cmV0dXJuICJpZGJfY21wMSI7IH0KLX07Ci0KLS8vIDAgLSBJbml0aWFsIHZlcnNpb24uCi0vLyAx
IC0gQWRkcyBVc2VySW50VmVyc2lvbiB0byBEYXRhYmFzZU1ldGFEYXRhLgotLy8gMiAtIEFkZHMg
RGF0YVZlcnNpb24gdG8gdG8gZ2xvYmFsIG1ldGFkYXRhLgotY29uc3QgaW50NjRfdCBsYXRlc3RL
bm93blNjaGVtYVZlcnNpb24gPSAyOwotV0FSTl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIGlz
U2NoZW1hS25vd24oTGV2ZWxEQkRhdGFiYXNlKiBkYiwgYm9vbCYga25vd24pCi17Ci0gICAgaW50
NjRfdCBkYlNjaGVtYVZlcnNpb24gPSAwOwotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBi
b29sIG9rID0gZ2V0SW50KGRiLCBTY2hlbWFWZXJzaW9uS2V5OjplbmNvZGUoKSwgZGJTY2hlbWFW
ZXJzaW9uLCBmb3VuZCk7Ci0gICAgaWYgKCFvaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IGlmICghZm91bmQpIHsKLSAgICAgICAga25vd24gPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1
ZTsKLSAgICB9Ci0gICAgaWYgKGRiU2NoZW1hVmVyc2lvbiA+IGxhdGVzdEtub3duU2NoZW1hVmVy
c2lvbikgewotICAgICAgICBrbm93biA9IGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICB9Ci0KLSAgICBjb25zdCB1aW50MzJfdCBsYXRlc3RLbm93bkRhdGFWZXJzaW9uID0gU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjp3aXJlRm9ybWF0VmVyc2lvbigpOwotICAgIGludDY0X3QgZGJEYXRh
VmVyc2lvbiA9IDA7Ci0gICAgb2sgPSBnZXRJbnQoZGIsIERhdGFWZXJzaW9uS2V5OjplbmNvZGUo
KSwgZGJEYXRhVmVyc2lvbiwgZm91bmQpOwotICAgIGlmICghb2spCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgIGtub3duID0gdHJ1ZTsKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGRiRGF0YVZlcnNpb24gPiBsYXRlc3RLbm93
bkRhdGFWZXJzaW9uKSB7Ci0gICAgICAgIGtub3duID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0KLQotICAgIGtub3duID0gdHJ1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQot
V0FSTl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIHNldFVwTWV0YWRhdGEoTGV2ZWxEQkRhdGFi
YXNlKiBkYiwgY29uc3QgU3RyaW5nJiBvcmlnaW4pCi17Ci0gICAgY29uc3QgdWludDMyX3QgbGF0
ZXN0S25vd25EYXRhVmVyc2lvbiA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6d2lyZUZvcm1hdFZl
cnNpb24oKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc2NoZW1hVmVyc2lvbktleSA9IFNjaGVt
YVZlcnNpb25LZXk6OmVuY29kZSgpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBkYXRhVmVyc2lv
bktleSA9IERhdGFWZXJzaW9uS2V5OjplbmNvZGUoKTsKLQotICAgIFJlZlB0cjxMZXZlbERCVHJh
bnNhY3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9uOjpjcmVhdGUoZGIpOwot
Ci0gICAgaW50NjRfdCBkYlNjaGVtYVZlcnNpb24gPSAwOwotICAgIGludDY0X3QgZGJEYXRhVmVy
c2lvbiA9IDA7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGJvb2wgb2sgPSBnZXRJbnQo
dHJhbnNhY3Rpb24uZ2V0KCksIHNjaGVtYVZlcnNpb25LZXksIGRiU2NoZW1hVmVyc2lvbiwgZm91
bmQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihTZXR1cE1l
dGFkYXRhKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7
Ci0gICAgICAgIC8vIEluaXRpYWxpemUgbmV3IGJhY2tpbmcgc3RvcmUuCi0gICAgICAgIGRiU2No
ZW1hVmVyc2lvbiA9IGxhdGVzdEtub3duU2NoZW1hVmVyc2lvbjsKLSAgICAgICAgcHV0SW50KHRy
YW5zYWN0aW9uLmdldCgpLCBzY2hlbWFWZXJzaW9uS2V5LCBkYlNjaGVtYVZlcnNpb24pOwotICAg
ICAgICBkYkRhdGFWZXJzaW9uID0gbGF0ZXN0S25vd25EYXRhVmVyc2lvbjsKLSAgICAgICAgcHV0
SW50KHRyYW5zYWN0aW9uLmdldCgpLCBkYXRhVmVyc2lvbktleSwgZGJEYXRhVmVyc2lvbik7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVXBncmFkZSBvbGQgYmFja2luZyBzdG9yZS4KLSAgICAg
ICAgQVNTRVJUKGRiU2NoZW1hVmVyc2lvbiA8PSBsYXRlc3RLbm93blNjaGVtYVZlcnNpb24pOwot
ICAgICAgICBpZiAoZGJTY2hlbWFWZXJzaW9uIDwgMSkgewotICAgICAgICAgICAgZGJTY2hlbWFW
ZXJzaW9uID0gMTsKLSAgICAgICAgICAgIHB1dEludCh0cmFuc2FjdGlvbi5nZXQoKSwgc2NoZW1h
VmVyc2lvbktleSwgZGJTY2hlbWFWZXJzaW9uKTsKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBzdGFydEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlTWluS2V5Rm9yT3JpZ2luKG9y
aWdpbik7Ci0gICAgICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IERhdGFiYXNl
TmFtZUtleTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihvcmlnaW4pOwotICAgICAgICAgICAgT3du
UHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBkYi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICAgICAg
ICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlz
KGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAg
aW50NjRfdCBkYXRhYmFzZUlkID0gMDsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IGZhbHNlOwot
ICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBnZXRJbnQodHJhbnNhY3Rpb24uZ2V0KCksIGl0LT5r
ZXkoKSwgZGF0YWJhc2VJZCwgZm91bmQpOwotICAgICAgICAgICAgICAgIGlmICghb2spIHsKLSAg
ICAgICAgICAgICAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihTZXR1cE1ldGFkYXRhKTsKLSAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIElOVEVSTkFMX0NP
TlNJU1RFTkNZX0VSUk9SKFNldHVwTWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFZlY3RvcjxjaGFy
PiBpbnRWZXJzaW9uS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBw
dXRWYXJJbnQodHJhbnNhY3Rpb24uZ2V0KCksIGludFZlcnNpb25LZXksIElEQkRhdGFiYXNlTWV0
YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICBpZiAoZGJTY2hlbWFWZXJzaW9uIDwgMikgewotICAgICAgICAgICAgZGJTY2hlbWFWZXJz
aW9uID0gMjsKLSAgICAgICAgICAgIHB1dEludCh0cmFuc2FjdGlvbi5nZXQoKSwgc2NoZW1hVmVy
c2lvbktleSwgZGJTY2hlbWFWZXJzaW9uKTsKLSAgICAgICAgICAgIGRiRGF0YVZlcnNpb24gPSBT
ZXJpYWxpemVkU2NyaXB0VmFsdWU6OndpcmVGb3JtYXRWZXJzaW9uKCk7Ci0gICAgICAgICAgICBw
dXRJbnQodHJhbnNhY3Rpb24uZ2V0KCksIGRhdGFWZXJzaW9uS2V5LCBkYkRhdGFWZXJzaW9uKTsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBuZXcgdmFsdWVzIHdpbGwgYmUgd3JpdHRl
biB1c2luZyB0aGlzIHNlcmlhbGl6YXRpb24gdmVyc2lvbi4KLSAgICBmb3VuZCA9IGZhbHNlOwot
ICAgIG9rID0gZ2V0SW50KHRyYW5zYWN0aW9uLmdldCgpLCBkYXRhVmVyc2lvbktleSwgZGJEYXRh
VmVyc2lvbiwgZm91bmQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9F
UlJPUihTZXR1cE1ldGFkYXRhKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBp
ZiAoIWZvdW5kKSB7Ci0gICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKFNldHVwTWV0
YWRhdGEpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChkYkRhdGFWZXJz
aW9uIDwgbGF0ZXN0S25vd25EYXRhVmVyc2lvbikgewotICAgICAgICBkYkRhdGFWZXJzaW9uID0g
bGF0ZXN0S25vd25EYXRhVmVyc2lvbjsKLSAgICAgICAgcHV0SW50KHRyYW5zYWN0aW9uLmdldCgp
LCBkYXRhVmVyc2lvbktleSwgZGJEYXRhVmVyc2lvbik7Ci0gICAgfQotCi0gICAgQVNTRVJUKGRi
U2NoZW1hVmVyc2lvbiA9PSBsYXRlc3RLbm93blNjaGVtYVZlcnNpb24pOwotICAgIEFTU0VSVChk
YkRhdGFWZXJzaW9uID09IGxhdGVzdEtub3duRGF0YVZlcnNpb24pOwotCi0gICAgaWYgKCF0cmFu
c2FjdGlvbi0+Y29tbWl0KCkpIHsKLSAgICAgICAgSU5URVJOQUxfV1JJVEVfRVJST1IoU2V0dXBN
ZXRhZGF0YSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+Ci1XQVJOX1VOVVNFRF9S
RVRVUk4gc3RhdGljIGJvb2wgZ2V0TWF4T2JqZWN0U3RvcmVJZChEQk9yVHJhbnNhY3Rpb24qIGRi
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QmIG1heE9iamVjdFN0b3JlSWQpCi17Ci0gICAg
Y29uc3QgVmVjdG9yPGNoYXI+IG1heE9iamVjdFN0b3JlSWRLZXkgPSBEYXRhYmFzZU1ldGFEYXRh
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgRGF0YWJhc2VNZXRhRGF0YUtleTo6TWF4T2JqZWN0U3Rv
cmVJZCk7Ci0gICAgYm9vbCBvayA9IGdldE1heE9iamVjdFN0b3JlSWQoZGIsIG1heE9iamVjdFN0
b3JlSWRLZXksIG1heE9iamVjdFN0b3JlSWQpOwotICAgIHJldHVybiBvazsKLX0KLQotdGVtcGxh
dGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KLVdBUk5fVU5VU0VEX1JFVFVSTiBzdGF0aWMg
Ym9vbCBnZXRNYXhPYmplY3RTdG9yZUlkKERCT3JUcmFuc2FjdGlvbiogZGIsIGNvbnN0IFZlY3Rv
cjxjaGFyPiYgbWF4T2JqZWN0U3RvcmVJZEtleSwgaW50NjRfdCYgbWF4T2JqZWN0U3RvcmVJZCkK
LXsKLSAgICBtYXhPYmplY3RTdG9yZUlkID0gLTE7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwot
ICAgIGJvb2wgb2sgPSBnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG1heE9iamVjdFN0
b3JlSWQsIGZvdW5kKTsKLSAgICBpZiAoIW9rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
aWYgKCFmb3VuZCkKLSAgICAgICAgbWF4T2JqZWN0U3RvcmVJZCA9IDA7Ci0KLSAgICBBU1NFUlQo
bWF4T2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY2xhc3MgRGVm
YXVsdExldmVsREJGYWN0b3J5IDogcHVibGljIExldmVsREJGYWN0b3J5IHsKLXB1YmxpYzoKLSAg
ICB2aXJ0dWFsIFBhc3NPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPiBvcGVuTGV2ZWxEQihjb25zdCBT
dHJpbmcmIGZpbGVOYW1lLCBjb25zdCBMZXZlbERCQ29tcGFyYXRvciogY29tcGFyYXRvcikKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBMZXZlbERCRGF0YWJhc2U6Om9wZW4oZmlsZU5hbWUsIGNvbXBh
cmF0b3IpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgZGVzdHJveUxldmVsREIoY29uc3QgU3Ry
aW5nJiBmaWxlTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMZXZlbERCRGF0YWJhc2U6OmRl
c3Ryb3koZmlsZU5hbWUpOwotICAgIH0KLX07Ci0KLUlEQkJhY2tpbmdTdG9yZTo6SURCQmFja2lu
Z1N0b3JlKGNvbnN0IFN0cmluZyYgaWRlbnRpZmllciwgUGFzc093blB0cjxMZXZlbERCRGF0YWJh
c2U+IGRiLCBQYXNzT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yKQotICAgIDog
bV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCi0gICAgLCBtX2RiKGRiKQotICAgICwgbV9jb21wYXJh
dG9yKGNvbXBhcmF0b3IpCi0gICAgLCBtX3dlYWtGYWN0b3J5KHRoaXMpCi17Ci19Ci0KLUlEQkJh
Y2tpbmdTdG9yZTo6SURCQmFja2luZ1N0b3JlKCkKLSAgICA6IG1fd2Vha0ZhY3RvcnkodGhpcykK
LXsKLSAgICAvLyBGSVhNRTogdGhpcyBjb21tZW50cyB3YXMgcmVsYXRlZCB0byBDaHJvbWl1bSBj
b2RlLiBJdCBtYXkgYmUgaW5jb3JyZWN0Ci0gICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQg
b25seSBiZSB1c2VkIGluIHVuaXQgdGVzdHMuCi19Ci0KLUlEQkJhY2tpbmdTdG9yZTo6fklEQkJh
Y2tpbmdTdG9yZSgpCi17Ci0gICAgLy8gbV9kYidzIGRlc3RydWN0b3IgdXNlcyBtX2NvbXBhcmF0
b3IuIFRoZSBvcmRlciBvZiBkZXN0cnVjdGlvbiBpcyBpbXBvcnRhbnQuCi0gICAgbV9kYi5jbGVh
cigpOwotICAgIG1fY29tcGFyYXRvci5jbGVhcigpOwotfQotCi1lbnVtIElEQkxldmVsREJCYWNr
aW5nU3RvcmVPcGVuUmVzdWx0IHsKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1lbW9y
eVN1Y2Nlc3MsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5TdWNjZXNzLAotICAgIElE
QkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkRGlyZWN0b3J5LAotICAgIElEQkxldmVsREJC
YWNraW5nU3RvcmVPcGVuRmFpbGVkVW5rbm93blNjaGVtYSwKLSAgICBJREJMZXZlbERCQmFja2lu
Z1N0b3JlT3BlbkNsZWFudXBEZXN0cm95RmFpbGVkLAotICAgIElEQkxldmVsREJCYWNraW5nU3Rv
cmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Bl
bkNsZWFudXBSZW9wZW5TdWNjZXNzLAotICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFp
bGVkSU9FcnJDaGVja2luZ1NjaGVtYSwKLSAgICBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZh
aWxlZFVua25vd25FcnIsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NZW1vcnlGYWls
ZWQsCi0gICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5BdHRlbXB0Tm9uQVNDSUksCi0gICAg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgsCi19OwotCi1QYXNzUmVmUHRyPElEQkJhY2tp
bmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0eU9y
aWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgY29uc3QgU3RyaW5nJiBmaWxlSWRlbnRp
ZmllcikKLXsKLSAgICBEZWZhdWx0TGV2ZWxEQkZhY3RvcnkgbGV2ZWxEQkZhY3Rvcnk7Ci0gICAg
cmV0dXJuIElEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdpbiwgcGF0aEJhc2VBcmcs
IGZpbGVJZGVudGlmaWVyLCAmbGV2ZWxEQkZhY3RvcnkpOwotfQotCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3JpZ2luKiBzZWN1cml0
eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgY29uc3QgU3RyaW5nJiBmaWxlSWRl
bnRpZmllciwgTGV2ZWxEQkZhY3RvcnkqIGxldmVsREJGYWN0b3J5KQotewotICAgIElEQl9UUkFD
RSgiSURCQmFja2luZ1N0b3JlOjpvcGVuIik7Ci0gICAgQVNTRVJUKCFwYXRoQmFzZUFyZy5pc0Vt
cHR5KCkpOwotICAgIFN0cmluZyBwYXRoQmFzZSA9IHBhdGhCYXNlQXJnOwotCi0gICAgT3duUHRy
PExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yID0gYWRvcHRQdHIobmV3IENvbXBhcmF0b3Io
KSk7Ci0gICAgT3duUHRyPExldmVsREJEYXRhYmFzZT4gZGI7Ci0KLSAgICBpZiAoIXBhdGhCYXNl
LmNvbnRhaW5zT25seUFTQ0lJKCkpCi0gICAgICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0
b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0
dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkF0dGVtcHROb25BU0NJSSwgSURCTGV2ZWxE
QkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGhC
YXNlKSkgewotICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVhdGUgSW5kZXhlZERCIGRh
dGFiYXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsKLSAgICAgICAgSGlzdG9n
cmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tp
bmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5GYWlsZWREaXJl
Y3RvcnksIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICAgICAgcmV0dXJuIFBh
c3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwotICAgIH0KLQotICAgIFN0cmluZyBwYXRoID0g
cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0eU9yaWdpbi0+ZGF0YWJh
c2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7Ci0KLSAgICBkYiA9IGxldmVs
REJGYWN0b3J5LT5vcGVuTGV2ZWxEQihwYXRoLCBjb21wYXJhdG9yLmdldCgpKTsKLSAgICBpZiAo
ZGIpIHsKLSAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOwotICAgICAgICBib29sIG9rID0gaXNT
Y2hlbWFLbm93bihkYi5nZXQoKSwga25vd24pOwotICAgICAgICBpZiAoIW9rKSB7Ci0gICAgICAg
ICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBoYWQgSU8gZXJyb3IgY2hlY2tpbmcgc2NoZW1hLCB0
cmVhdGluZyBpdCBhcyBmYWlsdXJlIHRvIG9wZW4iKTsKLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1
cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3Rv
cmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkSU9FcnJDaGVj
a2luZ1NjaGVtYSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgICAgICAgICAg
ZGIuY2xlYXIoKTsKLSAgICAgICAgfSBlbHNlIGlmICgha25vd24pIHsKLSAgICAgICAgICAgIExP
R19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgaGFkIHVua25vd24gc2NoZW1hLCB0cmVh
dGluZyBpdCBhcyBmYWlsdXJlIHRvIG9wZW4iKTsKLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBv
cnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUu
T3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkVW5rbm93blNjaGVt
YSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgICAgICAgICAgZGIuY2xlYXIo
KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChkYikKLSAgICAgICAgSGlzdG9ncmFtU3Vw
cG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJhY2tpbmdTdG9y
ZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5TdWNjZXNzLCBJREJMZXZl
bERCQmFja2luZ1N0b3JlT3Blbk1heCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIExPR19FUlJPUigi
SW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgb3BlbiBmYWlsZWQsIGF0dGVtcHRpbmcgY2xlYW51cCIp
OwotICAgICAgICBib29sIHN1Y2Nlc3MgPSBsZXZlbERCRmFjdG9yeS0+ZGVzdHJveUxldmVsREIo
cGF0aCk7Ci0gICAgICAgIGlmICghc3VjY2VzcykgewotICAgICAgICAgICAgTE9HX0VSUk9SKCJJ
bmRleGVkREIgYmFja2luZyBzdG9yZSBjbGVhbnVwIGZhaWxlZCIpOwotICAgICAgICAgICAgSGlz
dG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhlZERCLkJh
Y2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5DbGVhbnVw
RGVzdHJveUZhaWxlZCwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwotICAgICAgICAg
ICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwotICAgICAgICB9Ci0KLSAg
ICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSBjbGVhbnVwIHN1Y2NlZWRl
ZCwgcmVvcGVuaW5nIik7Ci0gICAgICAgIGRiID0gbGV2ZWxEQkZhY3RvcnktPm9wZW5MZXZlbERC
KHBhdGgsIGNvbXBhcmF0b3IuZ2V0KCkpOwotICAgICAgICBpZiAoIWRiKSB7Ci0gICAgICAgICAg
ICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIHJlb3BlbiBhZnRlciByZWNvdmVy
eSBmYWlsZWQiKTsKLSAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1l
cmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxl
dmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwgSURCTGV2ZWxEQkJhY2tp
bmdTdG9yZU9wZW5NYXgpOwotICAgICAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlPigpOwotICAgICAgICB9Ci0gICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3Jh
bUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIs
IElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlblN1Y2Nlc3MsIElEQkxldmVs
REJCYWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICB9Ci0KLSAgICBpZiAoIWRiKSB7Ci0gICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dy
YW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMi
LCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZhaWxlZFVua25vd25FcnIsIElEQkxldmVsREJC
YWNraW5nU3RvcmVPcGVuTWF4KTsKLSAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2lu
Z1N0b3JlPigpOwotICAgIH0KLQotICAgIHJldHVybiBjcmVhdGUoZmlsZUlkZW50aWZpZXIsIGRi
LnJlbGVhc2UoKSwgY29tcGFyYXRvci5yZWxlYXNlKCkpOwotfQotCi1QYXNzUmVmUHRyPElEQkJh
Y2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuSW5NZW1vcnkoU2VjdXJpdHlPcmlnaW4q
IHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIpCi17Ci0gICAgRGVmYXVs
dExldmVsREJGYWN0b3J5IGxldmVsREJGYWN0b3J5OwotICAgIHJldHVybiBJREJCYWNraW5nU3Rv
cmU6Om9wZW5Jbk1lbW9yeShzZWN1cml0eU9yaWdpbiwgaWRlbnRpZmllciwgJmxldmVsREJGYWN0
b3J5KTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkJhY2tpbmdTdG9yZTo6
b3BlbkluTWVtb3J5KFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5nJiBpZGVudGlmaWVyLCBM
ZXZlbERCRmFjdG9yeSopCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6Om9wZW5J
bk1lbW9yeSIpOwotCi0gICAgT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yID0g
YWRvcHRQdHIobmV3IENvbXBhcmF0b3IoKSk7Ci0gICAgT3duUHRyPExldmVsREJEYXRhYmFzZT4g
ZGIgPSBMZXZlbERCRGF0YWJhc2U6Om9wZW5Jbk1lbW9yeShjb21wYXJhdG9yLmdldCgpKTsKLSAg
ICBpZiAoIWRiKSB7Ci0gICAgICAgIExPR19FUlJPUigiTGV2ZWxEQkRhdGFiYXNlOjpvcGVuSW5N
ZW1vcnkgZmFpbGVkLiIpOwotICAgICAgICBIaXN0b2dyYW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVt
ZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9wZW5TdGF0dXMiLCBJREJM
ZXZlbERCQmFja2luZ1N0b3JlT3Blbk1lbW9yeUZhaWxlZCwgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZU9wZW5NYXgpOwotICAgICAgICByZXR1cm4gUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+KCk7
Ci0gICAgfQotICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJD
b3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5n
U3RvcmVPcGVuTWVtb3J5U3VjY2VzcywgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOwot
Ci0gICAgcmV0dXJuIGNyZWF0ZShpZGVudGlmaWVyLCBkYi5yZWxlYXNlKCksIGNvbXBhcmF0b3Iu
cmVsZWFzZSgpKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElEQkJhY2tpbmdT
dG9yZTo6Y3JlYXRlKGNvbnN0IFN0cmluZyYgaWRlbnRpZmllciwgUGFzc093blB0cjxMZXZlbERC
RGF0YWJhc2U+IGRiLCBQYXNzT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yKQot
ewotICAgIC8vIEZJWE1FOiBIYW5kbGUgY29tcGFyYXRvciBuYW1lIGNoYW5nZXMuCi0gICAgUmVm
UHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVmKG5ldyBJREJCYWNraW5n
U3RvcmUoaWRlbnRpZmllciwgZGIsIGNvbXBhcmF0b3IpKSk7Ci0KLSAgICBpZiAoIXNldFVwTWV0
YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpLCBpZGVudGlmaWVyKSkKLSAgICAgICAgcmV0
dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwotCi0gICAgcmV0dXJuIGJhY2tpbmdT
dG9yZS5yZWxlYXNlKCk7Ci19Ci0KLVZlY3RvcjxTdHJpbmc+IElEQkJhY2tpbmdTdG9yZTo6Z2V0
RGF0YWJhc2VOYW1lcygpCi17Ci0gICAgVmVjdG9yPFN0cmluZz4gZm91bmROYW1lczsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZU1pbktl
eUZvck9yaWdpbihtX2lkZW50aWZpZXIpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5
ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGVTdG9wS2V5Rm9yT3JpZ2luKG1faWRlbnRpZmllcik7
Ci0KLSAgICBBU1NFUlQoZm91bmROYW1lcy5pc0VtcHR5KCkpOwotCi0gICAgT3duUHRyPExldmVs
REJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJdGVyYXRvcigpOwotICAgIGZvciAoaXQtPnNl
ZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3Rv
cEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5
KCkuYmVnaW4oKTsKLSAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBpdC0+a2V5KCkuZW5kKCk7
Ci0KLSAgICAgICAgRGF0YWJhc2VOYW1lS2V5IGRhdGFiYXNlTmFtZUtleTsKLSAgICAgICAgcCA9
IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YWJhc2VOYW1lS2V5KTsKLSAg
ICAgICAgQVNTRVJUKHApOwotCi0gICAgICAgIGZvdW5kTmFtZXMuYXBwZW5kKGRhdGFiYXNlTmFt
ZUtleS5kYXRhYmFzZU5hbWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBmb3VuZE5hbWVzOwotfQot
Ci1ib29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0SURCRGF0YWJhc2VNZXRhRGF0YShjb25zdCBTdHJp
bmcmIG5hbWUsIElEQkRhdGFiYXNlTWV0YWRhdGEqIG1ldGFkYXRhLCBib29sJiBmb3VuZCkKLXsK
LSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9p
ZGVudGlmaWVyLCBuYW1lKTsKLSAgICBmb3VuZCA9IGZhbHNlOwotCi0gICAgYm9vbCBvayA9IGdl
dEludChtX2RiLmdldCgpLCBrZXksIG1ldGFkYXRhLT5pZCwgZm91bmQpOwotICAgIGlmICghb2sp
IHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXRJREJEYXRhYmFzZU1ldGFEYXRhKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWZvdW5kKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIG9rID0gZ2V0U3RyaW5nKG1fZGIuZ2V0KCksIERhdGFiYXNlTWV0
YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS0+aWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJW
ZXJzaW9uKSwgbWV0YWRhdGEtPnZlcnNpb24sIGZvdW5kKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAg
ICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0SURCRGF0YWJhc2VNZXRhRGF0YSk7Ci0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBJTlRFUk5B
TF9DT05TSVNURU5DWV9FUlJPUihHZXRJREJEYXRhYmFzZU1ldGFEYXRhKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG9rID0gZ2V0VmFySW50KG1fZGIuZ2V0KCksIERhdGFi
YXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS0+aWQsIERhdGFiYXNlTWV0YURhdGFLZXk6
OlVzZXJJbnRWZXJzaW9uKSwgbWV0YWRhdGEtPmludFZlcnNpb24sIGZvdW5kKTsKLSAgICBpZiAo
IW9rKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0SURCRGF0YWJhc2VNZXRhRGF0
YSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAg
ICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRJREJEYXRhYmFzZU1ldGFEYXRhKTsK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtZXRhZGF0YS0+aW50VmVy
c2lvbiA9PSBJREJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lvbikKLSAgICAgICAg
bWV0YWRhdGEtPmludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRhOjpOb0ludFZlcnNpb247
Ci0KLSAgICBvayA9IGdldE1heE9iamVjdFN0b3JlSWQobV9kYi5nZXQoKSwgbWV0YWRhdGEtPmlk
LCBtZXRhZGF0YS0+bWF4T2JqZWN0U3RvcmVJZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJ
TlRFUk5BTF9SRUFEX0VSUk9SKEdldElEQkRhdGFiYXNlTWV0YURhdGEpOwotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLVdBUk5fVU5VU0VEX1JF
VFVSTiBzdGF0aWMgYm9vbCBnZXROZXdEYXRhYmFzZUlkKExldmVsREJEYXRhYmFzZSogZGIsIGlu
dDY0X3QmIG5ld0lkKQotewotICAgIFJlZlB0cjxMZXZlbERCVHJhbnNhY3Rpb24+IHRyYW5zYWN0
aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9uOjpjcmVhdGUoZGIpOwotCi0gICAgbmV3SWQgPSAtMTsK
LSAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQgPSAtMTsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7
Ci0gICAgYm9vbCBvayA9IGdldEludCh0cmFuc2FjdGlvbi5nZXQoKSwgTWF4RGF0YWJhc2VJZEtl
eTo6ZW5jb2RlKCksIG1heERhdGFiYXNlSWQsIGZvdW5kKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAg
ICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0TmV3RGF0YWJhc2VJZCk7Ci0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkKLSAgICAgICAgbWF4RGF0YWJhc2VJZCA9
IDA7Ci0KLSAgICBBU1NFUlQobWF4RGF0YWJhc2VJZCA+PSAwKTsKLQotICAgIGludDY0X3QgZGF0
YWJhc2VJZCA9IG1heERhdGFiYXNlSWQgKyAxOwotICAgIHB1dEludCh0cmFuc2FjdGlvbi5nZXQo
KSwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIGRhdGFiYXNlSWQpOwotICAgIGlmICghdHJh
bnNhY3Rpb24tPmNvbW1pdCgpKSB7Ci0gICAgICAgIElOVEVSTkFMX1dSSVRFX0VSUk9SKEdldE5l
d0RhdGFiYXNlSWQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG5ld0lkID0g
ZGF0YWJhc2VJZDsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6
OmNyZWF0ZUlEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHZlcnNpb24sIGludDY0X3QgaW50VmVyc2lvbiwgaW50NjRfdCYgcm93SWQpCi17Ci0gICAg
Ym9vbCBvayA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSwgcm93SWQpOwotICAgIGlmICgh
b2spCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBBU1NFUlQocm93SWQgPj0gMCk7Ci0KLSAg
ICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1ldGFkYXRhOjpOb0ludFZlcnNpb24pCi0g
ICAgICAgIGludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVyc2lv
bjsKLQotICAgIFJlZlB0cjxMZXZlbERCVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxE
QlRyYW5zYWN0aW9uOjpjcmVhdGUobV9kYi5nZXQoKSk7Ci0gICAgcHV0SW50KHRyYW5zYWN0aW9u
LmdldCgpLCBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZShtX2lkZW50aWZpZXIsIG5hbWUpLCByb3dJ
ZCk7Ci0gICAgcHV0U3RyaW5nKHRyYW5zYWN0aW9uLmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5
OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJWZXJzaW9uKSwgdmVyc2lv
bik7Ci0gICAgcHV0VmFySW50KHRyYW5zYWN0aW9uLmdldCgpLCBEYXRhYmFzZU1ldGFEYXRhS2V5
OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgaW50
VmVyc2lvbik7Ci0gICAgaWYgKCF0cmFuc2FjdGlvbi0+Y29tbWl0KCkpIHsKLSAgICAgICAgSU5U
RVJOQUxfV1JJVEVfRVJST1IoQ3JlYXRlSURCRGF0YWJhc2VNZXRhRGF0YSk7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSURCQmFja2lu
Z1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZUludFZlcnNpb24oSURCQmFja2luZ1N0b3JlOjpUcmFu
c2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qgcm93SWQsIGludDY0X3QgaW50VmVyc2lvbikK
LXsKLSAgICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1ldGFkYXRhOjpOb0ludFZlcnNp
b24pCi0gICAgICAgIGludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50
VmVyc2lvbjsKLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGludFZlcnNpb24gPj0gMCwgImludFZl
cnNpb24gd2FzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGludFZlcnNpb24pKTsKLSAg
ICBwdXRWYXJJbnQoVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rp
b24pLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFL
ZXk6OlVzZXJJbnRWZXJzaW9uKSwgaW50VmVyc2lvbik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LWJvb2wgSURCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZU1ldGFEYXRhKElEQkJhY2tp
bmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IHJvd0lkLCBjb25zdCBT
dHJpbmcmIHZlcnNpb24pCi17Ci0gICAgcHV0U3RyaW5nKFRyYW5zYWN0aW9uOjpsZXZlbERCVHJh
bnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKHJv
d0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VyVmVyc2lvbiksIHZlcnNpb24pOwotICAgIHJl
dHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBkZWxldGVSYW5nZShMZXZlbERCVHJhbnNhY3Rp
b24qIHRyYW5zYWN0aW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGJlZ2luLCBjb25zdCBWZWN0b3I8
Y2hhcj4mIGVuZCkKLXsKLSAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9yPiBpdCA9IHRyYW5zYWN0
aW9uLT5jcmVhdGVJdGVyYXRvcigpOwotICAgIGZvciAoaXQtPnNlZWsoYmVnaW4pOyBpdC0+aXNW
YWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgZW5kKSA8IDA7IGl0LT5uZXh0KCkpCi0g
ICAgICAgIHRyYW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKLX0KLQotCi1ib29sIElEQkJh
Y2tpbmdTdG9yZTo6ZGVsZXRlRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIElE
Ql9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpkZWxldGVEYXRhYmFzZSIpOwotICAgIE93blB0cjxM
ZXZlbERCV3JpdGVPbmx5VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxEQldyaXRlT25s
eVRyYW5zYWN0aW9uOjpjcmVhdGUobV9kYi5nZXQoKSk7Ci0KLSAgICBJREJEYXRhYmFzZU1ldGFk
YXRhIG1ldGFkYXRhOwotICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICAgIGJvb2wgb2sgPSBn
ZXRJREJEYXRhYmFzZU1ldGFEYXRhKG5hbWUsICZtZXRhZGF0YSwgc3VjY2Vzcyk7Ci0gICAgaWYg
KCFvaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghc3VjY2VzcykKLSAgICAgICAg
cmV0dXJuIHRydWU7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFz
ZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEuaWQsIERhdGFiYXNlTWV0YURhdGFLZXk6Ok9y
aWdpbk5hbWUpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gRGF0YWJhc2VNZXRh
RGF0YUtleTo6ZW5jb2RlKG1ldGFkYXRhLmlkICsgMSwgRGF0YWJhc2VNZXRhRGF0YUtleTo6T3Jp
Z2luTmFtZSk7Ci0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJ
dGVyYXRvcigpOwotICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYm
IGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKQotICAgICAg
ICB0cmFuc2FjdGlvbi0+cmVtb3ZlKGl0LT5rZXkoKSk7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hh
cj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKLSAg
ICB0cmFuc2FjdGlvbi0+cmVtb3ZlKGtleSk7Ci0KLSAgICBpZiAoIXRyYW5zYWN0aW9uLT5jb21t
aXQoKSkgewotICAgICAgICBJTlRFUk5BTF9XUklURV9FUlJPUihEZWxldGVEYXRhYmFzZSk7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRp
YyBib29sIGNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoY29uc3QgTGV2ZWxEQkl0ZXJh
dG9yKiBpdCwgY29uc3QgVmVjdG9yPGNoYXI+JiBzdG9wS2V5LCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgbWV0YURhdGFUeXBlKQotewotICAgIGlmICghaXQtPmlzVmFsaWQoKSB8fCBj
b21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpID49IDApCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURhdGFLZXk7Ci0gICAgY29uc3Qg
Y2hhciogcCA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShpdC0+a2V5KCkuYmVnaW4o
KSwgaXQtPmtleSgpLmVuZCgpLCAmbWV0YURhdGFLZXkpOwotICAgIEFTU0VSVF9VTlVTRUQocCwg
cCk7Ci0gICAgaWYgKG1ldGFEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSAhPSBvYmplY3RTdG9yZUlk
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlw
ZSgpICE9IG1ldGFEYXRhVHlwZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0
cnVlOwotfQotCi0vLyBGSVhNRTogVGhpcyBzaG91bGQgZG8gc29tZSBlcnJvciBoYW5kbGluZyBy
YXRoZXIgdGhhbiBwbG93aW5nIGFoZWFkIHdoZW4gYmFkIGRhdGEgaXMgZW5jb3VudGVyZWQuCi1i
b29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0X3QgZGF0YWJhc2VJZCwg
SURCRGF0YWJhc2VNZXRhZGF0YTo6T2JqZWN0U3RvcmVNYXAqIG9iamVjdFN0b3JlcykKLXsKLSAg
ICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzIik7Ci0gICAgaWYg
KCFLZXlQcmVmaXg6OmlzVmFsaWREYXRhYmFzZUlkKGRhdGFiYXNlSWQpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gT2JqZWN0U3RvcmVN
ZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIDEsIDApOwotICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBzdG9wS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlTWF4S2V5KGRhdGFi
YXNlSWQpOwotCi0gICAgQVNTRVJUKG9iamVjdFN0b3Jlcy0+aXNFbXB0eSgpKTsKLQotICAgIE93
blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICBp
dC0+c2VlayhzdGFydEtleSk7Ci0gICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtl
eXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsKLSAgICAgICAgY29uc3QgY2hhciogcCA9IGl0
LT5rZXkoKS5iZWdpbigpOwotICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5l
bmQoKTsKLQotICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5OwotICAg
ICAgICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURh
dGFLZXkpOwotICAgICAgICBBU1NFUlQocCk7Ci0gICAgICAgIGlmIChtZXRhRGF0YUtleS5tZXRh
RGF0YVR5cGUoKSAhPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKSB7Ci0gICAgICAgICAg
ICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRPYmplY3RTdG9yZXMpOwotICAgICAgICAg
ICAgLy8gUG9zc2libGUgc3RhbGUgbWV0YWRhdGEsIGJ1dCBkb24ndCBmYWlsIHRoZSBsb2FkLgot
ICAgICAgICAgICAgaXQtPm5leHQoKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0KLSAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gbWV0YURhdGFLZXkub2JqZWN0U3Rv
cmVJZCgpOwotCi0gICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIGJ5IGRpcmVjdCBrZXkgbG9va3Vw
IHJhdGhlciB0aGFuIGl0ZXJhdGlvbiwgdG8gc2ltcGxpZnkuCi0gICAgICAgIFN0cmluZyBvYmpl
Y3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVl
KCkuZW5kKCkpOwotCi0gICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgIGlmICghY2hlY2tPYmpl
Y3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwgb2JqZWN0U3RvcmVJZCwg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsKLSAgICAgICAgICAgIElOVEVSTkFM
X0NPTlNJU1RFTkNZX0VSUk9SKEdldE9iamVjdFN0b3Jlcyk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgICAgICBJREJLZXlQYXRoIGtleVBhdGggPSBkZWNvZGVJREJLZXlQYXRo
KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKLQotICAgICAgICBpdC0+
bmV4dCgpOwotICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQu
Z2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkF1
dG9JbmNyZW1lbnQpKSB7Ci0gICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihH
ZXRPYmplY3RTdG9yZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Ym9vbCBhdXRvSW5jcmVtZW50ID0gZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+
dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQtPm5leHQoKTsgLy8gSXMgZXZpY2F0YmxlLgot
ICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0
b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkV2aWN0YWJsZSkp
IHsKLSAgICAgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKEdldE9iamVjdFN0b3Jl
cyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGl0LT5uZXh0KCk7
IC8vIExhc3QgdmVyc2lvbi4KLSAgICAgICAgaWYgKCFjaGVja09iamVjdFN0b3JlQW5kTWV0YURh
dGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjpMYXN0VmVyc2lvbikpIHsKLSAgICAgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZ
X0VSUk9SKEdldE9iamVjdFN0b3Jlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot
Ci0gICAgICAgIGl0LT5uZXh0KCk7IC8vIE1heGltdW0gaW5kZXggaWQgYWxsb2NhdGVkLgotICAg
ICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BL
ZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Ok1heEluZGV4SWQpKSB7
Ci0gICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRPYmplY3RTdG9yZXMp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaW50NjRfdCBtYXhJbmRl
eElkID0gZGVjb2RlSW50KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsK
LQotICAgICAgICBpdC0+bmV4dCgpOyAvLyBbb3B0aW9uYWxdIGhhcyBrZXkgcGF0aCAoaXMgbm90
IG51bGwpCi0gICAgICAgIGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0Lmdl
dCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpIYXNL
ZXlQYXRoKSkgewotICAgICAgICAgICAgYm9vbCBoYXNLZXlQYXRoID0gZGVjb2RlQm9vbChpdC0+
dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0gICAgICAgICAgICAvLyBUaGlz
IGNoZWNrIGFjY291bnRzIGZvciB0d28gbGF5ZXJzIG9mIGxlZ2FjeSBjb2Rpbmc6Ci0gICAgICAg
ICAgICAvLyAoMSkgSW5pdGlhbGx5LCBoYXNLZXlQYXRoIHdhcyBhZGRlZCB0byBkaXN0aW5ndWlz
aCBudWxsIHZzLiBzdHJpbmcuCi0gICAgICAgICAgICAvLyAoMikgTGF0ZXIsIG51bGwgdnMuIHN0
cmluZyB2cy4gYXJyYXkgd2FzIHN0b3JlZCBpbiB0aGUga2V5UGF0aCBpdHNlbGYuCi0gICAgICAg
ICAgICAvLyBTbyB0aGlzIGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHN0cmluZy10eXBlIGtl
eVBhdGhzLgotICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoICYmIChrZXlQYXRoLnR5cGUoKSA9
PSBJREJLZXlQYXRoOjpTdHJpbmdUeXBlICYmICFrZXlQYXRoLnN0cmluZygpLmlzRW1wdHkoKSkp
IHsKLSAgICAgICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRPYmplY3RT
dG9yZXMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgaWYgKCFoYXNLZXlQYXRoKQotICAgICAgICAgICAgICAgIGtleVBhdGggPSBJREJLZXlQYXRo
KCk7Ci0gICAgICAgICAgICBpdC0+bmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRf
dCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gLTE7Ci0gICAgICAgIGlmIChjaGVja09iamVj
dFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKSkgewotICAg
ICAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IGRlY29kZUludChpdC0+dmFsdWUo
KS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0gICAgICAgICAgICAvLyBGSVhNRTogUmV0
dXJuIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIsIGNhY2hlIGluIG9iamVjdCBzdG9yZSwgYW5k
IHdyaXRlIGxhemlseSB0byBiYWNraW5nIHN0b3JlLgotICAgICAgICAgICAgLy8gRm9yIG5vdywg
anVzdCBhc3NlcnQgdGhhdCBpZiBpdCB3YXMgd3JpdHRlbiBpdCB3YXMgdmFsaWQuCi0gICAgICAg
ICAgICBBU1NFUlRfVU5VU0VEKGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIsIGtleUdlbmVyYXRv
ckN1cnJlbnROdW1iZXIgPj0gS2V5R2VuZXJhdG9ySW5pdGlhbE51bWJlcik7Ci0gICAgICAgICAg
ICBpdC0+bmV4dCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSURCT2JqZWN0U3RvcmVNZXRhZGF0
YSBtZXRhZGF0YShvYmplY3RTdG9yZU5hbWUsIG9iamVjdFN0b3JlSWQsIGtleVBhdGgsIGF1dG9J
bmNyZW1lbnQsIG1heEluZGV4SWQpOwotICAgICAgICBpZiAoIWdldEluZGV4ZXMoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgJm1ldGFkYXRhLmluZGV4ZXMpKQotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICBvYmplY3RTdG9yZXMtPnNldChvYmplY3RTdG9yZUlkLCBtZXRhZGF0
YSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1XQVJOX1VOVVNFRF9SRVRVUk4gc3Rh
dGljIGJvb2wgc2V0TWF4T2JqZWN0U3RvcmVJZChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtleSA9IERhdGFiYXNlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpNYXhPYmplY3RTdG9y
ZUlkKTsKLSAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQgPSAtMTsKLSAgICBib29sIG9rID0g
Z2V0TWF4T2JqZWN0U3RvcmVJZCh0cmFuc2FjdGlvbiwgbWF4T2JqZWN0U3RvcmVJZEtleSwgbWF4
T2JqZWN0U3RvcmVJZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VS
Uk9SKFNldE1heE9iamVjdFN0b3JlSWQpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgaWYgKG9iamVjdFN0b3JlSWQgPD0gbWF4T2JqZWN0U3RvcmVJZCkgewotICAgICAgICBJ
TlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihTZXRNYXhPYmplY3RTdG9yZUlkKTsKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdXRJbnQodHJhbnNhY3Rpb24sIG1heE9iamVjdFN0
b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElE
QkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoSURCQmFja2luZ1N0b3JlOjpUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgmIGtleVBhdGgsIGJvb2wg
YXV0b0luY3JlbWVudCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Y3JlYXRl
T2JqZWN0U3RvcmUiKTsKLSAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBMZXZlbERCVHJhbnNh
Y3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246
OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIGlmICghc2V0TWF4T2Jq
ZWN0U3RvcmVJZChsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQp
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbmFtZUtl
eSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hh
cj4ga2V5UGF0aEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlQYXRoKTsKLSAgICBj
b25zdCBWZWN0b3I8Y2hhcj4gYXV0b0luY3JlbWVudEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjpBdXRvSW5jcmVtZW50KTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXZpY3RhYmxlS2V5
ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkV2aWN0YWJsZSk7Ci0gICAgY29uc3QgVmVjdG9y
PGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRh
dGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Okxhc3RWZXJz
aW9uKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5OjpNYXhJbmRleElkKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaGFzS2V5
UGF0aEtleSAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6SGFzS2V5UGF0aCk7Ci0gICAgY29u
c3QgVmVjdG9yPGNoYXI+IGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXkgPSBPYmplY3RTdG9y
ZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcik7Ci0gICAgY29uc3QgVmVj
dG9yPGNoYXI+IG5hbWVzS2V5ID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG5hbWUpOwotCi0gICAgcHV0U3RyaW5nKGxldmVsREJUcmFuc2FjdGlvbiwgbmFtZUtleSwg
bmFtZSk7Ci0gICAgcHV0SURCS2V5UGF0aChsZXZlbERCVHJhbnNhY3Rpb24sIGtleVBhdGhLZXks
IGtleVBhdGgpOwotICAgIHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGF1dG9JbmNyZW1lbnRL
ZXksIGF1dG9JbmNyZW1lbnQpOwotICAgIHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGV2aWN0
YWJsZUtleSwgZmFsc2UpOwotICAgIHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGxhc3RWZXJz
aW9uS2V5LCAxKTsKLSAgICBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBtYXhJbmRleElkS2V5
LCBNaW5pbXVtSW5kZXhJZCk7Ci0gICAgcHV0Qm9vbChsZXZlbERCVHJhbnNhY3Rpb24sIGhhc0tl
eVBhdGhLZXksICFrZXlQYXRoLmlzTnVsbCgpKTsKLSAgICBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0
aW9uLCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5LCBLZXlHZW5lcmF0b3JJbml0aWFsTnVt
YmVyKTsKLSAgICBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBuYW1lc0tleSwgb2JqZWN0U3Rv
cmVJZCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpkZWxl
dGVPYmplY3RTdG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwg
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi17Ci0gICAgSURCX1RS
QUNFKCJJREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlIik7Ci0gICAgaWYgKCFLZXlQ
cmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQotICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJ
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5z
YWN0aW9uKTsKLQotICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7Ci0gICAgYm9vbCBmb3VuZCA9
IGZhbHNlOwotICAgIGJvb2wgb2sgPSBnZXRTdHJpbmcobGV2ZWxEQlRyYW5zYWN0aW9uLCBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6TmFtZSksIG9iamVjdFN0b3JlTmFtZSwgZm91bmQpOwotICAg
IGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihEZWxldGVPYmplY3RTdG9y
ZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAg
ICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihEZWxldGVPYmplY3RTdG9yZSk7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBkZWxldGVSYW5nZShsZXZlbERCVHJhbnNh
Y3Rpb24sIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RT
dG9yZUlkLCAwKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlTWF4S2V5KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQpKTsKLQotICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKE9i
amVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZU5hbWUpKTsK
LQotICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgSW5kZXhGcmVlTGlzdEtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBJbmRleEZyZWVMaXN0S2V5Ojpl
bmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpOwotICAgIGRlbGV0ZVJhbmdl
KGxldmVsREJUcmFuc2FjdGlvbiwgSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsIDAsIDApLCBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpOwotCi0gICAgcmV0dXJuIGNsZWFyT2JqZWN0U3RvcmUo
dHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwotfQotCi1ib29sIElEQkJh
Y2tpbmdTdG9yZTo6Z2V0UmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5z
YWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3Qg
SURCS2V5JiBrZXksIFZlY3RvcjxjaGFyPiYgcmVjb3JkKQotewotICAgIElEQl9UUkFDRSgiSURC
QmFja2luZ1N0b3JlOjpnZXRSZWNvcmQiKTsKLSAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBM
ZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwotCi0gICAg
Y29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotICAgIFZlY3RvcjxjaGFyPiBkYXRh
OwotCi0gICAgcmVjb3JkLmNsZWFyKCk7Ci0KLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAg
Ym9vbCBvayA9IGxldmVsREJUcmFuc2FjdGlvbi0+c2FmZUdldChsZXZlbGRiS2V5LCBkYXRhLCBm
b3VuZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9SKEdldFJl
Y29yZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkKLSAg
ICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAgY29uc3QgY2hh
ciogcCA9IGRlY29kZVZhckludChkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksIHZlcnNpb24pOwot
ICAgIGlmICghcCkgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9SKEdldFJlY29yZCk7Ci0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZWNvcmQuYXBwZW5kUmFuZ2UocCwg
c3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEuZW5kKCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsK
LX0KLQotV0FSTl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIGdldE5ld1ZlcnNpb25OdW1iZXIo
TGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QmIG5ld1ZlcnNpb25OdW1iZXIpCi17Ci0gICAgY29u
c3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
Okxhc3RWZXJzaW9uKTsKLQotICAgIG5ld1ZlcnNpb25OdW1iZXIgPSAtMTsKLSAgICBpbnQ2NF90
IGxhc3RWZXJzaW9uID0gLTE7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGJvb2wgb2sg
PSBnZXRJbnQodHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCBsYXN0VmVyc2lvbiwgZm91bmQp
OwotICAgIGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXROZXdWZXJz
aW9uTnVtYmVyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWZvdW5k
KQotICAgICAgICBsYXN0VmVyc2lvbiA9IDA7Ci0KLSAgICBBU1NFUlQobGFzdFZlcnNpb24gPj0g
MCk7Ci0KLSAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lvbiArIDE7Ci0gICAgcHV0SW50
KHRyYW5zYWN0aW9uLCBsYXN0VmVyc2lvbktleSwgdmVyc2lvbik7Ci0KLSAgICBBU1NFUlQodmVy
c2lvbiA+IGxhc3RWZXJzaW9uKTsgLy8gRklYTUU6IFRoaW5rIGFib3V0IGhvdyB3ZSB3YW50IHRv
IGhhbmRsZSB0aGUgb3ZlcmZsb3cgc2NlbmFyaW8uCi0KLSAgICBuZXdWZXJzaW9uTnVtYmVyID0g
dmVyc2lvbjsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OnB1
dFJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYga2V5LCBQ
YXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gcHJwVmFsdWUsIFJlY29yZElkZW50aWZpZXIqIHJlY29y
ZElkZW50aWZpZXIpCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OnB1dFJlY29y
ZCIpOwotICAgIGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEFTU0VSVChrZXkuaXNWYWxpZCgpKTsK
LQotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFja2lu
Z1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7
Ci0gICAgaW50NjRfdCB2ZXJzaW9uID0gLTE7Ci0gICAgYm9vbCBvayA9IGdldE5ld1ZlcnNpb25O
dW1iZXIobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJz
aW9uKTsKLSAgICBpZiAoIW9rKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgQVNTRVJUKHZl
cnNpb24gPj0gMCk7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IG9iamVjdFN0b3JlZGF0YUtleSA9
IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtl
eSk7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gdjsKLSAgICB2LmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJ
bnQodmVyc2lvbikpOwotICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IHZhbHVlID0gcHJwVmFsdWU7
Ci0gICAgQVNTRVJUKHZhbHVlKTsKLSAgICB2LmFwcGVuZCh2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+
c2l6ZSgpKTsKLQotICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cHV0KG9iamVjdFN0b3JlZGF0YUtl
eSwgdik7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhpc3RzRW50cnlLZXkgPSBFeGlzdHNF
bnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGtleSk7Ci0gICAgbGV2
ZWxEQlRyYW5zYWN0aW9uLT5wdXQoZXhpc3RzRW50cnlLZXksIGVuY29kZUludCh2ZXJzaW9uKSk7
Ci0KLSAgICByZWNvcmRJZGVudGlmaWVyLT5yZXNldChlbmNvZGVJREJLZXkoa2V5KSwgdmVyc2lv
bik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpjbGVhck9i
amVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2
NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICBJREJfVFJBQ0Uo
IklEQkJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSIpOwotICAgIGlmICghS2V5UHJlZml4
Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFj
a2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlv
bik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQpLmVuY29kZSgpOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9w
S2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQgKyAxKS5lbmNvZGUoKTsK
LQotICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgc3RhcnRLZXksIHN0b3BLZXkp
OwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlUmVj
b3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRh
dGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgUmVjb3JkSWRlbnRpZmllciYg
cmVjb3JkSWRlbnRpZmllcikKLXsKLSAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6ZGVs
ZXRlUmVjb3JkIik7Ci0gICAgaWYgKCFLZXlQcmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0
aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjps
ZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLQotICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBvYmplY3RTdG9yZURhdGFLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCByZWNvcmRJZGVudGlmaWVyLnByaW1hcnlLZXkoKSk7Ci0g
ICAgbGV2ZWxEQlRyYW5zYWN0aW9uLT5yZW1vdmUob2JqZWN0U3RvcmVEYXRhS2V5KTsKLQotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBleGlzdHNFbnRyeUtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNv
ZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgcmVjb3JkSWRlbnRpZmllci5wcmltYXJ5S2V5
KCkpOwotICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKGV4aXN0c0VudHJ5S2V5KTsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0S2V5R2VuZXJh
dG9yQ3VycmVudE51bWJlcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QmIGtl
eUdlbmVyYXRvckN1cnJlbnROdW1iZXIpCi17Ci0gICAgaWYgKCFLZXlQcmVmaXg6OnZhbGlkSWRz
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
TGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLQotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5ID0gT2JqZWN0
U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOwotCi0gICAga2V5
R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IC0xOwotICAgIFZlY3RvcjxjaGFyPiBkYXRhOwotCi0g
ICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGJvb2wgb2sgPSBsZXZlbERCVHJhbnNhY3Rpb24t
PnNhZmVHZXQoa2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSwgZGF0YSwgZm91bmQpOwotICAg
IGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXRLZXlHZW5lcmF0b3JD
dXJyZW50TnVtYmVyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoZm91
bmQpCi0gICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPSBkZWNvZGVJbnQoZGF0YS5i
ZWdpbigpLCBkYXRhLmVuZCgpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gUHJldmlvdXNseSwg
dGhlIGtleSBnZW5lcmF0b3Igc3RhdGUgd2FzIG5vdCBzdG9yZWQgZXhwbGljaXRseSBidXQgZGVy
aXZlZCBmcm9tIHRoZQotICAgICAgICAvLyBtYXhpbXVtIG51bWVyaWMga2V5IHByZXNlbnQgaW4g
ZXhpc3RpbmcgZGF0YS4gVGhpcyB2aW9sYXRlcyB0aGUgc3BlYyBhcyB0aGUgZGF0YSBtYXkKLSAg
ICAgICAgLy8gYmUgY2xlYXJlZCBidXQgdGhlIGtleSBnZW5lcmF0b3Igc3RhdGUgbXVzdCBiZSBw
cmVzZXJ2ZWQuCi0gICAgICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IE9iamVjdFN0
b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIG1pbklEQktleSgp
KTsKLSAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJREJLZXkoKSk7Ci0KLSAg
ICAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBsZXZlbERCVHJhbnNhY3Rpb24tPmNy
ZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgICAgIGludDY0X3QgbWF4TnVtZXJpY0tleSA9IDA7Ci0KLSAg
ICAgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtl
eXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsKLSAgICAgICAgICAgIGNv
bnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIq
IGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOwotCi0gICAgICAgICAgICBPYmplY3RTdG9yZURhdGFL
ZXkgZGF0YUtleTsKLSAgICAgICAgICAgIHAgPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShw
LCBsaW1pdCwgJmRhdGFLZXkpOwotICAgICAgICAgICAgQVNTRVJUKHApOwotCi0gICAgICAgICAg
ICBpZiAoZGF0YUtleS51c2VyS2V5KCktPnR5cGUoKSA9PSBJREJLZXk6Ok51bWJlclR5cGUpIHsK
LSAgICAgICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxpbnQ2NF90PihkYXRhS2V5
LnVzZXJLZXkoKS0+bnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGlmIChuID4gbWF4TnVtZXJp
Y0tleSkKLSAgICAgICAgICAgICAgICAgICAgbWF4TnVtZXJpY0tleSA9IG47Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgIH0KLQotICAgICAgICBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gbWF4
TnVtZXJpY0tleSArIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGtleUdlbmVyYXRvckN1cnJlbnRO
dW1iZXI7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjptYXliZVVwZGF0ZUtleUdlbmVyYXRv
ckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24s
IGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IG5ld051
bWJlciwgYm9vbCBjaGVja0N1cnJlbnQpCi17Ci0gICAgaWYgKCFLZXlQcmVmaXg6OnZhbGlkSWRz
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
TGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKLQotICAg
IGlmIChjaGVja0N1cnJlbnQpIHsKLSAgICAgICAgaW50NjRfdCBjdXJyZW50TnVtYmVyOwotICAg
ICAgICBib29sIG9rID0gZ2V0S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcih0cmFuc2FjdGlvbiwg
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgY3VycmVudE51bWJlcik7Ci0gICAgICAgIGlmICgh
b2spCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChuZXdOdW1iZXIgPD0g
Y3VycmVudE51bWJlcikKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGNv
bnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0
b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpOwotICAgIHB1dEludChs
ZXZlbERCVHJhbnNhY3Rpb24sIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJLZXksIG5ld051bWJl
cik7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjprZXlFeGlz
dHNJbk9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9u
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5
JiBrZXksIFJlY29yZElkZW50aWZpZXIqIGZvdW5kUmVjb3JkSWRlbnRpZmllciwgYm9vbCYgZm91
bmQpCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0luT2JqZWN0
U3RvcmUiKTsKLSAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBmb3VuZCA9IGZhbHNlOwotICAg
IExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFja2luZ1N0b3Jl
OjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0gICAg
Y29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOwotICAgIFZlY3RvcjxjaGFyPiBkYXRh
OwotCi0gICAgYm9vbCBvayA9IGxldmVsREJUcmFuc2FjdGlvbi0+c2FmZUdldChsZXZlbGRiS2V5
LCBkYXRhLCBmb3VuZCk7Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VS
Uk9SKEtleUV4aXN0c0luT2JqZWN0U3RvcmUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotICAgIGlmICghZm91bmQpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaW50NjRfdCB2
ZXJzaW9uOwotICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwg
dmVyc2lvbikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGZvdW5kUmVjb3JkSWRlbnRp
Zmllci0+cmVzZXQoZW5jb2RlSURCS2V5KGtleSksIHZlcnNpb24pOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1zdGF0aWMgYm9vbCBjaGVja0luZGV4QW5kTWV0YURhdGFLZXkoY29uc3QgTGV2ZWxE
Qkl0ZXJhdG9yKiBpdCwgY29uc3QgVmVjdG9yPGNoYXI+JiBzdG9wS2V5LCBpbnQ2NF90IGluZGV4
SWQsIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQotewotICAgIGlmICghaXQtPmlzVmFsaWQo
KSB8fCBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpID49IDApCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIEluZGV4TWV0YURhdGFLZXkgbWV0YURhdGFLZXk7Ci0gICAgY29uc3Qg
Y2hhciogcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShpdC0+a2V5KCkuYmVnaW4oKSwgaXQt
PmtleSgpLmVuZCgpLCAmbWV0YURhdGFLZXkpOwotICAgIEFTU0VSVF9VTlVTRUQocCwgcCk7Ci0g
ICAgaWYgKG1ldGFEYXRhS2V5LmluZGV4SWQoKSAhPSBpbmRleElkKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlwZSgpICE9IG1ldGFEYXRhVHlw
ZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotfQotCi0KLS8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBkbyBzb21lIGVycm9yIGhhbmRsaW5nIHJhdGhlciB0aGFuIHBsb3dp
bmcgYWhlYWQgd2hlbiBiYWQgZGF0YSBpcyBlbmNvdW50ZXJlZC4KLWJvb2wgSURCQmFja2luZ1N0
b3JlOjpnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBJREJPYmplY3RTdG9yZU1ldGFkYXRhOjpJbmRleE1hcCogaW5kZXhlcykKLXsKLSAgICBJREJf
VFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyIpOwotICAgIGlmICghS2V5UHJlZml4
Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkKLSAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IEluZGV4TWV0YURhdGFLZXk6
OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKTsKLSAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gc3RvcEtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBv
YmplY3RTdG9yZUlkICsgMSwgMCwgMCk7Ci0KLSAgICBBU1NFUlQoaW5kZXhlcy0+aXNFbXB0eSgp
KTsKLQotICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRlcmF0
b3IoKTsKLSAgICBpdC0+c2VlayhzdGFydEtleSk7Ci0gICAgd2hpbGUgKGl0LT5pc1ZhbGlkKCkg
JiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsKLSAgICAgICAgY29uc3Qg
Y2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOwotICAgICAgICBjb25zdCBjaGFyKiBsaW1pdCA9
IGl0LT5rZXkoKS5lbmQoKTsKLQotICAgICAgICBJbmRleE1ldGFEYXRhS2V5IG1ldGFEYXRhS2V5
OwotICAgICAgICBwID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmbWV0YURh
dGFLZXkpOwotICAgICAgICBBU1NFUlQocCk7Ci0gICAgICAgIGlmIChtZXRhRGF0YUtleS5tZXRh
RGF0YVR5cGUoKSAhPSBJbmRleE1ldGFEYXRhS2V5OjpOYW1lKSB7Ci0gICAgICAgICAgICBJTlRF
Uk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRJbmRleGVzKTsKLSAgICAgICAgICAgIC8vIFBvc3Np
YmxlIHN0YWxlIG1ldGFkYXRhIGR1ZSB0byBodHRwOi8vd2Via2l0Lm9yZy9iLzg1NTU3IGJ1dCBk
b24ndCBmYWlsIHRoZSBsb2FkLgotICAgICAgICAgICAgaXQtPm5leHQoKTsKLSAgICAgICAgICAg
IGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRklYTUU6IERvIHRoaXMgYnkgZGly
ZWN0IGtleSBsb29rdXAgcmF0aGVyIHRoYW4gaXRlcmF0aW9uLCB0byBzaW1wbGlmeS4KLSAgICAg
ICAgaW50NjRfdCBpbmRleElkID0gbWV0YURhdGFLZXkuaW5kZXhJZCgpOwotICAgICAgICBTdHJp
bmcgaW5kZXhOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1
ZSgpLmVuZCgpKTsKLQotICAgICAgICBpdC0+bmV4dCgpOyAvLyB1bmlxdWUgZmxhZwotICAgICAg
ICBpZiAoIWNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShpdC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJ
ZCwgSW5kZXhNZXRhRGF0YUtleTo6VW5pcXVlKSkgewotICAgICAgICAgICAgSU5URVJOQUxfQ09O
U0lTVEVOQ1lfRVJST1IoR2V0SW5kZXhlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgICAgICBib29sIGluZGV4VW5pcXVlID0gZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdp
bigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQtPm5leHQoKTsgLy8ga2V5UGF0
aAotICAgICAgICBpZiAoIWNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShpdC5nZXQoKSwgc3RvcEtl
eSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsKLSAgICAgICAgICAgIElO
VEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKEdldEluZGV4ZXMpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICAgICAgSURCS2V5UGF0aCBrZXlQYXRoID0gZGVjb2RlSURCS2V5UGF0
aChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7Ci0KLSAgICAgICAgaXQt
Pm5leHQoKTsgLy8gW29wdGlvbmFsXSBtdWx0aUVudHJ5IGZsYWcKLSAgICAgICAgYm9vbCBpbmRl
eE11bHRpRW50cnkgPSBmYWxzZTsKLSAgICAgICAgaWYgKGNoZWNrSW5kZXhBbmRNZXRhRGF0YUtl
eShpdC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6TXVsdGlFbnRy
eSkpIHsKLSAgICAgICAgICAgIGluZGV4TXVsdGlFbnRyeSA9IGRlY29kZUJvb2woaXQtPnZhbHVl
KCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOwotICAgICAgICAgICAgaXQtPm5leHQoKTsK
LSAgICAgICAgfQotCi0gICAgICAgIGluZGV4ZXMtPnNldChpbmRleElkLCBJREJJbmRleE1ldGFk
YXRhKGluZGV4TmFtZSwgaW5kZXhJZCwga2V5UGF0aCwgaW5kZXhVbmlxdWUsIGluZGV4TXVsdGlF
bnRyeSkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotV0FSTl9VTlVTRURfUkVUVVJO
IHN0YXRpYyBib29sIHNldE1heEluZGV4SWQoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCkKLXsKLSAgICBpbnQ2NF90IG1heEluZGV4SWQgPSAtMTsKLSAgICBjb25zdCBWZWN0b3I8
Y2hhcj4gbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpNYXhJbmRleElk
KTsKLSAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgYm9vbCBvayA9IGdldEludCh0cmFuc2Fj
dGlvbiwgbWF4SW5kZXhJZEtleSwgbWF4SW5kZXhJZCwgZm91bmQpOwotICAgIGlmICghb2spIHsK
LSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihTZXRNYXhJbmRleElkKTsKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWZvdW5kKQotICAgICAgICBtYXhJbmRleElkID0g
TWluaW11bUluZGV4SWQ7Ci0KLSAgICBpZiAoaW5kZXhJZCA8PSBtYXhJbmRleElkKSB7Ci0gICAg
ICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKFNldE1heEluZGV4SWQpOwotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHV0SW50KHRyYW5zYWN0aW9uLCBtYXhJbmRleElk
S2V5LCBpbmRleElkKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3Rv
cmU6OmNyZWF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9u
LCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgmIGtleVBhdGgsIGJvb2wg
aXNVbmlxdWUsIGJvb2wgaXNNdWx0aUVudHJ5KQotewotICAgIElEQl9UUkFDRSgiSURCQmFja2lu
Z1N0b3JlOjpjcmVhdGVJbmRleCIpOwotICAgIGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFja2luZ1N0
b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7Ci0g
ICAgaWYgKCFzZXRNYXhJbmRleElkKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0
IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFLZXk6Ok5hbWUpOwotICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiB1bmlxdWVLZXkgPSBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6VW5p
cXVlKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IEluZGV4TWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFE
YXRhS2V5OjpLZXlQYXRoKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbXVsdGlFbnRyeUtleSA9
IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBJbmRleE1ldGFEYXRhS2V5OjpNdWx0aUVudHJ5KTsKLQotICAgIHB1dFN0cmluZyhsZXZl
bERCVHJhbnNhY3Rpb24sIG5hbWVLZXksIG5hbWUpOwotICAgIHB1dEJvb2wobGV2ZWxEQlRyYW5z
YWN0aW9uLCB1bmlxdWVLZXksIGlzVW5pcXVlKTsKLSAgICBwdXRJREJLZXlQYXRoKGxldmVsREJU
cmFuc2FjdGlvbiwga2V5UGF0aEtleSwga2V5UGF0aCk7Ci0gICAgcHV0Qm9vbChsZXZlbERCVHJh
bnNhY3Rpb24sIG11bHRpRW50cnlLZXksIGlzTXVsdGlFbnRyeSk7Ci0gICAgcmV0dXJuIHRydWU7
Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKLXsKLSAgICBJREJfVFJBQ0UoIklEQkJhY2tp
bmdTdG9yZTo6ZGVsZXRlSW5kZXgiKTsKLSAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdT
dG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOwot
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4TWV0YURhdGFTdGFydCA9IEluZGV4TWV0YURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCAwKTsKLSAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhNZXRhRGF0YUVuZCA9IEluZGV4TWV0YURhdGFLZXk6
OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLSAgICBk
ZWxldGVSYW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIGluZGV4TWV0YURhdGFTdGFydCwgaW5kZXhN
ZXRhRGF0YUVuZCk7Ci0KLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhEYXRhU3RhcnQgPSBJ
bmRleERhdGFLZXk6OmVuY29kZU1pbktleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkKTsKLSAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhEYXRhRW5kID0gSW5kZXhEYXRhS2V5
OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0gICAg
ZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBpbmRleERhdGFTdGFydCwgaW5kZXhEYXRh
RW5kKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OnB1dElu
ZGV4RGF0YUZvclJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlv
biwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IFJlY29yZElkZW50aWZpZXImIHJlY29yZElk
ZW50aWZpZXIpCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OnB1dEluZGV4RGF0
YUZvclJlY29yZCIpOwotICAgIEFTU0VSVChrZXkuaXNWYWxpZCgpKTsKLSAgICBpZiAoIUtleVBy
ZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCkpCi0gICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5z
YWN0aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9u
RnJvbSh0cmFuc2FjdGlvbik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4RGF0YUtleSA9
IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQs
IGVuY29kZUlEQktleShrZXkpLCByZWNvcmRJZGVudGlmaWVyLnByaW1hcnlLZXkoKSk7Ci0KLSAg
ICBWZWN0b3I8Y2hhcj4gZGF0YTsKLSAgICBkYXRhLmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQo
cmVjb3JkSWRlbnRpZmllci52ZXJzaW9uKCkpKTsKLSAgICBkYXRhLmFwcGVuZFZlY3RvcihyZWNv
cmRJZGVudGlmaWVyLnByaW1hcnlLZXkoKSk7Ci0KLSAgICBsZXZlbERCVHJhbnNhY3Rpb24tPnB1
dChpbmRleERhdGFLZXksIGRhdGEpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9v
bCBmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9yRXF1YWwoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFu
c2FjdGlvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3RvcjxjaGFyPiYgZm91bmRL
ZXkpCi17Ci0gICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0cmFuc2FjdGlvbi0+Y3Jl
YXRlSXRlcmF0b3IoKTsKLSAgICBpdC0+c2Vlayh0YXJnZXQpOwotCi0gICAgaWYgKCFpdC0+aXNW
YWxpZCgpKSB7Ci0gICAgICAgIGl0LT5zZWVrVG9MYXN0KCk7Ci0gICAgICAgIGlmICghaXQtPmlz
VmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAo
Y29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkgPiAwKSB7Ci0gICAgICAgIGl0LT5w
cmV2KCk7Ci0gICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0KLSAgICBkbyB7Ci0gICAgICAgIGZvdW5kS2V5LmNsZWFyKCk7Ci0gICAg
ICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpIC0g
aXQtPmtleSgpLmJlZ2luKCkpOwotCi0gICAgICAgIC8vIFRoZXJlIGNhbiBiZSBzZXZlcmFsIGlu
ZGV4IGtleXMgdGhhdCBjb21wYXJlIGVxdWFsLiBXZSB3YW50IHRoZSBsYXN0IG9uZS4KLSAgICAg
ICAgaXQtPm5leHQoKTsKLSAgICB9IHdoaWxlIChpdC0+aXNWYWxpZCgpICYmICFjb21wYXJlSW5k
ZXhLZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3Rh
dGljIGJvb2wgdmVyc2lvbkV4aXN0cyhMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCB2ZXJzaW9u
LCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRQcmltYXJ5S2V5LCBib29sJiBleGlzdHMpCi17
Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlZFByaW1hcnlLZXkpOwotICAgIFZlY3Rvcjxj
aGFyPiBkYXRhOwotCi0gICAgYm9vbCBvayA9IHRyYW5zYWN0aW9uLT5zYWZlR2V0KGtleSwgZGF0
YSwgZXhpc3RzKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1Io
VmVyc2lvbkV4aXN0cyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFl
eGlzdHMpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZXhpc3RzID0gKGRlY29kZUludChk
YXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpID09IHZlcnNpb24pOwotICAgIHJldHVybiB0cnVlOwot
fQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6ZmluZEtleUluSW5kZXgoSURCQmFja2luZ1N0b3Jl
OjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleSYga2V5LCBWZWN0b3I8
Y2hhcj4mIGZvdW5kRW5jb2RlZFByaW1hcnlLZXksIGJvb2wmIGZvdW5kKQotewotICAgIElEQl9U
UkFDRSgiSURCQmFja2luZ1N0b3JlOjpmaW5kS2V5SW5JbmRleCIpOwotICAgIEFTU0VSVChLZXlQ
cmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQpKTsKLQot
ICAgIEFTU0VSVChmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmlzRW1wdHkoKSk7Ci0gICAgZm91bmQg
PSBmYWxzZTsKLQotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0g
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFu
c2FjdGlvbik7Ci0gICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBJbmRleERhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBrZXkpOwotICAg
IE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbGV2ZWxEQlRyYW5zYWN0aW9uLT5jcmVhdGVJ
dGVyYXRvcigpOwotICAgIGl0LT5zZWVrKGxldmVsZGJLZXkpOwotCi0gICAgZm9yICg7Oykgewot
ICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgaWYgKGNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZlbGRiS2V5KSA+IDApCi0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpbnQ2NF90IHZlcnNpb247Ci0gICAg
ICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQt
PnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOwotICAgICAgICBpZiAoIXApIHsKLSAgICAgICAgICAg
IElOVEVSTkFMX1JFQURfRVJST1IoRmluZEtleUluSW5kZXgpOwotICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkuYXBwZW5k
KHAsIGl0LT52YWx1ZSgpLmVuZCgpIC0gcCk7Ci0KLSAgICAgICAgYm9vbCBleGlzdHMgPSBmYWxz
ZTsKLSAgICAgICAgYm9vbCBvayA9IHZlcnNpb25FeGlzdHMobGV2ZWxEQlRyYW5zYWN0aW9uLCBk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBmb3VuZEVuY29kZWRQcmltYXJ5S2V5
LCBleGlzdHMpOwotICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgICBpZiAoIWV4aXN0cykgewotICAgICAgICAgICAgLy8gRGVsZXRlIHN0YWxlIGluZGV4
IGRhdGEgZW50cnkgYW5kIGNvbnRpbnVlLgotICAgICAgICAgICAgbGV2ZWxEQlRyYW5zYWN0aW9u
LT5yZW1vdmUoaXQtPmtleSgpKTsKLSAgICAgICAgICAgIGl0LT5uZXh0KCk7Ci0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OmdldFByaW1hcnlL
ZXlWaWFJbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
Y29uc3QgSURCS2V5JiBrZXksIFJlZlB0cjxJREJLZXk+JiBwcmltYXJ5S2V5KQotewotICAgIElE
Ql9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5VmlhSW5kZXgiKTsKLSAgICBp
ZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJ
ZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAg
ICBWZWN0b3I8Y2hhcj4gZm91bmRFbmNvZGVkUHJpbWFyeUtleTsKLSAgICBib29sIG9rID0gZmlu
ZEtleUluSW5kZXgodHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQsIGtleSwgZm91bmRFbmNvZGVkUHJpbWFyeUtleSwgZm91bmQpOwotICAgIGlmICghb2spIHsK
LSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXRQcmltYXJ5S2V5VmlhSW5kZXgpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmb3VuZCkgewotICAgICAgICBkZWNv
ZGVJREJLZXkoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5iZWdpbigpLCBmb3VuZEVuY29kZWRQcmlt
YXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgSURCQmFja2luZ1N0b3JlOjprZXlFeGlzdHNJ
bkluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25z
dCBJREJLZXkmIGluZGV4S2V5LCBSZWZQdHI8SURCS2V5PiYgZm91bmRQcmltYXJ5S2V5LCBib29s
JiBleGlzdHMpCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OmtleUV4aXN0c0lu
SW5kZXgiKTsKLSAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGV4aXN0cyA9
IGZhbHNlOwotICAgIFZlY3RvcjxjaGFyPiBmb3VuZEVuY29kZWRQcmltYXJ5S2V5OwotICAgIGJv
b2wgb2sgPSBmaW5kS2V5SW5JbmRleCh0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgaW5kZXhJZCwgaW5kZXhLZXksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXksIGV4aXN0cyk7
Ci0gICAgaWYgKCFvaykgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9SKEtleUV4aXN0c0lu
SW5kZXgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghZXhpc3RzKQot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlY29kZUlEQktleShmb3VuZEVuY29kZWRQcmlt
YXJ5S2V5LmJlZ2luKCksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkuZW5kKCksIGZvdW5kUHJpbWFy
eUtleSk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUlEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpD
dXJzb3IoY29uc3QgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IqIG90aGVyKQotICAgIDogbV90cmFu
c2FjdGlvbihvdGhlci0+bV90cmFuc2FjdGlvbikKLSAgICAsIG1fY3Vyc29yT3B0aW9ucyhvdGhl
ci0+bV9jdXJzb3JPcHRpb25zKQotICAgICwgbV9jdXJyZW50S2V5KG90aGVyLT5tX2N1cnJlbnRL
ZXkpCi17Ci0gICAgaWYgKG90aGVyLT5tX2l0ZXJhdG9yKSB7Ci0gICAgICAgIG1faXRlcmF0b3Ig
PSBtX3RyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOwotCi0gICAgICAgIGlmIChvdGhlci0+
bV9pdGVyYXRvci0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG90
aGVyLT5tX2l0ZXJhdG9yLT5rZXkoKSk7Ci0gICAgICAgICAgICBBU1NFUlQobV9pdGVyYXRvci0+
aXNWYWxpZCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6
OkN1cnNvcjo6Zmlyc3RTZWVrKCkKLXsKLSAgICBtX2l0ZXJhdG9yID0gbV90cmFuc2FjdGlvbi0+
Y3JlYXRlSXRlcmF0b3IoKTsKLSAgICBpZiAobV9jdXJzb3JPcHRpb25zLmZvcndhcmQpCi0gICAg
ICAgIG1faXRlcmF0b3ItPnNlZWsobV9jdXJzb3JPcHRpb25zLmxvd0tleSk7Ci0gICAgZWxzZQot
ICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5KTsKLQotICAg
IHJldHVybiBjb250aW51ZUZ1bmN0aW9uKDAsIFJlYWR5KTsKLX0KLQotYm9vbCBJREJCYWNraW5n
U3RvcmU6OkN1cnNvcjo6YWR2YW5jZSh1bnNpZ25lZCBsb25nIGNvdW50KQotewotICAgIHdoaWxl
IChjb3VudC0tKSB7Ci0gICAgICAgIGlmICghY29udGludWVGdW5jdGlvbigpKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBJREJC
YWNraW5nU3RvcmU6OkN1cnNvcjo6Y29udGludWVGdW5jdGlvbihjb25zdCBJREJLZXkqIGtleSwg
SXRlcmF0b3JTdGF0ZSBuZXh0U3RhdGUpCi17Ci0gICAgUmVmUHRyPElEQktleT4gcHJldmlvdXNL
ZXkgPSBtX2N1cnJlbnRLZXk7Ci0KLSAgICBib29sIGZpcnN0SXRlcmF0aW9uID0gdHJ1ZTsKLQot
ICAgIC8vIFdoZW4gaXRlcmF0aW5nIHdpdGggUHJldk5vRHVwbGljYXRlLCBzcGVjIHJlcXVpcmVz
IHRoYXQgdGhlCi0gICAgLy8gdmFsdWUgd2UgeWllbGQgZm9yIGVhY2gga2V5IGlzIHRoZSBmaXJz
dCBkdXBsaWNhdGUgaW4gZm9yd2FyZHMKLSAgICAvLyBvcmRlci4KLSAgICBSZWZQdHI8SURCS2V5
PiBsYXN0RHVwbGljYXRlS2V5OwotCi0gICAgYm9vbCBmb3J3YXJkID0gbV9jdXJzb3JPcHRpb25z
LmZvcndhcmQ7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChuZXh0U3RhdGUgPT0gU2Vl
aykgewotICAgICAgICAgICAgLy8gRklYTUU6IE9wdGltaXplIHNlZWtpbmcgZm9yIHJldmVyc2Ug
Y3Vyc29ycyBhcyB3ZWxsLgotICAgICAgICAgICAgaWYgKGZpcnN0SXRlcmF0aW9uICYmIGtleSAm
JiBmb3J3YXJkKSB7Ci0gICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+c2VlayhlbmNvZGVLZXko
KmtleSkpOwotICAgICAgICAgICAgICAgIGZpcnN0SXRlcmF0aW9uID0gZmFsc2U7Ci0gICAgICAg
ICAgICB9IGVsc2UgaWYgKGZvcndhcmQpCi0gICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+bmV4
dCgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1faXRlcmF0b3ItPnByZXYo
KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZXh0U3RhdGUgPSBTZWVrOyAvLyBmb3Ig
c3Vic2VxdWVudCBpdGVyYXRpb25zCi0KLSAgICAgICAgaWYgKCFtX2l0ZXJhdG9yLT5pc1ZhbGlk
KCkpIHsKLSAgICAgICAgICAgIGlmICghZm9yd2FyZCAmJiBsYXN0RHVwbGljYXRlS2V5LmdldCgp
KSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWxrIGZvcndhcmQgYmVjYXVzZSB3
ZSBoaXQgdGhlIGVuZCBvZgotICAgICAgICAgICAgICAgIC8vIHRoZSBkYXRhLgotICAgICAgICAg
ICAgICAgIGZvcndhcmQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAg
ICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoaXNQYXN0Qm91bmRzKCkpIHsKLSAgICAgICAgICAgIGlmICghZm9yd2FyZCAmJiBsYXN0
RHVwbGljYXRlS2V5LmdldCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWxr
IGZvcndhcmQgYmVjYXVzZSBub3cgd2UncmUgYmV5b25kIHRoZQotICAgICAgICAgICAgICAgIC8v
IGJvdW5kcyBkZWZpbmVkIGJ5IHRoZSBjdXJzb3IuCi0gICAgICAgICAgICAgICAgZm9yd2FyZCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaGF2ZUVudGVy
ZWRSYW5nZSgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gVGhlIHJvdyBt
YXkgbm90IGxvYWQgYmVjYXVzZSB0aGVyZSdzIGEgc3RhbGUgZW50cnkgaW4gdGhlCi0gICAgICAg
IC8vIGluZGV4LiBUaGlzIGlzIG5vdCBmYXRhbC4KLSAgICAgICAgaWYgKCFsb2FkQ3VycmVudFJv
dygpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGtleSkgewotICAgICAg
ICAgICAgaWYgKGZvcndhcmQpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50S2V5LT5p
c0xlc3NUaGFuKGtleSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoa2V5LT5pc0xlc3NUaGFuKG1fY3VycmVu
dEtleS5nZXQoKSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fY3Vyc29yT3B0aW9ucy51bmlxdWUpIHsKLQot
ICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNFcXVhbChwcmV2aW91c0tleS5nZXQoKSkp
IHsKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUgYWJsZSB0byB3YWxrIGZv
cndhcmQgYWxsIHRoZSB3YXkKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgcHJldmlvdXMga2V5
LgotICAgICAgICAgICAgICAgIEFTU0VSVCghbGFzdER1cGxpY2F0ZUtleS5nZXQoKSk7Ci0gICAg
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgh
Zm9yd2FyZCkgewotICAgICAgICAgICAgICAgIGlmICghbGFzdER1cGxpY2F0ZUtleS5nZXQoKSkg
ewotICAgICAgICAgICAgICAgICAgICBsYXN0RHVwbGljYXRlS2V5ID0gbV9jdXJyZW50S2V5Owot
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAg
ICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9yd2FyZCBiZWNhdXNlIHdlIGhpdCB0aGUg
Ym91bmRhcnkKLSAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIGtleSByYW5nZXMuCi0gICAgICAg
ICAgICAgICAgaWYgKCFsYXN0RHVwbGljYXRlS2V5LT5pc0VxdWFsKG1fY3VycmVudEtleS5nZXQo
KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yd2FyZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LQotICAgIEFTU0VSVCghbGFzdER1cGxpY2F0ZUtleS5nZXQoKSB8fCAoZm9yd2FyZCAmJiBsYXN0
RHVwbGljYXRlS2V5LT5pc0VxdWFsKG1fY3VycmVudEtleS5nZXQoKSkpKTsKLSAgICByZXR1cm4g
dHJ1ZTsKLX0KLQotYm9vbCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6aGF2ZUVudGVyZWRSYW5n
ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3YXJkKSB7Ci0gICAgICAg
IGlmIChtX2N1cnNvck9wdGlvbnMubG93T3BlbikKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJl
SW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA+IDA7
Ci0KLSAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1f
Y3Vyc29yT3B0aW9ucy5sb3dLZXkpID49IDA7Ci0gICAgfQotICAgIGlmIChtX2N1cnNvck9wdGlv
bnMuaGlnaE9wZW4pCi0gICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3It
PmtleSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwOwotCi0gICAgcmV0dXJuIGNvbXBh
cmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA8
PSAwOwotfQotCi1ib29sIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjppc1Bhc3RCb3VuZHMoKSBj
b25zdAotewotICAgIGlmIChtX2N1cnNvck9wdGlvbnMuZm9yd2FyZCkgewotICAgICAgICBpZiAo
bV9jdXJzb3JPcHRpb25zLmhpZ2hPcGVuKQotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRl
eEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA+PSAwOwot
ICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9yLT5rZXkoKSwgbV9jdXJz
b3JPcHRpb25zLmhpZ2hLZXkpID4gMDsKLSAgICB9Ci0KLSAgICBpZiAobV9jdXJzb3JPcHRpb25z
Lmxvd09wZW4pCi0gICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtl
eSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA8PSAwOwotICAgIHJldHVybiBjb21wYXJlSW5k
ZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA8IDA7Ci19
Ci0KLWNsYXNzIE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbCA6IHB1YmxpYyBJREJCYWNraW5nU3Rv
cmU6OkN1cnNvciB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8T2JqZWN0U3RvcmVL
ZXlDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29u
c3QgSURCQmFja2luZ1N0b3JlOjpDdXJzb3I6OkN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMp
Ci0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IE9iamVjdFN0b3JlS2V5Q3Vyc29y
SW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOwotICAgIH0KLQotICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUoKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUtleUN1cnNvckltcGwodGhpcykpOwot
ICAgIH0KLQotICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCi0gICAgdmlydHVhbCBQYXNz
UmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFsdWUoKSBjb25zdCB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVudFJvdygpOwotCi1wcm90
ZWN0ZWQ6Ci0gICAgdmlydHVhbCBWZWN0b3I8Y2hhcj4gZW5jb2RlS2V5KGNvbnN0IElEQktleSAm
a2V5KQotICAgIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKG1f
Y3Vyc29yT3B0aW9ucy5kYXRhYmFzZUlkLCBtX2N1cnNvck9wdGlvbnMub2JqZWN0U3RvcmVJZCwg
a2V5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgT2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsKExl
dmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vy
c29yOjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotICAgICAgICA6IElEQkJhY2tpbmdT
dG9yZTo6Q3Vyc29yKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0K
LSAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwoY29uc3QgT2JqZWN0U3RvcmVLZXlDdXJzb3JJ
bXBsKiBvdGhlcikKLSAgICAgICAgOiBJREJCYWNraW5nU3RvcmU6OkN1cnNvcihvdGhlcikKLSAg
ICB7Ci0gICAgfQotfTsKLQotYm9vbCBPYmplY3RTdG9yZUtleUN1cnNvckltcGw6OmxvYWRDdXJy
ZW50Um93KCkKLXsKLSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtl
eSgpLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXko
KS5lbmQoKTsKLQotICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RTdG9yZURhdGFLZXk7Ci0g
ICAga2V5UG9zaXRpb24gPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwg
a2V5TGltaXQsICZvYmplY3RTdG9yZURhdGFLZXkpOwotICAgIGlmICgha2V5UG9zaXRpb24pIHsK
LSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJvdyk7Ci0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBtX2N1cnJlbnRLZXkgPSBvYmplY3RTdG9yZURhdGFL
ZXkudXNlcktleSgpOwotCi0gICAgaW50NjRfdCB2ZXJzaW9uOwotICAgIGNvbnN0IGNoYXIqIHZh
bHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFsdWUoKS5iZWdpbigpLCBt
X2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKLSAgICBpZiAoIXZhbHVlUG9zaXRp
b24pIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJvdyk7Ci0gICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogVGhpcyByZS1lbmNvZGVz
IHdoYXQgd2FzIGp1c3QgZGVjb2RlZDsgdHJ5IGFuZCBvcHRpbWl6ZS4KLSAgICBtX3JlY29yZElk
ZW50aWZpZXIucmVzZXQoZW5jb2RlSURCS2V5KCptX2N1cnJlbnRLZXkpLCB2ZXJzaW9uKTsKLQot
ICAgIHJldHVybiB0cnVlOwotfQotCi1jbGFzcyBPYmplY3RTdG9yZUN1cnNvckltcGwgOiBwdWJs
aWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgewotcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVm
UHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiogdHJh
bnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zJiBj
dXJzb3JPcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RT
dG9yZUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKLSAgICB9Ci0KLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKHRo
aXMpKTsKLSAgICB9Ci0KLSAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNvcgotICAgIHZpcnR1
YWwgUGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+IHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9jdXJy
ZW50VmFsdWU7IH0KLSAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRSb3coKTsKLQotcHJvdGVj
dGVkOgotICAgIHZpcnR1YWwgVmVjdG9yPGNoYXI+IGVuY29kZUtleShjb25zdCBJREJLZXkgJmtl
eSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShtX2N1
cnNvck9wdGlvbnMuZGF0YWJhc2VJZCwgbV9jdXJzb3JPcHRpb25zLm9iamVjdFN0b3JlSWQsIGtl
eSk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIE9iamVjdFN0b3JlQ3Vyc29ySW1wbChMZXZlbERC
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6
Q3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLSAgICAgICAgOiBJREJCYWNraW5nU3RvcmU6
OkN1cnNvcih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykKLSAgICB7Ci0gICAgfQotCi0gICAg
T2JqZWN0U3RvcmVDdXJzb3JJbXBsKGNvbnN0IE9iamVjdFN0b3JlQ3Vyc29ySW1wbCogb3RoZXIp
Ci0gICAgICAgIDogSURCQmFja2luZ1N0b3JlOjpDdXJzb3Iob3RoZXIpCi0gICAgICAgICwgbV9j
dXJyZW50VmFsdWUob3RoZXItPm1fY3VycmVudFZhbHVlKQotICAgIHsKLSAgICB9Ci0KLSAgICBS
ZWZQdHI8U2hhcmVkQnVmZmVyPiBtX2N1cnJlbnRWYWx1ZTsKLX07Ci0KLWJvb2wgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCi17Ci0gICAgY29uc3QgY2hhcioga2V5UG9z
aXRpb24gPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOwotICAgIGNvbnN0IGNoYXIqIGtleUxp
bWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7Ci0KLSAgICBPYmplY3RTdG9yZURhdGFLZXkg
b2JqZWN0U3RvcmVEYXRhS2V5OwotICAgIGtleVBvc2l0aW9uID0gT2JqZWN0U3RvcmVEYXRhS2V5
OjpkZWNvZGUoa2V5UG9zaXRpb24sIGtleUxpbWl0LCAmb2JqZWN0U3RvcmVEYXRhS2V5KTsKLSAg
ICBpZiAoIWtleVBvc2l0aW9uKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoTG9hZEN1
cnJlbnRSb3cpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgbV9jdXJyZW50
S2V5ID0gb2JqZWN0U3RvcmVEYXRhS2V5LnVzZXJLZXkoKTsKLQotICAgIGludDY0X3QgdmVyc2lv
bjsKLSAgICBjb25zdCBjaGFyKiB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0
b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgdmVyc2lvbik7
Ci0gICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1Io
TG9hZEN1cnJlbnRSb3cpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8g
RklYTUU6IFRoaXMgcmUtZW5jb2RlcyB3aGF0IHdhcyBqdXN0IGRlY29kZWQ7IHRyeSBhbmQgb3B0
aW1pemUuCi0gICAgbV9yZWNvcmRJZGVudGlmaWVyLnJlc2V0KGVuY29kZUlEQktleSgqbV9jdXJy
ZW50S2V5KSwgdmVyc2lvbik7Ci0KLSAgICBWZWN0b3I8Y2hhcj4gdmFsdWU7Ci0gICAgdmFsdWUu
YXBwZW5kKHZhbHVlUG9zaXRpb24sIG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCkgLSB2YWx1ZVBv
c2l0aW9uKTsKLSAgICBtX2N1cnJlbnRWYWx1ZSA9IFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3Io
dmFsdWUpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1jbGFzcyBJbmRleEtleUN1cnNvckltcGwg
OiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgewotcHVibGljOgotICAgIHN0YXRpYyBQ
YXNzUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25z
JiBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRl
eEtleUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpKTsKLSAgICB9Ci0KLSAg
ICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IGNsb25lKCkKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5kZXhLZXlDdXJzb3JJbXBsKHRoaXMp
KTsKLSAgICB9Ci0KLSAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNvcgotICAgIHZpcnR1YWwg
UGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+IHZhbHVlKCkgY29uc3QgeyBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCS2V5PiBwcmltYXJ5
S2V5KCkgY29uc3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9Ci0gICAgdmlydHVhbCBjb25zdCBJ
REJCYWNraW5nU3RvcmU6OlJlY29yZElkZW50aWZpZXImIHJlY29yZElkZW50aWZpZXIoKSBjb25z
dCB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gbV9yZWNvcmRJZGVudGlmaWVyOyB9Ci0g
ICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0
dWFsIFZlY3RvcjxjaGFyPiBlbmNvZGVLZXkoY29uc3QgSURCS2V5ICZrZXkpCi0gICAgewotICAg
ICAgICByZXR1cm4gSW5kZXhEYXRhS2V5OjplbmNvZGUobV9jdXJzb3JPcHRpb25zLmRhdGFiYXNl
SWQsIG1fY3Vyc29yT3B0aW9ucy5vYmplY3RTdG9yZUlkLCBtX2N1cnNvck9wdGlvbnMuaW5kZXhJ
ZCwga2V5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgSW5kZXhLZXlDdXJzb3JJbXBsKExldmVs
REJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
OjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQotICAgICAgICA6IElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAg
ICBJbmRleEtleUN1cnNvckltcGwoY29uc3QgSW5kZXhLZXlDdXJzb3JJbXBsKiBvdGhlcikKLSAg
ICAgICAgOiBJREJCYWNraW5nU3RvcmU6OkN1cnNvcihvdGhlcikKLSAgICAgICAgLCBtX3ByaW1h
cnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKLSAgICB7Ci0gICAgfQotCi0gICAgUmVmUHRyPElE
QktleT4gbV9wcmltYXJ5S2V5OwotfTsKLQotYm9vbCBJbmRleEtleUN1cnNvckltcGw6OmxvYWRD
dXJyZW50Um93KCkKLXsKLSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3It
PmtleSgpLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5r
ZXkoKS5lbmQoKTsKLQotICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7Ci0gICAga2V5UG9z
aXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZpbmRl
eERhdGFLZXkpOwotCi0gICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsK
LQotICAgIGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKLSAgICBjb25zdCBjaGFyKiB2YWx1ZVBv
c2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVy
YXRvci0+dmFsdWUoKS5lbmQoKSwgaW5kZXhEYXRhVmVyc2lvbik7Ci0gICAgaWYgKCF2YWx1ZVBv
c2l0aW9uKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoTG9hZEN1cnJlbnRSb3cpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdmFsdWVQb3NpdGlvbiA9IGRlY29k
ZUlEQktleSh2YWx1ZVBvc2l0aW9uLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCBtX3ByaW1h
cnlLZXkpOwotICAgIGlmICghdmFsdWVQb3NpdGlvbikgewotICAgICAgICBJTlRFUk5BTF9SRUFE
X0VSUk9SKExvYWRDdXJyZW50Um93KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQot
ICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5TGV2ZWxEQktleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6
ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0YUtleS5vYmplY3RTdG9y
ZUlkKCksICptX3ByaW1hcnlLZXkpOwotCi0gICAgVmVjdG9yPGNoYXI+IHJlc3VsdDsKLSAgICBi
b29sIGZvdW5kID0gZmFsc2U7Ci0gICAgYm9vbCBvayA9IG1fdHJhbnNhY3Rpb24tPnNhZmVHZXQo
cHJpbWFyeUxldmVsREJLZXksIHJlc3VsdCwgZm91bmQpOwotICAgIGlmICghb2spIHsKLSAgICAg
ICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJvdyk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgICBtX3RyYW5zYWN0aW9uLT5y
ZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQot
Ci0gICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOwotICAgIGNvbnN0IGNoYXIqIHQg
PSBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgb2JqZWN0U3RvcmVE
YXRhVmVyc2lvbik7Ci0gICAgaWYgKCF0KSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1Io
TG9hZEN1cnJlbnRSb3cpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYg
KG9iamVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgewotICAgICAgICBt
X3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNzIEluZGV4Q3Vyc29y
SW1wbCA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7Ci1wdWJsaWM6Ci0gICAgc3Rh
dGljIFBhc3NSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9u
KiB0cmFuc2FjdGlvbiwgY29uc3QgSURCQmFja2luZ1N0b3JlOjpDdXJzb3I6OkN1cnNvck9wdGlv
bnMmIGN1cnNvck9wdGlvbnMpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IElu
ZGV4Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOwotICAgIH0KLQotICAg
IHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUoKQotICAg
IHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNvckltcGwodGhpcykpOwot
ICAgIH0KLQotICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCi0gICAgdmlydHVhbCBQYXNz
UmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnRWYWx1
ZTsgfQotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1hcnlLZXkoKSBjb25zdCB7
IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KLSAgICB2aXJ0dWFsIGNvbnN0IElEQkJhY2tpbmdTdG9y
ZTo6UmVjb3JkSWRlbnRpZmllciYgcmVjb3JkSWRlbnRpZmllcigpIGNvbnN0IHsgQVNTRVJUX05P
VF9SRUFDSEVEKCk7IHJldHVybiBtX3JlY29yZElkZW50aWZpZXI7IH0KLSAgICBib29sIGxvYWRD
dXJyZW50Um93KCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIFZlY3RvcjxjaGFyPiBlbmNv
ZGVLZXkoY29uc3QgSURCS2V5ICZrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gSW5kZXhEYXRh
S2V5OjplbmNvZGUobV9jdXJzb3JPcHRpb25zLmRhdGFiYXNlSWQsIG1fY3Vyc29yT3B0aW9ucy5v
YmplY3RTdG9yZUlkLCBtX2N1cnNvck9wdGlvbnMuaW5kZXhJZCwga2V5KTsKLSAgICB9Ci0KLXBy
aXZhdGU6Ci0gICAgSW5kZXhDdXJzb3JJbXBsKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zJiBjdXJzb3JP
cHRpb25zKQotICAgICAgICA6IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yKHRyYW5zYWN0aW9uLCBj
dXJzb3JPcHRpb25zKQotICAgIHsKLSAgICB9Ci0KLSAgICBJbmRleEN1cnNvckltcGwoY29uc3Qg
SW5kZXhDdXJzb3JJbXBsKiBvdGhlcikKLSAgICAgICAgOiBJREJCYWNraW5nU3RvcmU6OkN1cnNv
cihvdGhlcikKLSAgICAgICAgLCBtX3ByaW1hcnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKLSAg
ICAgICAgLCBtX2N1cnJlbnRWYWx1ZShvdGhlci0+bV9jdXJyZW50VmFsdWUpCi0gICAgICAgICwg
bV9wcmltYXJ5TGV2ZWxEQktleShvdGhlci0+bV9wcmltYXJ5TGV2ZWxEQktleSkKLSAgICB7Ci0g
ICAgfQotCi0gICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OwotICAgIFJlZlB0cjxTaGFy
ZWRCdWZmZXI+IG1fY3VycmVudFZhbHVlOwotICAgIFZlY3RvcjxjaGFyPiBtX3ByaW1hcnlMZXZl
bERCS2V5OwotfTsKLQotYm9vbCBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKLXsK
LSAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7
Ci0gICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKLQot
ICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7Ci0gICAga2V5UG9zaXRpb24gPSBJbmRleERh
dGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZpbmRleERhdGFLZXkpOwotCi0g
ICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsKLQotICAgIGNvbnN0IGNo
YXIqIHZhbHVlUG9zaXRpb24gPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmJlZ2luKCk7Ci0gICAgY29u
c3QgY2hhciogdmFsdWVMaW1pdCA9IG1faXRlcmF0b3ItPnZhbHVlKCkuZW5kKCk7Ci0KLSAgICBp
bnQ2NF90IGluZGV4RGF0YVZlcnNpb247Ci0gICAgdmFsdWVQb3NpdGlvbiA9IGRlY29kZVZhcklu
dCh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBpbmRleERhdGFWZXJzaW9uKTsKLSAgICBpZiAo
IXZhbHVlUG9zaXRpb24pIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVu
dFJvdyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdmFsdWVQb3NpdGlvbiA9
IGRlY29kZUlEQktleSh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBtX3ByaW1hcnlLZXkpOwot
ICAgIGlmICghdmFsdWVQb3NpdGlvbikgewotICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9SKExv
YWRDdXJyZW50Um93KTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG1fcHJp
bWFyeUxldmVsREJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShpbmRleERhdGFLZXku
ZGF0YWJhc2VJZCgpLCBpbmRleERhdGFLZXkub2JqZWN0U3RvcmVJZCgpLCAqbV9wcmltYXJ5S2V5
KTsKLQotICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwot
ICAgIGJvb2wgb2sgPSBtX3RyYW5zYWN0aW9uLT5zYWZlR2V0KG1fcHJpbWFyeUxldmVsREJLZXks
IHJlc3VsdCwgZm91bmQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgSU5URVJOQUxfUkVBRF9F
UlJPUihMb2FkQ3VycmVudFJvdyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAg
aWYgKCFmb3VuZCkgewotICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+
a2V5KCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCBvYmpl
Y3RTdG9yZURhdGFWZXJzaW9uOwotICAgIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQocmVz
dWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7Ci0gICAg
aWYgKCF2YWx1ZVBvc2l0aW9uKSB7Ci0gICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoTG9hZEN1
cnJlbnRSb3cpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG9iamVj
dFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgewotICAgICAgICBtX3RyYW5z
YWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgfQotCi0gICAgVmVjdG9yPGNoYXI+IHZhbHVlOwotICAgIHZhbHVlLmFwcGVuZCh2YWx1
ZVBvc2l0aW9uLCByZXN1bHQuZW5kKCkgLSB2YWx1ZVBvc2l0aW9uKTsKLSAgICBtX2N1cnJlbnRW
YWx1ZSA9IFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1ib29sIG9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhMZXZlbERCVHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJbmRleGVkREI6OkN1cnNvckRpcmVjdGlvbiBkaXJl
Y3Rpb24sIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRp
b25zKQotewotICAgIGN1cnNvck9wdGlvbnMuZGF0YWJhc2VJZCA9IGRhdGFiYXNlSWQ7Ci0gICAg
Y3Vyc29yT3B0aW9ucy5vYmplY3RTdG9yZUlkID0gb2JqZWN0U3RvcmVJZDsKLQotICAgIGJvb2wg
bG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOwotICAgIGJvb2wgdXBwZXJCb3Vu
ZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOwotICAgIGN1cnNvck9wdGlvbnMuZm9yd2FyZCA9
IChkaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JOZXh0Tm9EdXBsaWNhdGUgfHwgZGlyZWN0
aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yTmV4dCk7Ci0gICAgY3Vyc29yT3B0aW9ucy51bmlxdWUg
PSAoZGlyZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yTmV4dE5vRHVwbGljYXRlIHx8IGRpcmVj
dGlvbiA9PSBJbmRleGVkREI6OkN1cnNvclByZXZOb0R1cGxpY2F0ZSk7Ci0KLSAgICBpZiAoIWxv
d2VyQm91bmQpIHsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5sb3dLZXkgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtaW5JREJLZXkoKSk7Ci0g
ICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHRydWU7IC8vIE5vdCBpbmNsdWRlZC4KLSAg
ICB9IGVsc2UgewotICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IE9iamVjdFN0b3JlRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5nZS0+bG93ZXIoKSk7
Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKLSAg
ICB9Ci0KLSAgICBpZiAoIXVwcGVyQm91bmQpIHsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdo
S2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgbWF4SURCS2V5KCkpOwotCi0gICAgICAgIGlmIChjdXJzb3JPcHRpb25zLmZvcndhcmQpCi0g
ICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gdHJ1ZTsgLy8gTm90IGluY2x1ZGVk
LgotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIG5lZWQgYSBrZXkgdGhhdCBleGlz
dHMuCi0gICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFu
c2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBjdXJzb3JPcHRpb25zLmhpZ2hLZXkpKQot
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGN1cnNvck9wdGlvbnMu
aGlnaE9wZW4gPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGN1cnNv
ck9wdGlvbnMuaGlnaEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQsICpyYW5nZS0+dXBwZXIoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMu
aGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7Ci0KLSAgICAgICAgaWYgKCFjdXJzb3JPcHRp
b25zLmZvcndhcmQpIHsKLSAgICAgICAgICAgIC8vIEZvciByZXZlcnNlIGN1cnNvcnMsIHdlIG5l
ZWQgYSBrZXkgdGhhdCBleGlzdHMuCi0gICAgICAgICAgICBWZWN0b3I8Y2hhcj4gZm91bmRIaWdo
S2V5OwotICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9yRXF1YWwodHJh
bnNhY3Rpb24sIGN1cnNvck9wdGlvbnMuaGlnaEtleSwgZm91bmRIaWdoS2V5KSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSB0YXJnZXQga2V5
IHNob3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNtYWxsZXIga2V5
LCB3ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgotICAgICAgICAgICAgaWYgKGN1cnNvck9wdGlvbnMu
aGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3VuZEhpZ2hLZXksIGN1cnNvck9wdGlvbnMu
aGlnaEtleSkgPCAwKQotICAgICAgICAgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBm
YWxzZTsKLQotICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5
OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgaW5kZXhD
dXJzb3JPcHRpb25zKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElE
QktleVJhbmdlKiByYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24gZGlyZWN0aW9uLCBJ
REJCYWNraW5nU3RvcmU6OkN1cnNvcjo6Q3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKLXsK
LSAgICBBU1NFUlQodHJhbnNhY3Rpb24pOwotICAgIGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhk
YXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgY3Vyc29yT3B0aW9ucy5kYXRhYmFzZUlkID0gZGF0YWJhc2VJZDsKLSAgICBjdXJz
b3JPcHRpb25zLm9iamVjdFN0b3JlSWQgPSBvYmplY3RTdG9yZUlkOwotICAgIGN1cnNvck9wdGlv
bnMuaW5kZXhJZCA9IGluZGV4SWQ7Ci0KLSAgICBib29sIGxvd2VyQm91bmQgPSByYW5nZSAmJiBy
YW5nZS0+bG93ZXIoKTsKLSAgICBib29sIHVwcGVyQm91bmQgPSByYW5nZSAmJiByYW5nZS0+dXBw
ZXIoKTsKLSAgICBjdXJzb3JPcHRpb25zLmZvcndhcmQgPSAoZGlyZWN0aW9uID09IEluZGV4ZWRE
Qjo6Q3Vyc29yTmV4dE5vRHVwbGljYXRlIHx8IGRpcmVjdGlvbiA9PSBJbmRleGVkREI6OkN1cnNv
ck5leHQpOwotICAgIGN1cnNvck9wdGlvbnMudW5pcXVlID0gKGRpcmVjdGlvbiA9PSBJbmRleGVk
REI6OkN1cnNvck5leHROb0R1cGxpY2F0ZSB8fCBkaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJz
b3JQcmV2Tm9EdXBsaWNhdGUpOwotCi0gICAgaWYgKCFsb3dlckJvdW5kKSB7Ci0gICAgICAgIGN1
cnNvck9wdGlvbnMubG93S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNaW5LZXkoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93T3Bl
biA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KLSAgICB9IGVsc2UgewotICAgICAgICBjdXJzb3JPcHRp
b25zLmxvd0tleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSk7Ci0gICAgICAgIGN1cnNvck9wdGlvbnMubG93
T3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoIXVwcGVyQm91bmQp
IHsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVN
YXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7Ci0gICAgICAgIGN1cnNv
ck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCi0KLSAgICAgICAgaWYgKCFj
dXJzb3JPcHRpb25zLmZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0aGF0IGV4aXN0cy4KLSAg
ICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVxdWFsKHRyYW5zYWN0aW9u
LCBjdXJzb3JPcHRpb25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGlnaEtleSkpCi0gICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoT3Bl
biA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY3Vyc29yT3B0aW9u
cy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJ
ZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpKTsKLSAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdo
T3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKLQotICAgICAgICBWZWN0b3I8Y2hhcj4gZm91bmRI
aWdoS2V5OwotICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NUaGFuT3JFcXVhbCh0cmFu
c2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hLZXkpKSAvLyBTZWVrIHRv
IHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBrZXlzLgotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIC8vIElmIHRoZSB0YXJnZXQga2V5IHNob3VsZCBu
b3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNtYWxsZXIga2V5LCB3ZSBzaG91
bGQgaW5jbHVkZSB0aGF0LgotICAgICAgICBpZiAoY3Vyc29yT3B0aW9ucy5oaWdoT3BlbiAmJiBj
b21wYXJlSW5kZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5KSA8IDAp
Ci0gICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFsc2U7Ci0KLSAgICAgICAg
Y3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5OwotICAgIH0KLQotICAgIHJldHVy
biB0cnVlOwotfQotCi1QYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yPiBJREJCYWNr
aW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24g
ZGlyZWN0aW9uKQotewotICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpvcGVuT2JqZWN0
U3RvcmVDdXJzb3IiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlv
biA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20o
dHJhbnNhY3Rpb24pOwotICAgIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25z
IGN1cnNvck9wdGlvbnM7Ci0gICAgaWYgKCFvYmplY3RTdG9yZUN1cnNvck9wdGlvbnMobGV2ZWxE
QlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCByYW5nZSwgZGlyZWN0aW9u
LCBjdXJzb3JPcHRpb25zKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVmUHRyPE9iamVjdFN0
b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpjcmVhdGUobGV2
ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKLSAgICBpZiAoIWN1cnNvci0+Zmlyc3RT
ZWVrKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGN1cnNvci5yZWxlYXNlKCk7
Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkJhY2tpbmdTdG9y
ZTo6b3Blbk9iamVjdFN0b3JlS2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
Y29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJbmRleGVkREI6OkN1cnNvckRpcmVjdGlvbiBkaXJl
Y3Rpb24pCi17Ci0gICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9y
ZUtleUN1cnNvciIpOwotICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9u
ID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0
cmFuc2FjdGlvbik7Ci0gICAgSURCQmFja2luZ1N0b3JlOjpDdXJzb3I6OkN1cnNvck9wdGlvbnMg
Y3Vyc29yT3B0aW9uczsKLSAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhsZXZlbERC
VHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJhbmdlLCBkaXJlY3Rpb24s
IGN1cnNvck9wdGlvbnMpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBSZWZQdHI8T2JqZWN0U3Rv
cmVLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBPYmplY3RTdG9yZUtleUN1cnNvckltcGw6OmNyZWF0
ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpOwotICAgIGlmICghY3Vyc29yLT5m
aXJzdFNlZWsoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gY3Vyc29yLnJlbGVh
c2UoKTsKLX0KLQotUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gSURCQmFja2lu
Z1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiog
dHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBp
bnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSW5kZXhlZERCOjpDdXJz
b3JEaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3Jl
OjpvcGVuSW5kZXhLZXlDdXJzb3IiKTsKLSAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJU
cmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2Fj
dGlvbkZyb20odHJhbnNhY3Rpb24pOwotICAgIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJz
b3JPcHRpb25zIGN1cnNvck9wdGlvbnM7Ci0gICAgaWYgKCFpbmRleEN1cnNvck9wdGlvbnMobGV2
ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCByYW5n
ZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVm
UHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhLZXlDdXJzb3JJbXBsOjpjcmVh
dGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKLSAgICBpZiAoIWN1cnNvci0+
Zmlyc3RTZWVrKCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIGN1cnNvci5yZWxl
YXNlKCk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+IElEQkJhY2tp
bmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRy
YW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50
NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIEluZGV4ZWREQjo6Q3Vyc29y
RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6
b3BlbkluZGV4Q3Vyc29yIik7Ci0gICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNh
Y3Rpb24gPSBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25G
cm9tKHRyYW5zYWN0aW9uKTsKLSAgICBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6Q3Vyc29yT3B0
aW9ucyBjdXJzb3JPcHRpb25zOwotICAgIGlmICghaW5kZXhDdXJzb3JPcHRpb25zKGxldmVsREJU
cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgcmFuZ2UsIGRp
cmVjdGlvbiwgY3Vyc29yT3B0aW9ucykpCi0gICAgICAgIHJldHVybiAwOwotICAgIFJlZlB0cjxJ
bmRleEN1cnNvckltcGw+IGN1cnNvciA9IEluZGV4Q3Vyc29ySW1wbDo6Y3JlYXRlKGxldmVsREJU
cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucyk7Ci0gICAgaWYgKCFjdXJzb3ItPmZpcnN0U2Vlaygp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBjdXJzb3IucmVsZWFzZSgpOwotfQot
Ci1JREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpUcmFuc2FjdGlvbihJREJCYWNraW5nU3Rv
cmUqIGJhY2tpbmdTdG9yZSkKLSAgICA6IG1fYmFja2luZ1N0b3JlKGJhY2tpbmdTdG9yZSkKLXsK
LX0KLQotdm9pZCBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbigpCi17Ci0gICAg
SURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpiZWdpbiIpOwotICAgIEFT
U0VSVCghbV90cmFuc2FjdGlvbik7Ci0gICAgbV90cmFuc2FjdGlvbiA9IExldmVsREJUcmFuc2Fj
dGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKTsKLX0KLQotYm9vbCBJREJC
YWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjb21taXQoKQotewotICAgIElEQl9UUkFDRSgiSURC
QmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y29tbWl0Iik7Ci0gICAgQVNTRVJUKG1fdHJhbnNh
Y3Rpb24pOwotICAgIGJvb2wgcmVzdWx0ID0gbV90cmFuc2FjdGlvbi0+Y29tbWl0KCk7Ci0gICAg
bV90cmFuc2FjdGlvbi5jbGVhcigpOwotICAgIGlmICghcmVzdWx0KQotICAgICAgICBJTlRFUk5B
TF9XUklURV9FUlJPUihUcmFuc2FjdGlvbkNvbW1pdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotdm9pZCBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xsYmFjaygpCi17Ci0gICAg
SURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xsYmFjayIpOwotICAg
IEFTU0VSVChtX3RyYW5zYWN0aW9uKTsKLSAgICBtX3RyYW5zYWN0aW9uLT5yb2xsYmFjaygpOwot
ICAgIG1fdHJhbnNhY3Rpb24uY2xlYXIoKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQot
Ci0jZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJDb2RpbmcuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCA4OGUwZTBiLi4wMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3Jl
L01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJDb2RpbmcuY3BwCisrKyAvZGV2L251bGwKQEAg
LTEsMTgwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFy
ZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIklE
QkxldmVsREJDb2RpbmcuaCIKLQotI2lmIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQotI2lmIFVT
RShMRVZFTERCKQotCi0jaW5jbHVkZSAiSURCS2V5LmgiCi0jaW5jbHVkZSAiSURCS2V5UGF0aC5o
IgotI2luY2x1ZGUgIkxldmVsREJTbGljZS5oIgotI2luY2x1ZGUgPHd0Zi9CeXRlT3JkZXIuaD4K
LSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+Ci0KLS8vIExldmVsREIgc3RvcmVz
IGtleS92YWx1ZSBwYWlycy4gS2V5cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIG9mIGJ5dGVzLCBu
b3JtYWxseSBvZiB0eXBlIFZlY3RvcjxjaGFyPi4KLS8vCi0vLyBUaGUga2V5cyBpbiB0aGUgYmFj
a2luZyBzdG9yZSBhcmUgdmFyaWFibGUtbGVuZ3RoIHR1cGxlcyB3aXRoIGRpZmZlcmVudCB0eXBl
cwotLy8gb2YgZmllbGRzLiBFYWNoIGtleSBpbiB0aGUgYmFja2luZyBzdG9yZSBzdGFydHMgd2l0
aCBhIHRlcm5hcnkgcHJlZml4OiAoZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXgg
aWQpLiBGb3IgZWFjaCwgMCBpcyByZXNlcnZlZCBmb3IgbWV0YS1kYXRhLgotLy8gVGhlIHByZWZp
eCBtYWtlcyBzdXJlIHRoYXQgZGF0YSBmb3IgYSBzcGVjaWZpYyBkYXRhYmFzZSwgb2JqZWN0IHN0
b3JlLCBhbmQgaW5kZXggYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBsb2NhbGl0eSBpcyBpbXBv
cnRhbnQgZm9yIHBlcmZvcm1hbmNlOiBjb21tb24KLS8vIG9wZXJhdGlvbnMgc2hvdWxkIG9ubHkg
bmVlZCBhIG1pbmltYWwgbnVtYmVyIG9mIHNlZWsgb3BlcmF0aW9ucy4gRm9yIGV4YW1wbGUsIGFs
bCB0aGUgbWV0YS1kYXRhIGZvciBhIGRhdGFiYXNlIGlzIGdyb3VwZWQgdG9nZXRoZXIgc28gdGhh
dCByZWFkaW5nIHRoYXQKLS8vIG1ldGEtZGF0YSBvbmx5IHJlcXVpcmVzIG9uZSBzZWVrLgotLy8K
LS8vIEVhY2gga2V5IHR5cGUgaGFzIGEgY2xhc3MgKGluIHNxdWFyZSBicmFja2V0cyBiZWxvdykg
d2hpY2gga25vd3MgaG93IHRvIGVuY29kZSwgZGVjb2RlLCBhbmQgY29tcGFyZSB0aGF0IGtleSB0
eXBlLgotLy8KLS8vIEdsb2JhbCBtZXRhLWRhdGEgaGF2ZSBrZXlzIHdpdGggcHJlZml4ICgwLDAs
MCksIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlOgotLy8KLS8vICAgICA8MCwgMCwgMCwgMD4gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gSW5kZXhlZERCL0xldmVs
REIgc2NoZW1hIHZlcnNpb24gW1NjaGVtYVZlcnNpb25LZXldCi0vLyAgICAgPDAsIDAsIDAsIDE+
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFRoZSBtYXhpbXVt
IGRhdGFiYXNlIGlkIGV2ZXIgYWxsb2NhdGVkIFtNYXhEYXRhYmFzZUlkS2V5XQotLy8gICAgIDww
LCAwLCAwLCAyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBT
ZXJpYWxpemVkU2NyaXB0VmFsdWUgdmVyc2lvbiBbRGF0YVZlcnNpb25LZXldCi0vLyAgICAgPDAs
IDAsIDAsIDEwMCwgZGF0YWJhc2UgaWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IEV4
aXN0ZW5jZSBpbXBsaWVzIHRoZSBkYXRhYmFzZSBpZCBpcyBpbiB0aGUgZnJlZSBsaXN0IFtEYXRh
YmFzZUZyZWVMaXN0S2V5XQotLy8gICAgIDwwLCAwLCAwLCAyMDEsIHV0ZjE2IG9yaWdpbiBuYW1l
LCB1dGYxNiBkYXRhYmFzZSBuYW1lPiA9PiBEYXRhYmFzZSBpZCBbRGF0YWJhc2VOYW1lS2V5XQot
Ly8KLS8vCi0vLyBEYXRhYmFzZSBtZXRhLWRhdGE6Ci0vLwotLy8gICAgIEFnYWluLCB0aGUgcHJl
Zml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQs
IDAsIDAsIDA+ID0+IHV0ZjE2IG9yaWdpbiBuYW1lIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQotLy8g
ICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMT4gPT4gdXRmMTYgZGF0YWJhc2UgbmFtZSBbRGF0YWJh
c2VNZXRhRGF0YUtleV0KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDI+ID0+IHV0ZjE2IHVz
ZXIgdmVyc2lvbiBkYXRhIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQotLy8gICAgIDxkYXRhYmFzZSBp
ZCwgMCwgMCwgMz4gPT4gbWF4aW11bSBvYmplY3Qgc3RvcmUgaWQgZXZlciBhbGxvY2F0ZWQgW0Rh
dGFiYXNlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA0PiA9PiB1c2Vy
IGludGVnZXIgdmVyc2lvbiAodmFyIGludCkgW0RhdGFiYXNlTWV0YURhdGFLZXldCi0vLwotLy8K
LS8vIE9iamVjdCBzdG9yZSBtZXRhLWRhdGE6Ci0vLwotLy8gICAgIFRoZSBwcmVmaXggaXMgZm9s
bG93ZWQgYnkgYSB0eXBlIGJ5dGUsIHRoZW4gYSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciwgYW5k
IHRoZW4gYW5vdGhlciB0eXBlIGJ5dGUuCi0vLwotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwg
NTAsIG9iamVjdCBzdG9yZSBpZCwgMD4gPT4gdXRmMTYgb2JqZWN0IHN0b3JlIG5hbWUgW09iamVj
dFN0b3JlTWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0
IHN0b3JlIGlkLCAxPiA9PiB1dGYxNiBrZXkgcGF0aCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0K
LS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDI+ID0+IGhh
cyBhdXRvIGluY3JlbWVudCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KLS8vICAgICA8ZGF0YWJh
c2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDM+ID0+IGlzIGV2aWN0YWJsZSBbT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleV0KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmpl
Y3Qgc3RvcmUgaWQsIDQ+ID0+IGxhc3QgInZlcnNpb24iIG51bWJlciBbT2JqZWN0U3RvcmVNZXRh
RGF0YUtleV0KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQs
IDU+ID0+IG1heGltdW0gaW5kZXggaWQgZXZlciBhbGxvY2F0ZWQgW09iamVjdFN0b3JlTWV0YURh
dGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCA2
PiA9PiBoYXMga2V5IHBhdGggKHZzLiBudWxsKSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KLS8v
ICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDc+ID0+IGtleSBn
ZW5lcmF0b3IgY3VycmVudCBudW1iZXIgW09iamVjdFN0b3JlTWV0YURhdGFLZXldCi0vLwotLy8K
LS8vIEluZGV4IG1ldGEtZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBi
eSBhIHR5cGUgYnl0ZSwgdGhlbiB0d28gdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzLCBhbmQgdGhl
biBhbm90aGVyIHR5cGUgYnl0ZS4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAs
IG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDA+ID0+IHV0ZjE2IGluZGV4IG5hbWUgW0luZGV4
TWV0YURhdGFLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9y
ZSBpZCwgaW5kZXggaWQsIDE+ID0+IGFyZSBpbmRleCBrZXlzIHVuaXF1ZSBbSW5kZXhNZXRhRGF0
YUtleV0KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBp
bmRleCBpZCwgMj4gPT4gdXRmMTYga2V5IHBhdGggW0luZGV4TWV0YURhdGFLZXldCi0vLyAgICAg
PGRhdGFiYXNlIGlkLCAwLCAwLCAxMDAsIG9iamVjdCBzdG9yZSBpZCwgaW5kZXggaWQsIDM+ID0+
IGlzIGluZGV4IG11bHRpLWVudHJ5IFtJbmRleE1ldGFEYXRhS2V5XQotLy8KLS8vCi0vLyBPdGhl
ciBvYmplY3Qgc3RvcmUgYW5kIGluZGV4IG1ldGEtZGF0YToKLS8vCi0vLyAgICAgVGhlIHByZWZp
eCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIG9iamVjdCBzdG9yZSBhbmQgaW5kZXgg
aWQgYXJlIHZhcmlhYmxlIGxlbmd0aCBpbnRlZ2VycywgdGhlIHV0ZjE2IHN0cmluZ3MgYXJlIHZh
cmlhYmxlIGxlbmd0aCBzdHJpbmdzLgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDE1
MCwgb2JqZWN0IHN0b3JlIGlkPiAgICAgICAgICAgICAgICAgICA9PiBleGlzdGVuY2UgaW1wbGll
cyB0aGUgb2JqZWN0IHN0b3JlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW09iamVjdFN0b3JlRnJl
ZUxpc3RLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAxNTEsIG9iamVjdCBzdG9yZSBp
ZCwgaW5kZXggaWQ+ICAgICAgICAgPT4gZXhpc3RlbmNlIGltcGxpZXMgdGhlIGluZGV4IGlkIGlz
IGluIHRoZSBmcmVlIGxpc3QgW0luZGV4RnJlZUxpc3RLZXldCi0vLyAgICAgPGRhdGFiYXNlIGlk
LCAwLCAwLCAyMDAsIHV0ZjE2IG9iamVjdCBzdG9yZSBuYW1lPiAgICAgICAgICAgPT4gb2JqZWN0
IHN0b3JlIGlkIFtPYmplY3RTdG9yZU5hbWVzS2V5XQotLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwg
MCwgMjAxLCBvYmplY3Qgc3RvcmUgaWQsIHV0ZjE2IGluZGV4IG5hbWU+ID0+IGluZGV4IGlkIFtJ
bmRleE5hbWVzS2V5XQotLy8KLS8vCi0vLyBPYmplY3Qgc3RvcmUgZGF0YToKLS8vCi0vLyAgICAg
VGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFu
IGVuY29kZWQgSURCS2V5LgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBp
ZCwgMSwgdXNlciBrZXk+ID0+ICJ2ZXJzaW9uIiwgc2VyaWFsaXplZCBzY3JpcHQgdmFsdWUgW09i
amVjdFN0b3JlRGF0YUtleV0KLS8vCi0vLwotLy8gIkV4aXN0cyIgZW50cnk6Ci0vLwotLy8gICAg
IFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSB1c2VyIGtleSBpcyBh
biBlbmNvZGVkIElEQktleS4KLS8vCi0vLyAgICAgPGRhdGFiYXNlIGlkLCBvYmplY3Qgc3RvcmUg
aWQsIDIsIHVzZXIga2V5PiA9PiAidmVyc2lvbiIgW0V4aXN0c0VudHJ5S2V5XQotLy8KLS8vCi0v
LyBJbmRleCBkYXRhOgotLy8KLS8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlw
ZSBieXRlLiBUaGUgaW5kZXgga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LiBUaGUgc2VxdWVuY2Ug
bnVtYmVyIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGludGVnZXIuCi0vLyAgICAgVGhlIHByaW1hcnkg
a2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LgotLy8KLS8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVj
dCBzdG9yZSBpZCwgaW5kZXggaWQsIGluZGV4IGtleSwgc2VxdWVuY2UgbnVtYmVyLCBwcmltYXJ5
IGtleT4gPT4gInZlcnNpb24iLCBwcmltYXJ5IGtleSBbSW5kZXhEYXRhS2V5XQotLy8KLS8vICAg
ICAoVGhlIHNlcXVlbmNlIG51bWJlciBpcyBvYnNvbGV0ZTsgaXQgd2FzIHVzZWQgdG8gYWxsb3cg
dHdvIGVudHJpZXMgd2l0aAotLy8gICAgIHRoZSBzYW1lIHVzZXIgKGluZGV4KSBrZXkgaW4gbm9u
LXVuaXF1ZSBpbmRleGVzIHByaW9yIHRvIHRoZSBpbmNsdXNpb24gb2YKLS8vICAgICB0aGUgcHJp
bWFyeSBrZXkgaW4gdGhlIGRhdGEuIFRoZSAidmVyc2lvbiIgZmllbGQgaXMgdXNlZCB0byB3ZWVk
IG91dCBzdGFsZQotLy8gICAgIGluZGV4IGRhdGEuIFdoZW5ldmVyIG5ldyBvYmplY3Qgc3RvcmUg
ZGF0YSBpcyBpbnNlcnRlZCwgaXQgZ2V0cyBhIG5ldwotLy8gICAgICJ2ZXJzaW9uIiBudW1iZXIs
IGFuZCBuZXcgaW5kZXggZGF0YSBpcyB3cml0dGVuIHdpdGggdGhpcyBudW1iZXIuIFdoZW4KLS8v
ICAgICB0aGUgaW5kZXggaXMgdXNlZCBmb3IgbG9vay11cHMsIGVudHJpZXMgYXJlIHZhbGlkYXRl
ZCBhZ2FpbnN0IHRoZQotLy8gICAgICJleGlzdHMiIGVudHJpZXMsIGFuZCByZWNvcmRzIHdpdGgg
b2xkICJ2ZXJzaW9uIiBudW1iZXJzIGFyZSBkZWxldGVkCi0vLyAgICAgd2hlbiB0aGV5IGFyZSBl
bmNvdW50ZXJlZCBpbiBnZXRQcmltYXJ5S2V5VmlhSW5kZXgsCi0vLyAgICAgSW5kZXhDdXJzb3JJ
bXBsOjpsb2FkQ3VycmVudFJvdywgYW5kIEluZGV4S2V5Q3Vyc29ySW1wbDo6bG9hZEN1cnJlbnRS
b3cpLgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1uYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZyB7
Ci0KLSNpZm5kZWYgSU5UNjRfTUFYCi0jZGVmaW5lIElOVDY0X01BWCAweDdmZmZmZmZmZmZmZmZm
ZmZMTAotI2VuZGlmCi0jaWZuZGVmIElOVDMyX01BWAotI2RlZmluZSBJTlQzMl9NQVggMHg3ZmZm
ZmZmZkwKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBJREJLZXlOdWxsVHlw
ZUJ5dGUgPSAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgSURCS2V5U3RyaW5nVHlwZUJ5
dGUgPSAxOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgSURCS2V5RGF0ZVR5cGVCeXRlID0g
MjsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIElEQktleU51bWJlclR5cGVCeXRlID0gMzsK
LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIElEQktleUFycmF5VHlwZUJ5dGUgPSA0Owotc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgSURCS2V5TWluS2V5VHlwZUJ5dGUgPSA1OwotCi1zdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBJREJLZXlQYXRoVHlwZUNvZGVkQnl0ZTEgPSAwOwotc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgSURCS2V5UGF0aFR5cGVDb2RlZEJ5dGUyID0gMDsKLQot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgT2JqZWN0U3RvcmVEYXRhSW5kZXhJZCA9IDE7Ci1z
dGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBFeGlzdHNFbnRyeUluZGV4SWQgPSAyOwotCi1zdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBTY2hlbWFWZXJzaW9uVHlwZUJ5dGUgPSAwOwotc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIgTWF4RGF0YWJhc2VJZFR5cGVCeXRlID0gMTsKLXN0YXRpYyBj
b25zdCB1bnNpZ25lZCBjaGFyIERhdGFWZXJzaW9uVHlwZUJ5dGUgPSAyOwotc3RhdGljIGNvbnN0
IHVuc2lnbmVkIGNoYXIgTWF4U2ltcGxlR2xvYmFsTWV0YURhdGFUeXBlQnl0ZSA9IDM7IC8vIElu
c2VydCBiZWZvcmUgdGhpcyBhbmQgaW5jcmVtZW50Lgotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNo
YXIgRGF0YWJhc2VGcmVlTGlzdFR5cGVCeXRlID0gMTAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNoYXIgRGF0YWJhc2VOYW1lVHlwZUJ5dGUgPSAyMDE7Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25l
ZCBjaGFyIE9iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSA9IDUwOwotc3RhdGljIGNvbnN0IHVu
c2lnbmVkIGNoYXIgSW5kZXhNZXRhRGF0YVR5cGVCeXRlID0gMTAwOwotc3RhdGljIGNvbnN0IHVu
c2lnbmVkIGNoYXIgT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlID0gMTUwOwotc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIgSW5kZXhGcmVlTGlzdFR5cGVCeXRlID0gMTUxOwotc3RhdGljIGNv
bnN0IHVuc2lnbmVkIGNoYXIgT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRlID0gMjAwOwotc3RhdGlj
IGNvbnN0IHVuc2lnbmVkIGNoYXIgSW5kZXhOYW1lc0tleVR5cGVCeXRlID0gMjAxOwotCi1zdGF0
aWMgY29uc3QgdW5zaWduZWQgY2hhciBPYmplY3RNZXRhRGF0YVR5cGVNYXhpbXVtID0gMjU1Owot
c3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgSW5kZXhNZXRhRGF0YVR5cGVNYXhpbXVtID0gMjU1
OwotCi1WZWN0b3I8Y2hhcj4gZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyIGMpCi17Ci0gICAgVmVj
dG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiB2OwotICAgIHYuYXBwZW5kKGMpOwot
Ci0gICAgQVNTRVJUKHYuc2l6ZSgpIDw9IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplKTsKLSAgICBy
ZXR1cm4gdjsKLX0KLQotY29uc3QgY2hhciogZGVjb2RlQnl0ZShjb25zdCBjaGFyKiBwLCBjb25z
dCBjaGFyKiBsaW1pdCwgdW5zaWduZWQgY2hhciYgZm91bmRDaGFyKQotewotICAgIGlmIChwID49
IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvdW5kQ2hhciA9ICpwKys7Ci0gICAg
cmV0dXJuIHA7Ci19Ci0KLVZlY3RvcjxjaGFyPiBtYXhJREJLZXkoKQotewotICAgIHJldHVybiBl
bmNvZGVCeXRlKElEQktleU51bGxUeXBlQnl0ZSk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBtaW5JREJL
ZXkoKQotewotICAgIHJldHVybiBlbmNvZGVCeXRlKElEQktleU1pbktleVR5cGVCeXRlKTsKLX0K
LQotVmVjdG9yPGNoYXI+IGVuY29kZUJvb2woYm9vbCBiKQotewotICAgIFZlY3RvcjxjaGFyLCBE
ZWZhdWx0SW5saW5lQnVmZmVyU2l6ZT4gcmV0OwotICAgIHJldC5hcHBlbmQoYiA/IDEgOiAwKTsK
LQotICAgIEFTU0VSVChyZXQuc2l6ZSgpIDw9IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplKTsKLSAg
ICByZXR1cm4gcmV0OwotfQotCi1ib29sIGRlY29kZUJvb2woY29uc3QgY2hhciogYmVnaW4sIGNv
bnN0IGNoYXIqIGVuZCkKLXsKLSAgICBBU1NFUlRfVU5VU0VEKGVuZCwgYmVnaW4gPCBlbmQpOwot
ICAgIHJldHVybiAqYmVnaW47Ci19Ci0KLVZlY3RvcjxjaGFyPiBlbmNvZGVJbnQoaW50NjRfdCBu
UGFyYW0pCi17Ci0gICAgQVNTRVJUKG5QYXJhbSA+PSAwKTsKLSAgICB1aW50NjRfdCBuID0gc3Rh
dGljX2Nhc3Q8dWludDY0X3Q+KG5QYXJhbSk7Ci0gICAgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxp
bmVCdWZmZXJTaXplPiByZXQ7Ci0KLSAgICBkbyB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9
IG47Ci0gICAgICAgIHJldC5hcHBlbmQoYyk7Ci0gICAgICAgIG4gPj49IDg7Ci0gICAgfSB3aGls
ZSAobik7Ci0KLSAgICBBU1NFUlQocmV0LnNpemUoKSA8PSBEZWZhdWx0SW5saW5lQnVmZmVyU2l6
ZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50NjRfdCBkZWNvZGVJbnQoY29uc3QgY2hhciog
YmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkKLXsKLSAgICBBU1NFUlQoYmVnaW4gPD0gZW5kKTsKLSAg
ICBpbnQ2NF90IHJldCA9IDA7Ci0KLSAgICBpbnQgc2hpZnQgPSAwOwotICAgIHdoaWxlIChiZWdp
biA8IGVuZCkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqYmVnaW4rKzsKLSAgICAgICAg
cmV0IHw9IHN0YXRpY19jYXN0PGludDY0X3Q+KGMpIDw8IHNoaWZ0OwotICAgICAgICBzaGlmdCAr
PSA4OwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGFyZUlu
dHMoaW50NjRfdCBhLCBpbnQ2NF90IGIpCi17Ci0gICAgQVNTRVJUKGEgPj0gMCk7Ci0gICAgQVNT
RVJUKGIgPj0gMCk7Ci0KLSAgICBpbnQ2NF90IGRpZmYgPSBhIC0gYjsKLSAgICBpZiAoZGlmZiA8
IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZGlmZiA+IDApCi0gICAgICAgIHJldHVy
biAxOwotICAgIHJldHVybiAwOwotfQotCi1WZWN0b3I8Y2hhcj4gZW5jb2RlVmFySW50KGludDY0
X3QgblBhcmFtKQotewotICAgIEFTU0VSVChuUGFyYW0gPj0gMCk7Ci0gICAgdWludDY0X3QgbiA9
IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuUGFyYW0pOwotICAgIFZlY3RvcjxjaGFyLCBEZWZhdWx0
SW5saW5lQnVmZmVyU2l6ZT4gcmV0OwotCi0gICAgZG8gewotICAgICAgICB1bnNpZ25lZCBjaGFy
IGMgPSBuICYgMHg3ZjsKLSAgICAgICAgbiA+Pj0gNzsKLSAgICAgICAgaWYgKG4pCi0gICAgICAg
ICAgICBjIHw9IDB4ODA7Ci0gICAgICAgIHJldC5hcHBlbmQoYyk7Ci0gICAgfSB3aGlsZSAobik7
Ci0KLSAgICBBU1NFUlQocmV0LnNpemUoKSA8PSBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZSk7Ci0g
ICAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgY2hhciogZGVjb2RlVmFySW50KGNvbnN0IGNoYXIq
IHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBpbnQ2NF90JiBmb3VuZEludCkKLXsKLSAgICBBU1NFUlQo
bGltaXQgPj0gcCk7Ci0gICAgZm91bmRJbnQgPSAwOwotICAgIGludCBzaGlmdCA9IDA7Ci0KLSAg
ICBkbyB7Ci0gICAgICAgIGlmIChwID49IGxpbWl0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICAgICAgdW5zaWduZWQgY2hhciBjID0gKnA7Ci0gICAgICAgIGZvdW5kSW50IHw9IHN0YXRp
Y19jYXN0PGludDY0X3Q+KGMgJiAweDdmKSA8PCBzaGlmdDsKLSAgICAgICAgc2hpZnQgKz0gNzsK
LSAgICB9IHdoaWxlICgqcCsrICYgMHg4MCk7Ci0gICAgcmV0dXJuIHA7Ci19Ci0KLVZlY3Rvcjxj
aGFyPiBlbmNvZGVTdHJpbmcoY29uc3QgU3RyaW5nJiBzKQotewotICAgIC8vIEJhY2tpbmcgc3Rv
cmUgaXMgVVRGLTE2QkUsIGNvbnZlcnQgZnJvbSBob3N0IGVuZGlhbm5lc3MuCi0gICAgc2l6ZV90
IGxlbmd0aCA9IHMubGVuZ3RoKCk7Ci0gICAgVmVjdG9yPGNoYXI+IHJldChsZW5ndGggKiBzaXpl
b2YoVUNoYXIpKTsKLQotICAgIGNvbnN0IFVDaGFyKiBzcmMgPSBzLmNoYXJhY3RlcnMoKTsKLSAg
ICBVQ2hhciogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KHJldC5kYXRhKCkpOwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKLSAgICAgICAgKmRzdCsrID0g
aHRvbnMoKnNyYysrKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLVN0cmluZyBkZWNvZGVTdHJp
bmcoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCkKLXsKLSAgICAvLyBCYWNraW5n
IHN0b3JlIGlzIFVURi0xNkJFLCBjb252ZXJ0IHRvIGhvc3QgZW5kaWFubmVzcy4KLSAgICBBU1NF
UlQoZW5kID49IHN0YXJ0KTsKLSAgICBBU1NFUlQoISgoZW5kIC0gc3RhcnQpICUgc2l6ZW9mKFVD
aGFyKSkpOwotCi0gICAgc2l6ZV90IGxlbmd0aCA9IChlbmQgLSBzdGFydCkgLyBzaXplb2YoVUNo
YXIpOwotICAgIFZlY3RvcjxVQ2hhcj4gYnVmZmVyKGxlbmd0aCk7Ci0KLSAgICBjb25zdCBVQ2hh
ciogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcio+KHN0YXJ0KTsKLSAgICBVQ2hh
ciogZHN0ID0gYnVmZmVyLmRhdGEoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
Z3RoOyArK2kpCi0gICAgICAgICpkc3QrKyA9IG50b2hzKCpzcmMrKyk7Ci0KLSAgICByZXR1cm4g
U3RyaW5nOjphZG9wdChidWZmZXIpOwotfQotCi1WZWN0b3I8Y2hhcj4gZW5jb2RlU3RyaW5nV2l0
aExlbmd0aChjb25zdCBTdHJpbmcmIHMpCi17Ci0gICAgVmVjdG9yPGNoYXI+IHJldCA9IGVuY29k
ZVZhckludChzLmxlbmd0aCgpKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVN0cmluZyhz
KSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgY2hhciogZGVjb2RlU3RyaW5nV2l0aExl
bmd0aChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgU3RyaW5nJiBmb3VuZFN0cmlu
ZykKLXsKLSAgICBBU1NFUlQobGltaXQgPj0gcCk7Ci0gICAgaW50NjRfdCBsZW47Ci0gICAgcCA9
IGRlY29kZVZhckludChwLCBsaW1pdCwgbGVuKTsKLSAgICBpZiAoIXAgfHwgbGVuIDwgMCB8fCBw
ICsgbGVuICogMiA+IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvdW5kU3RyaW5n
ID0gZGVjb2RlU3RyaW5nKHAsIHAgKyBsZW4gKiAyKTsKLSAgICBwICs9IGxlbiAqIDI7Ci0gICAg
cmV0dXJuIHA7Ci19Ci0KLWludCBjb21wYXJlRW5jb2RlZFN0cmluZ3NXaXRoTGVuZ3RoKGNvbnN0
IGNoYXIqJiBwLCBjb25zdCBjaGFyKiBsaW1pdFAsIGNvbnN0IGNoYXIqJiBxLCBjb25zdCBjaGFy
KiBsaW1pdFEsIGJvb2wmIG9rKQotewotICAgIEFTU0VSVCgmcCAhPSAmcSk7Ci0gICAgQVNTRVJU
KGxpbWl0UCA+PSBwKTsKLSAgICBBU1NFUlQobGltaXRRID49IHEpOwotICAgIGludDY0X3QgbGVu
UCwgbGVuUTsKLSAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0UCwgbGVuUCk7Ci0gICAgcSA9
IGRlY29kZVZhckludChxLCBsaW1pdFEsIGxlblEpOwotICAgIGlmICghcCB8fCAhcSB8fCBsZW5Q
IDwgMCB8fCBsZW5RIDwgMCkgewotICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0gICAgQVNTRVJUKHAgJiYgcSk7Ci0gICAgQVNTRVJUKGxlblAgPj0gMCk7Ci0g
ICAgQVNTRVJUKGxlblEgPj0gMCk7Ci0gICAgQVNTRVJUKHAgKyBsZW5QICogMiA8PSBsaW1pdFAp
OwotICAgIEFTU0VSVChxICsgbGVuUSAqIDIgPD0gbGltaXRRKTsKLQotICAgIGNvbnN0IGNoYXIq
IHN0YXJ0UCA9IHA7Ci0gICAgY29uc3QgY2hhciogc3RhcnRRID0gcTsKLSAgICBwICs9IGxlblAg
KiAyOwotICAgIHEgKz0gbGVuUSAqIDI7Ci0KLSAgICBpZiAocCA+IGxpbWl0UCB8fCBxID4gbGlt
aXRRKSB7Ci0gICAgICAgIG9rID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQot
ICAgIG9rID0gdHJ1ZTsKLSAgICBjb25zdCBzaXplX3QgbG1pbiA9IHN0YXRpY19jYXN0PHNpemVf
dD4obGVuUCA8IGxlblEgPyBsZW5QIDogbGVuUSk7Ci0gICAgaWYgKGludCB4ID0gbWVtY21wKHN0
YXJ0UCwgc3RhcnRRLCBsbWluICogMikpCi0gICAgICAgIHJldHVybiB4OwotCi0gICAgaWYgKGxl
blAgPT0gbGVuUSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKGxlblAgPiBsZW5R
KSA/IDEgOiAtMTsKLX0KLQotVmVjdG9yPGNoYXI+IGVuY29kZURvdWJsZShkb3VibGUgeCkKLXsK
LSAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBiZSBieXRlIG9yZGVy
IGluZGVwZW5kZW50LgotICAgIGNvbnN0IGNoYXIqIHAgPSByZWludGVycHJldF9jYXN0PGNoYXIq
PigmeCk7Ci0gICAgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiB2OwotICAg
IHYuYXBwZW5kKHAsIHNpemVvZih4KSk7Ci0KLSAgICBBU1NFUlQodi5zaXplKCkgPD0gRGVmYXVs
dElubGluZUJ1ZmZlclNpemUpOwotICAgIHJldHVybiB2OwotfQotCi1jb25zdCBjaGFyKiBkZWNv
ZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRvdWJsZSogZCkKLXsK
LSAgICBpZiAocCArIHNpemVvZigqZCkgPiBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICBjaGFyKiB4ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZCk7Ci0gICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBzaXplb2YoKmQpOyArK2kpCi0gICAgICAgICp4KysgPSAqcCsrOwotICAgIHJl
dHVybiBwOwotfQotCi1WZWN0b3I8Y2hhcj4gZW5jb2RlSURCS2V5KGNvbnN0IElEQktleSYga2V5
KQotewotICAgIFZlY3RvcjxjaGFyLCBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZT4gcmV0OwotICAg
IGVuY29kZUlEQktleShrZXksIHJldCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBlbmNv
ZGVJREJLZXkoY29uc3QgSURCS2V5JiBrZXksIFZlY3RvcjxjaGFyLCBEZWZhdWx0SW5saW5lQnVm
ZmVyU2l6ZT4mIGludG8pCi17Ci0gICAgc2l6ZV90IHByZXZpb3VzU2l6ZSA9IGludG8uc2l6ZSgp
OwotICAgIEFTU0VSVChrZXkuaXNWYWxpZCgpKTsKLSAgICBzd2l0Y2ggKGtleS50eXBlKCkpIHsK
LSAgICBjYXNlIElEQktleTo6SW52YWxpZFR5cGU6Ci0gICAgY2FzZSBJREJLZXk6Ok1pblR5cGU6
Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAgICBpbnRvLmFwcGVuZFZlY3Rv
cihlbmNvZGVCeXRlKElEQktleU51bGxUeXBlQnl0ZSkpOwotICAgICAgICByZXR1cm47Ci0gICAg
Y2FzZSBJREJLZXk6OkFycmF5VHlwZTogewotICAgICAgICBpbnRvLmFwcGVuZFZlY3RvcihlbmNv
ZGVCeXRlKElEQktleUFycmF5VHlwZUJ5dGUpKTsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IGtl
eS5hcnJheSgpLnNpemUoKTsKLSAgICAgICAgaW50by5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50
KGxlbmd0aCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQot
ICAgICAgICAgICAgZW5jb2RlSURCS2V5KCprZXkuYXJyYXkoKVtpXSwgaW50byk7Ci0gICAgICAg
IEFTU0VSVF9VTlVTRUQocHJldmlvdXNTaXplLCBpbnRvLnNpemUoKSA+IHByZXZpb3VzU2l6ZSk7
Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBJREJLZXk6OlN0cmluZ1R5cGU6Ci0g
ICAgICAgIGludG8uYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSURCS2V5U3RyaW5nVHlwZUJ5dGUp
KTsKLSAgICAgICAgaW50by5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChrZXku
c3RyaW5nKCkpKTsKLSAgICAgICAgQVNTRVJUX1VOVVNFRChwcmV2aW91c1NpemUsIGludG8uc2l6
ZSgpID4gcHJldmlvdXNTaXplKTsKLSAgICAgICAgcmV0dXJuOwotICAgIGNhc2UgSURCS2V5OjpE
YXRlVHlwZToKLSAgICAgICAgaW50by5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShJREJLZXlEYXRl
VHlwZUJ5dGUpKTsKLSAgICAgICAgaW50by5hcHBlbmRWZWN0b3IoZW5jb2RlRG91YmxlKGtleS5k
YXRlKCkpKTsKLSAgICAgICAgQVNTRVJUX1VOVVNFRChwcmV2aW91c1NpemUsIGludG8uc2l6ZSgp
IC0gcHJldmlvdXNTaXplID09IDkpOwotICAgICAgICByZXR1cm47Ci0gICAgY2FzZSBJREJLZXk6
Ok51bWJlclR5cGU6Ci0gICAgICAgIGludG8uYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSURCS2V5
TnVtYmVyVHlwZUJ5dGUpKTsKLSAgICAgICAgaW50by5hcHBlbmRWZWN0b3IoZW5jb2RlRG91Ymxl
KGtleS5udW1iZXIoKSkpOwotICAgICAgICBBU1NFUlRfVU5VU0VEKHByZXZpb3VzU2l6ZSwgaW50
by5zaXplKCkgLSBwcmV2aW91c1NpemUgPT0gOSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0K
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLX0KLQotCi1jb25zdCBjaGFyKiBkZWNvZGVJREJL
ZXkoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIFJlZlB0cjxJREJLZXk+JiBmb3Vu
ZEtleSkKLXsKLSAgICBBU1NFUlQobGltaXQgPj0gcCk7Ci0gICAgaWYgKHAgPj0gbGltaXQpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgdW5zaWduZWQgY2hhciB0eXBlID0gKnArKzsKLQotICAg
IHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSURCS2V5TnVsbFR5cGVCeXRlOgotICAgICAgICBm
b3VuZEtleSA9IElEQktleTo6Y3JlYXRlSW52YWxpZCgpOwotICAgICAgICByZXR1cm4gcDsKLQot
ICAgIGNhc2UgSURCS2V5QXJyYXlUeXBlQnl0ZTogewotICAgICAgICBpbnQ2NF90IGxlbmd0aDsK
LSAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgbGVuZ3RoKTsKLSAgICAgICAgaWYg
KCFwIHx8IGxlbmd0aCA8IDApCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgSURCS2V5
OjpLZXlBcnJheSBhcnJheTsKLSAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7Ci0gICAgICAgICAg
ICBSZWZQdHI8SURCS2V5PiBrZXk7Ci0gICAgICAgICAgICBwID0gZGVjb2RlSURCS2V5KHAsIGxp
bWl0LCBrZXkpOwotICAgICAgICAgICAgaWYgKCFwKQotICAgICAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICAgICAgYXJyYXkuYXBwZW5kKGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm91
bmRLZXkgPSBJREJLZXk6OmNyZWF0ZUFycmF5KGFycmF5KTsKLSAgICAgICAgcmV0dXJuIHA7Ci0g
ICAgfQotICAgIGNhc2UgSURCS2V5U3RyaW5nVHlwZUJ5dGU6IHsKLSAgICAgICAgU3RyaW5nIHM7
Ci0gICAgICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHAsIGxpbWl0LCBzKTsKLSAgICAg
ICAgaWYgKCFwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGZvdW5kS2V5ID0gSURC
S2V5OjpjcmVhdGVTdHJpbmcocyk7Ci0gICAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICBjYXNl
IElEQktleURhdGVUeXBlQnl0ZTogewotICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgcCA9IGRl
Y29kZURvdWJsZShwLCBsaW1pdCwgJmQpOwotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICBy
ZXR1cm4gMDsKLSAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoZCk7Ci0gICAg
ICAgIHJldHVybiBwOwotICAgIH0KLSAgICBjYXNlIElEQktleU51bWJlclR5cGVCeXRlOiB7Ci0g
ICAgICAgIGRvdWJsZSBkOwotICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAmZCk7
Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBmb3VuZEtl
eSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKGQpOwotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0g
ICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNv
bnN0IGNoYXIqIGV4dHJhY3RFbmNvZGVkSURCS2V5KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBj
aGFyKiBsaW1pdCwgVmVjdG9yPGNoYXI+KiByZXN1bHQgPSAwKQotewotICAgIGNvbnN0IGNoYXIq
IHAgPSBzdGFydDsKLSAgICBpZiAocCA+PSBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAg
ICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOwotCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAg
Y2FzZSBJREJLZXlOdWxsVHlwZUJ5dGU6Ci0gICAgY2FzZSBJREJLZXlNaW5LZXlUeXBlQnl0ZToK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJREJLZXlBcnJheVR5cGVCeXRlOiB7Ci0gICAgICAg
IGludDY0X3QgbGVuZ3RoOwotICAgICAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCBsZW5n
dGgpOwotICAgICAgICBpZiAoIXAgfHwgbGVuZ3RoIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKLSAgICAgICAgICAgIHAgPSBleHRyYWN0RW5j
b2RlZElEQktleShwLCBsaW1pdCk7Ci0gICAgICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2Ug
SURCS2V5U3RyaW5nVHlwZUJ5dGU6IHsKLSAgICAgICAgaW50NjRfdCBsZW5ndGg7Ci0gICAgICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbmd0aCk7Ci0gICAgICAgIGlmICghcCB8fCBs
ZW5ndGggPCAwIHx8IHAgKyBsZW5ndGggKiAyID4gbGltaXQpCi0gICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgcCArPSBsZW5ndGggKiAyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAg
Y2FzZSBJREJLZXlEYXRlVHlwZUJ5dGU6Ci0gICAgY2FzZSBJREJLZXlOdW1iZXJUeXBlQnl0ZToK
LSAgICAgICAgaWYgKHAgKyBzaXplb2YoZG91YmxlKSA+IGxpbWl0KQotICAgICAgICAgICAgcmV0
dXJuIDA7Ci0gICAgICAgIHAgKz0gc2l6ZW9mKGRvdWJsZSk7Ci0gICAgICAgIGJyZWFrOwotICAg
IH0KLQotICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgQVNTRVJUKHApOwotICAgICAgICBBU1NF
UlQocCA8PSBsaW1pdCk7Ci0gICAgICAgIHJlc3VsdC0+Y2xlYXIoKTsKLSAgICAgICAgcmVzdWx0
LT5hcHBlbmQoc3RhcnQsIHAgLSBzdGFydCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHA7Ci19Ci0K
LXN0YXRpYyBJREJLZXk6OlR5cGUga2V5VHlwZUJ5dGVUb0tleVR5cGUodW5zaWduZWQgY2hhciB0
eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSURCS2V5TnVsbFR5cGVCeXRl
OgotICAgICAgICByZXR1cm4gSURCS2V5OjpJbnZhbGlkVHlwZTsKLSAgICBjYXNlIElEQktleUFy
cmF5VHlwZUJ5dGU6Ci0gICAgICAgIHJldHVybiBJREJLZXk6OkFycmF5VHlwZTsKLSAgICBjYXNl
IElEQktleVN0cmluZ1R5cGVCeXRlOgotICAgICAgICByZXR1cm4gSURCS2V5OjpTdHJpbmdUeXBl
OwotICAgIGNhc2UgSURCS2V5RGF0ZVR5cGVCeXRlOgotICAgICAgICByZXR1cm4gSURCS2V5OjpE
YXRlVHlwZTsKLSAgICBjYXNlIElEQktleU51bWJlclR5cGVCeXRlOgotICAgICAgICByZXR1cm4g
SURCS2V5OjpOdW1iZXJUeXBlOwotICAgIGNhc2UgSURCS2V5TWluS2V5VHlwZUJ5dGU6Ci0gICAg
ICAgIHJldHVybiBJREJLZXk6Ok1pblR5cGU7Ci0gICAgfQotCi0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci0gICAgcmV0dXJuIElEQktleTo6SW52YWxpZFR5cGU7Ci19Ci0KLWludCBjb21wYXJl
RW5jb2RlZElEQktleXMoY29uc3QgY2hhciomIHB0ckEsIGNvbnN0IGNoYXIqIGxpbWl0QSwgY29u
c3QgY2hhciomIHB0ckIsIGNvbnN0IGNoYXIqIGxpbWl0QiwgYm9vbCYgb2spCi17Ci0gICAgb2sg
PSB0cnVlOwotICAgIEFTU0VSVCgmcHRyQSAhPSAmcHRyQik7Ci0gICAgQVNTRVJUKHB0ckEgPCBs
aW1pdEEpOwotICAgIEFTU0VSVChwdHJCIDwgbGltaXRCKTsKLSAgICB1bnNpZ25lZCBjaGFyIHR5
cGVBID0gKnB0ckErKzsKLSAgICB1bnNpZ25lZCBjaGFyIHR5cGVCID0gKnB0ckIrKzsKLQotICAg
IGlmIChpbnQgeCA9IElEQktleTo6Y29tcGFyZVR5cGVzKGtleVR5cGVCeXRlVG9LZXlUeXBlKHR5
cGVBKSwga2V5VHlwZUJ5dGVUb0tleVR5cGUodHlwZUIpKSkKLSAgICAgICAgcmV0dXJuIHg7Ci0K
LSAgICBzd2l0Y2ggKHR5cGVBKSB7Ci0gICAgY2FzZSBJREJLZXlOdWxsVHlwZUJ5dGU6Ci0gICAg
Y2FzZSBJREJLZXlNaW5LZXlUeXBlQnl0ZToKLSAgICAgICAgLy8gTnVsbCB0eXBlIG9yIG1heCB0
eXBlOyBubyBwYXlsb2FkIHRvIGNvbXBhcmUuCi0gICAgICAgIHJldHVybiAwOwotICAgIGNhc2Ug
SURCS2V5QXJyYXlUeXBlQnl0ZTogewotICAgICAgICBpbnQ2NF90IGxlbmd0aEEsIGxlbmd0aEI7
Ci0gICAgICAgIHB0ckEgPSBkZWNvZGVWYXJJbnQocHRyQSwgbGltaXRBLCBsZW5ndGhBKTsKLSAg
ICAgICAgcHRyQiA9IGRlY29kZVZhckludChwdHJCLCBsaW1pdEIsIGxlbmd0aEIpOwotICAgICAg
ICBpZiAoIXB0ckEgfHwgIXB0ckIgfHwgbGVuZ3RoQSA8IDAgfHwgbGVuZ3RoQiA8IDApIHsKLSAg
ICAgICAgICAgIG9rID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQot
ICAgICAgICBmb3IgKGludDY0X3QgaSA9IDA7IGkgPCBsZW5ndGhBICYmIGkgPCBsZW5ndGhCOyAr
K2kpIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBjb21wYXJlRW5jb2RlZElEQktleXMocHRy
QSwgbGltaXRBLCBwdHJCLCBsaW1pdEIsIG9rKTsKLSAgICAgICAgICAgIGlmICghb2sgfHwgcmVz
dWx0KQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAg
aWYgKGxlbmd0aEEgPCBsZW5ndGhCKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBp
ZiAobGVuZ3RoQSA+IGxlbmd0aEIpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotICAgIGNhc2UgSURCS2V5U3RyaW5nVHlwZUJ5dGU6Ci0gICAgICAgIHJl
dHVybiBjb21wYXJlRW5jb2RlZFN0cmluZ3NXaXRoTGVuZ3RoKHB0ckEsIGxpbWl0QSwgcHRyQiwg
bGltaXRCLCBvayk7Ci0gICAgY2FzZSBJREJLZXlEYXRlVHlwZUJ5dGU6Ci0gICAgY2FzZSBJREJL
ZXlOdW1iZXJUeXBlQnl0ZTogewotICAgICAgICBkb3VibGUgZCwgZTsKLSAgICAgICAgcHRyQSA9
IGRlY29kZURvdWJsZShwdHJBLCBsaW1pdEEsICZkKTsKLSAgICAgICAgcHRyQiA9IGRlY29kZURv
dWJsZShwdHJCLCBsaW1pdEIsICZlKTsKLSAgICAgICAgQVNTRVJUKHB0ckEpOwotICAgICAgICBB
U1NFUlQocHRyQik7Ci0gICAgICAgIGlmICghcHRyQSB8fCAhcHRyQikgewotICAgICAgICAgICAg
b2sgPSBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlm
IChkIDwgZSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGQgPiBlKQotICAg
ICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB9Ci0KLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGNvbXBhcmVF
bmNvZGVkSURCS2V5cyhjb25zdCBWZWN0b3I8Y2hhcj4mIGtleUEsIGNvbnN0IFZlY3RvcjxjaGFy
PiYga2V5QiwgYm9vbCYgb2spCi17Ci0gICAgQVNTRVJUKGtleUEuc2l6ZSgpID49IDEpOwotICAg
IEFTU0VSVChrZXlCLnNpemUoKSA+PSAxKTsKLQotICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBrZXlB
LmRhdGEoKTsKLSAgICBjb25zdCBjaGFyKiBsaW1pdEEgPSBwdHJBICsga2V5QS5zaXplKCk7Ci0g
ICAgY29uc3QgY2hhciogcHRyQiA9IGtleUIuZGF0YSgpOwotICAgIGNvbnN0IGNoYXIqIGxpbWl0
QiA9IHB0ckIgKyBrZXlCLnNpemUoKTsKLQotICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktl
eXMocHRyQSwgbGltaXRBLCBwdHJCLCBsaW1pdEIsIG9rKTsKLX0KLQotVmVjdG9yPGNoYXI+IGVu
Y29kZUlEQktleVBhdGgoY29uc3QgSURCS2V5UGF0aCYga2V5UGF0aCkKLXsKLSAgICAvLyBNYXkg
YmUgdHlwZWQsIG9yIG1heSBiZSBhIHJhdyBzdHJpbmcuIEFuIGludmFsaWQgbGVhZGluZwotICAg
IC8vIGJ5dGUgaXMgdXNlZCB0byBpZGVudGlmeSB0eXBlZCBjb2RpbmcuIE5ldyByZWNvcmRzIGFy
ZQotICAgIC8vIGFsd2F5cyB3cml0dGVuIGFzIHR5cGVkLgotICAgIFZlY3RvcjxjaGFyLCBEZWZh
dWx0SW5saW5lQnVmZmVyU2l6ZT4gcmV0OwotICAgIHJldC5hcHBlbmQoSURCS2V5UGF0aFR5cGVD
b2RlZEJ5dGUxKTsKLSAgICByZXQuYXBwZW5kKElEQktleVBhdGhUeXBlQ29kZWRCeXRlMik7Ci0g
ICAgcmV0LmFwcGVuZChzdGF0aWNfY2FzdDxjaGFyPihrZXlQYXRoLnR5cGUoKSkpOwotICAgIHN3
aXRjaCAoa2V5UGF0aC50eXBlKCkpIHsKLSAgICBjYXNlIElEQktleVBhdGg6Ok51bGxUeXBlOgot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIElEQktleVBhdGg6OlN0cmluZ1R5cGU6Ci0gICAgICAg
IHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChrZXlQYXRoLnN0cmluZygp
KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSURCS2V5UGF0aDo6QXJyYXlUeXBlOiB7Ci0g
ICAgICAgIGNvbnN0IFZlY3RvcjxTdHJpbmc+JiBhcnJheSA9IGtleVBhdGguYXJyYXkoKTsKLSAg
ICAgICAgc2l6ZV90IGNvdW50ID0gYXJyYXkuc2l6ZSgpOwotICAgICAgICByZXQuYXBwZW5kVmVj
dG9yKGVuY29kZVZhckludChjb3VudCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGNvdW50OyArK2kpCi0gICAgICAgICAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVN0cmluZ1dp
dGhMZW5ndGgoYXJyYXlbaV0pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIH0KLSAgICBy
ZXR1cm4gcmV0OwotfQotCi1JREJLZXlQYXRoIGRlY29kZUlEQktleVBhdGgoY29uc3QgY2hhciog
cCwgY29uc3QgY2hhciogbGltaXQpCi17Ci0gICAgLy8gTWF5IGJlIHR5cGVkLCBvciBtYXkgYmUg
YSByYXcgc3RyaW5nLiBBbiBpbnZhbGlkIGxlYWRpbmcKLSAgICAvLyBieXRlIHNlcXVlbmNlIGlz
IHVzZWQgdG8gaWRlbnRpZnkgdHlwZWQgY29kaW5nLiBOZXcgcmVjb3JkcyBhcmUKLSAgICAvLyBh
bHdheXMgd3JpdHRlbiBhcyB0eXBlZC4KLSAgICBpZiAocCA9PSBsaW1pdCB8fCAobGltaXQgLSBw
ID49IDIgJiYgKCpwICE9IElEQktleVBhdGhUeXBlQ29kZWRCeXRlMSB8fCAqKHAgKyAxKSAhPSBJ
REJLZXlQYXRoVHlwZUNvZGVkQnl0ZTIpKSkKLSAgICAgICAgcmV0dXJuIElEQktleVBhdGgoZGVj
b2RlU3RyaW5nKHAsIGxpbWl0KSk7Ci0gICAgcCArPSAyOwotCi0gICAgQVNTRVJUKHAgIT0gbGlt
aXQpOwotICAgIElEQktleVBhdGg6OlR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PElEQktleVBhdGg6
OlR5cGU+KCpwKyspOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSURCS2V5UGF0aDo6
TnVsbFR5cGU6Ci0gICAgICAgIEFTU0VSVChwID09IGxpbWl0KTsKLSAgICAgICAgcmV0dXJuIElE
QktleVBhdGgoKTsKLSAgICBjYXNlIElEQktleVBhdGg6OlN0cmluZ1R5cGU6IHsKLSAgICAgICAg
U3RyaW5nIHN0cmluZzsKLSAgICAgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGlt
aXQsIHN0cmluZyk7Ci0gICAgICAgIEFTU0VSVChwID09IGxpbWl0KTsKLSAgICAgICAgcmV0dXJu
IElEQktleVBhdGgoc3RyaW5nKTsKLSAgICB9Ci0gICAgY2FzZSBJREJLZXlQYXRoOjpBcnJheVR5
cGU6IHsKLSAgICAgICAgVmVjdG9yPFN0cmluZz4gYXJyYXk7Ci0gICAgICAgIGludDY0X3QgY291
bnQ7Ci0gICAgICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGNvdW50KTsKLSAgICAgICAg
QVNTRVJUKHApOwotICAgICAgICBBU1NFUlQoY291bnQgPj0gMCk7Ci0gICAgICAgIHdoaWxlIChj
b3VudC0tKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyaW5nOwotICAgICAgICAgICAgcCA9IGRl
Y29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHN0cmluZyk7Ci0gICAgICAgICAgICBBU1NF
UlQocCk7Ci0gICAgICAgICAgICBhcnJheS5hcHBlbmQoc3RyaW5nKTsKLSAgICAgICAgfQotICAg
ICAgICBBU1NFUlQocCA9PSBsaW1pdCk7Ci0gICAgICAgIHJldHVybiBJREJLZXlQYXRoKGFycmF5
KTsKLSAgICB9Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBJ
REJLZXlQYXRoKCk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEtleVR5
cGU+Ci1pbnQgY29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGlj
ZSYgYiwgYm9vbCwgYm9vbCYgb2spCi17Ci0gICAgS2V5VHlwZSBrZXlBOwotICAgIEtleVR5cGUg
a2V5QjsKLQotICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBLZXlUeXBlOjpkZWNvZGUoYS5iZWdpbigp
LCBhLmVuZCgpLCAma2V5QSk7Ci0gICAgQVNTRVJUKHB0ckEpOwotICAgIGlmICghcHRyQSkgewot
ICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgY29uc3Qg
Y2hhciogcHRyQiA9IEtleVR5cGU6OmRlY29kZShiLmJlZ2luKCksIGIuZW5kKCksICZrZXlCKTsK
LSAgICBBU1NFUlQocHRyQik7Ci0gICAgaWYgKCFwdHJCKSB7Ci0gICAgICAgIG9rID0gZmFsc2U7
Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIG9rID0gdHJ1ZTsKLSAgICByZXR1cm4g
a2V5QS5jb21wYXJlKGtleUIpOwotfQotCi10ZW1wbGF0ZTw+Ci1pbnQgY29tcGFyZTxFeGlzdHNF
bnRyeUtleT4oY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIsIGJv
b2wsIGJvb2wmIG9rKQotewotICAgIEtleVByZWZpeCBwcmVmaXhBOwotICAgIEtleVByZWZpeCBw
cmVmaXhCOwotICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShhLmJlZ2lu
KCksIGEuZW5kKCksICZwcmVmaXhBKTsKLSAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5UHJlZml4
OjpkZWNvZGUoYi5iZWdpbigpLCBiLmVuZCgpLCAmcHJlZml4Qik7Ci0gICAgQVNTRVJUKHB0ckEp
OwotICAgIEFTU0VSVChwdHJCKTsKLSAgICBBU1NFUlQocHJlZml4QS5tX2RhdGFiYXNlSWQpOwot
ICAgIEFTU0VSVChwcmVmaXhBLm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgQVNTRVJUKHByZWZpeEEu
bV9pbmRleElkID09IEV4aXN0c0VudHJ5S2V5OjpTcGVjaWFsSW5kZXhOdW1iZXIpOwotICAgIEFT
U0VSVChwcmVmaXhCLm1fZGF0YWJhc2VJZCk7Ci0gICAgQVNTRVJUKHByZWZpeEIubV9vYmplY3RT
dG9yZUlkKTsKLSAgICBBU1NFUlQocHJlZml4Qi5tX2luZGV4SWQgPT0gRXhpc3RzRW50cnlLZXk6
OlNwZWNpYWxJbmRleE51bWJlcik7Ci0gICAgQVNTRVJUKHB0ckEgIT0gYS5lbmQoKSk7Ci0gICAg
QVNTRVJUKHB0ckIgIT0gYi5lbmQoKSk7Ci0gICAgLy8gUHJlZml4ZXMgYXJlIG5vdCBjb21wYXJl
ZCAtIGl0IGlzIGFzc3VtZWQgdGhpcyB3YXMgYWxyZWFkeSBkb25lLgotICAgIEFTU0VSVCghcHJl
Zml4QS5jb21wYXJlKHByZWZpeEIpKTsKLQotICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktl
eXMocHRyQSwgYS5lbmQoKSwgcHRyQiwgYi5lbmQoKSwgb2spOwotfQotCi10ZW1wbGF0ZTw+Ci1p
bnQgY29tcGFyZTxPYmplY3RTdG9yZURhdGFLZXk+KGNvbnN0IExldmVsREJTbGljZSYgYSwgY29u
c3QgTGV2ZWxEQlNsaWNlJiBiLCBib29sLCBib29sJiBvaykKLXsKLSAgICBLZXlQcmVmaXggcHJl
Zml4QTsKLSAgICBLZXlQcmVmaXggcHJlZml4QjsKLSAgICBjb25zdCBjaGFyKiBwdHJBID0gS2V5
UHJlZml4OjpkZWNvZGUoYS5iZWdpbigpLCBhLmVuZCgpLCAmcHJlZml4QSk7Ci0gICAgY29uc3Qg
Y2hhciogcHRyQiA9IEtleVByZWZpeDo6ZGVjb2RlKGIuYmVnaW4oKSwgYi5lbmQoKSwgJnByZWZp
eEIpOwotICAgIEFTU0VSVChwdHJBKTsKLSAgICBBU1NFUlQocHRyQik7Ci0gICAgQVNTRVJUKHBy
ZWZpeEEubV9kYXRhYmFzZUlkKTsKLSAgICBBU1NFUlQocHJlZml4QS5tX29iamVjdFN0b3JlSWQp
OwotICAgIEFTU0VSVChwcmVmaXhBLm1faW5kZXhJZCA9PSBPYmplY3RTdG9yZURhdGFLZXk6OlNw
ZWNpYWxJbmRleE51bWJlcik7Ci0gICAgQVNTRVJUKHByZWZpeEIubV9kYXRhYmFzZUlkKTsKLSAg
ICBBU1NFUlQocHJlZml4Qi5tX29iamVjdFN0b3JlSWQpOwotICAgIEFTU0VSVChwcmVmaXhCLm1f
aW5kZXhJZCA9PSBPYmplY3RTdG9yZURhdGFLZXk6OlNwZWNpYWxJbmRleE51bWJlcik7Ci0gICAg
QVNTRVJUKHB0ckEgIT0gYS5lbmQoKSk7Ci0gICAgQVNTRVJUKHB0ckIgIT0gYi5lbmQoKSk7Ci0g
ICAgLy8gUHJlZml4ZXMgYXJlIG5vdCBjb21wYXJlZCAtIGl0IGlzIGFzc3VtZWQgdGhpcyB3YXMg
YWxyZWFkeSBkb25lLgotICAgIEFTU0VSVCghcHJlZml4QS5jb21wYXJlKHByZWZpeEIpKTsKLQot
ICAgIHJldHVybiBjb21wYXJlRW5jb2RlZElEQktleXMocHRyQSwgYS5lbmQoKSwgcHRyQiwgYi5l
bmQoKSwgb2spOwotfQotCi10ZW1wbGF0ZTw+Ci1pbnQgY29tcGFyZTxJbmRleERhdGFLZXk+KGNv
bnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiLCBib29sIGlnbm9yZUR1
cGxpY2F0ZXMsIGJvb2wmIG9rKQotewotICAgIEtleVByZWZpeCBwcmVmaXhBOwotICAgIEtleVBy
ZWZpeCBwcmVmaXhCOwotICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShh
LmJlZ2luKCksIGEuZW5kKCksICZwcmVmaXhBKTsKLSAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5
UHJlZml4OjpkZWNvZGUoYi5iZWdpbigpLCBiLmVuZCgpLCAmcHJlZml4Qik7Ci0gICAgQVNTRVJU
KHB0ckEpOwotICAgIEFTU0VSVChwdHJCKTsKLSAgICBBU1NFUlQocHJlZml4QS5tX2RhdGFiYXNl
SWQpOwotICAgIEFTU0VSVChwcmVmaXhBLm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgQVNTRVJUKHBy
ZWZpeEEubV9pbmRleElkID49IE1pbmltdW1JbmRleElkKTsKLSAgICBBU1NFUlQocHJlZml4Qi5t
X2RhdGFiYXNlSWQpOwotICAgIEFTU0VSVChwcmVmaXhCLm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAg
QVNTRVJUKHByZWZpeEIubV9pbmRleElkID49IE1pbmltdW1JbmRleElkKTsKLSAgICBBU1NFUlQo
cHRyQSAhPSBhLmVuZCgpKTsKLSAgICBBU1NFUlQocHRyQiAhPSBiLmVuZCgpKTsKLSAgICAvLyBQ
cmVmaXhlcyBhcmUgbm90IGNvbXBhcmVkIC0gaXQgaXMgYXNzdW1lZCB0aGlzIHdhcyBhbHJlYWR5
IGRvbmUuCi0gICAgQVNTRVJUKCFwcmVmaXhBLmNvbXBhcmUocHJlZml4QikpOwotCi0gICAgLy8g
aW5kZXgga2V5Ci0gICAgaW50IHJlc3VsdCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhwdHJBLCBh
LmVuZCgpLCBwdHJCLCBiLmVuZCgpLCBvayk7Ci0gICAgaWYgKCFvayB8fCByZXN1bHQpCi0gICAg
ICAgIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlnbm9yZUR1cGxpY2F0ZXMpCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgLy8gc2VxdWVuY2UgbnVtYmVyIFtvcHRpb25hbF0KLSAgICBpbnQ2NF90
IHNlcXVlbmNlTnVtYmVyQSA9IC0xOwotICAgIGludDY0X3Qgc2VxdWVuY2VOdW1iZXJCID0gLTE7
Ci0gICAgaWYgKHB0ckEgIT0gYS5lbmQoKSkKLSAgICAgICAgcHRyQSA9IGRlY29kZVZhckludChw
dHJBLCBhLmVuZCgpLCBzZXF1ZW5jZU51bWJlckEpOwotICAgIGlmIChwdHJCICE9IGIuZW5kKCkp
Ci0gICAgICAgIHB0ckIgPSBkZWNvZGVWYXJJbnQocHRyQiwgYi5lbmQoKSwgc2VxdWVuY2VOdW1i
ZXJCKTsKLQotICAgIC8vIHByaW1hcnkga2V5IFtvcHRpb25hbF0KLSAgICBpZiAoIXB0ckEgfHwg
IXB0ckIpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChwdHJBID09IGEuZW5kKCkgJiYgcHRy
QiA9PSBiLmVuZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAocHRyQSA9PSBhLmVuZCgp
KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHB0ckIgPT0gYi5lbmQoKSkKLSAgICAgICAg
cmV0dXJuIDE7Ci0KLSAgICByZXN1bHQgPSBjb21wYXJlRW5jb2RlZElEQktleXMocHRyQSwgYS5l
bmQoKSwgcHRyQiwgYi5lbmQoKSwgb2spOwotICAgIGlmICghb2sgfHwgcmVzdWx0KQotICAgICAg
ICByZXR1cm4gcmVzdWx0OwotCi0gICAgcmV0dXJuIGNvbXBhcmVJbnRzKHNlcXVlbmNlTnVtYmVy
QSwgc2VxdWVuY2VOdW1iZXJCKTsKLX0KLQotaW50IGNvbXBhcmUoY29uc3QgTGV2ZWxEQlNsaWNl
JiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIsIGJvb2wgaW5kZXhLZXlzLCBib29sJiBvaykKLXsK
LSAgICBjb25zdCBjaGFyKiBwdHJBID0gYS5iZWdpbigpOwotICAgIGNvbnN0IGNoYXIqIHB0ckIg
PSBiLmJlZ2luKCk7Ci0gICAgY29uc3QgY2hhciogZW5kQSA9IGEuZW5kKCk7Ci0gICAgY29uc3Qg
Y2hhciogZW5kQiA9IGIuZW5kKCk7Ci0KLSAgICBLZXlQcmVmaXggcHJlZml4QTsKLSAgICBLZXlQ
cmVmaXggcHJlZml4QjsKLQotICAgIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShwdHJBLCBlbmRB
LCAmcHJlZml4QSk7Ci0gICAgcHRyQiA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckIsIGVuZEIsICZw
cmVmaXhCKTsKLSAgICBBU1NFUlQocHRyQSk7Ci0gICAgQVNTRVJUKHB0ckIpOwotICAgIGlmICgh
cHRyQSB8fCAhcHRyQikgewotICAgICAgICBvayA9IGZhbHNlOwotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBvayA9IHRydWU7Ci0gICAgaWYgKGludCB4ID0gcHJlZml4QS5jb21wYXJl
KHByZWZpeEIpKQotICAgICAgICByZXR1cm4geDsKLQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9
PSBLZXlQcmVmaXg6Okdsb2JhbE1ldGFEYXRhKSB7Ci0gICAgICAgIEFTU0VSVChwdHJBICE9IGVu
ZEEpOwotICAgICAgICBBU1NFUlQocHRyQiAhPSBlbmRCKTsKLQotICAgICAgICB1bnNpZ25lZCBj
aGFyIHR5cGVCeXRlQSA9ICpwdHJBKys7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVC
ID0gKnB0ckIrKzsKLQotICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIp
Ci0gICAgICAgICAgICByZXR1cm4geDsKLSAgICAgICAgaWYgKHR5cGVCeXRlQSA8IE1heFNpbXBs
ZUdsb2JhbE1ldGFEYXRhVHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAg
ICBjb25zdCBib29sIGlnbm9yZUR1cGxpY2F0ZXMgPSBmYWxzZTsKLSAgICAgICAgaWYgKHR5cGVC
eXRlQSA9PSBEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4gY29t
cGFyZTxEYXRhYmFzZUZyZWVMaXN0S2V5PihhLCBiLCBpZ25vcmVEdXBsaWNhdGVzLCBvayk7Ci0g
ICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gRGF0YWJhc2VOYW1lVHlwZUJ5dGUpCi0gICAgICAgICAg
ICByZXR1cm4gY29tcGFyZTxEYXRhYmFzZU5hbWVLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMs
IG9rKTsKLSAgICB9Ci0KLSAgICBpZiAocHJlZml4QS50eXBlKCkgPT0gS2V5UHJlZml4OjpEYXRh
YmFzZU1ldGFEYXRhKSB7Ci0gICAgICAgIEFTU0VSVChwdHJBICE9IGVuZEEpOwotICAgICAgICBB
U1NFUlQocHRyQiAhPSBlbmRCKTsKLQotICAgICAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlQSA9
ICpwdHJBKys7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVCID0gKnB0ckIrKzsKLQot
ICAgICAgICBpZiAoaW50IHggPSB0eXBlQnl0ZUEgLSB0eXBlQnl0ZUIpCi0gICAgICAgICAgICBy
ZXR1cm4geDsKLSAgICAgICAgaWYgKHR5cGVCeXRlQSA8IERhdGFiYXNlTWV0YURhdGFLZXk6Ok1h
eFNpbXBsZU1ldGFEYXRhVHlwZSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGNv
bnN0IGJvb2wgaWdub3JlRHVwbGljYXRlcyA9IGZhbHNlOwotICAgICAgICBpZiAodHlwZUJ5dGVB
ID09IE9iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiBjb21w
YXJlPE9iamVjdFN0b3JlTWV0YURhdGFLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsK
LSAgICAgICAgaWYgKHR5cGVCeXRlQSA9PSBJbmRleE1ldGFEYXRhVHlwZUJ5dGUpCi0gICAgICAg
ICAgICByZXR1cm4gY29tcGFyZTxJbmRleE1ldGFEYXRhS2V5PihhLCBiLCBpZ25vcmVEdXBsaWNh
dGVzLCBvayk7Ci0gICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gT2JqZWN0U3RvcmVGcmVlTGlzdFR5
cGVCeXRlKQotICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmU8T2JqZWN0U3RvcmVGcmVlTGlzdEtl
eT4oYSwgYiwgaWdub3JlRHVwbGljYXRlcywgb2spOwotICAgICAgICBpZiAodHlwZUJ5dGVBID09
IEluZGV4RnJlZUxpc3RUeXBlQnl0ZSkKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlPEluZGV4
RnJlZUxpc3RLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKLSAgICAgICAgaWYgKHR5
cGVCeXRlQSA9PSBPYmplY3RTdG9yZU5hbWVzVHlwZUJ5dGUpCi0gICAgICAgICAgICByZXR1cm4g
Y29tcGFyZTxPYmplY3RTdG9yZU5hbWVzS2V5PihhLCBiLCBpZ25vcmVEdXBsaWNhdGVzLCBvayk7
Ci0gICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gSW5kZXhOYW1lc0tleVR5cGVCeXRlKQotICAgICAg
ICAgICAgcmV0dXJuIGNvbXBhcmU8SW5kZXhOYW1lc0tleT4oYSwgYiwgaWdub3JlRHVwbGljYXRl
cywgb2spOwotICAgIH0KLQotICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6Ok9i
amVjdFN0b3JlRGF0YSkgewotICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5k
QikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAocHRyQSA9PSBlbmRBKQotICAg
ICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQotICAgICAgICAg
ICAgcmV0dXJuIDE7IC8vIEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5
cyBzaG91bGQgbm90IGhhdmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KLQotICAgICAgICBjb25z
dCBib29sIGlnbm9yZUR1cGxpY2F0ZXMgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIGNvbXBhcmU8
T2JqZWN0U3RvcmVEYXRhS2V5PihhLCBiLCBpZ25vcmVEdXBsaWNhdGVzLCBvayk7Ci0gICAgfQot
ICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OkV4aXN0c0VudHJ5KSB7Ci0gICAg
ICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQotICAgICAgICAgICAgcmV0dXJu
IDA7Ci0gICAgICAgIGlmIChwdHJBID09IGVuZEEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0g
ICAgICAgIGlmIChwdHJCID09IGVuZEIpCi0gICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6
IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBi
ZSBoYW5kbGVkIHRoaXMgd2F5LgotCi0gICAgICAgIGNvbnN0IGJvb2wgaWdub3JlRHVwbGljYXRl
cyA9IGZhbHNlOwotICAgICAgICByZXR1cm4gY29tcGFyZTxFeGlzdHNFbnRyeUtleT4oYSwgYiwg
aWdub3JlRHVwbGljYXRlcywgb2spOwotICAgIH0KLSAgICBpZiAocHJlZml4QS50eXBlKCkgPT0g
S2V5UHJlZml4OjpJbmRleERhdGEpIHsKLSAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAmJiBwdHJC
ID09IGVuZEIpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKHB0ckEgPT0gZW5k
QSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHB0ckIgPT0gZW5kQikKLSAg
ICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlzdGluZyB1
c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCi0KLSAgICAg
ICAgYm9vbCBpZ25vcmVEdXBsaWNhdGVzID0gaW5kZXhLZXlzOwotICAgICAgICByZXR1cm4gY29t
cGFyZTxJbmRleERhdGFLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKLSAgICB9Ci0K
LSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICBvayA9IGZhbHNlOwotICAgIHJldHVybiAw
OwotfQotCi19Ci0KLWludCBjb21wYXJlKGNvbnN0IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2
ZWxEQlNsaWNlJiBiLCBib29sIGluZGV4S2V5cykKLXsKLSAgICBib29sIG9rOwotICAgIGludCBy
ZXN1bHQgPSBjb21wYXJlKGEsIGIsIGluZGV4S2V5cywgb2spOwotICAgIEFTU0VSVChvayk7Ci0g
ICAgaWYgKCFvaykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
S2V5UHJlZml4OjpLZXlQcmVmaXgoKQotICAgIDogbV9kYXRhYmFzZUlkKEludmFsaWRUeXBlKQot
ICAgICwgbV9vYmplY3RTdG9yZUlkKEludmFsaWRUeXBlKQotICAgICwgbV9pbmRleElkKEludmFs
aWRUeXBlKQotewotfQotCi1LZXlQcmVmaXg6OktleVByZWZpeChpbnQ2NF90IGRhdGFiYXNlSWQp
Ci0gICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKLSAgICAsIG1fb2JqZWN0U3RvcmVJZCgw
KQotICAgICwgbV9pbmRleElkKDApCi17Ci0gICAgQVNTRVJUKEtleVByZWZpeDo6aXNWYWxpZERh
dGFiYXNlSWQoZGF0YWJhc2VJZCkpOwotfQotCi1LZXlQcmVmaXg6OktleVByZWZpeChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLSAgICA6IG1fZGF0YWJhc2VJZChk
YXRhYmFzZUlkKQotICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQpCi0gICAgLCBt
X2luZGV4SWQoMCkKLXsKLSAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZChk
YXRhYmFzZUlkKSk7Ci0gICAgQVNTRVJUKEtleVByZWZpeDo6aXNWYWxpZE9iamVjdFN0b3JlSWQo
b2JqZWN0U3RvcmVJZCkpOwotfQotCi1LZXlQcmVmaXg6OktleVByZWZpeChpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQotICAgIDogbV9k
YXRhYmFzZUlkKGRhdGFiYXNlSWQpCi0gICAgLCBtX29iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJ
ZCkKLSAgICAsIG1faW5kZXhJZChpbmRleElkKQotewotICAgIEFTU0VSVChLZXlQcmVmaXg6Omlz
VmFsaWREYXRhYmFzZUlkKGRhdGFiYXNlSWQpKTsKLSAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1Zh
bGlkT2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKSk7Ci0gICAgQVNTRVJUKEtleVByZWZpeDo6
aXNWYWxpZEluZGV4SWQoaW5kZXhJZCkpOwotfQotCi1LZXlQcmVmaXg6OktleVByZWZpeChUeXBl
IHR5cGUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQpCi0gICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkKLSAgICAsIG1fb2JqZWN0
U3RvcmVJZChvYmplY3RTdG9yZUlkKQotICAgICwgbV9pbmRleElkKGluZGV4SWQpCi17Ci0gICAg
QVNTRVJUX1VOVVNFRCh0eXBlLCB0eXBlID09IEludmFsaWRUeXBlKTsKLSAgICBBU1NFUlQoS2V5
UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZChkYXRhYmFzZUlkKSk7Ci0gICAgQVNTRVJUKEtleVBy
ZWZpeDo6aXNWYWxpZE9iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkpOwotfQotCi0KLUtleVBy
ZWZpeCBLZXlQcmVmaXg6OmNyZWF0ZVdpdGhTcGVjaWFsSW5kZXgoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKLXsKLSAgICBBU1NFUlQo
S2V5UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZChkYXRhYmFzZUlkKSk7Ci0gICAgQVNTRVJUKEtl
eVByZWZpeDo6aXNWYWxpZE9iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkpOwotICAgIEFTU0VS
VChpbmRleElkKTsKLSAgICByZXR1cm4gS2V5UHJlZml4KEludmFsaWRUeXBlLCBkYXRhYmFzZUlk
LCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLX0KLQotCi1ib29sIEtleVByZWZpeDo6aXNWYWxp
ZERhdGFiYXNlSWQoaW50NjRfdCBkYXRhYmFzZUlkKQotewotICAgIHJldHVybiAoZGF0YWJhc2VJ
ZCA+IDApICYmIChkYXRhYmFzZUlkIDwgS2V5UHJlZml4OjprTWF4RGF0YWJhc2VJZCk7Ci19Ci0K
LWJvb2wgS2V5UHJlZml4Ojppc1ZhbGlkT2JqZWN0U3RvcmVJZChpbnQ2NF90IG9iamVjdFN0b3Jl
SWQpCi17Ci0gICAgcmV0dXJuIChvYmplY3RTdG9yZUlkID4gMCkgJiYgKG9iamVjdFN0b3JlSWQg
PCBLZXlQcmVmaXg6OmtNYXhPYmplY3RTdG9yZUlkKTsKLX0KLQotYm9vbCBLZXlQcmVmaXg6Omlz
VmFsaWRJbmRleElkKGludDY0X3QgaW5kZXhJZCkKLXsKLSAgICByZXR1cm4gKGluZGV4SWQgPj0g
TWluaW11bUluZGV4SWQpICYmIChpbmRleElkIDwgS2V5UHJlZml4OjprTWF4SW5kZXhJZCk7Ci19
Ci0KLWNvbnN0IGNoYXIqIEtleVByZWZpeDo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25z
dCBjaGFyKiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQpCi17Ci0gICAgaWYgKHN0YXJ0ID09IGxp
bWl0KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0g
KnN0YXJ0Kys7Ci0KLSAgICBpbnQgZGF0YWJhc2VJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4gNSkg
JiAweDcpICsgMTsKLSAgICBpbnQgb2JqZWN0U3RvcmVJZEJ5dGVzID0gKChmaXJzdEJ5dGUgPj4g
MikgJiAweDcpICsgMTsKLSAgICBpbnQgaW5kZXhJZEJ5dGVzID0gKGZpcnN0Qnl0ZSAmIDB4Mykg
KyAxOwotCi0gICAgaWYgKHN0YXJ0ICsgZGF0YWJhc2VJZEJ5dGVzICsgb2JqZWN0U3RvcmVJZEJ5
dGVzICsgaW5kZXhJZEJ5dGVzID4gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmVz
dWx0LT5tX2RhdGFiYXNlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgZGF0YWJhc2VJZEJ5
dGVzKTsKLSAgICBzdGFydCArPSBkYXRhYmFzZUlkQnl0ZXM7Ci0gICAgcmVzdWx0LT5tX29iamVj
dFN0b3JlSWQgPSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgb2JqZWN0U3RvcmVJZEJ5dGVzKTsK
LSAgICBzdGFydCArPSBvYmplY3RTdG9yZUlkQnl0ZXM7Ci0gICAgcmVzdWx0LT5tX2luZGV4SWQg
PSBkZWNvZGVJbnQoc3RhcnQsIHN0YXJ0ICsgaW5kZXhJZEJ5dGVzKTsKLSAgICBzdGFydCArPSBp
bmRleElkQnl0ZXM7Ci0KLSAgICByZXR1cm4gc3RhcnQ7Ci19Ci0KLVZlY3RvcjxjaGFyPiBLZXlQ
cmVmaXg6OmVuY29kZUVtcHR5KCkKLXsKLSAgICBjb25zdCBWZWN0b3I8Y2hhciwgND4gcmVzdWx0
KDQsIDApOwotICAgIEFTU0VSVChlbmNvZGVJbnRlcm5hbCgwLCAwLCAwKSA9PSBWZWN0b3I8Y2hh
cj4oNCwgMCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVZlY3RvcjxjaGFyPiBLZXlQcmVm
aXg6OmVuY29kZSgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fZGF0YWJhc2VJZCAhPSBJbnZhbGlk
SWQpOwotICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgIT0gSW52YWxpZElkKTsKLSAgICBBU1NF
UlQobV9pbmRleElkICE9IEludmFsaWRJZCk7Ci0gICAgcmV0dXJuIGVuY29kZUludGVybmFsKG1f
ZGF0YWJhc2VJZCwgbV9vYmplY3RTdG9yZUlkLCBtX2luZGV4SWQpOwotfQotCi1WZWN0b3I8Y2hh
cj4gS2V5UHJlZml4OjplbmNvZGVJbnRlcm5hbChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQotewotICAgIFZlY3RvcjxjaGFyPiBkYXRh
YmFzZUlkU3RyaW5nID0gZW5jb2RlSW50U2FmZWx5KGRhdGFiYXNlSWQsIGtNYXhEYXRhYmFzZUlk
KTsKLSAgICBWZWN0b3I8Y2hhcj4gb2JqZWN0U3RvcmVJZFN0cmluZyA9IGVuY29kZUludFNhZmVs
eShvYmplY3RTdG9yZUlkLCBrTWF4T2JqZWN0U3RvcmVJZCk7Ci0gICAgVmVjdG9yPGNoYXI+IGlu
ZGV4SWRTdHJpbmcgPSBlbmNvZGVJbnRTYWZlbHkoaW5kZXhJZCwga01heEluZGV4SWQpOwotCi0g
ICAgQVNTRVJUKGRhdGFiYXNlSWRTdHJpbmcuc2l6ZSgpIDw9IGtNYXhEYXRhYmFzZUlkU2l6ZUJ5
dGVzKTsKLSAgICBBU1NFUlQob2JqZWN0U3RvcmVJZFN0cmluZy5zaXplKCkgPD0ga01heE9iamVj
dFN0b3JlSWRTaXplQnl0ZXMpOwotICAgIEFTU0VSVChpbmRleElkU3RyaW5nLnNpemUoKSA8PSBr
TWF4SW5kZXhJZFNpemVCeXRlcyk7Ci0KLSAgICB1bnNpZ25lZCBjaGFyIGZpcnN0Qnl0ZSA9IChk
YXRhYmFzZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IChrTWF4T2JqZWN0U3RvcmVJZFNpemVCaXRz
ICsga01heEluZGV4SWRTaXplQml0cykgfCAob2JqZWN0U3RvcmVJZFN0cmluZy5zaXplKCkgLSAx
KSA8PCBrTWF4SW5kZXhJZFNpemVCaXRzIHwgKGluZGV4SWRTdHJpbmcuc2l6ZSgpIC0gMSk7Ci0g
ICAgQ09NUElMRV9BU1NFUlQoa01heERhdGFiYXNlSWRTaXplQml0cyArIGtNYXhPYmplY3RTdG9y
ZUlkU2l6ZUJpdHMgKyBrTWF4SW5kZXhJZFNpemVCaXRzID09IHNpemVvZihmaXJzdEJ5dGUpICog
OCwgQ0FOVF9FTkNPREVfSURTKTsKLSAgICBWZWN0b3I8Y2hhciwgRGVmYXVsdElubGluZUJ1ZmZl
clNpemU+IHJldDsKLSAgICByZXQuYXBwZW5kKGZpcnN0Qnl0ZSk7Ci0gICAgcmV0LmFwcGVuZFZl
Y3RvcihkYXRhYmFzZUlkU3RyaW5nKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKG9iamVjdFN0b3Jl
SWRTdHJpbmcpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoaW5kZXhJZFN0cmluZyk7Ci0KLSAgICBB
U1NFUlQocmV0LnNpemUoKSA8PSBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZSk7Ci0gICAgcmV0dXJu
IHJldDsKLX0KLQotaW50IEtleVByZWZpeDo6Y29tcGFyZShjb25zdCBLZXlQcmVmaXgmIG90aGVy
KSBjb25zdAotewotICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgIT0gSW52YWxpZElkKTsKLSAgICBB
U1NFUlQobV9vYmplY3RTdG9yZUlkICE9IEludmFsaWRJZCk7Ci0gICAgQVNTRVJUKG1faW5kZXhJ
ZCAhPSBJbnZhbGlkSWQpOwotCi0gICAgaWYgKG1fZGF0YWJhc2VJZCAhPSBvdGhlci5tX2RhdGFi
YXNlSWQpCi0gICAgICAgIHJldHVybiBjb21wYXJlSW50cyhtX2RhdGFiYXNlSWQsIG90aGVyLm1f
ZGF0YWJhc2VJZCk7Ci0gICAgaWYgKG1fb2JqZWN0U3RvcmVJZCAhPSBvdGhlci5tX29iamVjdFN0
b3JlSWQpCi0gICAgICAgIHJldHVybiBjb21wYXJlSW50cyhtX29iamVjdFN0b3JlSWQsIG90aGVy
Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgaWYgKG1faW5kZXhJZCAhPSBvdGhlci5tX2luZGV4SWQp
Ci0gICAgICAgIHJldHVybiBjb21wYXJlSW50cyhtX2luZGV4SWQsIG90aGVyLm1faW5kZXhJZCk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUtleVByZWZpeDo6VHlwZSBLZXlQcmVmaXg6OnR5cGUoKSBj
b25zdAotewotICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgIT0gSW52YWxpZElkKTsKLSAgICBBU1NF
UlQobV9vYmplY3RTdG9yZUlkICE9IEludmFsaWRJZCk7Ci0gICAgQVNTRVJUKG1faW5kZXhJZCAh
PSBJbnZhbGlkSWQpOwotCi0gICAgaWYgKCFtX2RhdGFiYXNlSWQpCi0gICAgICAgIHJldHVybiBH
bG9iYWxNZXRhRGF0YTsKLSAgICBpZiAoIW1fb2JqZWN0U3RvcmVJZCkKLSAgICAgICAgcmV0dXJu
IERhdGFiYXNlTWV0YURhdGE7Ci0gICAgaWYgKG1faW5kZXhJZCA9PSBPYmplY3RTdG9yZURhdGFJ
bmRleElkKQotICAgICAgICByZXR1cm4gT2JqZWN0U3RvcmVEYXRhOwotICAgIGlmIChtX2luZGV4
SWQgPT0gRXhpc3RzRW50cnlJbmRleElkKQotICAgICAgICByZXR1cm4gRXhpc3RzRW50cnk7Ci0g
ICAgaWYgKG1faW5kZXhJZCA+PSBNaW5pbXVtSW5kZXhJZCkKLSAgICAgICAgcmV0dXJuIEluZGV4
RGF0YTsKLQotICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBJbnZhbGlkVHlw
ZTsKLX0KLQotVmVjdG9yPGNoYXI+IFNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSgpCi17Ci0gICAg
VmVjdG9yPGNoYXI+IHJldCA9IEtleVByZWZpeDo6ZW5jb2RlRW1wdHkoKTsKLSAgICByZXQuYXBw
ZW5kVmVjdG9yKGVuY29kZUJ5dGUoU2NoZW1hVmVyc2lvblR5cGVCeXRlKSk7Ci0gICAgcmV0dXJu
IHJldDsKLX0KLQotVmVjdG9yPGNoYXI+IE1heERhdGFiYXNlSWRLZXk6OmVuY29kZSgpCi17Ci0g
ICAgVmVjdG9yPGNoYXI+IHJldCA9IEtleVByZWZpeDo6ZW5jb2RlRW1wdHkoKTsKLSAgICByZXQu
YXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoTWF4RGF0YWJhc2VJZFR5cGVCeXRlKSk7Ci0gICAgcmV0
dXJuIHJldDsKLX0KLQotVmVjdG9yPGNoYXI+IERhdGFWZXJzaW9uS2V5OjplbmNvZGUoKQotewot
ICAgIFZlY3RvcjxjaGFyPiByZXQgPSBLZXlQcmVmaXg6OmVuY29kZUVtcHR5KCk7Ci0gICAgcmV0
LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKERhdGFWZXJzaW9uVHlwZUJ5dGUpKTsKLSAgICByZXR1
cm4gcmV0OwotfQotCi1EYXRhYmFzZUZyZWVMaXN0S2V5OjpEYXRhYmFzZUZyZWVMaXN0S2V5KCkK
LSAgICA6IG1fZGF0YWJhc2VJZCgtMSkKLXsKLX0KLQotY29uc3QgY2hhciogRGF0YWJhc2VGcmVl
TGlzdEtleTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0
YWJhc2VGcmVlTGlzdEtleSogcmVzdWx0KQotewotICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAg
Y29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7
Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBBU1NFUlQoIXByZWZpeC5tX2Rh
dGFiYXNlSWQpOwotICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7Ci0gICAgQVNT
RVJUKCFwcmVmaXgubV9pbmRleElkKTsKLSAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9IDA7Ci0gICAgcCA9IGRlY29kZUJ5
dGUocCwgbGltaXQsIHR5cGVCeXRlKTsKLSAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBl
Qnl0ZSA9PSBEYXRhYmFzZUZyZWVMaXN0VHlwZUJ5dGUpOwotICAgIGlmIChwID09IGxpbWl0KQot
ICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1
bHQtPm1fZGF0YWJhc2VJZCk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBEYXRhYmFzZUZyZWVMaXN0S2V5
OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkKQotewotICAgIFZlY3RvcjxjaGFyPiByZXQgPSBL
ZXlQcmVmaXg6OmVuY29kZUVtcHR5KCk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRl
KERhdGFiYXNlRnJlZUxpc3RUeXBlQnl0ZSkpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2Rl
VmFySW50KGRhdGFiYXNlSWQpKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1WZWN0b3I8Y2hhcj4g
RGF0YWJhc2VGcmVlTGlzdEtleTo6ZW5jb2RlTWF4S2V5KCkKLXsKLSAgICByZXR1cm4gZW5jb2Rl
KElOVDY0X01BWCk7Ci19Ci0KLWludDY0X3QgRGF0YWJhc2VGcmVlTGlzdEtleTo6ZGF0YWJhc2VJ
ZCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsKLSAgICByZXR1cm4g
bV9kYXRhYmFzZUlkOwotfQotCi1pbnQgRGF0YWJhc2VGcmVlTGlzdEtleTo6Y29tcGFyZShjb25z
dCBEYXRhYmFzZUZyZWVMaXN0S2V5JiBvdGhlcikgY29uc3QKLXsKLSAgICBBU1NFUlQobV9kYXRh
YmFzZUlkID49IDApOwotICAgIHJldHVybiBjb21wYXJlSW50cyhtX2RhdGFiYXNlSWQsIG90aGVy
Lm1fZGF0YWJhc2VJZCk7Ci19Ci0KLWNvbnN0IGNoYXIqIERhdGFiYXNlTmFtZUtleTo6ZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0YWJhc2VOYW1lS2V5KiBy
ZXN1bHQpCi17Ci0gICAgS2V5UHJlZml4IHByZWZpeDsKLSAgICBjb25zdCBjaGFyKiBwID0gS2V5
UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAgICBpZiAoIXApCi0gICAg
ICAgIHJldHVybiBwOwotICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgQVNT
RVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4
SWQpOwotICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLSAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlID0gMDsKLSAgICBwID0gZGVjb2RlQnl0ZShwLCBsaW1pdCwgdHlwZUJ5
dGUpOwotICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IERhdGFiYXNlTmFt
ZVR5cGVCeXRlKTsKLSAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
cCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9vcmlnaW4pOwot
ICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGRlY29kZVN0cmluZ1dp
dGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZU5hbWUpOwotfQotCi1WZWN0b3I8
Y2hhcj4gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUoY29uc3QgU3RyaW5nJiBvcmlnaW4sIGNvbnN0
IFN0cmluZyYgZGF0YWJhc2VOYW1lKQotewotICAgIFZlY3RvcjxjaGFyPiByZXQgPSBLZXlQcmVm
aXg6OmVuY29kZUVtcHR5KCk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKERhdGFi
YXNlTmFtZVR5cGVCeXRlKSk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVTdHJpbmdXaXRo
TGVuZ3RoKG9yaWdpbikpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nV2l0aExl
bmd0aChkYXRhYmFzZU5hbWUpKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1WZWN0b3I8Y2hhcj4g
RGF0YWJhc2VOYW1lS2V5OjplbmNvZGVNaW5LZXlGb3JPcmlnaW4oY29uc3QgU3RyaW5nJiBvcmln
aW4pCi17Ci0gICAgcmV0dXJuIGVuY29kZShvcmlnaW4sICIiKTsKLX0KLQotVmVjdG9yPGNoYXI+
IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihjb25zdCBTdHJpbmcmIG9y
aWdpbikKLXsKLSAgICAvLyBqdXN0IGFmdGVyIG9yaWdpbiBpbiBjb2xsYXRpb24gb3JkZXIKLSAg
ICByZXR1cm4gZW5jb2RlTWluS2V5Rm9yT3JpZ2luKG9yaWdpbiArICJceDAxIik7Ci19Ci0KLWlu
dCBEYXRhYmFzZU5hbWVLZXk6OmNvbXBhcmUoY29uc3QgRGF0YWJhc2VOYW1lS2V5JiBvdGhlcikK
LXsKLSAgICBpZiAoaW50IHggPSBjb2RlUG9pbnRDb21wYXJlKG1fb3JpZ2luLCBvdGhlci5tX29y
aWdpbikpCi0gICAgICAgIHJldHVybiB4OwotICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKG1f
ZGF0YWJhc2VOYW1lLCBvdGhlci5tX2RhdGFiYXNlTmFtZSk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBE
YXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBNZXRhRGF0YVR5
cGUgbWV0YURhdGFUeXBlKQotewotICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCk7Ci0g
ICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICByZXQuYXBwZW5kVmVj
dG9yKGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotT2Jq
ZWN0U3RvcmVNZXRhRGF0YUtleTo6T2JqZWN0U3RvcmVNZXRhRGF0YUtleSgpCi0gICAgOiBtX29i
amVjdFN0b3JlSWQoLTEpCi0gICAgLCBtX21ldGFEYXRhVHlwZSgtMSkKLXsKLX0KLQotY29uc3Qg
Y2hhciogT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSogcmVzdWx0KQotewotICAg
IEtleVByZWZpeCBwcmVmaXg7Ci0gICAgY29uc3QgY2hhciogcCA9IEtleVByZWZpeDo6ZGVjb2Rl
KHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gMDsK
LSAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgQVNTRVJUKCFwcmVmaXgubV9v
YmplY3RTdG9yZUlkKTsKLSAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQpOwotICAgIGlmIChw
ID09IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLSAgICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRl
ID0gMDsKLSAgICBwID0gZGVjb2RlQnl0ZShwLCBsaW1pdCwgdHlwZUJ5dGUpOwotICAgIEFTU0VS
VF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IE9iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0
ZSk7Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKLSAgICBpZiAoIXAp
Ci0gICAgICAgIHJldHVybiAwOwotICAgIEFTU0VSVChyZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7
Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkZWNv
ZGVCeXRlKHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBlKTsKLX0KLQotVmVjdG9yPGNo
YXI+IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUpCi17Ci0gICAg
S2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkKTsKLSAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJl
Zml4LmVuY29kZSgpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShPYmplY3RTdG9y
ZU1ldGFEYXRhVHlwZUJ5dGUpKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVZhckludChv
YmplY3RTdG9yZUlkKSk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKG1ldGFEYXRh
VHlwZSkpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLVZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjplbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkKQotewotICAgIHJldHVy
biBlbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYLCBPYmplY3RNZXRhRGF0YVR5cGVNYXhpbXVt
KTsKLX0KLQotVmVjdG9yPGNoYXI+IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZU1heEtl
eShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKLXsKLSAgICByZXR1
cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdE1ldGFEYXRhVHlwZU1h
eGltdW0pOwotfQotCi1pbnQ2NF90IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6Om9iamVjdFN0b3Jl
SWQoKSBjb25zdAotewotICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgcmV0
dXJuIG1fb2JqZWN0U3RvcmVJZDsKLX0KLXVuc2lnbmVkIGNoYXIgT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6bWV0YURhdGFUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGU7
Ci19Ci0KLWludCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5Ojpjb21wYXJlKGNvbnN0IE9iamVjdFN0
b3JlTWV0YURhdGFLZXkmIG90aGVyKQotewotICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0g
MCk7Ci0gICAgaWYgKGludCB4ID0gY29tcGFyZUludHMobV9vYmplY3RTdG9yZUlkLCBvdGhlci5t
X29iamVjdFN0b3JlSWQpKQotICAgICAgICByZXR1cm4geDsKLSAgICBpbnQ2NF90IHJlc3VsdCA9
IG1fbWV0YURhdGFUeXBlIC0gb3RoZXIubV9tZXRhRGF0YVR5cGU7Ci0gICAgaWYgKHJlc3VsdCA8
IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gKHJlc3VsdCA+IDApID8gMSA6IHJl
c3VsdDsKLX0KLQotSW5kZXhNZXRhRGF0YUtleTo6SW5kZXhNZXRhRGF0YUtleSgpCi0gICAgOiBt
X29iamVjdFN0b3JlSWQoLTEpCi0gICAgLCBtX2luZGV4SWQoLTEpCi0gICAgLCBtX21ldGFEYXRh
VHlwZSgwKQotewotfQotCi1jb25zdCBjaGFyKiBJbmRleE1ldGFEYXRhS2V5OjpkZWNvZGUoY29u
c3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE1ldGFEYXRhS2V5KiByZXN1
bHQpCi17Ci0gICAgS2V5UHJlZml4IHByZWZpeDsKLSAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJl
Zml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAgICBpZiAoIXApCi0gICAgICAg
IHJldHVybiAwOwotICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKLSAgICBBU1NFUlQo
IXByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7
Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHVuc2lnbmVkIGNo
YXIgdHlwZUJ5dGUgPSAwOwotICAgIHAgPSBkZWNvZGVCeXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7
Ci0gICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0gSW5kZXhNZXRhRGF0YVR5
cGVCeXRlKTsKLSAgICBpZiAocCA9PSBsaW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcCA9
IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgIGlm
ICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwg
cmVzdWx0LT5tX2luZGV4SWQpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
aWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkZWNvZGVCeXRl
KHAsIGxpbWl0LCByZXN1bHQtPm1fbWV0YURhdGFUeXBlKTsKLX0KLQotVmVjdG9yPGNoYXI+IElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKLXsK
LSAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQpOwotICAgIFZlY3RvcjxjaGFyPiByZXQg
PSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKEluZGV4
TWV0YURhdGFUeXBlQnl0ZSkpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50KG9i
amVjdFN0b3JlSWQpKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVZhckludChpbmRleElk
KSk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKG1ldGFEYXRhVHlwZSkpOwotICAg
IHJldHVybiByZXQ7Ci19Ci0KLVZlY3RvcjxjaGFyPiBJbmRleE1ldGFEYXRhS2V5OjplbmNvZGVN
YXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi17Ci0gICAg
cmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgsIEluZGV4
TWV0YURhdGFUeXBlTWF4aW11bSk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBJbmRleE1ldGFEYXRhS2V5
OjplbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQs
IGludDY0X3QgaW5kZXhJZCkKLXsKLSAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFUeXBlTWF4aW11bSk7Ci19Ci0KLWludCBJ
bmRleE1ldGFEYXRhS2V5Ojpjb21wYXJlKGNvbnN0IEluZGV4TWV0YURhdGFLZXkmIG90aGVyKQot
ewotICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7Ci0gICAgQVNTRVJUKG1faW5kZXhJ
ZCA+PSAwKTsKLQotICAgIGlmIChpbnQgeCA9IGNvbXBhcmVJbnRzKG1fb2JqZWN0U3RvcmVJZCwg
b3RoZXIubV9vYmplY3RTdG9yZUlkKSkKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgaWYgKGludCB4
ID0gY29tcGFyZUludHMobV9pbmRleElkLCBvdGhlci5tX2luZGV4SWQpKQotICAgICAgICByZXR1
cm4geDsKLSAgICByZXR1cm4gbV9tZXRhRGF0YVR5cGUgLSBvdGhlci5tX21ldGFEYXRhVHlwZTsK
LX0KLQotaW50NjRfdCBJbmRleE1ldGFEYXRhS2V5OjppbmRleElkKCkgY29uc3QKLXsKLSAgICBB
U1NFUlQobV9pbmRleElkID49IDApOwotICAgIHJldHVybiBtX2luZGV4SWQ7Ci19Ci0KLU9iamVj
dFN0b3JlRnJlZUxpc3RLZXk6Ok9iamVjdFN0b3JlRnJlZUxpc3RLZXkoKQotICAgIDogbV9vYmpl
Y3RTdG9yZUlkKC0xKQotewotfQotCi1jb25zdCBjaGFyKiBPYmplY3RTdG9yZUZyZWVMaXN0S2V5
OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9y
ZUZyZWVMaXN0S2V5KiByZXN1bHQpCi17Ci0gICAgS2V5UHJlZml4IHByZWZpeDsKLSAgICBjb25z
dCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKLSAg
ICBpZiAoIXApCi0gICAgICAgIHJldHVybiAwOwotICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFz
ZUlkKTsKLSAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgIEFTU0VSVCgh
cHJlZml4Lm1faW5kZXhJZCk7Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAw
OwotICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAwOwotICAgIHAgPSBkZWNvZGVCeXRlKHAs
IGxpbWl0LCB0eXBlQnl0ZSk7Ci0gICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUg
PT0gT2JqZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKTsKLSAgICBpZiAocCA9PSBsaW1pdCkKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0
LT5tX29iamVjdFN0b3JlSWQpOwotfQotCi1WZWN0b3I8Y2hhcj4gT2JqZWN0U3RvcmVGcmVlTGlz
dEtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQot
ewotICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCk7Ci0gICAgVmVjdG9yPGNoYXI+IHJl
dCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoT2Jq
ZWN0U3RvcmVGcmVlTGlzdFR5cGVCeXRlKSk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVW
YXJJbnQob2JqZWN0U3RvcmVJZCkpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLVZlY3RvcjxjaGFy
PiBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlk
KQotewotICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgSU5UNjRfTUFYKTsKLX0KLQotaW50
NjRfdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjpvYmplY3RTdG9yZUlkKCkgY29uc3QKLXsKLSAg
ICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOwotICAgIHJldHVybiBtX29iamVjdFN0b3Jl
SWQ7Ci19Ci0KLWludCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5Ojpjb21wYXJlKGNvbnN0IE9iamVj
dFN0b3JlRnJlZUxpc3RLZXkmIG90aGVyKQotewotICAgIC8vIEZJWE1FOiBJdCBtYXkgc2VlbSBz
dHJhbmdlIHRoYXQgd2UncmUgbm90IGNvbXBhcmluZyBkYXRhYmFzZSBpZCdzLAotICAgIC8vIGJ1
dCB0aGF0IGNvbXBhcmlzb24gd2lsbCBoYXZlIGJlZW4gbWFkZSBlYXJsaWVyLgotICAgIC8vIFdl
IHNob3VsZCBwcm9iYWJseSBtYWtlIHRoaXMgbW9yZSBjbGVhciwgdGhvdWdoLi4uCi0gICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICByZXR1cm4gY29tcGFyZUludHMobV9vYmpl
Y3RTdG9yZUlkLCBvdGhlci5tX29iamVjdFN0b3JlSWQpOwotfQotCi1JbmRleEZyZWVMaXN0S2V5
OjpJbmRleEZyZWVMaXN0S2V5KCkKLSAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKLSAgICAsIG1f
aW5kZXhJZCgtMSkKLXsKLX0KLQotY29uc3QgY2hhciogSW5kZXhGcmVlTGlzdEtleTo6ZGVjb2Rl
KGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5kZXhGcmVlTGlzdEtleSog
cmVzdWx0KQotewotICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgY29uc3QgY2hhciogcCA9IEtl
eVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgaWYgKCFwKQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7Ci0gICAgQVNT
RVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4
SWQpOwotICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLSAgICB1bnNpZ25l
ZCBjaGFyIHR5cGVCeXRlID0gMDsKLSAgICBwID0gZGVjb2RlQnl0ZShwLCBsaW1pdCwgdHlwZUJ5
dGUpOwotICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IEluZGV4RnJlZUxp
c3RUeXBlQnl0ZSk7Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0gICAgICAgIHJldHVybiAwOwotICAg
IHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKLSAg
ICBpZiAoIXApCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkZWNvZGVWYXJJbnQocCwg
bGltaXQsIHJlc3VsdC0+bV9pbmRleElkKTsKLX0KLQotVmVjdG9yPGNoYXI+IEluZGV4RnJlZUxp
c3RLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCBpbmRleElkKQotewotICAgIEtleVByZWZpeCBwcmVmaXgoZGF0YWJhc2VJZCk7Ci0g
ICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKLSAgICByZXQuYXBwZW5kVmVj
dG9yKGVuY29kZUJ5dGUoSW5kZXhGcmVlTGlzdFR5cGVCeXRlKSk7Ci0gICAgcmV0LmFwcGVuZFZl
Y3RvcihlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOwotICAgIHJldC5hcHBlbmRWZWN0b3Io
ZW5jb2RlVmFySW50KGluZGV4SWQpKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1WZWN0b3I8Y2hh
cj4gSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkKQotewotICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgSU5UNjRfTUFYKTsKLX0KLQotaW50IEluZGV4RnJlZUxpc3RLZXk6OmNvbXBh
cmUoY29uc3QgSW5kZXhGcmVlTGlzdEtleSYgb3RoZXIpCi17Ci0gICAgQVNTRVJUKG1fb2JqZWN0
U3RvcmVJZCA+PSAwKTsKLSAgICBBU1NFUlQobV9pbmRleElkID49IDApOwotICAgIGlmIChpbnQg
eCA9IGNvbXBhcmVJbnRzKG1fb2JqZWN0U3RvcmVJZCwgb3RoZXIubV9vYmplY3RTdG9yZUlkKSkK
LSAgICAgICAgcmV0dXJuIHg7Ci0gICAgcmV0dXJuIGNvbXBhcmVJbnRzKG1faW5kZXhJZCwgb3Ro
ZXIubV9pbmRleElkKTsKLX0KLQotaW50NjRfdCBJbmRleEZyZWVMaXN0S2V5OjpvYmplY3RTdG9y
ZUlkKCkgY29uc3QKLXsKLSAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOwotICAgIHJl
dHVybiBtX29iamVjdFN0b3JlSWQ7Ci19Ci0KLWludDY0X3QgSW5kZXhGcmVlTGlzdEtleTo6aW5k
ZXhJZCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKLSAgICByZXR1cm4g
bV9pbmRleElkOwotfQotCi0vLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBv
YmplY3Qgc3RvcmUgaWRzLCBiZWNhdXNlIGEgbWFwcGluZwotLy8gaXMga2VwdCBpbiB0aGUgSURC
RGF0YWJhc2VCYWNrZW5kSW1wbC4gQ2FuIHRoZSBtYXBwaW5nIGJlY29tZSB1bnJlbGlhYmxlPwot
Ly8gQ2FuIHdlIHJlbW92ZSB0aGlzPwotY29uc3QgY2hhciogT2JqZWN0U3RvcmVOYW1lc0tleTo6
ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVO
YW1lc0tleSogcmVzdWx0KQotewotICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgY29uc3QgY2hh
ciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7Ci0gICAgaWYg
KCFwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7
Ci0gICAgQVNTRVJUKCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICBBU1NFUlQoIXByZWZp
eC5tX2luZGV4SWQpOwotICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICByZXR1cm4gMDsKLSAg
ICB1bnNpZ25lZCBjaGFyIHR5cGVCeXRlID0gMDsKLSAgICBwID0gZGVjb2RlQnl0ZShwLCBsaW1p
dCwgdHlwZUJ5dGUpOwotICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IE9i
amVjdFN0b3JlTmFtZXNUeXBlQnl0ZSk7Ci0gICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW5n
dGgocCwgbGltaXQsIHJlc3VsdC0+bV9vYmplY3RTdG9yZU5hbWUpOwotfQotCi1WZWN0b3I8Y2hh
cj4gT2JqZWN0U3RvcmVOYW1lc0tleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgY29uc3Qg
U3RyaW5nJiBvYmplY3RTdG9yZU5hbWUpCi17Ci0gICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFz
ZUlkKTsKLSAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgIHJldC5h
cHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShPYmplY3RTdG9yZU5hbWVzVHlwZUJ5dGUpKTsKLSAgICBy
ZXQuYXBwZW5kVmVjdG9yKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob2JqZWN0U3RvcmVOYW1lKSk7
Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IE9iamVjdFN0b3JlTmFtZXNLZXk6OmNvbXBhcmUo
Y29uc3QgT2JqZWN0U3RvcmVOYW1lc0tleSYgb3RoZXIpCi17Ci0gICAgcmV0dXJuIGNvZGVQb2lu
dENvbXBhcmUobV9vYmplY3RTdG9yZU5hbWUsIG90aGVyLm1fb2JqZWN0U3RvcmVOYW1lKTsKLX0K
LQotSW5kZXhOYW1lc0tleTo6SW5kZXhOYW1lc0tleSgpCi0gICAgOiBtX29iamVjdFN0b3JlSWQo
LTEpCi17Ci19Ci0KLS8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVwIGluZGV4
IGlkcywgYmVjYXVzZSBhIG1hcHBpbmcKLS8vIGlzIGtlcHQgYXQgYSBoaWdoZXIgbGV2ZWwuCi1j
b25zdCBjaGFyKiBJbmRleE5hbWVzS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0
IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiByZXN1bHQpCi17Ci0gICAgS2V5UHJlZml4IHBy
ZWZpeDsKLSAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0
LCAmcHJlZml4KTsKLSAgICBpZiAoIXApCi0gICAgICAgIHJldHVybiAwOwotICAgIEFTU0VSVChw
cmVmaXgubV9kYXRhYmFzZUlkKTsKLSAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQp
OwotICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7Ci0gICAgaWYgKHAgPT0gbGltaXQpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAwOwotICAgIHAg
PSBkZWNvZGVCeXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7Ci0gICAgQVNTRVJUX1VOVVNFRCh0eXBl
Qnl0ZSwgdHlwZUJ5dGUgPT0gSW5kZXhOYW1lc0tleVR5cGVCeXRlKTsKLSAgICBpZiAocCA9PSBs
aW1pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwg
cmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgcmV0dXJuIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHJlc3VsdC0+bV9p
bmRleE5hbWUpOwotfQotCi1WZWN0b3I8Y2hhcj4gSW5kZXhOYW1lc0tleTo6ZW5jb2RlKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIGluZGV4
TmFtZSkKLXsKLSAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQpOwotICAgIFZlY3Rvcjxj
aGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVC
eXRlKEluZGV4TmFtZXNLZXlUeXBlQnl0ZSkpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2Rl
VmFySW50KG9iamVjdFN0b3JlSWQpKTsKLSAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVN0cmlu
Z1dpdGhMZW5ndGgoaW5kZXhOYW1lKSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IEluZGV4
TmFtZXNLZXk6OmNvbXBhcmUoY29uc3QgSW5kZXhOYW1lc0tleSYgb3RoZXIpCi17Ci0gICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKLSAgICBpZiAoaW50IHggPSBjb21wYXJlSW50cyht
X29iamVjdFN0b3JlSWQsIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkpCi0gICAgICAgIHJldHVybiB4
OwotICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKG1faW5kZXhOYW1lLCBvdGhlci5tX2luZGV4
TmFtZSk7Ci19Ci0KLWNvbnN0IGNoYXIqIE9iamVjdFN0b3JlRGF0YUtleTo6ZGVjb2RlKGNvbnN0
IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIE9iamVjdFN0b3JlRGF0YUtleSogcmVzdWx0
KQotewotICAgIEtleVByZWZpeCBwcmVmaXg7Ci0gICAgY29uc3QgY2hhciogcCA9IEtleVByZWZp
eDo6ZGVjb2RlKHN0YXJ0LCBlbmQsICZwcmVmaXgpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOwotICAgIEFTU0VSVChwcmVm
aXgubV9vYmplY3RTdG9yZUlkKTsKLSAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA9PSBTcGVj
aWFsSW5kZXhOdW1iZXIpOwotICAgIGlmIChwID09IGVuZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgcmV0dXJuIGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGVuZCwgJnJlc3VsdC0+bV9lbmNvZGVk
VXNlcktleSk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNo
YXI+IGVuY29kZWRVc2VyS2V5KQotewotICAgIEtleVByZWZpeCBwcmVmaXgoS2V5UHJlZml4Ojpj
cmVhdGVXaXRoU3BlY2lhbEluZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIFNwZWNpYWxJ
bmRleE51bWJlcikpOwotICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7Ci0g
ICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVkVXNlcktleSk7Ci0KLSAgICByZXR1cm4gcmV0Owot
fQotCi1WZWN0b3I8Y2hhcj4gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSkKLXsK
LSAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVuY29kZUlEQktl
eSh1c2VyS2V5KSk7Ci19Ci0KLWludCBPYmplY3RTdG9yZURhdGFLZXk6OmNvbXBhcmUoY29uc3Qg
T2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlciwgYm9vbCYgb2spCi17Ci0gICAgcmV0dXJuIGNvbXBh
cmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5
LCBvayk7Ci19Ci0KLVBhc3NSZWZQdHI8SURCS2V5PiBPYmplY3RTdG9yZURhdGFLZXk6OnVzZXJL
ZXkoKSBjb25zdAotewotICAgIFJlZlB0cjxJREJLZXk+IGtleTsKLSAgICBkZWNvZGVJREJLZXko
bV9lbmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkpOwot
ICAgIHJldHVybiBrZXk7Ci19Ci0KLWNvbnN0IGludDY0X3QgT2JqZWN0U3RvcmVEYXRhS2V5OjpT
cGVjaWFsSW5kZXhOdW1iZXIgPSBPYmplY3RTdG9yZURhdGFJbmRleElkOwotCi1jb25zdCBjaGFy
KiBFeGlzdHNFbnRyeUtleTo6ZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBl
bmQsIEV4aXN0c0VudHJ5S2V5KiByZXN1bHQpCi17Ci0gICAgS2V5UHJlZml4IHByZWZpeDsKLSAg
ICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwgJnByZWZpeCk7
Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBBU1NFUlQocHJlZml4Lm1fZGF0
YWJhc2VJZCk7Ci0gICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOwotICAgIEFTU0VS
VChwcmVmaXgubV9pbmRleElkID09IFNwZWNpYWxJbmRleE51bWJlcik7Ci0gICAgaWYgKHAgPT0g
ZW5kKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZXh0cmFjdEVuY29kZWRJREJLZXko
cCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKLX0KLQotVmVjdG9yPGNoYXI+IEV4
aXN0c0VudHJ5S2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2RlZEtleSkKLXsKLSAgICBLZXlQcmVmaXgg
cHJlZml4KEtleVByZWZpeDo6Y3JlYXRlV2l0aFNwZWNpYWxJbmRleChkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBTcGVjaWFsSW5kZXhOdW1iZXIpKTsKLSAgICBWZWN0b3I8Y2hhcj4gcmV0ID0g
cHJlZml4LmVuY29kZSgpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlZEtleSk7Ci0gICAg
cmV0dXJuIHJldDsKLX0KLQotVmVjdG9yPGNoYXI+IEV4aXN0c0VudHJ5S2V5OjplbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNl
cktleSkKLXsKLSAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGVu
Y29kZUlEQktleSh1c2VyS2V5KSk7Ci19Ci0KLWludCBFeGlzdHNFbnRyeUtleTo6Y29tcGFyZShj
b25zdCBFeGlzdHNFbnRyeUtleSYgb3RoZXIsIGJvb2wmIG9rKQotewotICAgIHJldHVybiBjb21w
YXJlRW5jb2RlZElEQktleXMobV9lbmNvZGVkVXNlcktleSwgb3RoZXIubV9lbmNvZGVkVXNlcktl
eSwgb2spOwotfQotCi1QYXNzUmVmUHRyPElEQktleT4gRXhpc3RzRW50cnlLZXk6OnVzZXJLZXko
KSBjb25zdAotewotICAgIFJlZlB0cjxJREJLZXk+IGtleTsKLSAgICBkZWNvZGVJREJLZXkobV9l
bmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkpOwotICAg
IHJldHVybiBrZXk7Ci19Ci0KLWNvbnN0IGludDY0X3QgRXhpc3RzRW50cnlLZXk6OlNwZWNpYWxJ
bmRleE51bWJlciA9IEV4aXN0c0VudHJ5SW5kZXhJZDsKLQotSW5kZXhEYXRhS2V5OjpJbmRleERh
dGFLZXkoKQotICAgIDogbV9kYXRhYmFzZUlkKC0xKQotICAgICwgbV9vYmplY3RTdG9yZUlkKC0x
KQotICAgICwgbV9pbmRleElkKC0xKQotICAgICwgbV9zZXF1ZW5jZU51bWJlcigtMSkKLXsKLX0K
LQotY29uc3QgY2hhciogSW5kZXhEYXRhS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNv
bnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCkKLXsKLSAgICBLZXlQcmVmaXgg
cHJlZml4OwotICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGlt
aXQsICZwcmVmaXgpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQVNTRVJU
KHByZWZpeC5tX2RhdGFiYXNlSWQpOwotICAgIEFTU0VSVChwcmVmaXgubV9vYmplY3RTdG9yZUlk
KTsKLSAgICBBU1NFUlQocHJlZml4Lm1faW5kZXhJZCA+PSBNaW5pbXVtSW5kZXhJZCk7Ci0gICAg
cmVzdWx0LT5tX2RhdGFiYXNlSWQgPSBwcmVmaXgubV9kYXRhYmFzZUlkOwotICAgIHJlc3VsdC0+
bV9vYmplY3RTdG9yZUlkID0gcHJlZml4Lm1fb2JqZWN0U3RvcmVJZDsKLSAgICByZXN1bHQtPm1f
aW5kZXhJZCA9IHByZWZpeC5tX2luZGV4SWQ7Ci0gICAgcmVzdWx0LT5tX3NlcXVlbmNlTnVtYmVy
ID0gLTE7Ci0gICAgcmVzdWx0LT5tX2VuY29kZWRQcmltYXJ5S2V5ID0gbWluSURCS2V5KCk7Ci0K
LSAgICBwID0gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgbGltaXQsICZyZXN1bHQtPm1fZW5jb2Rl
ZFVzZXJLZXkpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvLyBbb3B0
aW9uYWxdIHNlcXVlbmNlIG51bWJlcgotICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICByZXR1
cm4gcDsKLSAgICBwID0gIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX3NlcXVlbmNl
TnVtYmVyKTsKLSAgICBpZiAoIXApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLy8gW29wdGlv
bmFsXSBwcmltYXJ5IGtleQotICAgIGlmIChwID09IGxpbWl0KQotICAgICAgICByZXR1cm4gcDsK
LSAgICBwID0gZXh0cmFjdEVuY29kZWRJREJLZXkocCwgbGltaXQsICZyZXN1bHQtPm1fZW5jb2Rl
ZFByaW1hcnlLZXkpOwotICAgIGlmICghcCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1
cm4gcDsKLX0KLQotVmVjdG9yPGNoYXI+IEluZGV4RGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0
YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IFZl
Y3RvcjxjaGFyPiYgZW5jb2RlZFVzZXJLZXksIGNvbnN0IFZlY3RvcjxjaGFyPiYgZW5jb2RlZFBy
aW1hcnlLZXksIGludDY0X3Qgc2VxdWVuY2VOdW1iZXIpCi17Ci0gICAgS2V5UHJlZml4IHByZWZp
eChkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKTsKLSAgICBWZWN0b3I8Y2hhcj4g
cmV0ID0gcHJlZml4LmVuY29kZSgpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlZFVzZXJL
ZXkpOwotICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50KHNlcXVlbmNlTnVtYmVyKSk7
Ci0gICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVkUHJpbWFyeUtleSk7Ci0gICAgcmV0dXJuIHJl
dDsKLX0KLQotVmVjdG9yPGNoYXI+IEluZGV4RGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYgdXNlcktleSkKLXsKLSAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIGluZGV4SWQsIGVuY29kZUlEQktleSh1c2VyS2V5KSwgbWluSURCS2V5KCkpOwotfQotCi1W
ZWN0b3I8Y2hhcj4gSW5kZXhEYXRhS2V5OjplbmNvZGVNaW5LZXkoaW50NjRfdCBkYXRhYmFzZUlk
LCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKLXsKLSAgICByZXR1cm4g
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIG1pbklEQktleSgpLCBt
aW5JREJLZXkoKSk7Ci19Ci0KLVZlY3RvcjxjaGFyPiBJbmRleERhdGFLZXk6OmVuY29kZU1heEtl
eShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRl
eElkKQotewotICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgbWF4SURCS2V5KCksIG1heElEQktleSgpLCBJTlQ2NF9NQVgpOwotfQotCi1pbnQgSW5k
ZXhEYXRhS2V5Ojpjb21wYXJlKGNvbnN0IEluZGV4RGF0YUtleSYgb3RoZXIsIGJvb2wgaWdub3Jl
RHVwbGljYXRlcywgYm9vbCYgb2spCi17Ci0gICAgQVNTRVJUKG1fZGF0YWJhc2VJZCA+PSAwKTsK
LSAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOwotICAgIEFTU0VSVChtX2luZGV4SWQg
Pj0gMCk7Ci0gICAgaW50IHJlc3VsdCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2VuY29kZWRV
c2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5LCBvayk7Ci0gICAgaWYgKCFvayB8fCByZXN1
bHQpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgaWYgKGlnbm9yZUR1cGxpY2F0ZXMpCi0g
ICAgICAgIHJldHVybiAwOwotICAgIHJlc3VsdCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2Vu
Y29kZWRQcmltYXJ5S2V5LCBvdGhlci5tX2VuY29kZWRQcmltYXJ5S2V5LCBvayk7Ci0gICAgaWYg
KCFvayB8fCByZXN1bHQpCi0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgcmV0dXJuIGNvbXBh
cmVJbnRzKG1fc2VxdWVuY2VOdW1iZXIsIG90aGVyLm1fc2VxdWVuY2VOdW1iZXIpOwotfQotCi1p
bnQ2NF90IEluZGV4RGF0YUtleTo6ZGF0YWJhc2VJZCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1f
ZGF0YWJhc2VJZCA+PSAwKTsKLSAgICByZXR1cm4gbV9kYXRhYmFzZUlkOwotfQotCi1pbnQ2NF90
IEluZGV4RGF0YUtleTo6b2JqZWN0U3RvcmVJZCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1fb2Jq
ZWN0U3RvcmVJZCA+PSAwKTsKLSAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwotfQotCi1pbnQ2
NF90IEluZGV4RGF0YUtleTo6aW5kZXhJZCgpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKG1faW5kZXhJ
ZCA+PSAwKTsKLSAgICByZXR1cm4gbV9pbmRleElkOwotfQotCi1QYXNzUmVmUHRyPElEQktleT4g
SW5kZXhEYXRhS2V5Ojp1c2VyS2V5KCkgY29uc3QKLXsKLSAgICBSZWZQdHI8SURCS2V5PiBrZXk7
Ci0gICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFVzZXJLZXkuYmVnaW4oKSwgbV9lbmNvZGVkVXNl
cktleS5lbmQoKSwga2V5KTsKLSAgICByZXR1cm4ga2V5OwotfQotCi1QYXNzUmVmUHRyPElEQktl
eT4gSW5kZXhEYXRhS2V5OjpwcmltYXJ5S2V5KCkgY29uc3QKLXsKLSAgICBSZWZQdHI8SURCS2V5
PiBrZXk7Ci0gICAgZGVjb2RlSURCS2V5KG1fZW5jb2RlZFByaW1hcnlLZXkuYmVnaW4oKSwgbV9l
bmNvZGVkUHJpbWFyeUtleS5lbmQoKSwga2V5KTsKLSAgICByZXR1cm4ga2V5OwotfQotCi19IC8v
IG5hbWVzcGFjZSBJREJMZXZlbERCQ29kaW5nCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCi0KLSNl
bmRpZiAvLyBVU0UoTEVWRUxEQikKLSNlbmRpZiAvLyBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJD
b2RpbmcuaCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL0lEQkxldmVsREJDb2Rp
bmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxOTdmNi4uMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9JREJMZXZlbERCQ29kaW5nLmgKKysr
IC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0g
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgSURCTGV2ZWxEQkNv
ZGluZ19oCi0jZGVmaW5lIElEQkxldmVsREJDb2RpbmdfaAotCi0jaWYgRU5BQkxFKElOREVYRURf
REFUQUJBU0UpCi0jaWYgVVNFKExFVkVMREIpCi0KLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0j
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgot
Ci1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIElEQktleTsKLWNsYXNzIElEQktleVBhdGg7
Ci1jbGFzcyBMZXZlbERCU2xpY2U7Ci0KLW5hbWVzcGFjZSBJREJMZXZlbERCQ29kaW5nIHsKLQot
Y29uc3QgdW5zaWduZWQgY2hhciBNaW5pbXVtSW5kZXhJZCA9IDMwOwotCi0vLyBBcyBtb3N0IG9m
IHRoZSBJREJLZXlzIGFuZCBlbmNvZGVkIHZhbHVlcyBhcmUgc2hvcnQsIHdlIGluaXRpYWxpemUg
c29tZSBWZWN0b3JzIHdpdGggYSBkZWZhdWx0IGlubGluZSBidWZmZXIgc2l6ZQotLy8gdG8gcmVk
dWNlIHRoZSBtZW1vcnkgcmUtYWxsb2NhdGlvbnMgd2hlbiB0aGUgVmVjdG9ycyBhcmUgYXBwZW5k
ZWQuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplID0gMzI7Ci0K
LVZlY3RvcjxjaGFyPiBlbmNvZGVCeXRlKHVuc2lnbmVkIGNoYXIpOwotY29uc3QgY2hhciogZGVj
b2RlQnl0ZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgdW5zaWduZWQgY2hhciYg
Zm91bmRDaGFyKTsKLVZlY3RvcjxjaGFyPiBtYXhJREJLZXkoKTsKLVZlY3RvcjxjaGFyPiBtaW5J
REJLZXkoKTsKLVZlY3RvcjxjaGFyPiBlbmNvZGVCb29sKGJvb2wpOwotYm9vbCBkZWNvZGVCb29s
KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpOwotVmVjdG9yPGNoYXI+IGVuY29k
ZUludChpbnQ2NF90KTsKLWlubGluZSBWZWN0b3I8Y2hhcj4gZW5jb2RlSW50U2FmZWx5KGludDY0
X3QgblBhcmFtLCBpbnQ2NF90IG1heCkKLXsKLSAgICBBU1NFUlRfVU5VU0VEKG1heCwgblBhcmFt
IDw9IG1heCk7Ci0gICAgcmV0dXJuIGVuY29kZUludChuUGFyYW0pOwotfQotaW50NjRfdCBkZWNv
ZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCk7Ci1WZWN0b3I8Y2hhcj4g
ZW5jb2RlVmFySW50KGludDY0X3QpOwotY29uc3QgY2hhciogZGVjb2RlVmFySW50KGNvbnN0IGNo
YXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBpbnQ2NF90JiBmb3VuZEludCk7Ci1WZWN0b3I8Y2hh
cj4gZW5jb2RlU3RyaW5nKGNvbnN0IFN0cmluZyYpOwotU3RyaW5nIGRlY29kZVN0cmluZyhjb25z
dCBjaGFyKiBwLCBjb25zdCBjaGFyKiBlbmQpOwotVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZ1dp
dGhMZW5ndGgoY29uc3QgU3RyaW5nJik7Ci1jb25zdCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVu
Z3RoKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5n
KTsKLWludCBjb21wYXJlRW5jb2RlZFN0cmluZ3NXaXRoTGVuZ3RoKGNvbnN0IGNoYXIqJiBwLCBj
b25zdCBjaGFyKiBsaW1pdFAsIGNvbnN0IGNoYXIqJiBxLCBjb25zdCBjaGFyKiBsaW1pdFEsIGJv
b2wmIG9rKTsKLVZlY3RvcjxjaGFyPiBlbmNvZGVEb3VibGUoZG91YmxlKTsKLWNvbnN0IGNoYXIq
IGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgZG91YmxlKik7
Ci12b2lkIGVuY29kZUlEQktleShjb25zdCBJREJLZXkmLCBWZWN0b3I8Y2hhciwgRGVmYXVsdElu
bGluZUJ1ZmZlclNpemU+JiBpbnRvKTsKLVZlY3RvcjxjaGFyPiBlbmNvZGVJREJLZXkoY29uc3Qg
SURCS2V5Jik7Ci1jb25zdCBjaGFyKiBkZWNvZGVJREJLZXkoY29uc3QgY2hhciogcCwgY29uc3Qg
Y2hhciogbGltaXQsIFJlZlB0cjxJREJLZXk+JiBmb3VuZEtleSk7Ci1jb25zdCBjaGFyKiBleHRy
YWN0RW5jb2RlZElEQktleShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIFZl
Y3RvcjxjaGFyPiogcmVzdWx0KTsKLWludCBjb21wYXJlRW5jb2RlZElEQktleXMoY29uc3QgVmVj
dG9yPGNoYXI+JiwgY29uc3QgVmVjdG9yPGNoYXI+JiwgYm9vbCYgb2spOwotVmVjdG9yPGNoYXI+
IGVuY29kZUlEQktleVBhdGgoY29uc3QgSURCS2V5UGF0aCYpOwotSURCS2V5UGF0aCBkZWNvZGVJ
REJLZXlQYXRoKGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7Ci0KLWludCBjb21wYXJlKGNvbnN0
IExldmVsREJTbGljZSYsIGNvbnN0IExldmVsREJTbGljZSYsIGJvb2wgaW5kZXhLZXlzID0gZmFs
c2UpOwotCi1jbGFzcyBLZXlQcmVmaXggewotcHVibGljOgotICAgIEtleVByZWZpeCgpOwotICAg
IGV4cGxpY2l0IEtleVByZWZpeChpbnQ2NF90IGRhdGFiYXNlSWQpOwotICAgIEtleVByZWZpeChp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7Ci0gICAgS2V5UHJlZml4
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQpOwotICAgIHN0YXRpYyBLZXlQcmVmaXggY3JlYXRlV2l0aFNwZWNpYWxJbmRleChpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKLQot
ICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNo
YXIqIGxpbWl0LCBLZXlQcmVmaXgqIHJlc3VsdCk7Ci0gICAgVmVjdG9yPGNoYXI+IGVuY29kZSgp
IGNvbnN0OwotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlRW1wdHkoKTsKLSAgICBpbnQg
Y29tcGFyZShjb25zdCBLZXlQcmVmaXgmIG90aGVyKSBjb25zdDsKLQotICAgIGVudW0gVHlwZSB7
Ci0gICAgICAgIEdsb2JhbE1ldGFEYXRhLAotICAgICAgICBEYXRhYmFzZU1ldGFEYXRhLAotICAg
ICAgICBPYmplY3RTdG9yZURhdGEsCi0gICAgICAgIEV4aXN0c0VudHJ5LAotICAgICAgICBJbmRl
eERhdGEsCi0gICAgICAgIEludmFsaWRUeXBlCi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBz
aXplX3Qga01heERhdGFiYXNlSWRTaXplQml0cyA9IDM7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVf
dCBrTWF4T2JqZWN0U3RvcmVJZFNpemVCaXRzID0gMzsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90
IGtNYXhJbmRleElkU2l6ZUJpdHMgPSAyOwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4
RGF0YWJhc2VJZFNpemVCeXRlcyA9IDFVTEwgPDwga01heERhdGFiYXNlSWRTaXplQml0czsgLy8g
OAotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE9iamVjdFN0b3JlSWRTaXplQnl0ZXMgPSAx
VUxMIDw8IGtNYXhPYmplY3RTdG9yZUlkU2l6ZUJpdHM7IC8vIDgKLSAgICBzdGF0aWMgY29uc3Qg
c2l6ZV90IGtNYXhJbmRleElkU2l6ZUJ5dGVzID0gMVVMTCA8PCBrTWF4SW5kZXhJZFNpemVCaXRz
OyAvLyA0Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhEYXRhYmFzZUlkQml0cyA9IGtN
YXhEYXRhYmFzZUlkU2l6ZUJ5dGVzICogOCAtIDE7IC8vIDYzCi0gICAgc3RhdGljIGNvbnN0IHNp
emVfdCBrTWF4T2JqZWN0U3RvcmVJZEJpdHMgPSBrTWF4T2JqZWN0U3RvcmVJZFNpemVCeXRlcyAq
IDggLSAxOyAvLyA2MwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEluZGV4SWRCaXRzID0g
a01heEluZGV4SWRTaXplQnl0ZXMgKiA4IC0gMTsgLy8gMzEKLQotICAgIHN0YXRpYyBjb25zdCBp
bnQ2NF90IGtNYXhEYXRhYmFzZUlkID0gKDFVTEwgPDwga01heERhdGFiYXNlSWRCaXRzKSAtIDE7
IC8vIG1heCBzaWduZWQgaW50NjRfdAotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhPYmpl
Y3RTdG9yZUlkID0gKDFVTEwgPDwga01heE9iamVjdFN0b3JlSWRCaXRzKSAtIDE7IC8vIG1heCBz
aWduZWQgaW50NjRfdAotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhJbmRleElkID0gKDFV
TEwgPDwga01heEluZGV4SWRCaXRzKSAtIDE7IC8vIG1heCBzaWduZWQgaW50MzJfdAotCi0gICAg
c3RhdGljIGJvb2wgaXNWYWxpZERhdGFiYXNlSWQoaW50NjRfdCBkYXRhYmFzZUlkKTsKLSAgICBz
dGF0aWMgYm9vbCBpc1ZhbGlkT2JqZWN0U3RvcmVJZChpbnQ2NF90IGluZGV4SWQpOwotICAgIHN0
YXRpYyBib29sIGlzVmFsaWRJbmRleElkKGludDY0X3QgaW5kZXhJZCk7Ci0gICAgc3RhdGljIGJv
b2wgdmFsaWRJZHMoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc1ZhbGlkRGF0YWJhc2VJZChk
YXRhYmFzZUlkKSAmJiBpc1ZhbGlkT2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKSAmJiBpc1Zh
bGlkSW5kZXhJZChpbmRleElkKTsKLSAgICB9Ci0gICAgc3RhdGljIGJvb2wgdmFsaWRJZHMoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCi0gICAgewotICAgICAgICBy
ZXR1cm4gaXNWYWxpZERhdGFiYXNlSWQoZGF0YWJhc2VJZCkgJiYgaXNWYWxpZE9iamVjdFN0b3Jl
SWQob2JqZWN0U3RvcmVJZCk7Ci0gICAgfQotCi0gICAgVHlwZSB0eXBlKCkgY29uc3Q7Ci0KLSAg
ICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAg
ICBpbnQ2NF90IG1faW5kZXhJZDsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IEludmFsaWRJ
ZCA9IC0xOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlSW50ZXJu
YWwoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5k
ZXhJZCk7Ci0gICAgLy8gU3BlY2lhbCBjb25zdHJ1Y3RvciBmb3IgY3JlYXRlV2l0aFNwZWNpYWxJ
bmRleCgpCi0gICAgS2V5UHJlZml4KFR5cGUsIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOwotfTsKLQotY2xhc3MgU2NoZW1hVmVyc2lv
bktleSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKTsKLX07Ci0K
LWNsYXNzIE1heERhdGFiYXNlSWRLZXkgewotcHVibGljOgotICAgIHN0YXRpYyBWZWN0b3I8Y2hh
cj4gZW5jb2RlKCk7Ci19OwotCi1jbGFzcyBEYXRhVmVyc2lvbktleSB7Ci1wdWJsaWM6Ci0gICAg
c3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoKTsKLX07Ci0KLWNsYXNzIERhdGFiYXNlRnJlZUxp
c3RLZXkgewotcHVibGljOgotICAgIERhdGFiYXNlRnJlZUxpc3RLZXkoKTsKLSAgICBzdGF0aWMg
Y29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwg
RGF0YWJhc2VGcmVlTGlzdEtleSogcmVzdWx0KTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQpOwotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
TWF4S2V5KCk7Ci0gICAgaW50NjRfdCBkYXRhYmFzZUlkKCkgY29uc3Q7Ci0gICAgaW50IGNvbXBh
cmUoY29uc3QgRGF0YWJhc2VGcmVlTGlzdEtleSYgb3RoZXIpIGNvbnN0OwotCi1wcml2YXRlOgot
ICAgIGludDY0X3QgbV9kYXRhYmFzZUlkOwotfTsKLQotY2xhc3MgRGF0YWJhc2VOYW1lS2V5IHsK
LXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0
LCBjb25zdCBjaGFyKiBsaW1pdCwgRGF0YWJhc2VOYW1lS2V5KiByZXN1bHQpOwotICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGNvbnN0IFN0cmluZyYgb3JpZ2luLCBjb25zdCBTdHJpbmcm
IGRhdGFiYXNlTmFtZSk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNaW5LZXlGb3JP
cmlnaW4oY29uc3QgU3RyaW5nJiBvcmlnaW4pOwotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlU3RvcEtleUZvck9yaWdpbihjb25zdCBTdHJpbmcmIG9yaWdpbik7Ci0gICAgU3RyaW5nIG9y
aWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fb3JpZ2luOyB9Ci0gICAgU3RyaW5nIGRhdGFiYXNlTmFt
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YWJhc2VOYW1lOyB9Ci0gICAgaW50IGNvbXBhcmUoY29u
c3QgRGF0YWJhc2VOYW1lS2V5JiBvdGhlcik7Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fb3Jp
Z2luOyAvLyBGSVhNRTogU3RvcmUgZW5jb2RlZCBzdHJpbmdzLCBvciBqdXN0IHBvaW50ZXJzLgot
ICAgIFN0cmluZyBtX2RhdGFiYXNlTmFtZTsKLX07Ci0KLWNsYXNzIERhdGFiYXNlTWV0YURhdGFL
ZXkgewotcHVibGljOgotICAgIGVudW0gTWV0YURhdGFUeXBlIHsKLSAgICAgICAgT3JpZ2luTmFt
ZSA9IDAsCi0gICAgICAgIERhdGFiYXNlTmFtZSA9IDEsCi0gICAgICAgIFVzZXJWZXJzaW9uID0g
MiwKLSAgICAgICAgTWF4T2JqZWN0U3RvcmVJZCA9IDMsCi0gICAgICAgIFVzZXJJbnRWZXJzaW9u
ID0gNCwKLSAgICAgICAgTWF4U2ltcGxlTWV0YURhdGFUeXBlID0gNQotICAgIH07Ci0KLSAgICBz
dGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIE1ldGFEYXRhVHlw
ZSk7Ci19OwotCi1jbGFzcyBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IHsKLXB1YmxpYzoKLSAgICBl
bnVtIE1ldGFEYXRhVHlwZSB7Ci0gICAgICAgIE5hbWUgPSAwLAotICAgICAgICBLZXlQYXRoID0g
MSwKLSAgICAgICAgQXV0b0luY3JlbWVudCA9IDIsCi0gICAgICAgIEV2aWN0YWJsZSA9IDMsCi0g
ICAgICAgIExhc3RWZXJzaW9uID0gNCwKLSAgICAgICAgTWF4SW5kZXhJZCA9IDUsCi0gICAgICAg
IEhhc0tleVBhdGggPSA2LAotICAgICAgICBLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gNwot
ICAgIH07Ci0KLSAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5KCk7Ci0gICAgc3RhdGljIGNvbnN0
IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVj
dFN0b3JlTWV0YURhdGFLZXkqIHJlc3VsdCk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIHVuc2lnbmVkIGNo
YXIgbWV0YURhdGFUeXBlKTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1heEtleShp
bnQ2NF90IGRhdGFiYXNlSWQpOwotICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKLSAgICBpbnQ2NF90
IG9iamVjdFN0b3JlSWQoKSBjb25zdDsKLSAgICB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSgp
IGNvbnN0OwotICAgIGludCBjb21wYXJlKGNvbnN0IE9iamVjdFN0b3JlTWV0YURhdGFLZXkmIG90
aGVyKTsKLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICB1bnNp
Z25lZCBjaGFyIG1fbWV0YURhdGFUeXBlOwotfTsKLQotY2xhc3MgSW5kZXhNZXRhRGF0YUtleSB7
Ci1wdWJsaWM6Ci0gICAgZW51bSBNZXRhRGF0YVR5cGUgewotICAgICAgICBOYW1lID0gMCwKLSAg
ICAgICAgVW5pcXVlID0gMSwKLSAgICAgICAgS2V5UGF0aCA9IDIsCi0gICAgICAgIE11bHRpRW50
cnkgPSAzCi0gICAgfTsKLQotICAgIEluZGV4TWV0YURhdGFLZXkoKTsKLSAgICBzdGF0aWMgY29u
c3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgSW5k
ZXhNZXRhRGF0YUtleSogcmVzdWx0KTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
LCB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBl
bmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwot
ICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpOwotICAgIGludCBjb21wYXJl
KGNvbnN0IEluZGV4TWV0YURhdGFLZXkmIG90aGVyKTsKLSAgICBpbnQ2NF90IGluZGV4SWQoKSBj
b25zdDsKLSAgICB1bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1f
bWV0YURhdGFUeXBlOyB9Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7
Ci0gICAgaW50NjRfdCBtX2luZGV4SWQ7Ci0gICAgdW5zaWduZWQgY2hhciBtX21ldGFEYXRhVHlw
ZTsKLX07Ci0KLWNsYXNzIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkgewotcHVibGljOgotICAgIE9i
amVjdFN0b3JlRnJlZUxpc3RLZXkoKTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNv
bnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVGcmVlTGlzdEtl
eSogcmVzdWx0KTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBl
bmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkKTsKLSAgICBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQoKSBjb25zdDsKLSAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZUZyZWVMaXN0S2V5
JiBvdGhlcik7Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci19Owot
Ci1jbGFzcyBJbmRleEZyZWVMaXN0S2V5IHsKLXB1YmxpYzoKLSAgICBJbmRleEZyZWVMaXN0S2V5
KCk7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29u
c3QgY2hhciogbGltaXQsIEluZGV4RnJlZUxpc3RLZXkqIHJlc3VsdCk7Ci0gICAgc3RhdGljIFZl
Y3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhL
ZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOwotICAgIGludCBj
b21wYXJlKGNvbnN0IEluZGV4RnJlZUxpc3RLZXkmIG90aGVyKTsKLSAgICBpbnQ2NF90IG9iamVj
dFN0b3JlSWQoKSBjb25zdDsKLSAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25zdDsKLQotcHJpdmF0
ZToKLSAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsKLSAgICBpbnQ2NF90IG1faW5kZXhJZDsK
LX07Ci0KLWNsYXNzIE9iamVjdFN0b3JlTmFtZXNLZXkgewotcHVibGljOgotICAgIC8vIEZJWE1F
OiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVwIG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1c2Ug
YSBtYXBwaW5nCi0gICAgLy8gaXMga2VwdCBpbiB0aGUgSURCRGF0YWJhc2VCYWNrZW5kSW1wbC4g
Q2FuIHRoZSBtYXBwaW5nIGJlY29tZSB1bnJlbGlhYmxlPwotICAgIC8vIENhbiB3ZSByZW1vdmUg
dGhpcz8KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBsaW1pdCwgT2JqZWN0U3RvcmVOYW1lc0tleSogcmVzdWx0KTsKLSAgICBzdGF0
aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGNvbnN0IFN0cmluZyYg
b2JqZWN0U3RvcmVOYW1lKTsKLSAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU5hbWVz
S2V5JiBvdGhlcik7Ci0gICAgU3RyaW5nIG9iamVjdFN0b3JlTmFtZSgpIGNvbnN0IHsgcmV0dXJu
IG1fb2JqZWN0U3RvcmVOYW1lOyB9Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nIG1fb2JqZWN0U3Rv
cmVOYW1lOyAvLyBGSVhNRTogU3RvcmUgdGhlIGVuY29kZWQgc3RyaW5nLCBvciBqdXN0IHBvaW50
ZXJzIHRvIGl0LgotfTsKLQotY2xhc3MgSW5kZXhOYW1lc0tleSB7Ci1wdWJsaWM6Ci0gICAgSW5k
ZXhOYW1lc0tleSgpOwotICAgIC8vIEZJWE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVw
IGluZGV4IGlkcywgYmVjYXVzZSBhIG1hcHBpbmcKLSAgICAvLyBpcyBrZXB0IGF0IGEgaGlnaGVy
IGxldmVsLgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQs
IGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleE5hbWVzS2V5KiByZXN1bHQpOwotICAgIHN0YXRpYyBW
ZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9y
ZUlkLCBjb25zdCBTdHJpbmcmIGluZGV4TmFtZSk7Ci0gICAgaW50IGNvbXBhcmUoY29uc3QgSW5k
ZXhOYW1lc0tleSYgb3RoZXIpOwotICAgIFN0cmluZyBpbmRleE5hbWUoKSBjb25zdCB7IHJldHVy
biBtX2luZGV4TmFtZTsgfQotCi1wcml2YXRlOgotICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlk
OwotICAgIFN0cmluZyBtX2luZGV4TmFtZTsKLX07Ci0KLWNsYXNzIE9iamVjdFN0b3JlRGF0YUtl
eSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBz
dGFydCwgY29uc3QgY2hhciogZW5kLCBPYmplY3RTdG9yZURhdGFLZXkqIHJlc3VsdCk7Ci0gICAg
c3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9i
amVjdFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiBlbmNvZGVkVXNlcktleSk7Ci0gICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSk7Ci0gICAgaW50IGNvbXBhcmUoY29uc3Qg
T2JqZWN0U3RvcmVEYXRhS2V5JiBvdGhlciwgYm9vbCYgb2spOwotICAgIFBhc3NSZWZQdHI8SURC
S2V5PiB1c2VyS2V5KCkgY29uc3Q7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3QgU3BlY2lhbElu
ZGV4TnVtYmVyOwotCi1wcml2YXRlOgotICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5
OwotfTsKLQotY2xhc3MgRXhpc3RzRW50cnlLZXkgewotcHVibGljOgotICAgIHN0YXRpYyBjb25z
dCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgRXhpc3Rz
RW50cnlLZXkqIHJlc3VsdCk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRf
dCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IFZlY3RvcjxjaGFyPiYg
ZW5jb2RlZEtleSk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRh
YmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleSYgdXNlcktleSk7Ci0g
ICAgaW50IGNvbXBhcmUoY29uc3QgRXhpc3RzRW50cnlLZXkmIG90aGVyLCBib29sJiBvayk7Ci0g
ICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdDsKLQotICAgIHN0YXRpYyBjb25z
dCBpbnQ2NF90IFNwZWNpYWxJbmRleE51bWJlcjsKLQotcHJpdmF0ZToKLSAgICBWZWN0b3I8Y2hh
cj4gbV9lbmNvZGVkVXNlcktleTsKLX07Ci0KLWNsYXNzIEluZGV4RGF0YUtleSB7Ci1wdWJsaWM6
Ci0gICAgSW5kZXhEYXRhS2V5KCk7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25z
dCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4RGF0YUtleSogcmVzdWx0KTsK
LSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVu
Y29kZWRVc2VyS2V5LCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRQcmltYXJ5S2V5LCBpbnQ2
NF90IHNlcXVlbmNlTnVtYmVyID0gMCk7Ci0gICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUo
aW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJ
ZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZU1pbktleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkKTsKLSAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1heEtleShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKLSAg
ICBpbnQgY29tcGFyZShjb25zdCBJbmRleERhdGFLZXkmIG90aGVyLCBib29sIGlnbm9yZUR1cGxp
Y2F0ZXMsIGJvb2wmIG9rKTsKLSAgICBpbnQ2NF90IGRhdGFiYXNlSWQoKSBjb25zdDsKLSAgICBp
bnQ2NF90IG9iamVjdFN0b3JlSWQoKSBjb25zdDsKLSAgICBpbnQ2NF90IGluZGV4SWQoKSBjb25z
dDsKLSAgICBQYXNzUmVmUHRyPElEQktleT4gdXNlcktleSgpIGNvbnN0OwotICAgIFBhc3NSZWZQ
dHI8SURCS2V5PiBwcmltYXJ5S2V5KCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgaW50NjRfdCBt
X2RhdGFiYXNlSWQ7Ci0gICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7Ci0gICAgaW50NjRfdCBt
X2luZGV4SWQ7Ci0gICAgVmVjdG9yPGNoYXI+IG1fZW5jb2RlZFVzZXJLZXk7Ci0gICAgVmVjdG9y
PGNoYXI+IG1fZW5jb2RlZFByaW1hcnlLZXk7Ci0gICAgaW50NjRfdCBtX3NlcXVlbmNlTnVtYmVy
OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZwotCi19IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCi0KLSNlbmRpZiAvLyBVU0UoTEVWRUxEQikKLSNlbmRpZiAvLyBFTkFCTEUoSU5E
RVhFRF9EQVRBQkFTRSkKLQotI2VuZGlmIC8vIElEQkxldmVsREJDb2RpbmdfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJCYWNraW5nU3Rv
cmVMZXZlbERCLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL2xldmVsZGIv
SURCQmFja2luZ1N0b3JlTGV2ZWxEQi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMC4uNDhlMGQzMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMv
aW5kZXhlZGRiL2xldmVsZGIvSURCQmFja2luZ1N0b3JlTGV2ZWxEQi5jcHAKQEAgLTAsMCArMSwx
OTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQkJhY2tpbmdT
dG9yZS5oIgorCisjaWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisKKyNpbmNsdWRlICJGaWxl
U3lzdGVtLmgiCisjaW5jbHVkZSAiSGlzdG9ncmFtU3VwcG9ydC5oIgorI2luY2x1ZGUgIklEQktl
eS5oIgorI2luY2x1ZGUgIklEQktleVBhdGguaCIKKyNpbmNsdWRlICJJREJLZXlSYW5nZS5oIgor
I2luY2x1ZGUgIklEQkxldmVsREJDb2RpbmcuaCIKKyNpbmNsdWRlICJJREJNZXRhZGF0YS5oIgor
I2luY2x1ZGUgIklEQlRyYWNpbmcuaCIKKyNpbmNsdWRlICJMZXZlbERCQ29tcGFyYXRvci5oIgor
I2luY2x1ZGUgIkxldmVsREJEYXRhYmFzZS5oIgorI2luY2x1ZGUgIkxldmVsREJJdGVyYXRvci5o
IgorI2luY2x1ZGUgIkxldmVsREJTbGljZS5oIgorI2luY2x1ZGUgIkxldmVsREJUcmFuc2FjdGlv
bi5oIgorI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVy
LmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
Cit1c2luZyBuYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZzsKKworY29uc3QgaW50NjRfdCBLZXlH
ZW5lcmF0b3JJbml0aWFsTnVtYmVyID0gMTsgLy8gRnJvbSB0aGUgSW5kZXhlZERCIHNwZWNpZmlj
YXRpb24uCisKK2VudW0gSURCQmFja2luZ1N0b3JlRXJyb3JTb3VyY2UgeworICAgIC8vIDAgLSAy
IGFyZSBubyBsb25nZXIgdXNlZC4KKyAgICBGaW5kS2V5SW5JbmRleCA9IDMsCisgICAgR2V0SURC
RGF0YWJhc2VNZXRhRGF0YSwKKyAgICBHZXRJbmRleGVzLAorICAgIEdldEtleUdlbmVyYXRvckN1
cnJlbnROdW1iZXIsCisgICAgR2V0T2JqZWN0U3RvcmVzLAorICAgIEdldFJlY29yZCwKKyAgICBL
ZXlFeGlzdHNJbk9iamVjdFN0b3JlLAorICAgIExvYWRDdXJyZW50Um93LAorICAgIFNldHVwTWV0
YWRhdGEsCisgICAgR2V0UHJpbWFyeUtleVZpYUluZGV4LAorICAgIEtleUV4aXN0c0luSW5kZXgs
CisgICAgVmVyc2lvbkV4aXN0cywKKyAgICBEZWxldGVPYmplY3RTdG9yZSwKKyAgICBTZXRNYXhP
YmplY3RTdG9yZUlkLAorICAgIFNldE1heEluZGV4SWQsCisgICAgR2V0TmV3RGF0YWJhc2VJZCwK
KyAgICBHZXROZXdWZXJzaW9uTnVtYmVyLAorICAgIENyZWF0ZUlEQkRhdGFiYXNlTWV0YURhdGEs
CisgICAgRGVsZXRlRGF0YWJhc2UsCisgICAgVHJhbnNhY3Rpb25Db21taXQsCisgICAgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZUludGVybmFsRXJyb3JNYXgsCit9OworCitzdGF0aWMgdm9pZCByZWNv
cmRJbnRlcm5hbEVycm9yKGNvbnN0IGNoYXIqIHR5cGUsIElEQkJhY2tpbmdTdG9yZUVycm9yU291
cmNlIGxvY2F0aW9uKQoreworICAgIFN0cmluZyBuYW1lID0gU3RyaW5nOjpmb3JtYXQoIldlYkNv
cmUuSW5kZXhlZERCLkJhY2tpbmdTdG9yZS4lc0Vycm9yIiwgdHlwZSk7CisgICAgSGlzdG9ncmFt
U3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24obmFtZS51dGY4KCkuZGF0YSgpLCBsb2NhdGlv
biwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZUludGVybmFsRXJyb3JNYXgpOworfQorCisvLyBVc2Ug
dG8gc2lnbmFsIGNvbmRpdGlvbnMgdGhhdCB1c3VhbGx5IGluZGljYXRlIGRldmVsb3BlciBlcnJv
ciwgYnV0IGNvdWxkIGJlIGNhdXNlZCBieSBkYXRhIGNvcnJ1cHRpb24uCisvLyBBIG1hY3JvIGlz
IHVzZWQgaW5zdGVhZCBvZiBhbiBpbmxpbmUgZnVuY3Rpb24gc28gdGhhdCB0aGUgYXNzZXJ0IGFu
ZCBsb2cgcmVwb3J0IHRoZSBsaW5lIG51bWJlci4KKyNkZWZpbmUgUkVQT1JUX0VSUk9SKHR5cGUs
IGxvY2F0aW9uKSBcCisgICAgZG8geyBcCisgICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCICVz
IEVycm9yOiAlcyIsIHR5cGUsICNsb2NhdGlvbik7IFwKKyAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7IFwKKyAgICAgICAgcmVjb3JkSW50ZXJuYWxFcnJvcih0eXBlLCBsb2NhdGlvbik7IFwK
KyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIElOVEVSTkFMX1JFQURfRVJST1IobG9jYXRpb24p
IFJFUE9SVF9FUlJPUigiUmVhZCIsIGxvY2F0aW9uKQorI2RlZmluZSBJTlRFUk5BTF9DT05TSVNU
RU5DWV9FUlJPUihsb2NhdGlvbikgUkVQT1JUX0VSUk9SKCJDb25zaXN0ZW5jeSIsIGxvY2F0aW9u
KQorI2RlZmluZSBJTlRFUk5BTF9XUklURV9FUlJPUihsb2NhdGlvbikgUkVQT1JUX0VSUk9SKCJX
cml0ZSIsIGxvY2F0aW9uKQorCitzdGF0aWMgdm9pZCBwdXRCb29sKExldmVsREJUcmFuc2FjdGlv
biogdHJhbnNhY3Rpb24sIGNvbnN0IExldmVsREJTbGljZSYga2V5LCBib29sIHZhbHVlKQorewor
ICAgIHRyYW5zYWN0aW9uLT5wdXQoa2V5LCBlbmNvZGVCb29sKHZhbHVlKSk7Cit9CisKK3RlbXBs
YXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+CitzdGF0aWMgYm9vbCBnZXRJbnQoREJPclRy
YW5zYWN0aW9uKiBkYiwgY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QmIGZvdW5kSW50
LCBib29sJiBmb3VuZCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGJvb2wgb2sg
PSBkYi0+c2FmZUdldChrZXksIHJlc3VsdCwgZm91bmQpOworICAgIGlmICghb2spCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIGZvdW5kSW50ID0gZGVjb2RlSW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCkpOwor
ICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwdXRJbnQoTGV2ZWxEQlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QgdmFsdWUp
Cit7CisgICAgQVNTRVJUKHZhbHVlID49IDApOworICAgIHRyYW5zYWN0aW9uLT5wdXQoa2V5LCBl
bmNvZGVJbnQodmFsdWUpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlv
bj4KK1dBUk5fVU5VU0VEX1JFVFVSTiBzdGF0aWMgYm9vbCBnZXRWYXJJbnQoREJPclRyYW5zYWN0
aW9uKiBkYiwgY29uc3QgTGV2ZWxEQlNsaWNlJiBrZXksIGludDY0X3QmIGZvdW5kSW50LCBib29s
JiBmb3VuZCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGJvb2wgb2sgPSBkYi0+
c2FmZUdldChrZXksIHJlc3VsdCwgZm91bmQpOworICAgIGlmICghb2spCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZv
dW5kID0gZGVjb2RlVmFySW50KHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIGZvdW5kSW50
KSA9PSByZXN1bHQuZW5kKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHB1
dFZhckludChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBMZXZlbERCU2xp
Y2UmIGtleSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICB0cmFuc2FjdGlvbi0+cHV0KGtleSwgZW5j
b2RlVmFySW50KHZhbHVlKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rp
b24+CitXQVJOX1VOVVNFRF9SRVRVUk4gc3RhdGljIGJvb2wgZ2V0U3RyaW5nKERCT3JUcmFuc2Fj
dGlvbiogZGIsIGNvbnN0IExldmVsREJTbGljZSYga2V5LCBTdHJpbmcmIGZvdW5kU3RyaW5nLCBi
b29sJiBmb3VuZCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmVzdWx0OworICAgIGZvdW5kID0gZmFs
c2U7CisgICAgYm9vbCBvayA9IGRiLT5zYWZlR2V0KGtleSwgcmVzdWx0LCBmb3VuZCk7CisgICAg
aWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghZm91bmQpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocmVzdWx0LmJl
Z2luKCksIHJlc3VsdC5lbmQoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lk
IHB1dFN0cmluZyhMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBMZXZlbERC
U2xpY2UmIGtleSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICB0cmFuc2FjdGlvbi0+cHV0
KGtleSwgZW5jb2RlU3RyaW5nKHZhbHVlKSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dElEQktleVBh
dGgoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgTGV2ZWxEQlNsaWNlJiBr
ZXksIGNvbnN0IElEQktleVBhdGgmIHZhbHVlKQoreworICAgIHRyYW5zYWN0aW9uLT5wdXQoa2V5
LCBlbmNvZGVJREJLZXlQYXRoKHZhbHVlKSk7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUtleXMo
Y29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIpCit7CisgICAgcmV0
dXJuIGNvbXBhcmUoYSwgYik7Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZUluZGV4S2V5cyhjb25z
dCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikKK3sKKyAgICByZXR1cm4g
Y29tcGFyZShhLCBiLCB0cnVlKTsKK30KKworY2xhc3MgQ29tcGFyYXRvciA6IHB1YmxpYyBMZXZl
bERCQ29tcGFyYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgY29tcGFyZShjb25zdCBM
ZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYikgY29uc3QgeyByZXR1cm4gSURC
TGV2ZWxEQkNvZGluZzo6Y29tcGFyZShhLCBiKTsgfQorICAgIHZpcnR1YWwgY29uc3QgY2hhciog
bmFtZSgpIGNvbnN0IHsgcmV0dXJuICJpZGJfY21wMSI7IH0KK307CisKKy8vIDAgLSBJbml0aWFs
IHZlcnNpb24uCisvLyAxIC0gQWRkcyBVc2VySW50VmVyc2lvbiB0byBEYXRhYmFzZU1ldGFEYXRh
LgorLy8gMiAtIEFkZHMgRGF0YVZlcnNpb24gdG8gdG8gZ2xvYmFsIG1ldGFkYXRhLgorY29uc3Qg
aW50NjRfdCBsYXRlc3RLbm93blNjaGVtYVZlcnNpb24gPSAyOworV0FSTl9VTlVTRURfUkVUVVJO
IHN0YXRpYyBib29sIGlzU2NoZW1hS25vd24oTGV2ZWxEQkRhdGFiYXNlKiBkYiwgYm9vbCYga25v
d24pCit7CisgICAgaW50NjRfdCBkYlNjaGVtYVZlcnNpb24gPSAwOworICAgIGJvb2wgZm91bmQg
PSBmYWxzZTsKKyAgICBib29sIG9rID0gZ2V0SW50KGRiLCBTY2hlbWFWZXJzaW9uS2V5OjplbmNv
ZGUoKSwgZGJTY2hlbWFWZXJzaW9uLCBmb3VuZCk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAga25vd24gPSB0cnVlOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRiU2NoZW1hVmVyc2lvbiA+IGxhdGVz
dEtub3duU2NoZW1hVmVyc2lvbikgeworICAgICAgICBrbm93biA9IGZhbHNlOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50MzJfdCBsYXRlc3RLbm93bkRhdGFW
ZXJzaW9uID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjp3aXJlRm9ybWF0VmVyc2lvbigpOworICAg
IGludDY0X3QgZGJEYXRhVmVyc2lvbiA9IDA7CisgICAgb2sgPSBnZXRJbnQoZGIsIERhdGFWZXJz
aW9uS2V5OjplbmNvZGUoKSwgZGJEYXRhVmVyc2lvbiwgZm91bmQpOworICAgIGlmICghb2spCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIGtub3duID0g
dHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKGRiRGF0YVZlcnNp
b24gPiBsYXRlc3RLbm93bkRhdGFWZXJzaW9uKSB7CisgICAgICAgIGtub3duID0gZmFsc2U7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGtub3duID0gdHJ1ZTsKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworV0FSTl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIHNldFVwTWV0YWRh
dGEoTGV2ZWxEQkRhdGFiYXNlKiBkYiwgY29uc3QgU3RyaW5nJiBvcmlnaW4pCit7CisgICAgY29u
c3QgdWludDMyX3QgbGF0ZXN0S25vd25EYXRhVmVyc2lvbiA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZTo6d2lyZUZvcm1hdFZlcnNpb24oKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc2NoZW1hVmVy
c2lvbktleSA9IFNjaGVtYVZlcnNpb25LZXk6OmVuY29kZSgpOworICAgIGNvbnN0IFZlY3Rvcjxj
aGFyPiBkYXRhVmVyc2lvbktleSA9IERhdGFWZXJzaW9uS2V5OjplbmNvZGUoKTsKKworICAgIFJl
ZlB0cjxMZXZlbERCVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9u
OjpjcmVhdGUoZGIpOworCisgICAgaW50NjRfdCBkYlNjaGVtYVZlcnNpb24gPSAwOworICAgIGlu
dDY0X3QgZGJEYXRhVmVyc2lvbiA9IDA7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGJv
b2wgb2sgPSBnZXRJbnQodHJhbnNhY3Rpb24uZ2V0KCksIHNjaGVtYVZlcnNpb25LZXksIGRiU2No
ZW1hVmVyc2lvbiwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVB
RF9FUlJPUihTZXR1cE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICBpZiAoIWZvdW5kKSB7CisgICAgICAgIC8vIEluaXRpYWxpemUgbmV3IGJhY2tpbmcgc3RvcmUu
CisgICAgICAgIGRiU2NoZW1hVmVyc2lvbiA9IGxhdGVzdEtub3duU2NoZW1hVmVyc2lvbjsKKyAg
ICAgICAgcHV0SW50KHRyYW5zYWN0aW9uLmdldCgpLCBzY2hlbWFWZXJzaW9uS2V5LCBkYlNjaGVt
YVZlcnNpb24pOworICAgICAgICBkYkRhdGFWZXJzaW9uID0gbGF0ZXN0S25vd25EYXRhVmVyc2lv
bjsKKyAgICAgICAgcHV0SW50KHRyYW5zYWN0aW9uLmdldCgpLCBkYXRhVmVyc2lvbktleSwgZGJE
YXRhVmVyc2lvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXBncmFkZSBvbGQgYmFja2lu
ZyBzdG9yZS4KKyAgICAgICAgQVNTRVJUKGRiU2NoZW1hVmVyc2lvbiA8PSBsYXRlc3RLbm93blNj
aGVtYVZlcnNpb24pOworICAgICAgICBpZiAoZGJTY2hlbWFWZXJzaW9uIDwgMSkgeworICAgICAg
ICAgICAgZGJTY2hlbWFWZXJzaW9uID0gMTsKKyAgICAgICAgICAgIHB1dEludCh0cmFuc2FjdGlv
bi5nZXQoKSwgc2NoZW1hVmVyc2lvbktleSwgZGJTY2hlbWFWZXJzaW9uKTsKKyAgICAgICAgICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlTWlu
S2V5Rm9yT3JpZ2luKG9yaWdpbik7CisgICAgICAgICAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3Rv
cEtleSA9IERhdGFiYXNlTmFtZUtleTo6ZW5jb2RlU3RvcEtleUZvck9yaWdpbihvcmlnaW4pOwor
ICAgICAgICAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBkYi0+Y3JlYXRlSXRlcmF0
b3IoKTsKKyAgICAgICAgICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgp
ICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7Cisg
ICAgICAgICAgICAgICAgaW50NjRfdCBkYXRhYmFzZUlkID0gMDsKKyAgICAgICAgICAgICAgICBm
b3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJvb2wgb2sgPSBnZXRJbnQodHJhbnNhY3Rp
b24uZ2V0KCksIGl0LT5rZXkoKSwgZGF0YWJhc2VJZCwgZm91bmQpOworICAgICAgICAgICAgICAg
IGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihTZXR1
cE1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAg
ICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKFNldHVwTWV0YWRhdGEpOworICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIFZlY3RvcjxjaGFyPiBpbnRWZXJzaW9uS2V5ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKTsKKyAg
ICAgICAgICAgICAgICBwdXRWYXJJbnQodHJhbnNhY3Rpb24uZ2V0KCksIGludFZlcnNpb25LZXks
IElEQkRhdGFiYXNlTWV0YWRhdGE6OkRlZmF1bHRJbnRWZXJzaW9uKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgICAgICBpZiAoZGJTY2hlbWFWZXJzaW9uIDwgMikgeworICAgICAgICAg
ICAgZGJTY2hlbWFWZXJzaW9uID0gMjsKKyAgICAgICAgICAgIHB1dEludCh0cmFuc2FjdGlvbi5n
ZXQoKSwgc2NoZW1hVmVyc2lvbktleSwgZGJTY2hlbWFWZXJzaW9uKTsKKyAgICAgICAgICAgIGRi
RGF0YVZlcnNpb24gPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OndpcmVGb3JtYXRWZXJzaW9uKCk7
CisgICAgICAgICAgICBwdXRJbnQodHJhbnNhY3Rpb24uZ2V0KCksIGRhdGFWZXJzaW9uS2V5LCBk
YkRhdGFWZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFsbCBuZXcgdmFsdWVz
IHdpbGwgYmUgd3JpdHRlbiB1c2luZyB0aGlzIHNlcmlhbGl6YXRpb24gdmVyc2lvbi4KKyAgICBm
b3VuZCA9IGZhbHNlOworICAgIG9rID0gZ2V0SW50KHRyYW5zYWN0aW9uLmdldCgpLCBkYXRhVmVy
c2lvbktleSwgZGJEYXRhVmVyc2lvbiwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
SU5URVJOQUxfUkVBRF9FUlJPUihTZXR1cE1ldGFkYXRhKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZ
X0VSUk9SKFNldHVwTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGlmIChkYkRhdGFWZXJzaW9uIDwgbGF0ZXN0S25vd25EYXRhVmVyc2lvbikgeworICAgICAgICBk
YkRhdGFWZXJzaW9uID0gbGF0ZXN0S25vd25EYXRhVmVyc2lvbjsKKyAgICAgICAgcHV0SW50KHRy
YW5zYWN0aW9uLmdldCgpLCBkYXRhVmVyc2lvbktleSwgZGJEYXRhVmVyc2lvbik7CisgICAgfQor
CisgICAgQVNTRVJUKGRiU2NoZW1hVmVyc2lvbiA9PSBsYXRlc3RLbm93blNjaGVtYVZlcnNpb24p
OworICAgIEFTU0VSVChkYkRhdGFWZXJzaW9uID09IGxhdGVzdEtub3duRGF0YVZlcnNpb24pOwor
CisgICAgaWYgKCF0cmFuc2FjdGlvbi0+Y29tbWl0KCkpIHsKKyAgICAgICAgSU5URVJOQUxfV1JJ
VEVfRVJST1IoU2V0dXBNZXRhZGF0YSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEQk9yVHJhbnNhY3Rpb24+
CitXQVJOX1VOVVNFRF9SRVRVUk4gc3RhdGljIGJvb2wgZ2V0TWF4T2JqZWN0U3RvcmVJZChEQk9y
VHJhbnNhY3Rpb24qIGRiLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3QmIG1heE9iamVjdFN0
b3JlSWQpCit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG1heE9iamVjdFN0b3JlSWRLZXkgPSBE
YXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgRGF0YWJhc2VNZXRhRGF0YUtl
eTo6TWF4T2JqZWN0U3RvcmVJZCk7CisgICAgYm9vbCBvayA9IGdldE1heE9iamVjdFN0b3JlSWQo
ZGIsIG1heE9iamVjdFN0b3JlSWRLZXksIG1heE9iamVjdFN0b3JlSWQpOworICAgIHJldHVybiBv
azsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIERCT3JUcmFuc2FjdGlvbj4KK1dBUk5fVU5VU0VE
X1JFVFVSTiBzdGF0aWMgYm9vbCBnZXRNYXhPYmplY3RTdG9yZUlkKERCT3JUcmFuc2FjdGlvbiog
ZGIsIGNvbnN0IFZlY3RvcjxjaGFyPiYgbWF4T2JqZWN0U3RvcmVJZEtleSwgaW50NjRfdCYgbWF4
T2JqZWN0U3RvcmVJZCkKK3sKKyAgICBtYXhPYmplY3RTdG9yZUlkID0gLTE7CisgICAgYm9vbCBm
b3VuZCA9IGZhbHNlOworICAgIGJvb2wgb2sgPSBnZXRJbnQoZGIsIG1heE9iamVjdFN0b3JlSWRL
ZXksIG1heE9iamVjdFN0b3JlSWQsIGZvdW5kKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgbWF4T2JqZWN0U3RvcmVJZCA9IDA7
CisKKyAgICBBU1NFUlQobWF4T2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworY2xhc3MgRGVmYXVsdExldmVsREJGYWN0b3J5IDogcHVibGljIExldmVsREJGYWN0b3J5
IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8TGV2ZWxEQkRhdGFiYXNlPiBvcGVu
TGV2ZWxEQihjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBMZXZlbERCQ29tcGFyYXRvciog
Y29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBMZXZlbERCRGF0YWJhc2U6Om9wZW4o
ZmlsZU5hbWUsIGNvbXBhcmF0b3IpOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgZGVzdHJveUxl
dmVsREIoY29uc3QgU3RyaW5nJiBmaWxlTmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBMZXZl
bERCRGF0YWJhc2U6OmRlc3Ryb3koZmlsZU5hbWUpOworICAgIH0KK307CisKK0lEQkJhY2tpbmdT
dG9yZTo6SURCQmFja2luZ1N0b3JlKGNvbnN0IFN0cmluZyYgaWRlbnRpZmllciwgUGFzc093blB0
cjxMZXZlbERCRGF0YWJhc2U+IGRiLCBQYXNzT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21w
YXJhdG9yKQorICAgIDogbV9pZGVudGlmaWVyKGlkZW50aWZpZXIpCisgICAgLCBtX2RiKGRiKQor
ICAgICwgbV9jb21wYXJhdG9yKGNvbXBhcmF0b3IpCisgICAgLCBtX3dlYWtGYWN0b3J5KHRoaXMp
Cit7Cit9CisKK0lEQkJhY2tpbmdTdG9yZTo6SURCQmFja2luZ1N0b3JlKCkKKyAgICA6IG1fd2Vh
a0ZhY3RvcnkodGhpcykKK3sKKyAgICAvLyBGSVhNRTogdGhpcyBjb21tZW50cyB3YXMgcmVsYXRl
ZCB0byBDaHJvbWl1bSBjb2RlLiBJdCBtYXkgYmUgaW5jb3JyZWN0CisgICAgLy8gVGhpcyBjb25z
dHJ1Y3RvciBzaG91bGQgb25seSBiZSB1c2VkIGluIHVuaXQgdGVzdHMuCit9CisKK0lEQkJhY2tp
bmdTdG9yZTo6fklEQkJhY2tpbmdTdG9yZSgpCit7CisgICAgLy8gbV9kYidzIGRlc3RydWN0b3Ig
dXNlcyBtX2NvbXBhcmF0b3IuIFRoZSBvcmRlciBvZiBkZXN0cnVjdGlvbiBpcyBpbXBvcnRhbnQu
CisgICAgbV9kYi5jbGVhcigpOworICAgIG1fY29tcGFyYXRvci5jbGVhcigpOworfQorCitlbnVt
IElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuUmVzdWx0IHsKKyAgICBJREJMZXZlbERCQmFja2lu
Z1N0b3JlT3Blbk1lbW9yeVN1Y2Nlc3MsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5T
dWNjZXNzLAorICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkRGlyZWN0b3J5LAor
ICAgIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFpbGVkVW5rbm93blNjaGVtYSwKKyAgICBJ
REJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkNsZWFudXBEZXN0cm95RmFpbGVkLAorICAgIElEQkxl
dmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwKKyAgICBJREJMZXZlbERC
QmFja2luZ1N0b3JlT3BlbkNsZWFudXBSZW9wZW5TdWNjZXNzLAorICAgIElEQkxldmVsREJCYWNr
aW5nU3RvcmVPcGVuRmFpbGVkSU9FcnJDaGVja2luZ1NjaGVtYSwKKyAgICBJREJMZXZlbERCQmFj
a2luZ1N0b3JlT3BlbkZhaWxlZFVua25vd25FcnIsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZU9wZW5NZW1vcnlGYWlsZWQsCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5BdHRlbXB0
Tm9uQVNDSUksCisgICAgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgsCit9OworCitQYXNz
UmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5T3Jp
Z2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgY29uc3QgU3Ry
aW5nJiBmaWxlSWRlbnRpZmllcikKK3sKKyAgICBEZWZhdWx0TGV2ZWxEQkZhY3RvcnkgbGV2ZWxE
QkZhY3Rvcnk7CisgICAgcmV0dXJuIElEQkJhY2tpbmdTdG9yZTo6b3BlbihzZWN1cml0eU9yaWdp
biwgcGF0aEJhc2VBcmcsIGZpbGVJZGVudGlmaWVyLCAmbGV2ZWxEQkZhY3RvcnkpOworfQorCitQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuKFNlY3VyaXR5
T3JpZ2luKiBzZWN1cml0eU9yaWdpbiwgY29uc3QgU3RyaW5nJiBwYXRoQmFzZUFyZywgY29uc3Qg
U3RyaW5nJiBmaWxlSWRlbnRpZmllciwgTGV2ZWxEQkZhY3RvcnkqIGxldmVsREJGYWN0b3J5KQor
eworICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpvcGVuIik7CisgICAgQVNTRVJUKCFw
YXRoQmFzZUFyZy5pc0VtcHR5KCkpOworICAgIFN0cmluZyBwYXRoQmFzZSA9IHBhdGhCYXNlQXJn
OworCisgICAgT3duUHRyPExldmVsREJDb21wYXJhdG9yPiBjb21wYXJhdG9yID0gYWRvcHRQdHIo
bmV3IENvbXBhcmF0b3IoKSk7CisgICAgT3duUHRyPExldmVsREJEYXRhYmFzZT4gZGI7CisKKyAg
ICBpZiAoIXBhdGhCYXNlLmNvbnRhaW5zT25seUFTQ0lJKCkpCisgICAgICAgICAgICBIaXN0b2dy
YW1TdXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2lu
Z1N0b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkF0dGVtcHROb25B
U0NJSSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAgIGlmICghbWFrZUFsbERp
cmVjdG9yaWVzKHBhdGhCYXNlKSkgeworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjcmVh
dGUgSW5kZXhlZERCIGRhdGFiYXNlIHBhdGggJXMiLCBwYXRoQmFzZS51dGY4KCkuZGF0YSgpKTsK
KyAgICAgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUu
SW5kZXhlZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9y
ZU9wZW5GYWlsZWREaXJlY3RvcnksIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAg
ICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOworICAgIH0KKworICAg
IFN0cmluZyBwYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KHBhdGhCYXNlLCBzZWN1cml0
eU9yaWdpbi0+ZGF0YWJhc2VJZGVudGlmaWVyKCkgKyAiLmluZGV4ZWRkYi5sZXZlbGRiIik7CisK
KyAgICBkYiA9IGxldmVsREJGYWN0b3J5LT5vcGVuTGV2ZWxEQihwYXRoLCBjb21wYXJhdG9yLmdl
dCgpKTsKKyAgICBpZiAoZGIpIHsKKyAgICAgICAgYm9vbCBrbm93biA9IGZhbHNlOworICAgICAg
ICBib29sIG9rID0gaXNTY2hlbWFLbm93bihkYi5nZXQoKSwga25vd24pOworICAgICAgICBpZiAo
IW9rKSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBoYWQgSU8gZXJyb3IgY2hl
Y2tpbmcgc2NoZW1hLCB0cmVhdGluZyBpdCBhcyBmYWlsdXJlIHRvIG9wZW4iKTsKKyAgICAgICAg
ICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4
ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVu
RmFpbGVkSU9FcnJDaGVja2luZ1NjaGVtYSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgp
OworICAgICAgICAgICAgZGIuY2xlYXIoKTsKKyAgICAgICAgfSBlbHNlIGlmICgha25vd24pIHsK
KyAgICAgICAgICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgaGFkIHVua25v
d24gc2NoZW1hLCB0cmVhdGluZyBpdCBhcyBmYWlsdXJlIHRvIG9wZW4iKTsKKyAgICAgICAgICAg
IEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWRE
Qi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuRmFp
bGVkVW5rbm93blNjaGVtYSwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAgICAg
ICAgICAgZGIuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkYikKKyAgICAg
ICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNvcmUuSW5kZXhl
ZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5T
dWNjZXNzLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1heCk7CisgICAgZWxzZSB7CisgICAg
ICAgIExPR19FUlJPUigiSW5kZXhlZERCIGJhY2tpbmcgc3RvcmUgb3BlbiBmYWlsZWQsIGF0dGVt
cHRpbmcgY2xlYW51cCIpOworICAgICAgICBib29sIHN1Y2Nlc3MgPSBsZXZlbERCRmFjdG9yeS0+
ZGVzdHJveUxldmVsREIocGF0aCk7CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAg
ICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSBjbGVhbnVwIGZhaWxlZCIpOwor
ICAgICAgICAgICAgSGlzdG9ncmFtU3VwcG9ydDo6aGlzdG9ncmFtRW51bWVyYXRpb24oIldlYkNv
cmUuSW5kZXhlZERCLkJhY2tpbmdTdG9yZS5PcGVuU3RhdHVzIiwgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZU9wZW5DbGVhbnVwRGVzdHJveUZhaWxlZCwgSURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5N
YXgpOworICAgICAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOwor
ICAgICAgICB9CisKKyAgICAgICAgTE9HX0VSUk9SKCJJbmRleGVkREIgYmFja2luZyBzdG9yZSBj
bGVhbnVwIHN1Y2NlZWRlZCwgcmVvcGVuaW5nIik7CisgICAgICAgIGRiID0gbGV2ZWxEQkZhY3Rv
cnktPm9wZW5MZXZlbERCKHBhdGgsIGNvbXBhcmF0b3IuZ2V0KCkpOworICAgICAgICBpZiAoIWRi
KSB7CisgICAgICAgICAgICBMT0dfRVJST1IoIkluZGV4ZWREQiBiYWNraW5nIHN0b3JlIHJlb3Bl
biBhZnRlciByZWNvdmVyeSBmYWlsZWQiKTsKKyAgICAgICAgICAgIEhpc3RvZ3JhbVN1cHBvcnQ6
Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3Bl
blN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlbkZhaWxlZCwg
SURCTGV2ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAgICAgICAgICAgcmV0dXJuIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOworICAgICAgICB9CisgICAgICAgIEhpc3RvZ3JhbVN1
cHBvcnQ6Omhpc3RvZ3JhbUVudW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3Rv
cmUuT3BlblN0YXR1cyIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuQ2xlYW51cFJlb3BlblN1
Y2Nlc3MsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICB9CisKKyAgICBpZiAo
IWRiKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBIaXN0b2dyYW1T
dXBwb3J0OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0
b3JlLk9wZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3BlbkZhaWxlZFVua25vd25F
cnIsIElEQkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWF4KTsKKyAgICAgICAgcmV0dXJuIFBhc3NS
ZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGUoZmls
ZUlkZW50aWZpZXIsIGRiLnJlbGVhc2UoKSwgY29tcGFyYXRvci5yZWxlYXNlKCkpOworfQorCitQ
YXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gSURCQmFja2luZ1N0b3JlOjpvcGVuSW5NZW1vcnko
U2VjdXJpdHlPcmlnaW4qIHNlY3VyaXR5T3JpZ2luLCBjb25zdCBTdHJpbmcmIGlkZW50aWZpZXIp
Cit7CisgICAgRGVmYXVsdExldmVsREJGYWN0b3J5IGxldmVsREJGYWN0b3J5OworICAgIHJldHVy
biBJREJCYWNraW5nU3RvcmU6Om9wZW5Jbk1lbW9yeShzZWN1cml0eU9yaWdpbiwgaWRlbnRpZmll
ciwgJmxldmVsREJGYWN0b3J5KTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU+IElE
QkJhY2tpbmdTdG9yZTo6b3BlbkluTWVtb3J5KFNlY3VyaXR5T3JpZ2luKiwgY29uc3QgU3RyaW5n
JiBpZGVudGlmaWVyLCBMZXZlbERCRmFjdG9yeSopCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNr
aW5nU3RvcmU6Om9wZW5Jbk1lbW9yeSIpOworCisgICAgT3duUHRyPExldmVsREJDb21wYXJhdG9y
PiBjb21wYXJhdG9yID0gYWRvcHRQdHIobmV3IENvbXBhcmF0b3IoKSk7CisgICAgT3duUHRyPExl
dmVsREJEYXRhYmFzZT4gZGIgPSBMZXZlbERCRGF0YWJhc2U6Om9wZW5Jbk1lbW9yeShjb21wYXJh
dG9yLmdldCgpKTsKKyAgICBpZiAoIWRiKSB7CisgICAgICAgIExPR19FUlJPUigiTGV2ZWxEQkRh
dGFiYXNlOjpvcGVuSW5NZW1vcnkgZmFpbGVkLiIpOworICAgICAgICBIaXN0b2dyYW1TdXBwb3J0
OjpoaXN0b2dyYW1FbnVtZXJhdGlvbigiV2ViQ29yZS5JbmRleGVkREIuQmFja2luZ1N0b3JlLk9w
ZW5TdGF0dXMiLCBJREJMZXZlbERCQmFja2luZ1N0b3JlT3Blbk1lbW9yeUZhaWxlZCwgSURCTGV2
ZWxEQkJhY2tpbmdTdG9yZU9wZW5NYXgpOworICAgICAgICByZXR1cm4gUGFzc1JlZlB0cjxJREJC
YWNraW5nU3RvcmU+KCk7CisgICAgfQorICAgIEhpc3RvZ3JhbVN1cHBvcnQ6Omhpc3RvZ3JhbUVu
dW1lcmF0aW9uKCJXZWJDb3JlLkluZGV4ZWREQi5CYWNraW5nU3RvcmUuT3BlblN0YXR1cyIsIElE
QkxldmVsREJCYWNraW5nU3RvcmVPcGVuTWVtb3J5U3VjY2VzcywgSURCTGV2ZWxEQkJhY2tpbmdT
dG9yZU9wZW5NYXgpOworCisgICAgcmV0dXJuIGNyZWF0ZShpZGVudGlmaWVyLCBkYi5yZWxlYXNl
KCksIGNvbXBhcmF0b3IucmVsZWFzZSgpKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3Rv
cmU+IElEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlKGNvbnN0IFN0cmluZyYgaWRlbnRpZmllciwgUGFz
c093blB0cjxMZXZlbERCRGF0YWJhc2U+IGRiLCBQYXNzT3duUHRyPExldmVsREJDb21wYXJhdG9y
PiBjb21wYXJhdG9yKQoreworICAgIC8vIEZJWE1FOiBIYW5kbGUgY29tcGFyYXRvciBuYW1lIGNo
YW5nZXMuCisgICAgUmVmUHRyPElEQkJhY2tpbmdTdG9yZT4gYmFja2luZ1N0b3JlKGFkb3B0UmVm
KG5ldyBJREJCYWNraW5nU3RvcmUoaWRlbnRpZmllciwgZGIsIGNvbXBhcmF0b3IpKSk7CisKKyAg
ICBpZiAoIXNldFVwTWV0YWRhdGEoYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpLCBpZGVudGlmaWVy
KSkKKyAgICAgICAgcmV0dXJuIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlPigpOworCisgICAg
cmV0dXJuIGJhY2tpbmdTdG9yZS5yZWxlYXNlKCk7Cit9CisKK1ZlY3RvcjxTdHJpbmc+IElEQkJh
Y2tpbmdTdG9yZTo6Z2V0RGF0YWJhc2VOYW1lcygpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZm91
bmROYW1lczsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RhcnRLZXkgPSBEYXRhYmFzZU5hbWVL
ZXk6OmVuY29kZU1pbktleUZvck9yaWdpbihtX2lkZW50aWZpZXIpOworICAgIGNvbnN0IFZlY3Rv
cjxjaGFyPiBzdG9wS2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGVTdG9wS2V5Rm9yT3JpZ2lu
KG1faWRlbnRpZmllcik7CisKKyAgICBBU1NFUlQoZm91bmROYW1lcy5pc0VtcHR5KCkpOworCisg
ICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBtX2RiLT5jcmVhdGVJdGVyYXRvcigpOwor
ICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlz
KGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+bmV4dCgpKSB7CisgICAgICAgIGNvbnN0IGNo
YXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAgY29uc3QgY2hhciogbGltaXQgPSBp
dC0+a2V5KCkuZW5kKCk7CisKKyAgICAgICAgRGF0YWJhc2VOYW1lS2V5IGRhdGFiYXNlTmFtZUtl
eTsKKyAgICAgICAgcCA9IERhdGFiYXNlTmFtZUtleTo6ZGVjb2RlKHAsIGxpbWl0LCAmZGF0YWJh
c2VOYW1lS2V5KTsKKyAgICAgICAgQVNTRVJUKHApOworCisgICAgICAgIGZvdW5kTmFtZXMuYXBw
ZW5kKGRhdGFiYXNlTmFtZUtleS5kYXRhYmFzZU5hbWUoKSk7CisgICAgfQorICAgIHJldHVybiBm
b3VuZE5hbWVzOworfQorCitib29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0SURCRGF0YWJhc2VNZXRh
RGF0YShjb25zdCBTdHJpbmcmIG5hbWUsIElEQkRhdGFiYXNlTWV0YWRhdGEqIG1ldGFkYXRhLCBi
b29sJiBmb3VuZCkKK3sKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1l
S2V5OjplbmNvZGUobV9pZGVudGlmaWVyLCBuYW1lKTsKKyAgICBmb3VuZCA9IGZhbHNlOworCisg
ICAgYm9vbCBvayA9IGdldEludChtX2RiLmdldCgpLCBrZXksIG1ldGFkYXRhLT5pZCwgZm91bmQp
OworICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXRJREJEYXRh
YmFzZU1ldGFEYXRhKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWZv
dW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG9rID0gZ2V0U3RyaW5nKG1fZGIuZ2V0
KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS0+aWQsIERhdGFiYXNlTWV0
YURhdGFLZXk6OlVzZXJWZXJzaW9uKSwgbWV0YWRhdGEtPnZlcnNpb24sIGZvdW5kKTsKKyAgICBp
ZiAoIW9rKSB7CisgICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0SURCRGF0YWJhc2VNZXRh
RGF0YSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgewor
ICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRJREJEYXRhYmFzZU1ldGFEYXRh
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG9rID0gZ2V0VmFySW50KG1f
ZGIuZ2V0KCksIERhdGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShtZXRhZGF0YS0+aWQsIERhdGFi
YXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgbWV0YWRhdGEtPmludFZlcnNpb24sIGZv
dW5kKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0SURC
RGF0YWJhc2VNZXRhRGF0YSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KCFmb3VuZCkgeworICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRJREJEYXRh
YmFzZU1ldGFEYXRhKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICht
ZXRhZGF0YS0+aW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1ldGFkYXRhOjpEZWZhdWx0SW50VmVy
c2lvbikKKyAgICAgICAgbWV0YWRhdGEtPmludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRh
OjpOb0ludFZlcnNpb247CisKKyAgICBvayA9IGdldE1heE9iamVjdFN0b3JlSWQobV9kYi5nZXQo
KSwgbWV0YWRhdGEtPmlkLCBtZXRhZGF0YS0+bWF4T2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFv
aykgeworICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9SKEdldElEQkRhdGFiYXNlTWV0YURhdGEp
OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisK
K1dBUk5fVU5VU0VEX1JFVFVSTiBzdGF0aWMgYm9vbCBnZXROZXdEYXRhYmFzZUlkKExldmVsREJE
YXRhYmFzZSogZGIsIGludDY0X3QmIG5ld0lkKQoreworICAgIFJlZlB0cjxMZXZlbERCVHJhbnNh
Y3Rpb24+IHRyYW5zYWN0aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9uOjpjcmVhdGUoZGIpOworCisg
ICAgbmV3SWQgPSAtMTsKKyAgICBpbnQ2NF90IG1heERhdGFiYXNlSWQgPSAtMTsKKyAgICBib29s
IGZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBvayA9IGdldEludCh0cmFuc2FjdGlvbi5nZXQoKSwg
TWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIG1heERhdGFiYXNlSWQsIGZvdW5kKTsKKyAgICBp
ZiAoIW9rKSB7CisgICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoR2V0TmV3RGF0YWJhc2VJZCk7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAg
bWF4RGF0YWJhc2VJZCA9IDA7CisKKyAgICBBU1NFUlQobWF4RGF0YWJhc2VJZCA+PSAwKTsKKwor
ICAgIGludDY0X3QgZGF0YWJhc2VJZCA9IG1heERhdGFiYXNlSWQgKyAxOworICAgIHB1dEludCh0
cmFuc2FjdGlvbi5nZXQoKSwgTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCksIGRhdGFiYXNlSWQp
OworICAgIGlmICghdHJhbnNhY3Rpb24tPmNvbW1pdCgpKSB7CisgICAgICAgIElOVEVSTkFMX1dS
SVRFX0VSUk9SKEdldE5ld0RhdGFiYXNlSWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIG5ld0lkID0gZGF0YWJhc2VJZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJ
REJCYWNraW5nU3RvcmU6OmNyZWF0ZUlEQkRhdGFiYXNlTWV0YURhdGEoY29uc3QgU3RyaW5nJiBu
YW1lLCBjb25zdCBTdHJpbmcmIHZlcnNpb24sIGludDY0X3QgaW50VmVyc2lvbiwgaW50NjRfdCYg
cm93SWQpCit7CisgICAgYm9vbCBvayA9IGdldE5ld0RhdGFiYXNlSWQobV9kYi5nZXQoKSwgcm93
SWQpOworICAgIGlmICghb2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBBU1NFUlQocm93
SWQgPj0gMCk7CisKKyAgICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1ldGFkYXRhOjpO
b0ludFZlcnNpb24pCisgICAgICAgIGludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFkYXRhOjpE
ZWZhdWx0SW50VmVyc2lvbjsKKworICAgIFJlZlB0cjxMZXZlbERCVHJhbnNhY3Rpb24+IHRyYW5z
YWN0aW9uID0gTGV2ZWxEQlRyYW5zYWN0aW9uOjpjcmVhdGUobV9kYi5nZXQoKSk7CisgICAgcHV0
SW50KHRyYW5zYWN0aW9uLmdldCgpLCBEYXRhYmFzZU5hbWVLZXk6OmVuY29kZShtX2lkZW50aWZp
ZXIsIG5hbWUpLCByb3dJZCk7CisgICAgcHV0U3RyaW5nKHRyYW5zYWN0aW9uLmdldCgpLCBEYXRh
YmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJW
ZXJzaW9uKSwgdmVyc2lvbik7CisgICAgcHV0VmFySW50KHRyYW5zYWN0aW9uLmdldCgpLCBEYXRh
YmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERhdGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJ
bnRWZXJzaW9uKSwgaW50VmVyc2lvbik7CisgICAgaWYgKCF0cmFuc2FjdGlvbi0+Y29tbWl0KCkp
IHsKKyAgICAgICAgSU5URVJOQUxfV1JJVEVfRVJST1IoQ3JlYXRlSURCRGF0YWJhc2VNZXRhRGF0
YSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgSURCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZUludFZlcnNpb24oSURCQmFj
a2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3Qgcm93SWQsIGludDY0
X3QgaW50VmVyc2lvbikKK3sKKyAgICBpZiAoaW50VmVyc2lvbiA9PSBJREJEYXRhYmFzZU1ldGFk
YXRhOjpOb0ludFZlcnNpb24pCisgICAgICAgIGludFZlcnNpb24gPSBJREJEYXRhYmFzZU1ldGFk
YXRhOjpEZWZhdWx0SW50VmVyc2lvbjsKKyAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGludFZlcnNp
b24gPj0gMCwgImludFZlcnNpb24gd2FzICVsbGQiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KGlu
dFZlcnNpb24pKTsKKyAgICBwdXRWYXJJbnQoVHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlv
bkZyb20odHJhbnNhY3Rpb24pLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUocm93SWQsIERh
dGFiYXNlTWV0YURhdGFLZXk6OlVzZXJJbnRWZXJzaW9uKSwgaW50VmVyc2lvbik7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFja2luZ1N0b3JlOjp1cGRhdGVJREJEYXRhYmFzZU1l
dGFEYXRhKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90
IHJvd0lkLCBjb25zdCBTdHJpbmcmIHZlcnNpb24pCit7CisgICAgcHV0U3RyaW5nKFRyYW5zYWN0
aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKSwgRGF0YWJhc2VNZXRhRGF0
YUtleTo6ZW5jb2RlKHJvd0lkLCBEYXRhYmFzZU1ldGFEYXRhS2V5OjpVc2VyVmVyc2lvbiksIHZl
cnNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBkZWxldGVSYW5nZShM
ZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGJlZ2lu
LCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuZCkKK3sKKyAgICBPd25QdHI8TGV2ZWxEQkl0ZXJhdG9y
PiBpdCA9IHRyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworICAgIGZvciAoaXQtPnNlZWso
YmVnaW4pOyBpdC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgZW5kKSA8IDA7
IGl0LT5uZXh0KCkpCisgICAgICAgIHRyYW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKK30K
KworCitib29sIElEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlRGF0YWJhc2UoY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpkZWxldGVEYXRhYmFzZSIp
OworICAgIE93blB0cjxMZXZlbERCV3JpdGVPbmx5VHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9uID0g
TGV2ZWxEQldyaXRlT25seVRyYW5zYWN0aW9uOjpjcmVhdGUobV9kYi5nZXQoKSk7CisKKyAgICBJ
REJEYXRhYmFzZU1ldGFkYXRhIG1ldGFkYXRhOworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwor
ICAgIGJvb2wgb2sgPSBnZXRJREJEYXRhYmFzZU1ldGFEYXRhKG5hbWUsICZtZXRhZGF0YSwgc3Vj
Y2Vzcyk7CisgICAgaWYgKCFvaykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICghc3Vj
Y2VzcykKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3Rh
cnRLZXkgPSBEYXRhYmFzZU1ldGFEYXRhS2V5OjplbmNvZGUobWV0YWRhdGEuaWQsIERhdGFiYXNl
TWV0YURhdGFLZXk6Ok9yaWdpbk5hbWUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5
ID0gRGF0YWJhc2VNZXRhRGF0YUtleTo6ZW5jb2RlKG1ldGFkYXRhLmlkICsgMSwgRGF0YWJhc2VN
ZXRhRGF0YUtleTo6T3JpZ2luTmFtZSk7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQg
PSBtX2RiLT5jcmVhdGVJdGVyYXRvcigpOworICAgIGZvciAoaXQtPnNlZWsoc3RhcnRLZXkpOyBp
dC0+aXNWYWxpZCgpICYmIGNvbXBhcmVLZXlzKGl0LT5rZXkoKSwgc3RvcEtleSkgPCAwOyBpdC0+
bmV4dCgpKQorICAgICAgICB0cmFuc2FjdGlvbi0+cmVtb3ZlKGl0LT5rZXkoKSk7CisKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4ga2V5ID0gRGF0YWJhc2VOYW1lS2V5OjplbmNvZGUobV9pZGVudGlm
aWVyLCBuYW1lKTsKKyAgICB0cmFuc2FjdGlvbi0+cmVtb3ZlKGtleSk7CisKKyAgICBpZiAoIXRy
YW5zYWN0aW9uLT5jb21taXQoKSkgeworICAgICAgICBJTlRFUk5BTF9XUklURV9FUlJPUihEZWxl
dGVEYXRhYmFzZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK3N0YXRpYyBib29sIGNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUoY29u
c3QgTGV2ZWxEQkl0ZXJhdG9yKiBpdCwgY29uc3QgVmVjdG9yPGNoYXI+JiBzdG9wS2V5LCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgbWV0YURhdGFUeXBlKQoreworICAgIGlmICghaXQt
PmlzVmFsaWQoKSB8fCBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpID49IDApCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIE9iamVjdFN0b3JlTWV0YURhdGFLZXkgbWV0YURhdGFL
ZXk7CisgICAgY29uc3QgY2hhciogcCA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmRlY29kZShp
dC0+a2V5KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpLCAmbWV0YURhdGFLZXkpOworICAgIEFT
U0VSVF9VTlVTRUQocCwgcCk7CisgICAgaWYgKG1ldGFEYXRhS2V5Lm9iamVjdFN0b3JlSWQoKSAh
PSBvYmplY3RTdG9yZUlkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1ldGFEYXRh
S2V5Lm1ldGFEYXRhVHlwZSgpICE9IG1ldGFEYXRhVHlwZSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIHJldHVybiB0cnVlOworfQorCisvLyBGSVhNRTogVGhpcyBzaG91bGQgZG8gc29tZSBl
cnJvciBoYW5kbGluZyByYXRoZXIgdGhhbiBwbG93aW5nIGFoZWFkIHdoZW4gYmFkIGRhdGEgaXMg
ZW5jb3VudGVyZWQuCitib29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3RvcmVzKGludDY0
X3QgZGF0YWJhc2VJZCwgSURCRGF0YWJhc2VNZXRhZGF0YTo6T2JqZWN0U3RvcmVNYXAqIG9iamVj
dFN0b3JlcykKK3sKKyAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Z2V0T2JqZWN0U3Rv
cmVzIik7CisgICAgaWYgKCFLZXlQcmVmaXg6OmlzVmFsaWREYXRhYmFzZUlkKGRhdGFiYXNlSWQp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5
ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIDEsIDApOworICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBzdG9wS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5j
b2RlTWF4S2V5KGRhdGFiYXNlSWQpOworCisgICAgQVNTRVJUKG9iamVjdFN0b3Jlcy0+aXNFbXB0
eSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9kYi0+Y3JlYXRlSXRl
cmF0b3IoKTsKKyAgICBpdC0+c2VlayhzdGFydEtleSk7CisgICAgd2hpbGUgKGl0LT5pc1ZhbGlk
KCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsKKyAgICAgICAgY29u
c3QgY2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25zdCBjaGFyKiBsaW1p
dCA9IGl0LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBPYmplY3RTdG9yZU1ldGFEYXRhS2V5IG1l
dGFEYXRhS2V5OworICAgICAgICBwID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZGVjb2RlKHAs
IGxpbWl0LCAmbWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIGlmICht
ZXRhRGF0YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1l
KSB7CisgICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRPYmplY3RTdG9y
ZXMpOworICAgICAgICAgICAgLy8gUG9zc2libGUgc3RhbGUgbWV0YWRhdGEsIGJ1dCBkb24ndCBm
YWlsIHRoZSBsb2FkLgorICAgICAgICAgICAgaXQtPm5leHQoKTsKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCBvYmplY3RTdG9yZUlkID0gbWV0YURh
dGFLZXkub2JqZWN0U3RvcmVJZCgpOworCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIGJ5IGRp
cmVjdCBrZXkgbG9va3VwIHJhdGhlciB0aGFuIGl0ZXJhdGlvbiwgdG8gc2ltcGxpZnkuCisgICAg
ICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUgPSBkZWNvZGVTdHJpbmcoaXQtPnZhbHVlKCkuYmVn
aW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworCisgICAgICAgIGl0LT5uZXh0KCk7CisgICAgICAg
IGlmICghY2hlY2tPYmplY3RTdG9yZUFuZE1ldGFEYXRhVHlwZShpdC5nZXQoKSwgc3RvcEtleSwg
b2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsKKyAgICAg
ICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKEdldE9iamVjdFN0b3Jlcyk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBJREJLZXlQYXRoIGtleVBhdGggPSBk
ZWNvZGVJREJLZXlQYXRoKGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsK
KworICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRN
ZXRhRGF0YVR5cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OkF1dG9JbmNyZW1lbnQpKSB7CisgICAgICAgICAgICBJTlRFUk5BTF9DT05T
SVNURU5DWV9FUlJPUihHZXRPYmplY3RTdG9yZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgYm9vbCBhdXRvSW5jcmVtZW50ID0gZGVjb2RlQm9vbChpdC0+dmFsdWUo
KS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8g
SXMgZXZpY2F0YmxlLgorICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5
cGUoaXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OkV2aWN0YWJsZSkpIHsKKyAgICAgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9S
KEdldE9iamVjdFN0b3Jlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAg
ICAgIGl0LT5uZXh0KCk7IC8vIExhc3QgdmVyc2lvbi4KKyAgICAgICAgaWYgKCFjaGVja09iamVj
dFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBP
YmplY3RTdG9yZU1ldGFEYXRhS2V5OjpMYXN0VmVyc2lvbikpIHsKKyAgICAgICAgICAgIElOVEVS
TkFMX0NPTlNJU1RFTkNZX0VSUk9SKEdldE9iamVjdFN0b3Jlcyk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIGl0LT5uZXh0KCk7IC8vIE1heGltdW0gaW5kZXggaWQg
YWxsb2NhdGVkLgorICAgICAgICBpZiAoIWNoZWNrT2JqZWN0U3RvcmVBbmRNZXRhRGF0YVR5cGUo
aXQuZ2V0KCksIHN0b3BLZXksIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6
Ok1heEluZGV4SWQpKSB7CisgICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihH
ZXRPYmplY3RTdG9yZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
aW50NjRfdCBtYXhJbmRleElkID0gZGVjb2RlSW50KGl0LT52YWx1ZSgpLmJlZ2luKCksIGl0LT52
YWx1ZSgpLmVuZCgpKTsKKworICAgICAgICBpdC0+bmV4dCgpOyAvLyBbb3B0aW9uYWxdIGhhcyBr
ZXkgcGF0aCAoaXMgbm90IG51bGwpCisgICAgICAgIGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0
YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1l
dGFEYXRhS2V5OjpIYXNLZXlQYXRoKSkgeworICAgICAgICAgICAgYm9vbCBoYXNLZXlQYXRoID0g
ZGVjb2RlQm9vbChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisgICAg
ICAgICAgICAvLyBUaGlzIGNoZWNrIGFjY291bnRzIGZvciB0d28gbGF5ZXJzIG9mIGxlZ2FjeSBj
b2Rpbmc6CisgICAgICAgICAgICAvLyAoMSkgSW5pdGlhbGx5LCBoYXNLZXlQYXRoIHdhcyBhZGRl
ZCB0byBkaXN0aW5ndWlzaCBudWxsIHZzLiBzdHJpbmcuCisgICAgICAgICAgICAvLyAoMikgTGF0
ZXIsIG51bGwgdnMuIHN0cmluZyB2cy4gYXJyYXkgd2FzIHN0b3JlZCBpbiB0aGUga2V5UGF0aCBp
dHNlbGYuCisgICAgICAgICAgICAvLyBTbyB0aGlzIGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9y
IHN0cmluZy10eXBlIGtleVBhdGhzLgorICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoICYmIChr
ZXlQYXRoLnR5cGUoKSA9PSBJREJLZXlQYXRoOjpTdHJpbmdUeXBlICYmICFrZXlQYXRoLnN0cmlu
ZygpLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9F
UlJPUihHZXRPYmplY3RTdG9yZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgaWYgKCFoYXNLZXlQYXRoKQorICAgICAgICAgICAgICAgIGtleVBh
dGggPSBJREJLZXlQYXRoKCk7CisgICAgICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICB9CisK
KyAgICAgICAgaW50NjRfdCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyID0gLTE7CisgICAgICAg
IGlmIChjaGVja09iamVjdFN0b3JlQW5kTWV0YURhdGFUeXBlKGl0LmdldCgpLCBzdG9wS2V5LCBv
YmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpLZXlHZW5lcmF0b3JDdXJyZW50
TnVtYmVyKSkgeworICAgICAgICAgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IGRlY29k
ZUludChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisgICAgICAgICAg
ICAvLyBGSVhNRTogUmV0dXJuIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIsIGNhY2hlIGluIG9i
amVjdCBzdG9yZSwgYW5kIHdyaXRlIGxhemlseSB0byBiYWNraW5nIHN0b3JlLgorICAgICAgICAg
ICAgLy8gRm9yIG5vdywganVzdCBhc3NlcnQgdGhhdCBpZiBpdCB3YXMgd3JpdHRlbiBpdCB3YXMg
dmFsaWQuCisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGtleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXIsIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPj0gS2V5R2VuZXJhdG9ySW5pdGlhbE51bWJl
cik7CisgICAgICAgICAgICBpdC0+bmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgSURCT2Jq
ZWN0U3RvcmVNZXRhZGF0YSBtZXRhZGF0YShvYmplY3RTdG9yZU5hbWUsIG9iamVjdFN0b3JlSWQs
IGtleVBhdGgsIGF1dG9JbmNyZW1lbnQsIG1heEluZGV4SWQpOworICAgICAgICBpZiAoIWdldElu
ZGV4ZXMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgJm1ldGFkYXRhLmluZGV4ZXMpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBvYmplY3RTdG9yZXMtPnNldChvYmplY3RT
dG9yZUlkLCBtZXRhZGF0YSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitXQVJOX1VO
VVNFRF9SRVRVUk4gc3RhdGljIGJvb2wgc2V0TWF4T2JqZWN0U3RvcmVJZChMZXZlbERCVHJhbnNh
Y3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3Rv
cmVJZCkKK3sKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4T2JqZWN0U3RvcmVJZEtleSA9IERh
dGFiYXNlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBEYXRhYmFzZU1ldGFEYXRhS2V5
OjpNYXhPYmplY3RTdG9yZUlkKTsKKyAgICBpbnQ2NF90IG1heE9iamVjdFN0b3JlSWQgPSAtMTsK
KyAgICBib29sIG9rID0gZ2V0TWF4T2JqZWN0U3RvcmVJZCh0cmFuc2FjdGlvbiwgbWF4T2JqZWN0
U3RvcmVJZEtleSwgbWF4T2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJ
TlRFUk5BTF9SRUFEX0VSUk9SKFNldE1heE9iamVjdFN0b3JlSWQpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgaWYgKG9iamVjdFN0b3JlSWQgPD0gbWF4T2JqZWN0U3RvcmVJ
ZCkgeworICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihTZXRNYXhPYmplY3RTdG9y
ZUlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwdXRJbnQodHJhbnNhY3Rp
b24sIG1heE9iamVjdFN0b3JlSWRLZXksIG9iamVjdFN0b3JlSWQpOworICAgIHJldHVybiB0cnVl
OworfQorCitib29sIElEQkJhY2tpbmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUoSURCQmFja2lu
Z1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgm
IGtleVBhdGgsIGJvb2wgYXV0b0luY3JlbWVudCkKK3sKKyAgICBJREJfVFJBQ0UoIklEQkJhY2tp
bmdTdG9yZTo6Y3JlYXRlT2JqZWN0U3RvcmUiKTsKKyAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJ
ZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9y
ZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAg
IGlmICghc2V0TWF4T2JqZWN0U3RvcmVJZChsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQs
IG9iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gbmFtZUtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpOYW1lKTsKKyAgICBj
b25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpL
ZXlQYXRoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gYXV0b0luY3JlbWVudEtleSA9IE9iamVj
dFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5OjpBdXRvSW5jcmVtZW50KTsKKyAgICBjb25zdCBWZWN0b3I8Y2hh
cj4gZXZpY3RhYmxlS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OkV2aWN0YWJsZSk7Cisg
ICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURh
dGFLZXk6Okxhc3RWZXJzaW9uKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtl
eSA9IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9y
ZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpNYXhJbmRleElkKTsKKyAgICBjb25zdCBWZWN0
b3I8Y2hhcj4gaGFzS2V5UGF0aEtleSAgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6SGFzS2V5
UGF0aCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXJL
ZXkgPSBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3Rv
cmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcik7
CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG5hbWVzS2V5ID0gT2JqZWN0U3RvcmVOYW1lc0tleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG5hbWUpOworCisgICAgcHV0U3RyaW5nKGxldmVsREJUcmFuc2Fj
dGlvbiwgbmFtZUtleSwgbmFtZSk7CisgICAgcHV0SURCS2V5UGF0aChsZXZlbERCVHJhbnNhY3Rp
b24sIGtleVBhdGhLZXksIGtleVBhdGgpOworICAgIHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24s
IGF1dG9JbmNyZW1lbnRLZXksIGF1dG9JbmNyZW1lbnQpOworICAgIHB1dEludChsZXZlbERCVHJh
bnNhY3Rpb24sIGV2aWN0YWJsZUtleSwgZmFsc2UpOworICAgIHB1dEludChsZXZlbERCVHJhbnNh
Y3Rpb24sIGxhc3RWZXJzaW9uS2V5LCAxKTsKKyAgICBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9u
LCBtYXhJbmRleElkS2V5LCBNaW5pbXVtSW5kZXhJZCk7CisgICAgcHV0Qm9vbChsZXZlbERCVHJh
bnNhY3Rpb24sIGhhc0tleVBhdGhLZXksICFrZXlQYXRoLmlzTnVsbCgpKTsKKyAgICBwdXRJbnQo
bGV2ZWxEQlRyYW5zYWN0aW9uLCBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyS2V5LCBLZXlHZW5l
cmF0b3JJbml0aWFsTnVtYmVyKTsKKyAgICBwdXRJbnQobGV2ZWxEQlRyYW5zYWN0aW9uLCBuYW1l
c0tleSwgb2JqZWN0U3RvcmVJZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFj
a2luZ1N0b3JlOjpkZWxldGVPYmplY3RTdG9yZShJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9u
KiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQp
Cit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OmRlbGV0ZU9iamVjdFN0b3JlIik7
CisgICAgaWYgKCFLZXlQcmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERC
VHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNh
Y3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWU7Cisg
ICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGJvb2wgb2sgPSBnZXRTdHJpbmcobGV2ZWxEQlRy
YW5zYWN0aW9uLCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6TmFtZSksIG9iamVjdFN0b3JlTmFt
ZSwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihE
ZWxldGVPYmplY3RTdG9yZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYg
KCFmb3VuZCkgeworICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihEZWxldGVPYmpl
Y3RTdG9yZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkZWxldGVSYW5n
ZShsZXZlbERCVHJhbnNhY3Rpb24sIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZShkYXRh
YmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwKSwgT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2Rl
TWF4S2V5KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKTsKKworICAgIGxldmVsREJUcmFuc2Fj
dGlvbi0+cmVtb3ZlKE9iamVjdFN0b3JlTmFtZXNLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZU5hbWUpKTsKKworICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgSW5k
ZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDApLCBJbmRl
eEZyZWVMaXN0S2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpOwor
ICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgSW5kZXhNZXRhRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIDAsIDApLCBJbmRleE1ldGFEYXRhS2V5Ojpl
bmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpOworCisgICAgcmV0dXJuIGNs
ZWFyT2JqZWN0U3RvcmUodHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpOwor
fQorCitib29sIElEQkJhY2tpbmdTdG9yZTo6Z2V0UmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJh
bnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiBrZXksIFZlY3RvcjxjaGFyPiYgcmVjb3JkKQoreworICAg
IElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpnZXRSZWNvcmQiKTsKKyAgICBpZiAoIUtleVBy
ZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElE
QkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNh
Y3Rpb24pOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworCisgICAgcmVjb3JkLmNsZWFyKCk7CisKKyAgICBib29sIGZvdW5k
ID0gZmFsc2U7CisgICAgYm9vbCBvayA9IGxldmVsREJUcmFuc2FjdGlvbi0+c2FmZUdldChsZXZl
bGRiS2V5LCBkYXRhLCBmb3VuZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJTlRFUk5BTF9S
RUFEX0VSUk9SKEdldFJlY29yZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAg
aWYgKCFmb3VuZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpbnQ2NF90IHZlcnNpb247
CisgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludChkYXRhLmJlZ2luKCksIGRhdGEuZW5k
KCksIHZlcnNpb24pOworICAgIGlmICghcCkgeworICAgICAgICBJTlRFUk5BTF9SRUFEX0VSUk9S
KEdldFJlY29yZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZWNvcmQu
YXBwZW5kUmFuZ2UocCwgc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEuZW5kKCkpKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworV0FSTl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIGdldE5l
d1ZlcnNpb25OdW1iZXIoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QmIG5ld1ZlcnNpb25OdW1i
ZXIpCit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxhc3RWZXJzaW9uS2V5ID0gT2JqZWN0U3Rv
cmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIE9iamVjdFN0
b3JlTWV0YURhdGFLZXk6Okxhc3RWZXJzaW9uKTsKKworICAgIG5ld1ZlcnNpb25OdW1iZXIgPSAt
MTsKKyAgICBpbnQ2NF90IGxhc3RWZXJzaW9uID0gLTE7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNl
OworICAgIGJvb2wgb2sgPSBnZXRJbnQodHJhbnNhY3Rpb24sIGxhc3RWZXJzaW9uS2V5LCBsYXN0
VmVyc2lvbiwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9F
UlJPUihHZXROZXdWZXJzaW9uTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
KyAgICBpZiAoIWZvdW5kKQorICAgICAgICBsYXN0VmVyc2lvbiA9IDA7CisKKyAgICBBU1NFUlQo
bGFzdFZlcnNpb24gPj0gMCk7CisKKyAgICBpbnQ2NF90IHZlcnNpb24gPSBsYXN0VmVyc2lvbiAr
IDE7CisgICAgcHV0SW50KHRyYW5zYWN0aW9uLCBsYXN0VmVyc2lvbktleSwgdmVyc2lvbik7CisK
KyAgICBBU1NFUlQodmVyc2lvbiA+IGxhc3RWZXJzaW9uKTsgLy8gRklYTUU6IFRoaW5rIGFib3V0
IGhvdyB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgb3ZlcmZsb3cgc2NlbmFyaW8uCisKKyAgICBuZXdW
ZXJzaW9uTnVtYmVyID0gdmVyc2lvbjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJC
YWNraW5nU3RvcmU6OnB1dFJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFu
c2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0
IElEQktleSYga2V5LCBQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gcHJwVmFsdWUsIFJlY29yZElk
ZW50aWZpZXIqIHJlY29yZElkZW50aWZpZXIpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5n
U3RvcmU6OnB1dFJlY29yZCIpOworICAgIGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhkYXRhYmFz
ZUlkLCBvYmplY3RTdG9yZUlkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChr
ZXkuaXNWYWxpZCgpKTsKKworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0
aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJv
bSh0cmFuc2FjdGlvbik7CisgICAgaW50NjRfdCB2ZXJzaW9uID0gLTE7CisgICAgYm9vbCBvayA9
IGdldE5ld1ZlcnNpb25OdW1iZXIobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCB2ZXJzaW9uKTsKKyAgICBpZiAoIW9rKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgQVNTRVJUKHZlcnNpb24gPj0gMCk7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IG9iamVj
dFN0b3JlZGF0YUtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9i
amVjdFN0b3JlSWQsIGtleSk7CisKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICB2LmFwcGVuZFZl
Y3RvcihlbmNvZGVWYXJJbnQodmVyc2lvbikpOworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IHZh
bHVlID0gcHJwVmFsdWU7CisgICAgQVNTRVJUKHZhbHVlKTsKKyAgICB2LmFwcGVuZCh2YWx1ZS0+
ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKworICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cHV0KG9i
amVjdFN0b3JlZGF0YUtleSwgdik7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gZXhpc3RzRW50
cnlLZXkgPSBFeGlzdHNFbnRyeUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGtleSk7CisgICAgbGV2ZWxEQlRyYW5zYWN0aW9uLT5wdXQoZXhpc3RzRW50cnlLZXksIGVuY29k
ZUludCh2ZXJzaW9uKSk7CisKKyAgICByZWNvcmRJZGVudGlmaWVyLT5yZXNldChlbmNvZGVJREJL
ZXkoa2V5KSwgdmVyc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFja2lu
Z1N0b3JlOjpjbGVhck9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRy
YW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sK
KyAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Y2xlYXJPYmplY3RTdG9yZSIpOworICAg
IGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5z
YWN0aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9u
RnJvbSh0cmFuc2FjdGlvbik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0YXJ0S2V5ID0gS2V5
UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpLmVuY29kZSgpOworICAgIGNvbnN0IFZl
Y3RvcjxjaGFyPiBzdG9wS2V5ID0gS2V5UHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQg
KyAxKS5lbmNvZGUoKTsKKworICAgIGRlbGV0ZVJhbmdlKGxldmVsREJUcmFuc2FjdGlvbiwgc3Rh
cnRLZXksIHN0b3BLZXkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElEQkJhY2tpbmdT
dG9yZTo6ZGVsZXRlUmVjb3JkKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0
aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgUmVj
b3JkSWRlbnRpZmllciYgcmVjb3JkSWRlbnRpZmllcikKK3sKKyAgICBJREJfVFJBQ0UoIklEQkJh
Y2tpbmdTdG9yZTo6ZGVsZXRlUmVjb3JkIik7CisgICAgaWYgKCFLZXlQcmVmaXg6OnZhbGlkSWRz
KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
TGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6
OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKworICAg
IGNvbnN0IFZlY3RvcjxjaGFyPiBvYmplY3RTdG9yZURhdGFLZXkgPSBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCByZWNvcmRJZGVudGlmaWVyLnBy
aW1hcnlLZXkoKSk7CisgICAgbGV2ZWxEQlRyYW5zYWN0aW9uLT5yZW1vdmUob2JqZWN0U3RvcmVE
YXRhS2V5KTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBleGlzdHNFbnRyeUtleSA9IEV4aXN0
c0VudHJ5S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgcmVjb3JkSWRlbnRp
Zmllci5wcmltYXJ5S2V5KCkpOworICAgIGxldmVsREJUcmFuc2FjdGlvbi0+cmVtb3ZlKGV4aXN0
c0VudHJ5S2V5KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIElEQkJhY2tpbmdTdG9y
ZTo6Z2V0S2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcihJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QmIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIpCit7CisgICAgaWYgKCFLZXlQ
cmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJ
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5z
YWN0aW9uKTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVt
YmVyS2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXIpOworCisgICAga2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IC0xOworICAgIFZlY3Rvcjxj
aGFyPiBkYXRhOworCisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGJvb2wgb2sgPSBsZXZl
bERCVHJhbnNhY3Rpb24tPnNhZmVHZXQoa2V5R2VuZXJhdG9yQ3VycmVudE51bWJlcktleSwgZGF0
YSwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihH
ZXRLZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKyAgICBpZiAoZm91bmQpCisgICAgICAgIGtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIgPSBk
ZWNvZGVJbnQoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
Ly8gUHJldmlvdXNseSwgdGhlIGtleSBnZW5lcmF0b3Igc3RhdGUgd2FzIG5vdCBzdG9yZWQgZXhw
bGljaXRseSBidXQgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAvLyBtYXhpbXVtIG51bWVyaWMg
a2V5IHByZXNlbnQgaW4gZXhpc3RpbmcgZGF0YS4gVGhpcyB2aW9sYXRlcyB0aGUgc3BlYyBhcyB0
aGUgZGF0YSBtYXkKKyAgICAgICAgLy8gYmUgY2xlYXJlZCBidXQgdGhlIGtleSBnZW5lcmF0b3Ig
c3RhdGUgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgICAgICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFy
dEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3Jl
SWQsIG1pbklEQktleSgpKTsKKyAgICAgICAgY29uc3QgVmVjdG9yPGNoYXI+IHN0b3BLZXkgPSBP
YmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBtYXhJ
REJLZXkoKSk7CisKKyAgICAgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSBsZXZlbERC
VHJhbnNhY3Rpb24tPmNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgICAgIGludDY0X3QgbWF4TnVtZXJp
Y0tleSA9IDA7CisKKyAgICAgICAgZm9yIChpdC0+c2VlayhzdGFydEtleSk7IGl0LT5pc1ZhbGlk
KCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDA7IGl0LT5uZXh0KCkpIHsK
KyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBpdC0+a2V5KCkuYmVnaW4oKTsKKyAgICAgICAg
ICAgIGNvbnN0IGNoYXIqIGxpbWl0ID0gaXQtPmtleSgpLmVuZCgpOworCisgICAgICAgICAgICBP
YmplY3RTdG9yZURhdGFLZXkgZGF0YUtleTsKKyAgICAgICAgICAgIHAgPSBPYmplY3RTdG9yZURh
dGFLZXk6OmRlY29kZShwLCBsaW1pdCwgJmRhdGFLZXkpOworICAgICAgICAgICAgQVNTRVJUKHAp
OworCisgICAgICAgICAgICBpZiAoZGF0YUtleS51c2VyS2V5KCktPnR5cGUoKSA9PSBJREJLZXk6
Ok51bWJlclR5cGUpIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDxp
bnQ2NF90PihkYXRhS2V5LnVzZXJLZXkoKS0+bnVtYmVyKCkpOworICAgICAgICAgICAgICAgIGlm
IChuID4gbWF4TnVtZXJpY0tleSkKKyAgICAgICAgICAgICAgICAgICAgbWF4TnVtZXJpY0tleSA9
IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBrZXlHZW5lcmF0b3JDdXJy
ZW50TnVtYmVyID0gbWF4TnVtZXJpY0tleSArIDE7CisgICAgfQorCisgICAgcmV0dXJuIGtleUdl
bmVyYXRvckN1cnJlbnROdW1iZXI7Cit9CisKK2Jvb2wgSURCQmFja2luZ1N0b3JlOjptYXliZVVw
ZGF0ZUtleUdlbmVyYXRvckN1cnJlbnROdW1iZXIoSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlv
biogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IG5ld051bWJlciwgYm9vbCBjaGVja0N1cnJlbnQpCit7CisgICAgaWYgKCFLZXlQ
cmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9uKiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJ
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZlbERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5z
YWN0aW9uKTsKKworICAgIGlmIChjaGVja0N1cnJlbnQpIHsKKyAgICAgICAgaW50NjRfdCBjdXJy
ZW50TnVtYmVyOworICAgICAgICBib29sIG9rID0gZ2V0S2V5R2VuZXJhdG9yQ3VycmVudE51bWJl
cih0cmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgY3VycmVudE51bWJlcik7
CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
IChuZXdOdW1iZXIgPD0gY3VycmVudE51bWJlcikKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBrZXlHZW5lcmF0b3JDdXJyZW50TnVtYmVy
S2V5ID0gT2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OktleUdlbmVyYXRvckN1cnJlbnROdW1iZXIp
OworICAgIHB1dEludChsZXZlbERCVHJhbnNhY3Rpb24sIGtleUdlbmVyYXRvckN1cnJlbnROdW1i
ZXJLZXksIG5ld051bWJlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFja2lu
Z1N0b3JlOjprZXlFeGlzdHNJbk9iamVjdFN0b3JlKElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rp
b24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgSURCS2V5JiBrZXksIFJlY29yZElkZW50aWZpZXIqIGZvdW5kUmVjb3JkSWRlbnRp
ZmllciwgYm9vbCYgZm91bmQpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6Omtl
eUV4aXN0c0luT2JqZWN0U3RvcmUiKTsKKyAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBmb3Vu
ZCA9IGZhbHNlOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9uID0g
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFu
c2FjdGlvbik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJLZXkgPSBPYmplY3RTdG9y
ZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBrZXkpOworICAgIFZl
Y3RvcjxjaGFyPiBkYXRhOworCisgICAgYm9vbCBvayA9IGxldmVsREJUcmFuc2FjdGlvbi0+c2Fm
ZUdldChsZXZlbGRiS2V5LCBkYXRhLCBmb3VuZCk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJ
TlRFUk5BTF9SRUFEX0VSUk9SKEtleUV4aXN0c0luT2JqZWN0U3RvcmUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZm91bmQpCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgaW50NjRfdCB2ZXJzaW9uOworICAgIGlmICghZGVjb2RlVmFySW50KGRhdGEuYmVnaW4o
KSwgZGF0YS5lbmQoKSwgdmVyc2lvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZv
dW5kUmVjb3JkSWRlbnRpZmllci0+cmVzZXQoZW5jb2RlSURCS2V5KGtleSksIHZlcnNpb24pOwor
ICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBjaGVja0luZGV4QW5kTWV0YURhdGFL
ZXkoY29uc3QgTGV2ZWxEQkl0ZXJhdG9yKiBpdCwgY29uc3QgVmVjdG9yPGNoYXI+JiBzdG9wS2V5
LCBpbnQ2NF90IGluZGV4SWQsIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQoreworICAgIGlm
ICghaXQtPmlzVmFsaWQoKSB8fCBjb21wYXJlS2V5cyhpdC0+a2V5KCksIHN0b3BLZXkpID49IDAp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEluZGV4TWV0YURhdGFLZXkgbWV0YURhdGFL
ZXk7CisgICAgY29uc3QgY2hhciogcCA9IEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShpdC0+a2V5
KCkuYmVnaW4oKSwgaXQtPmtleSgpLmVuZCgpLCAmbWV0YURhdGFLZXkpOworICAgIEFTU0VSVF9V
TlVTRUQocCwgcCk7CisgICAgaWYgKG1ldGFEYXRhS2V5LmluZGV4SWQoKSAhPSBpbmRleElkKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1ldGFEYXRhS2V5Lm1ldGFEYXRhVHlwZSgp
ICE9IG1ldGFEYXRhVHlwZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVl
OworfQorCisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBkbyBzb21lIGVycm9yIGhhbmRsaW5nIHJh
dGhlciB0aGFuIHBsb3dpbmcgYWhlYWQgd2hlbiBiYWQgZGF0YSBpcyBlbmNvdW50ZXJlZC4KK2Jv
b2wgSURCQmFja2luZ1N0b3JlOjpnZXRJbmRleGVzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRf
dCBvYmplY3RTdG9yZUlkLCBJREJPYmplY3RTdG9yZU1ldGFkYXRhOjpJbmRleE1hcCogaW5kZXhl
cykKK3sKKyAgICBJREJfVFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6Z2V0SW5kZXhlcyIpOworICAg
IGlmICghS2V5UHJlZml4Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBzdGFydEtleSA9IElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCAwLCAwKTsK
KyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gc3RvcEtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29k
ZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkICsgMSwgMCwgMCk7CisKKyAgICBBU1NFUlQoaW5k
ZXhlcy0+aXNFbXB0eSgpKTsKKworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbV9k
Yi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBpdC0+c2VlayhzdGFydEtleSk7CisgICAgd2hpbGUg
KGl0LT5pc1ZhbGlkKCkgJiYgY29tcGFyZUtleXMoaXQtPmtleSgpLCBzdG9wS2V5KSA8IDApIHsK
KyAgICAgICAgY29uc3QgY2hhciogcCA9IGl0LT5rZXkoKS5iZWdpbigpOworICAgICAgICBjb25z
dCBjaGFyKiBsaW1pdCA9IGl0LT5rZXkoKS5lbmQoKTsKKworICAgICAgICBJbmRleE1ldGFEYXRh
S2V5IG1ldGFEYXRhS2V5OworICAgICAgICBwID0gSW5kZXhNZXRhRGF0YUtleTo6ZGVjb2RlKHAs
IGxpbWl0LCAmbWV0YURhdGFLZXkpOworICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIGlmICht
ZXRhRGF0YUtleS5tZXRhRGF0YVR5cGUoKSAhPSBJbmRleE1ldGFEYXRhS2V5OjpOYW1lKSB7Cisg
ICAgICAgICAgICBJTlRFUk5BTF9DT05TSVNURU5DWV9FUlJPUihHZXRJbmRleGVzKTsKKyAgICAg
ICAgICAgIC8vIFBvc3NpYmxlIHN0YWxlIG1ldGFkYXRhIGR1ZSB0byBodHRwOi8vd2Via2l0Lm9y
Zy9iLzg1NTU3IGJ1dCBkb24ndCBmYWlsIHRoZSBsb2FkLgorICAgICAgICAgICAgaXQtPm5leHQo
KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRklYTUU6
IERvIHRoaXMgYnkgZGlyZWN0IGtleSBsb29rdXAgcmF0aGVyIHRoYW4gaXRlcmF0aW9uLCB0byBz
aW1wbGlmeS4KKyAgICAgICAgaW50NjRfdCBpbmRleElkID0gbWV0YURhdGFLZXkuaW5kZXhJZCgp
OworICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVjb2RlU3RyaW5nKGl0LT52YWx1ZSgpLmJl
Z2luKCksIGl0LT52YWx1ZSgpLmVuZCgpKTsKKworICAgICAgICBpdC0+bmV4dCgpOyAvLyB1bmlx
dWUgZmxhZworICAgICAgICBpZiAoIWNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShpdC5nZXQoKSwg
c3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6VW5pcXVlKSkgeworICAgICAgICAg
ICAgSU5URVJOQUxfQ09OU0lTVEVOQ1lfRVJST1IoR2V0SW5kZXhlcyk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBib29sIGluZGV4VW5pcXVlID0gZGVjb2RlQm9vbChp
dC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7CisKKyAgICAgICAgaXQtPm5l
eHQoKTsgLy8ga2V5UGF0aAorICAgICAgICBpZiAoIWNoZWNrSW5kZXhBbmRNZXRhRGF0YUtleShp
dC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0YUtleTo6S2V5UGF0aCkpIHsK
KyAgICAgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKEdldEluZGV4ZXMpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgSURCS2V5UGF0aCBrZXlQYXRoID0g
ZGVjb2RlSURCS2V5UGF0aChpdC0+dmFsdWUoKS5iZWdpbigpLCBpdC0+dmFsdWUoKS5lbmQoKSk7
CisKKyAgICAgICAgaXQtPm5leHQoKTsgLy8gW29wdGlvbmFsXSBtdWx0aUVudHJ5IGZsYWcKKyAg
ICAgICAgYm9vbCBpbmRleE11bHRpRW50cnkgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNoZWNrSW5k
ZXhBbmRNZXRhRGF0YUtleShpdC5nZXQoKSwgc3RvcEtleSwgaW5kZXhJZCwgSW5kZXhNZXRhRGF0
YUtleTo6TXVsdGlFbnRyeSkpIHsKKyAgICAgICAgICAgIGluZGV4TXVsdGlFbnRyeSA9IGRlY29k
ZUJvb2woaXQtPnZhbHVlKCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCkpOworICAgICAgICAg
ICAgaXQtPm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4ZXMtPnNldChpbmRleElk
LCBJREJJbmRleE1ldGFkYXRhKGluZGV4TmFtZSwgaW5kZXhJZCwga2V5UGF0aCwgaW5kZXhVbmlx
dWUsIGluZGV4TXVsdGlFbnRyeSkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworV0FS
Tl9VTlVTRURfUkVUVVJOIHN0YXRpYyBib29sIHNldE1heEluZGV4SWQoTGV2ZWxEQlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBpbnQ2NF90IG1heEluZGV4SWQgPSAtMTsKKyAg
ICBjb25zdCBWZWN0b3I8Y2hhcj4gbWF4SW5kZXhJZEtleSA9IE9iamVjdFN0b3JlTWV0YURhdGFL
ZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBPYmplY3RTdG9yZU1ldGFEYXRh
S2V5OjpNYXhJbmRleElkKTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBvayA9
IGdldEludCh0cmFuc2FjdGlvbiwgbWF4SW5kZXhJZEtleSwgbWF4SW5kZXhJZCwgZm91bmQpOwor
ICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihTZXRNYXhJbmRleElk
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWZvdW5kKQorICAgICAg
ICBtYXhJbmRleElkID0gTWluaW11bUluZGV4SWQ7CisKKyAgICBpZiAoaW5kZXhJZCA8PSBtYXhJ
bmRleElkKSB7CisgICAgICAgIElOVEVSTkFMX0NPTlNJU1RFTkNZX0VSUk9SKFNldE1heEluZGV4
SWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHV0SW50KHRyYW5zYWN0
aW9uLCBtYXhJbmRleElkS2V5LCBpbmRleElkKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBJREJCYWNraW5nU3RvcmU6OmNyZWF0ZUluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rp
b24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IElEQktleVBhdGgm
IGtleVBhdGgsIGJvb2wgaXNVbmlxdWUsIGJvb2wgaXNNdWx0aUVudHJ5KQoreworICAgIElEQl9U
UkFDRSgiSURCQmFja2luZ1N0b3JlOjpjcmVhdGVJbmRleCIpOworICAgIGlmICghS2V5UHJlZml4
Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxEQlRyYW5zYWN0aW9u
ID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5zYWN0aW9uRnJvbSh0
cmFuc2FjdGlvbik7CisgICAgaWYgKCFzZXRNYXhJbmRleElkKGxldmVsREJUcmFuc2FjdGlvbiwg
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiBuYW1lS2V5ID0gSW5kZXhNZXRhRGF0YUtleTo6
ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsIEluZGV4TWV0YURhdGFL
ZXk6Ok5hbWUpOworICAgIGNvbnN0IFZlY3RvcjxjaGFyPiB1bmlxdWVLZXkgPSBJbmRleE1ldGFE
YXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5kZXhN
ZXRhRGF0YUtleTo6VW5pcXVlKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4ga2V5UGF0aEtleSA9
IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBJbmRleE1ldGFEYXRhS2V5OjpLZXlQYXRoKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4g
bXVsdGlFbnRyeUtleSA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleElkLCBJbmRleE1ldGFEYXRhS2V5OjpNdWx0aUVudHJ5KTsKKworICAg
IHB1dFN0cmluZyhsZXZlbERCVHJhbnNhY3Rpb24sIG5hbWVLZXksIG5hbWUpOworICAgIHB1dEJv
b2wobGV2ZWxEQlRyYW5zYWN0aW9uLCB1bmlxdWVLZXksIGlzVW5pcXVlKTsKKyAgICBwdXRJREJL
ZXlQYXRoKGxldmVsREJUcmFuc2FjdGlvbiwga2V5UGF0aEtleSwga2V5UGF0aCk7CisgICAgcHV0
Qm9vbChsZXZlbERCVHJhbnNhY3Rpb24sIG11bHRpRW50cnlLZXksIGlzTXVsdGlFbnRyeSk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFja2luZ1N0b3JlOjpkZWxldGVJbmRleChJ
REJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKK3sKKyAgICBJREJf
VFJBQ0UoIklEQkJhY2tpbmdTdG9yZTo6ZGVsZXRlSW5kZXgiKTsKKyAgICBpZiAoIUtleVByZWZp
eDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxldmVsREJUcmFuc2FjdGlv
biA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJUcmFuc2FjdGlvbkZyb20o
dHJhbnNhY3Rpb24pOworCisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGluZGV4TWV0YURhdGFTdGFy
dCA9IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkLCAwKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhNZXRhRGF0YUVuZCA9IElu
ZGV4TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBp
bmRleElkKTsKKyAgICBkZWxldGVSYW5nZShsZXZlbERCVHJhbnNhY3Rpb24sIGluZGV4TWV0YURh
dGFTdGFydCwgaW5kZXhNZXRhRGF0YUVuZCk7CisKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5k
ZXhEYXRhU3RhcnQgPSBJbmRleERhdGFLZXk6OmVuY29kZU1pbktleShkYXRhYmFzZUlkLCBvYmpl
Y3RTdG9yZUlkLCBpbmRleElkKTsKKyAgICBjb25zdCBWZWN0b3I8Y2hhcj4gaW5kZXhEYXRhRW5k
ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCk7CisgICAgZGVsZXRlUmFuZ2UobGV2ZWxEQlRyYW5zYWN0aW9uLCBpbmRleERhdGFT
dGFydCwgaW5kZXhEYXRhRW5kKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJCYWNr
aW5nU3RvcmU6OnB1dEluZGV4RGF0YUZvclJlY29yZChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0
aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3Jl
SWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIGNvbnN0IFJlY29yZElkZW50
aWZpZXImIHJlY29yZElkZW50aWZpZXIpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3Rv
cmU6OnB1dEluZGV4RGF0YUZvclJlY29yZCIpOworICAgIEFTU0VSVChrZXkuaXNWYWxpZCgpKTsK
KyAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwg
aW5kZXhJZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIExldmVsREJUcmFuc2FjdGlv
biogbGV2ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2
ZWxEQlRyYW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+
IGluZGV4RGF0YUtleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQsIGVuY29kZUlEQktleShrZXkpLCByZWNvcmRJZGVudGlmaWVyLnByaW1h
cnlLZXkoKSk7CisKKyAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKyAgICBkYXRhLmFwcGVuZFZlY3Rv
cihlbmNvZGVWYXJJbnQocmVjb3JkSWRlbnRpZmllci52ZXJzaW9uKCkpKTsKKyAgICBkYXRhLmFw
cGVuZFZlY3RvcihyZWNvcmRJZGVudGlmaWVyLnByaW1hcnlLZXkoKSk7CisKKyAgICBsZXZlbERC
VHJhbnNhY3Rpb24tPnB1dChpbmRleERhdGFLZXksIGRhdGEpOworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgYm9vbCBmaW5kR3JlYXRlc3RLZXlMZXNzVGhhbk9yRXF1YWwoTGV2ZWxEQlRy
YW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgVmVjdG9yPGNoYXI+JiB0YXJnZXQsIFZlY3Rv
cjxjaGFyPiYgZm91bmRLZXkpCit7CisgICAgT3duUHRyPExldmVsREJJdGVyYXRvcj4gaXQgPSB0
cmFuc2FjdGlvbi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBpdC0+c2Vlayh0YXJnZXQpOworCisg
ICAgaWYgKCFpdC0+aXNWYWxpZCgpKSB7CisgICAgICAgIGl0LT5zZWVrVG9MYXN0KCk7CisgICAg
ICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICB3aGlsZSAoY29tcGFyZUluZGV4S2V5cyhpdC0+a2V5KCksIHRhcmdldCkgPiAwKSB7
CisgICAgICAgIGl0LT5wcmV2KCk7CisgICAgICAgIGlmICghaXQtPmlzVmFsaWQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGZvdW5kS2V5
LmNsZWFyKCk7CisgICAgICAgIGZvdW5kS2V5LmFwcGVuZChpdC0+a2V5KCkuYmVnaW4oKSwgaXQt
PmtleSgpLmVuZCgpIC0gaXQtPmtleSgpLmJlZ2luKCkpOworCisgICAgICAgIC8vIFRoZXJlIGNh
biBiZSBzZXZlcmFsIGluZGV4IGtleXMgdGhhdCBjb21wYXJlIGVxdWFsLiBXZSB3YW50IHRoZSBs
YXN0IG9uZS4KKyAgICAgICAgaXQtPm5leHQoKTsKKyAgICB9IHdoaWxlIChpdC0+aXNWYWxpZCgp
ICYmICFjb21wYXJlSW5kZXhLZXlzKGl0LT5rZXkoKSwgdGFyZ2V0KSk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdmVyc2lvbkV4aXN0cyhMZXZlbERCVHJhbnNhY3Rpb24q
IHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwg
aW50NjRfdCB2ZXJzaW9uLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVuY29kZWRQcmltYXJ5S2V5LCBi
b29sJiBleGlzdHMpCit7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGtleSA9IEV4aXN0c0VudHJ5
S2V5OjplbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlZFByaW1hcnlLZXkp
OworICAgIFZlY3RvcjxjaGFyPiBkYXRhOworCisgICAgYm9vbCBvayA9IHRyYW5zYWN0aW9uLT5z
YWZlR2V0KGtleSwgZGF0YSwgZXhpc3RzKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIElOVEVS
TkFMX1JFQURfRVJST1IoVmVyc2lvbkV4aXN0cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisgICAgaWYgKCFleGlzdHMpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgZXhpc3Rz
ID0gKGRlY29kZUludChkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCkpID09IHZlcnNpb24pOworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIElEQkJhY2tpbmdTdG9yZTo6ZmluZEtleUluSW5kZXgo
SURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktl
eSYga2V5LCBWZWN0b3I8Y2hhcj4mIGZvdW5kRW5jb2RlZFByaW1hcnlLZXksIGJvb2wmIGZvdW5k
KQoreworICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpmaW5kS2V5SW5JbmRleCIpOwor
ICAgIEFTU0VSVChLZXlQcmVmaXg6OnZhbGlkSWRzKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQs
IGluZGV4SWQpKTsKKworICAgIEFTU0VSVChmb3VuZEVuY29kZWRQcmltYXJ5S2V5LmlzRW1wdHko
KSk7CisgICAgZm91bmQgPSBmYWxzZTsKKworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2ZWxE
QlRyYW5zYWN0aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRyYW5z
YWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisgICAgY29uc3QgVmVjdG9yPGNoYXI+IGxldmVsZGJL
ZXkgPSBJbmRleERhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRl
eElkLCBrZXkpOworICAgIE93blB0cjxMZXZlbERCSXRlcmF0b3I+IGl0ID0gbGV2ZWxEQlRyYW5z
YWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworICAgIGl0LT5zZWVrKGxldmVsZGJLZXkpOworCisg
ICAgZm9yICg7OykgeworICAgICAgICBpZiAoIWl0LT5pc1ZhbGlkKCkpCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGNvbXBhcmVJbmRleEtleXMoaXQtPmtleSgpLCBsZXZl
bGRiS2V5KSA+IDApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpbnQ2NF90
IHZlcnNpb247CisgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBkZWNvZGVWYXJJbnQoaXQtPnZhbHVl
KCkuYmVnaW4oKSwgaXQtPnZhbHVlKCkuZW5kKCksIHZlcnNpb24pOworICAgICAgICBpZiAoIXAp
IHsKKyAgICAgICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoRmluZEtleUluSW5kZXgpOworICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvdW5kRW5jb2RlZFBy
aW1hcnlLZXkuYXBwZW5kKHAsIGl0LT52YWx1ZSgpLmVuZCgpIC0gcCk7CisKKyAgICAgICAgYm9v
bCBleGlzdHMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBvayA9IHZlcnNpb25FeGlzdHMobGV2ZWxE
QlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCB2ZXJzaW9uLCBmb3VuZEVu
Y29kZWRQcmltYXJ5S2V5LCBleGlzdHMpOworICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWV4aXN0cykgeworICAgICAgICAgICAgLy8gRGVs
ZXRlIHN0YWxlIGluZGV4IGRhdGEgZW50cnkgYW5kIGNvbnRpbnVlLgorICAgICAgICAgICAgbGV2
ZWxEQlRyYW5zYWN0aW9uLT5yZW1vdmUoaXQtPmtleSgpKTsKKyAgICAgICAgICAgIGl0LT5uZXh0
KCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3VuZCA9IHRy
dWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KKworYm9vbCBJREJCYWNraW5nU3Rv
cmU6OmdldFByaW1hcnlLZXlWaWFJbmRleChJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGlu
dDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiBrZXksIFJlZlB0cjxJREJLZXk+JiBwcmltYXJ5
S2V5KQoreworICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpnZXRQcmltYXJ5S2V5Vmlh
SW5kZXgiKTsKKyAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0YWJhc2VJZCwgb2JqZWN0
U3RvcmVJZCwgaW5kZXhJZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgZm91
bmQgPSBmYWxzZTsKKyAgICBWZWN0b3I8Y2hhcj4gZm91bmRFbmNvZGVkUHJpbWFyeUtleTsKKyAg
ICBib29sIG9rID0gZmluZEtleUluSW5kZXgodHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVj
dFN0b3JlSWQsIGluZGV4SWQsIGtleSwgZm91bmRFbmNvZGVkUHJpbWFyeUtleSwgZm91bmQpOwor
ICAgIGlmICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihHZXRQcmltYXJ5S2V5
VmlhSW5kZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChmb3VuZCkg
eworICAgICAgICBkZWNvZGVJREJLZXkoZm91bmRFbmNvZGVkUHJpbWFyeUtleS5iZWdpbigpLCBm
b3VuZEVuY29kZWRQcmltYXJ5S2V5LmVuZCgpLCBwcmltYXJ5S2V5KTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSURCQmFja2luZ1N0
b3JlOjprZXlFeGlzdHNJbkluZGV4KElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb24qIHRyYW5z
YWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRf
dCBpbmRleElkLCBjb25zdCBJREJLZXkmIGluZGV4S2V5LCBSZWZQdHI8SURCS2V5PiYgZm91bmRQ
cmltYXJ5S2V5LCBib29sJiBleGlzdHMpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3Rv
cmU6OmtleUV4aXN0c0luSW5kZXgiKTsKKyAgICBpZiAoIUtleVByZWZpeDo6dmFsaWRJZHMoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGV4aXN0cyA9IGZhbHNlOworICAgIFZlY3RvcjxjaGFyPiBmb3VuZEVuY29kZWRQcmlt
YXJ5S2V5OworICAgIGJvb2wgb2sgPSBmaW5kS2V5SW5JbmRleCh0cmFuc2FjdGlvbiwgZGF0YWJh
c2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgaW5kZXhLZXksIGZvdW5kRW5jb2RlZFByaW1h
cnlLZXksIGV4aXN0cyk7CisgICAgaWYgKCFvaykgeworICAgICAgICBJTlRFUk5BTF9SRUFEX0VS
Uk9SKEtleUV4aXN0c0luSW5kZXgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAg
IGlmICghZXhpc3RzKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlY29kZUlEQktleShm
b3VuZEVuY29kZWRQcmltYXJ5S2V5LmJlZ2luKCksIGZvdW5kRW5jb2RlZFByaW1hcnlLZXkuZW5k
KCksIGZvdW5kUHJpbWFyeUtleSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0lEQkJhY2tpbmdT
dG9yZTo6Q3Vyc29yOjpDdXJzb3IoY29uc3QgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IqIG90aGVy
KQorICAgIDogbV90cmFuc2FjdGlvbihvdGhlci0+bV90cmFuc2FjdGlvbikKKyAgICAsIG1fY3Vy
c29yT3B0aW9ucyhvdGhlci0+bV9jdXJzb3JPcHRpb25zKQorICAgICwgbV9jdXJyZW50S2V5KG90
aGVyLT5tX2N1cnJlbnRLZXkpCit7CisgICAgaWYgKG90aGVyLT5tX2l0ZXJhdG9yKSB7CisgICAg
ICAgIG1faXRlcmF0b3IgPSBtX3RyYW5zYWN0aW9uLT5jcmVhdGVJdGVyYXRvcigpOworCisgICAg
ICAgIGlmIChvdGhlci0+bV9pdGVyYXRvci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBtX2l0
ZXJhdG9yLT5zZWVrKG90aGVyLT5tX2l0ZXJhdG9yLT5rZXkoKSk7CisgICAgICAgICAgICBBU1NF
UlQobV9pdGVyYXRvci0+aXNWYWxpZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBJ
REJCYWNraW5nU3RvcmU6OkN1cnNvcjo6Zmlyc3RTZWVrKCkKK3sKKyAgICBtX2l0ZXJhdG9yID0g
bV90cmFuc2FjdGlvbi0+Y3JlYXRlSXRlcmF0b3IoKTsKKyAgICBpZiAobV9jdXJzb3JPcHRpb25z
LmZvcndhcmQpCisgICAgICAgIG1faXRlcmF0b3ItPnNlZWsobV9jdXJzb3JPcHRpb25zLmxvd0tl
eSk7CisgICAgZWxzZQorICAgICAgICBtX2l0ZXJhdG9yLT5zZWVrKG1fY3Vyc29yT3B0aW9ucy5o
aWdoS2V5KTsKKworICAgIHJldHVybiBjb250aW51ZUZ1bmN0aW9uKDAsIFJlYWR5KTsKK30KKwor
Ym9vbCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6YWR2YW5jZSh1bnNpZ25lZCBsb25nIGNvdW50
KQoreworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGlmICghY29udGludWVGdW5jdGlv
bigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworYm9vbCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6Y29udGludWVGdW5jdGlvbihjb25z
dCBJREJLZXkqIGtleSwgSXRlcmF0b3JTdGF0ZSBuZXh0U3RhdGUpCit7CisgICAgUmVmUHRyPElE
QktleT4gcHJldmlvdXNLZXkgPSBtX2N1cnJlbnRLZXk7CisKKyAgICBib29sIGZpcnN0SXRlcmF0
aW9uID0gdHJ1ZTsKKworICAgIC8vIFdoZW4gaXRlcmF0aW5nIHdpdGggUHJldk5vRHVwbGljYXRl
LCBzcGVjIHJlcXVpcmVzIHRoYXQgdGhlCisgICAgLy8gdmFsdWUgd2UgeWllbGQgZm9yIGVhY2gg
a2V5IGlzIHRoZSBmaXJzdCBkdXBsaWNhdGUgaW4gZm9yd2FyZHMKKyAgICAvLyBvcmRlci4KKyAg
ICBSZWZQdHI8SURCS2V5PiBsYXN0RHVwbGljYXRlS2V5OworCisgICAgYm9vbCBmb3J3YXJkID0g
bV9jdXJzb3JPcHRpb25zLmZvcndhcmQ7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChu
ZXh0U3RhdGUgPT0gU2VlaykgeworICAgICAgICAgICAgLy8gRklYTUU6IE9wdGltaXplIHNlZWtp
bmcgZm9yIHJldmVyc2UgY3Vyc29ycyBhcyB3ZWxsLgorICAgICAgICAgICAgaWYgKGZpcnN0SXRl
cmF0aW9uICYmIGtleSAmJiBmb3J3YXJkKSB7CisgICAgICAgICAgICAgICAgbV9pdGVyYXRvci0+
c2VlayhlbmNvZGVLZXkoKmtleSkpOworICAgICAgICAgICAgICAgIGZpcnN0SXRlcmF0aW9uID0g
ZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcndhcmQpCisgICAgICAgICAgICAgICAg
bV9pdGVyYXRvci0+bmV4dCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1f
aXRlcmF0b3ItPnByZXYoKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBuZXh0U3RhdGUg
PSBTZWVrOyAvLyBmb3Igc3Vic2VxdWVudCBpdGVyYXRpb25zCisKKyAgICAgICAgaWYgKCFtX2l0
ZXJhdG9yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGlmICghZm9yd2FyZCAmJiBsYXN0RHVw
bGljYXRlS2V5LmdldCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWxrIGZv
cndhcmQgYmVjYXVzZSB3ZSBoaXQgdGhlIGVuZCBvZgorICAgICAgICAgICAgICAgIC8vIHRoZSBk
YXRhLgorICAgICAgICAgICAgICAgIGZvcndhcmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKworICAgICAgICBpZiAoaXNQYXN0Qm91bmRzKCkpIHsKKyAgICAgICAgICAgIGlmICgh
Zm9yd2FyZCAmJiBsYXN0RHVwbGljYXRlS2V5LmdldCgpKSB7CisgICAgICAgICAgICAgICAgLy8g
V2UgbmVlZCB0byB3YWxrIGZvcndhcmQgYmVjYXVzZSBub3cgd2UncmUgYmV5b25kIHRoZQorICAg
ICAgICAgICAgICAgIC8vIGJvdW5kcyBkZWZpbmVkIGJ5IHRoZSBjdXJzb3IuCisgICAgICAgICAg
ICAgICAgZm9yd2FyZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAg
IGlmICghaGF2ZUVudGVyZWRSYW5nZSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgLy8gVGhlIHJvdyBtYXkgbm90IGxvYWQgYmVjYXVzZSB0aGVyZSdzIGEgc3RhbGUgZW50cnkg
aW4gdGhlCisgICAgICAgIC8vIGluZGV4LiBUaGlzIGlzIG5vdCBmYXRhbC4KKyAgICAgICAgaWYg
KCFsb2FkQ3VycmVudFJvdygpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYg
KGtleSkgeworICAgICAgICAgICAgaWYgKGZvcndhcmQpIHsKKyAgICAgICAgICAgICAgICBpZiAo
bV9jdXJyZW50S2V5LT5pc0xlc3NUaGFuKGtleSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5LT5pc0xl
c3NUaGFuKG1fY3VycmVudEtleS5nZXQoKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fY3Vyc29yT3B0aW9u
cy51bmlxdWUpIHsKKworICAgICAgICAgICAgaWYgKG1fY3VycmVudEtleS0+aXNFcXVhbChwcmV2
aW91c0tleS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgYmUg
YWJsZSB0byB3YWxrIGZvcndhcmQgYWxsIHRoZSB3YXkKKyAgICAgICAgICAgICAgICAvLyB0byB0
aGUgcHJldmlvdXMga2V5LgorICAgICAgICAgICAgICAgIEFTU0VSVCghbGFzdER1cGxpY2F0ZUtl
eS5nZXQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmICghZm9yd2FyZCkgeworICAgICAgICAgICAgICAgIGlmICghbGFzdER1cGxp
Y2F0ZUtleS5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0RHVwbGljYXRlS2V5ID0g
bV9jdXJyZW50S2V5OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHdhbGsgZm9yd2FyZCBiZWNh
dXNlIHdlIGhpdCB0aGUgYm91bmRhcnkKKyAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIGtleSBy
YW5nZXMuCisgICAgICAgICAgICAgICAgaWYgKCFsYXN0RHVwbGljYXRlS2V5LT5pc0VxdWFsKG1f
Y3VycmVudEtleS5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yd2FyZCA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IGJyZWFrOworICAgIH0KKworICAgIEFTU0VSVCghbGFzdER1cGxpY2F0ZUtleS5nZXQoKSB8fCAo
Zm9yd2FyZCAmJiBsYXN0RHVwbGljYXRlS2V5LT5pc0VxdWFsKG1fY3VycmVudEtleS5nZXQoKSkp
KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6
aGF2ZUVudGVyZWRSYW5nZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fY3Vyc29yT3B0aW9ucy5mb3J3
YXJkKSB7CisgICAgICAgIGlmIChtX2N1cnNvck9wdGlvbnMubG93T3BlbikKKyAgICAgICAgICAg
IHJldHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlv
bnMubG93S2V5KSA+IDA7CisKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVy
YXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5sb3dLZXkpID49IDA7CisgICAgfQorICAgIGlm
IChtX2N1cnNvck9wdGlvbnMuaGlnaE9wZW4pCisgICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhL
ZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwOworCisg
ICAgcmV0dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0
aW9ucy5oaWdoS2V5KSA8PSAwOworfQorCitib29sIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpp
c1Bhc3RCb3VuZHMoKSBjb25zdAoreworICAgIGlmIChtX2N1cnNvck9wdGlvbnMuZm9yd2FyZCkg
eworICAgICAgICBpZiAobV9jdXJzb3JPcHRpb25zLmhpZ2hPcGVuKQorICAgICAgICAgICAgcmV0
dXJuIGNvbXBhcmVJbmRleEtleXMobV9pdGVyYXRvci0+a2V5KCksIG1fY3Vyc29yT3B0aW9ucy5o
aWdoS2V5KSA+PSAwOworICAgICAgICByZXR1cm4gY29tcGFyZUluZGV4S2V5cyhtX2l0ZXJhdG9y
LT5rZXkoKSwgbV9jdXJzb3JPcHRpb25zLmhpZ2hLZXkpID4gMDsKKyAgICB9CisKKyAgICBpZiAo
bV9jdXJzb3JPcHRpb25zLmxvd09wZW4pCisgICAgICAgIHJldHVybiBjb21wYXJlSW5kZXhLZXlz
KG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMubG93S2V5KSA8PSAwOworICAgIHJl
dHVybiBjb21wYXJlSW5kZXhLZXlzKG1faXRlcmF0b3ItPmtleSgpLCBtX2N1cnNvck9wdGlvbnMu
bG93S2V5KSA8IDA7Cit9CisKK2NsYXNzIE9iamVjdFN0b3JlS2V5Q3Vyc29ySW1wbCA6IHB1Ymxp
YyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8T2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsPiBjcmVhdGUoTGV2ZWxEQlRyYW5zYWN0aW9uKiB0
cmFuc2FjdGlvbiwgY29uc3QgSURCQmFja2luZ1N0b3JlOjpDdXJzb3I6OkN1cnNvck9wdGlvbnMm
IGN1cnNvck9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IE9iamVj
dFN0b3JlS2V5Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykpOworICAgIH0K
KworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNvcj4gY2xvbmUo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBPYmplY3RTdG9yZUtleUN1cnNv
ckltcGwodGhpcykpOworICAgIH0KKworICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFsdWUoKSBjb25zdCB7IEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgYm9vbCBsb2FkQ3VycmVu
dFJvdygpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBWZWN0b3I8Y2hhcj4gZW5jb2RlS2V5
KGNvbnN0IElEQktleSAma2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdFN0b3JlRGF0
YUtleTo6ZW5jb2RlKG1fY3Vyc29yT3B0aW9ucy5kYXRhYmFzZUlkLCBtX2N1cnNvck9wdGlvbnMu
b2JqZWN0U3RvcmVJZCwga2V5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgT2JqZWN0U3RvcmVL
ZXlDdXJzb3JJbXBsKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJh
Y2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAg
ICA6IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQor
ICAgIHsKKyAgICB9CisKKyAgICBPYmplY3RTdG9yZUtleUN1cnNvckltcGwoY29uc3QgT2JqZWN0
U3RvcmVLZXlDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBJREJCYWNraW5nU3RvcmU6OkN1
cnNvcihvdGhlcikKKyAgICB7CisgICAgfQorfTsKKworYm9vbCBPYmplY3RTdG9yZUtleUN1cnNv
ckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9
IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBt
X2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAgIE9iamVjdFN0b3JlRGF0YUtleSBvYmplY3RT
dG9yZURhdGFLZXk7CisgICAga2V5UG9zaXRpb24gPSBPYmplY3RTdG9yZURhdGFLZXk6OmRlY29k
ZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZvYmplY3RTdG9yZURhdGFLZXkpOworICAgIGlmICgh
a2V5UG9zaXRpb24pIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJv
dyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2N1cnJlbnRLZXkgPSBv
YmplY3RTdG9yZURhdGFLZXkudXNlcktleSgpOworCisgICAgaW50NjRfdCB2ZXJzaW9uOworICAg
IGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBkZWNvZGVWYXJJbnQobV9pdGVyYXRvci0+dmFs
dWUoKS5iZWdpbigpLCBtX2l0ZXJhdG9yLT52YWx1ZSgpLmVuZCgpLCB2ZXJzaW9uKTsKKyAgICBp
ZiAoIXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3Vy
cmVudFJvdyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGSVhNRTog
VGhpcyByZS1lbmNvZGVzIHdoYXQgd2FzIGp1c3QgZGVjb2RlZDsgdHJ5IGFuZCBvcHRpbWl6ZS4K
KyAgICBtX3JlY29yZElkZW50aWZpZXIucmVzZXQoZW5jb2RlSURCS2V5KCptX2N1cnJlbnRLZXkp
LCB2ZXJzaW9uKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBPYmplY3RTdG9yZUN1
cnNvckltcGwgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgeworcHVibGljOgorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3JlYXRlKExldmVsREJU
cmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpD
dXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBPYmplY3RTdG9yZUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMp
KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgT2JqZWN0U3Rv
cmVDdXJzb3JJbXBsKHRoaXMpKTsKKyAgICB9CisKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1
cnNvcgorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+IHZhbHVlKCkgY29uc3Qg
eyByZXR1cm4gbV9jdXJyZW50VmFsdWU7IH0KKyAgICB2aXJ0dWFsIGJvb2wgbG9hZEN1cnJlbnRS
b3coKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgVmVjdG9yPGNoYXI+IGVuY29kZUtleShj
b25zdCBJREJLZXkgJmtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RTdG9yZURhdGFL
ZXk6OmVuY29kZShtX2N1cnNvck9wdGlvbnMuZGF0YWJhc2VJZCwgbV9jdXJzb3JPcHRpb25zLm9i
amVjdFN0b3JlSWQsIGtleSk7CisgICAgfQorCitwcml2YXRlOgorICAgIE9iamVjdFN0b3JlQ3Vy
c29ySW1wbChMZXZlbERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBjb25zdCBJREJCYWNraW5n
U3RvcmU6OkN1cnNvcjo6Q3Vyc29yT3B0aW9ucyYgY3Vyc29yT3B0aW9ucykKKyAgICAgICAgOiBJ
REJCYWNraW5nU3RvcmU6OkN1cnNvcih0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykKKyAgICB7
CisgICAgfQorCisgICAgT2JqZWN0U3RvcmVDdXJzb3JJbXBsKGNvbnN0IE9iamVjdFN0b3JlQ3Vy
c29ySW1wbCogb3RoZXIpCisgICAgICAgIDogSURCQmFja2luZ1N0b3JlOjpDdXJzb3Iob3RoZXIp
CisgICAgICAgICwgbV9jdXJyZW50VmFsdWUob3RoZXItPm1fY3VycmVudFZhbHVlKQorICAgIHsK
KyAgICB9CisKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBtX2N1cnJlbnRWYWx1ZTsKK307CisK
K2Jvb2wgT2JqZWN0U3RvcmVDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdygpCit7CisgICAgY29u
c3QgY2hhcioga2V5UG9zaXRpb24gPSBtX2l0ZXJhdG9yLT5rZXkoKS5iZWdpbigpOworICAgIGNv
bnN0IGNoYXIqIGtleUxpbWl0ID0gbV9pdGVyYXRvci0+a2V5KCkuZW5kKCk7CisKKyAgICBPYmpl
Y3RTdG9yZURhdGFLZXkgb2JqZWN0U3RvcmVEYXRhS2V5OworICAgIGtleVBvc2l0aW9uID0gT2Jq
ZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUoa2V5UG9zaXRpb24sIGtleUxpbWl0LCAmb2JqZWN0U3Rv
cmVEYXRhS2V5KTsKKyAgICBpZiAoIWtleVBvc2l0aW9uKSB7CisgICAgICAgIElOVEVSTkFMX1JF
QURfRVJST1IoTG9hZEN1cnJlbnRSb3cpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgbV9jdXJyZW50S2V5ID0gb2JqZWN0U3RvcmVEYXRhS2V5LnVzZXJLZXkoKTsKKworICAg
IGludDY0X3QgdmVyc2lvbjsKKyAgICBjb25zdCBjaGFyKiB2YWx1ZVBvc2l0aW9uID0gZGVjb2Rl
VmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCkuYmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5l
bmQoKSwgdmVyc2lvbik7CisgICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7CisgICAgICAgIElOVEVS
TkFMX1JFQURfRVJST1IoTG9hZEN1cnJlbnRSb3cpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgLy8gRklYTUU6IFRoaXMgcmUtZW5jb2RlcyB3aGF0IHdhcyBqdXN0IGRlY29k
ZWQ7IHRyeSBhbmQgb3B0aW1pemUuCisgICAgbV9yZWNvcmRJZGVudGlmaWVyLnJlc2V0KGVuY29k
ZUlEQktleSgqbV9jdXJyZW50S2V5KSwgdmVyc2lvbik7CisKKyAgICBWZWN0b3I8Y2hhcj4gdmFs
dWU7CisgICAgdmFsdWUuYXBwZW5kKHZhbHVlUG9zaXRpb24sIG1faXRlcmF0b3ItPnZhbHVlKCku
ZW5kKCkgLSB2YWx1ZVBvc2l0aW9uKTsKKyAgICBtX2N1cnJlbnRWYWx1ZSA9IFNoYXJlZEJ1ZmZl
cjo6YWRvcHRWZWN0b3IodmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitjbGFzcyBJbmRl
eEtleUN1cnNvckltcGwgOiBwdWJsaWMgSURCQmFja2luZ1N0b3JlOjpDdXJzb3IgeworcHVibGlj
OgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3JlYXRlKExldmVs
REJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
OjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBJbmRleEtleUN1cnNvckltcGwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMp
KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJz
b3I+IGNsb25lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgSW5kZXhLZXlD
dXJzb3JJbXBsKHRoaXMpKTsKKyAgICB9CisKKyAgICAvLyBJREJCYWNraW5nU3RvcmU6OkN1cnNv
cgorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+IHZhbHVlKCkgY29uc3QgeyBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8
SURCS2V5PiBwcmltYXJ5S2V5KCkgY29uc3QgeyByZXR1cm4gbV9wcmltYXJ5S2V5OyB9CisgICAg
dmlydHVhbCBjb25zdCBJREJCYWNraW5nU3RvcmU6OlJlY29yZElkZW50aWZpZXImIHJlY29yZElk
ZW50aWZpZXIoKSBjb25zdCB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyByZXR1cm4gbV9yZWNvcmRJ
ZGVudGlmaWVyOyB9CisgICAgdmlydHVhbCBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3Byb3Rl
Y3RlZDoKKyAgICB2aXJ0dWFsIFZlY3RvcjxjaGFyPiBlbmNvZGVLZXkoY29uc3QgSURCS2V5ICZr
ZXkpCisgICAgeworICAgICAgICByZXR1cm4gSW5kZXhEYXRhS2V5OjplbmNvZGUobV9jdXJzb3JP
cHRpb25zLmRhdGFiYXNlSWQsIG1fY3Vyc29yT3B0aW9ucy5vYmplY3RTdG9yZUlkLCBtX2N1cnNv
ck9wdGlvbnMuaW5kZXhJZCwga2V5KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgSW5kZXhLZXlD
dXJzb3JJbXBsKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tp
bmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAgICA6
IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQorICAg
IHsKKyAgICB9CisKKyAgICBJbmRleEtleUN1cnNvckltcGwoY29uc3QgSW5kZXhLZXlDdXJzb3JJ
bXBsKiBvdGhlcikKKyAgICAgICAgOiBJREJCYWNraW5nU3RvcmU6OkN1cnNvcihvdGhlcikKKyAg
ICAgICAgLCBtX3ByaW1hcnlLZXkob3RoZXItPm1fcHJpbWFyeUtleSkKKyAgICB7CisgICAgfQor
CisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5OworfTsKKworYm9vbCBJbmRleEtleUN1
cnNvckltcGw6OmxvYWRDdXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlv
biA9IG1faXRlcmF0b3ItPmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQg
PSBtX2l0ZXJhdG9yLT5rZXkoKS5lbmQoKTsKKworICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFL
ZXk7CisgICAga2V5UG9zaXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwg
a2V5TGltaXQsICZpbmRleERhdGFLZXkpOworCisgICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRh
S2V5LnVzZXJLZXkoKTsKKworICAgIGludDY0X3QgaW5kZXhEYXRhVmVyc2lvbjsKKyAgICBjb25z
dCBjaGFyKiB2YWx1ZVBvc2l0aW9uID0gZGVjb2RlVmFySW50KG1faXRlcmF0b3ItPnZhbHVlKCku
YmVnaW4oKSwgbV9pdGVyYXRvci0+dmFsdWUoKS5lbmQoKSwgaW5kZXhEYXRhVmVyc2lvbik7Cisg
ICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7CisgICAgICAgIElOVEVSTkFMX1JFQURfRVJST1IoTG9h
ZEN1cnJlbnRSb3cpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmFsdWVQ
b3NpdGlvbiA9IGRlY29kZUlEQktleSh2YWx1ZVBvc2l0aW9uLCBtX2l0ZXJhdG9yLT52YWx1ZSgp
LmVuZCgpLCBtX3ByaW1hcnlLZXkpOworICAgIGlmICghdmFsdWVQb3NpdGlvbikgeworICAgICAg
ICBJTlRFUk5BTF9SRUFEX0VSUk9SKExvYWRDdXJyZW50Um93KTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIFZlY3RvcjxjaGFyPiBwcmltYXJ5TGV2ZWxEQktleSA9IE9iamVj
dFN0b3JlRGF0YUtleTo6ZW5jb2RlKGluZGV4RGF0YUtleS5kYXRhYmFzZUlkKCksIGluZGV4RGF0
YUtleS5vYmplY3RTdG9yZUlkKCksICptX3ByaW1hcnlLZXkpOworCisgICAgVmVjdG9yPGNoYXI+
IHJlc3VsdDsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgYm9vbCBvayA9IG1fdHJhbnNh
Y3Rpb24tPnNhZmVHZXQocHJpbWFyeUxldmVsREJLZXksIHJlc3VsdCwgZm91bmQpOworICAgIGlm
ICghb2spIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJvdyk7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBt
X3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAg
IGNvbnN0IGNoYXIqIHQgPSBkZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQo
KSwgb2JqZWN0U3RvcmVEYXRhVmVyc2lvbik7CisgICAgaWYgKCF0KSB7CisgICAgICAgIElOVEVS
TkFMX1JFQURfRVJST1IoTG9hZEN1cnJlbnRSb3cpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgaWYgKG9iamVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lv
bikgeworICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Ns
YXNzIEluZGV4Q3Vyc29ySW1wbCA6IHB1YmxpYyBJREJCYWNraW5nU3RvcmU6OkN1cnNvciB7Citw
dWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8SW5kZXhDdXJzb3JJbXBsPiBjcmVhdGUoTGV2
ZWxEQlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgY29uc3QgSURCQmFja2luZ1N0b3JlOjpDdXJz
b3I6OkN1cnNvck9wdGlvbnMmIGN1cnNvck9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IEluZGV4Q3Vyc29ySW1wbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucykp
OworICAgIH0KKworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1cnNv
cj4gY2xvbmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBJbmRleEN1cnNv
ckltcGwodGhpcykpOworICAgIH0KKworICAgIC8vIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yCisg
ICAgdmlydHVhbCBQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdmFsdWUoKSBjb25zdCB7IHJldHVy
biBtX2N1cnJlbnRWYWx1ZTsgfQorICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxJREJLZXk+IHByaW1h
cnlLZXkoKSBjb25zdCB7IHJldHVybiBtX3ByaW1hcnlLZXk7IH0KKyAgICB2aXJ0dWFsIGNvbnN0
IElEQkJhY2tpbmdTdG9yZTo6UmVjb3JkSWRlbnRpZmllciYgcmVjb3JkSWRlbnRpZmllcigpIGNv
bnN0IHsgQVNTRVJUX05PVF9SRUFDSEVEKCk7IHJldHVybiBtX3JlY29yZElkZW50aWZpZXI7IH0K
KyAgICBib29sIGxvYWRDdXJyZW50Um93KCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIFZl
Y3RvcjxjaGFyPiBlbmNvZGVLZXkoY29uc3QgSURCS2V5ICZrZXkpCisgICAgeworICAgICAgICBy
ZXR1cm4gSW5kZXhEYXRhS2V5OjplbmNvZGUobV9jdXJzb3JPcHRpb25zLmRhdGFiYXNlSWQsIG1f
Y3Vyc29yT3B0aW9ucy5vYmplY3RTdG9yZUlkLCBtX2N1cnNvck9wdGlvbnMuaW5kZXhJZCwga2V5
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgSW5kZXhDdXJzb3JJbXBsKExldmVsREJUcmFuc2Fj
dGlvbiogdHJhbnNhY3Rpb24sIGNvbnN0IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JP
cHRpb25zJiBjdXJzb3JPcHRpb25zKQorICAgICAgICA6IElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
KHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKQorICAgIHsKKyAgICB9CisKKyAgICBJbmRleEN1
cnNvckltcGwoY29uc3QgSW5kZXhDdXJzb3JJbXBsKiBvdGhlcikKKyAgICAgICAgOiBJREJCYWNr
aW5nU3RvcmU6OkN1cnNvcihvdGhlcikKKyAgICAgICAgLCBtX3ByaW1hcnlLZXkob3RoZXItPm1f
cHJpbWFyeUtleSkKKyAgICAgICAgLCBtX2N1cnJlbnRWYWx1ZShvdGhlci0+bV9jdXJyZW50VmFs
dWUpCisgICAgICAgICwgbV9wcmltYXJ5TGV2ZWxEQktleShvdGhlci0+bV9wcmltYXJ5TGV2ZWxE
QktleSkKKyAgICB7CisgICAgfQorCisgICAgUmVmUHRyPElEQktleT4gbV9wcmltYXJ5S2V5Owor
ICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IG1fY3VycmVudFZhbHVlOworICAgIFZlY3RvcjxjaGFy
PiBtX3ByaW1hcnlMZXZlbERCS2V5OworfTsKKworYm9vbCBJbmRleEN1cnNvckltcGw6OmxvYWRD
dXJyZW50Um93KCkKK3sKKyAgICBjb25zdCBjaGFyKiBrZXlQb3NpdGlvbiA9IG1faXRlcmF0b3It
PmtleSgpLmJlZ2luKCk7CisgICAgY29uc3QgY2hhcioga2V5TGltaXQgPSBtX2l0ZXJhdG9yLT5r
ZXkoKS5lbmQoKTsKKworICAgIEluZGV4RGF0YUtleSBpbmRleERhdGFLZXk7CisgICAga2V5UG9z
aXRpb24gPSBJbmRleERhdGFLZXk6OmRlY29kZShrZXlQb3NpdGlvbiwga2V5TGltaXQsICZpbmRl
eERhdGFLZXkpOworCisgICAgbV9jdXJyZW50S2V5ID0gaW5kZXhEYXRhS2V5LnVzZXJLZXkoKTsK
KworICAgIGNvbnN0IGNoYXIqIHZhbHVlUG9zaXRpb24gPSBtX2l0ZXJhdG9yLT52YWx1ZSgpLmJl
Z2luKCk7CisgICAgY29uc3QgY2hhciogdmFsdWVMaW1pdCA9IG1faXRlcmF0b3ItPnZhbHVlKCku
ZW5kKCk7CisKKyAgICBpbnQ2NF90IGluZGV4RGF0YVZlcnNpb247CisgICAgdmFsdWVQb3NpdGlv
biA9IGRlY29kZVZhckludCh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBpbmRleERhdGFWZXJz
aW9uKTsKKyAgICBpZiAoIXZhbHVlUG9zaXRpb24pIHsKKyAgICAgICAgSU5URVJOQUxfUkVBRF9F
UlJPUihMb2FkQ3VycmVudFJvdyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAg
dmFsdWVQb3NpdGlvbiA9IGRlY29kZUlEQktleSh2YWx1ZVBvc2l0aW9uLCB2YWx1ZUxpbWl0LCBt
X3ByaW1hcnlLZXkpOworICAgIGlmICghdmFsdWVQb3NpdGlvbikgeworICAgICAgICBJTlRFUk5B
TF9SRUFEX0VSUk9SKExvYWRDdXJyZW50Um93KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIG1fcHJpbWFyeUxldmVsREJLZXkgPSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29k
ZShpbmRleERhdGFLZXkuZGF0YWJhc2VJZCgpLCBpbmRleERhdGFLZXkub2JqZWN0U3RvcmVJZCgp
LCAqbV9wcmltYXJ5S2V5KTsKKworICAgIFZlY3RvcjxjaGFyPiByZXN1bHQ7CisgICAgYm9vbCBm
b3VuZCA9IGZhbHNlOworICAgIGJvb2wgb2sgPSBtX3RyYW5zYWN0aW9uLT5zYWZlR2V0KG1fcHJp
bWFyeUxldmVsREJLZXksIHJlc3VsdCwgZm91bmQpOworICAgIGlmICghb2spIHsKKyAgICAgICAg
SU5URVJOQUxfUkVBRF9FUlJPUihMb2FkQ3VycmVudFJvdyk7CisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1v
dmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgaW50NjRfdCBvYmplY3RTdG9yZURhdGFWZXJzaW9uOworICAgIHZhbHVlUG9zaXRpb24gPSBk
ZWNvZGVWYXJJbnQocmVzdWx0LmJlZ2luKCksIHJlc3VsdC5lbmQoKSwgb2JqZWN0U3RvcmVEYXRh
VmVyc2lvbik7CisgICAgaWYgKCF2YWx1ZVBvc2l0aW9uKSB7CisgICAgICAgIElOVEVSTkFMX1JF
QURfRVJST1IoTG9hZEN1cnJlbnRSb3cpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgaWYgKG9iamVjdFN0b3JlRGF0YVZlcnNpb24gIT0gaW5kZXhEYXRhVmVyc2lvbikgewor
ICAgICAgICBtX3RyYW5zYWN0aW9uLT5yZW1vdmUobV9pdGVyYXRvci0+a2V5KCkpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVmVjdG9yPGNoYXI+IHZhbHVlOworICAgIHZh
bHVlLmFwcGVuZCh2YWx1ZVBvc2l0aW9uLCByZXN1bHQuZW5kKCkgLSB2YWx1ZVBvc2l0aW9uKTsK
KyAgICBtX2N1cnJlbnRWYWx1ZSA9IFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IodmFsdWUpOwor
ICAgIHJldHVybiB0cnVlOworfQorCitib29sIG9iamVjdFN0b3JlQ3Vyc29yT3B0aW9ucyhMZXZl
bERCVHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJbmRleGVkREI6OkN1cnNv
ckRpcmVjdGlvbiBkaXJlY3Rpb24sIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29yOjpDdXJzb3JPcHRp
b25zJiBjdXJzb3JPcHRpb25zKQoreworICAgIGN1cnNvck9wdGlvbnMuZGF0YWJhc2VJZCA9IGRh
dGFiYXNlSWQ7CisgICAgY3Vyc29yT3B0aW9ucy5vYmplY3RTdG9yZUlkID0gb2JqZWN0U3RvcmVJ
ZDsKKworICAgIGJvb2wgbG93ZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT5sb3dlcigpOworICAg
IGJvb2wgdXBwZXJCb3VuZCA9IHJhbmdlICYmIHJhbmdlLT51cHBlcigpOworICAgIGN1cnNvck9w
dGlvbnMuZm9yd2FyZCA9IChkaXJlY3Rpb24gPT0gSW5kZXhlZERCOjpDdXJzb3JOZXh0Tm9EdXBs
aWNhdGUgfHwgZGlyZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yTmV4dCk7CisgICAgY3Vyc29y
T3B0aW9ucy51bmlxdWUgPSAoZGlyZWN0aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yTmV4dE5vRHVw
bGljYXRlIHx8IGRpcmVjdGlvbiA9PSBJbmRleGVkREI6OkN1cnNvclByZXZOb0R1cGxpY2F0ZSk7
CisKKyAgICBpZiAoIWxvd2VyQm91bmQpIHsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5sb3dLZXkg
PSBPYmplY3RTdG9yZURhdGFLZXk6OmVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBt
aW5JREJLZXkoKSk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHRydWU7IC8vIE5v
dCBpbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAgICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9
IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpy
YW5nZS0+bG93ZXIoKSk7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93T3BlbiA9IHJhbmdlLT5s
b3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBpZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgY3Vy
c29yT3B0aW9ucy5oaWdoS2V5ID0gT2JqZWN0U3RvcmVEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgbWF4SURCS2V5KCkpOworCisgICAgICAgIGlmIChjdXJzb3JPcHRp
b25zLmZvcndhcmQpCisgICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gdHJ1ZTsg
Ly8gTm90IGluY2x1ZGVkLgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIG5lZWQg
YSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NU
aGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBjdXJzb3JPcHRp
b25zLmhpZ2hLZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaEtleSA9IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5j
b2RlKGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsICpyYW5nZS0+dXBwZXIoKSk7CisgICAgICAg
IGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSByYW5nZS0+dXBwZXJPcGVuKCk7CisKKyAgICAgICAg
aWYgKCFjdXJzb3JPcHRpb25zLmZvcndhcmQpIHsKKyAgICAgICAgICAgIC8vIEZvciByZXZlcnNl
IGN1cnNvcnMsIHdlIG5lZWQgYSBrZXkgdGhhdCBleGlzdHMuCisgICAgICAgICAgICBWZWN0b3I8
Y2hhcj4gZm91bmRIaWdoS2V5OworICAgICAgICAgICAgaWYgKCFmaW5kR3JlYXRlc3RLZXlMZXNz
VGhhbk9yRXF1YWwodHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMuaGlnaEtleSwgZm91bmRIaWdo
S2V5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIElm
IHRoZSB0YXJnZXQga2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0
aCBhIHNtYWxsZXIga2V5LCB3ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgorICAgICAgICAgICAgaWYg
KGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gJiYgY29tcGFyZUluZGV4S2V5cyhmb3VuZEhpZ2hLZXks
IGN1cnNvck9wdGlvbnMuaGlnaEtleSkgPCAwKQorICAgICAgICAgICAgICAgIGN1cnNvck9wdGlv
bnMuaGlnaE9wZW4gPSBmYWxzZTsKKworICAgICAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5
ID0gZm91bmRIaWdoS2V5OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9
CisKK2Jvb2wgaW5kZXhDdXJzb3JPcHRpb25zKExldmVsREJUcmFuc2FjdGlvbiogdHJhbnNhY3Rp
b24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGlu
ZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rp
b24gZGlyZWN0aW9uLCBJREJCYWNraW5nU3RvcmU6OkN1cnNvcjo6Q3Vyc29yT3B0aW9ucyYgY3Vy
c29yT3B0aW9ucykKK3sKKyAgICBBU1NFUlQodHJhbnNhY3Rpb24pOworICAgIGlmICghS2V5UHJl
Zml4Ojp2YWxpZElkcyhkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgY3Vyc29yT3B0aW9ucy5kYXRhYmFzZUlkID0gZGF0YWJh
c2VJZDsKKyAgICBjdXJzb3JPcHRpb25zLm9iamVjdFN0b3JlSWQgPSBvYmplY3RTdG9yZUlkOwor
ICAgIGN1cnNvck9wdGlvbnMuaW5kZXhJZCA9IGluZGV4SWQ7CisKKyAgICBib29sIGxvd2VyQm91
bmQgPSByYW5nZSAmJiByYW5nZS0+bG93ZXIoKTsKKyAgICBib29sIHVwcGVyQm91bmQgPSByYW5n
ZSAmJiByYW5nZS0+dXBwZXIoKTsKKyAgICBjdXJzb3JPcHRpb25zLmZvcndhcmQgPSAoZGlyZWN0
aW9uID09IEluZGV4ZWREQjo6Q3Vyc29yTmV4dE5vRHVwbGljYXRlIHx8IGRpcmVjdGlvbiA9PSBJ
bmRleGVkREI6OkN1cnNvck5leHQpOworICAgIGN1cnNvck9wdGlvbnMudW5pcXVlID0gKGRpcmVj
dGlvbiA9PSBJbmRleGVkREI6OkN1cnNvck5leHROb0R1cGxpY2F0ZSB8fCBkaXJlY3Rpb24gPT0g
SW5kZXhlZERCOjpDdXJzb3JQcmV2Tm9EdXBsaWNhdGUpOworCisgICAgaWYgKCFsb3dlckJvdW5k
KSB7CisgICAgICAgIGN1cnNvck9wdGlvbnMubG93S2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGVN
aW5LZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7CisgICAgICAgIGN1cnNv
ck9wdGlvbnMubG93T3BlbiA9IGZhbHNlOyAvLyBJbmNsdWRlZC4KKyAgICB9IGVsc2UgeworICAg
ICAgICBjdXJzb3JPcHRpb25zLmxvd0tleSA9IEluZGV4RGF0YUtleTo6ZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIGluZGV4SWQsICpyYW5nZS0+bG93ZXIoKSk7CisgICAgICAgIGN1
cnNvck9wdGlvbnMubG93T3BlbiA9IHJhbmdlLT5sb3dlck9wZW4oKTsKKyAgICB9CisKKyAgICBp
ZiAoIXVwcGVyQm91bmQpIHsKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhE
YXRhS2V5OjplbmNvZGVNYXhLZXkoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCk7
CisgICAgICAgIGN1cnNvck9wdGlvbnMuaGlnaE9wZW4gPSBmYWxzZTsgLy8gSW5jbHVkZWQuCisK
KyAgICAgICAgaWYgKCFjdXJzb3JPcHRpb25zLmZvcndhcmQpIHsgLy8gV2UgbmVlZCBhIGtleSB0
aGF0IGV4aXN0cy4KKyAgICAgICAgICAgIGlmICghZmluZEdyZWF0ZXN0S2V5TGVzc1RoYW5PckVx
dWFsKHRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zLmhpZ2hLZXksIGN1cnNvck9wdGlvbnMuaGln
aEtleSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY3Vyc29y
T3B0aW9ucy5oaWdoT3BlbiA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gSW5kZXhEYXRhS2V5OjplbmNvZGUoZGF0YWJhc2VJ
ZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgKnJhbmdlLT51cHBlcigpKTsKKyAgICAgICAgY3Vy
c29yT3B0aW9ucy5oaWdoT3BlbiA9IHJhbmdlLT51cHBlck9wZW4oKTsKKworICAgICAgICBWZWN0
b3I8Y2hhcj4gZm91bmRIaWdoS2V5OworICAgICAgICBpZiAoIWZpbmRHcmVhdGVzdEtleUxlc3NU
aGFuT3JFcXVhbCh0cmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucy5oaWdoS2V5LCBmb3VuZEhpZ2hL
ZXkpKSAvLyBTZWVrIHRvIHRoZSAqbGFzdCoga2V5IGluIHRoZSBzZXQgb2Ygbm9uLXVuaXF1ZSBr
ZXlzLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIElmIHRoZSB0YXJn
ZXQga2V5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQsIGJ1dCB3ZSBlbmQgdXAgd2l0aCBhIHNtYWxs
ZXIga2V5LCB3ZSBzaG91bGQgaW5jbHVkZSB0aGF0LgorICAgICAgICBpZiAoY3Vyc29yT3B0aW9u
cy5oaWdoT3BlbiAmJiBjb21wYXJlSW5kZXhLZXlzKGZvdW5kSGlnaEtleSwgY3Vyc29yT3B0aW9u
cy5oaWdoS2V5KSA8IDApCisgICAgICAgICAgICBjdXJzb3JPcHRpb25zLmhpZ2hPcGVuID0gZmFs
c2U7CisKKyAgICAgICAgY3Vyc29yT3B0aW9ucy5oaWdoS2V5ID0gZm91bmRIaWdoS2V5OworICAg
IH0KKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPElEQkJhY2tpbmdTdG9yZTo6
Q3Vyc29yPiBJREJCYWNraW5nU3RvcmU6Om9wZW5PYmplY3RTdG9yZUN1cnNvcihJREJCYWNraW5n
U3RvcmU6OlRyYW5zYWN0aW9uKiB0cmFuc2FjdGlvbiwgaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2
NF90IG9iamVjdFN0b3JlSWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwgSW5kZXhlZERCOjpD
dXJzb3JEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIElEQl9UUkFDRSgiSURCQmFja2luZ1N0
b3JlOjpvcGVuT2JqZWN0U3RvcmVDdXJzb3IiKTsKKyAgICBMZXZlbERCVHJhbnNhY3Rpb24qIGxl
dmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246OmxldmVsREJU
cmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIElEQkJhY2tpbmdTdG9yZTo6Q3Vyc29y
OjpDdXJzb3JPcHRpb25zIGN1cnNvck9wdGlvbnM7CisgICAgaWYgKCFvYmplY3RTdG9yZUN1cnNv
ck9wdGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBy
YW5nZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
UmVmUHRyPE9iamVjdFN0b3JlQ3Vyc29ySW1wbD4gY3Vyc29yID0gT2JqZWN0U3RvcmVDdXJzb3JJ
bXBsOjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKKyAgICBpZiAo
IWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGN1
cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpDdXJzb3I+
IElEQkJhY2tpbmdTdG9yZTo6b3Blbk9iamVjdFN0b3JlS2V5Q3Vyc29yKElEQkJhY2tpbmdTdG9y
ZTo6VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qg
b2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5UmFuZ2UqIHJhbmdlLCBJbmRleGVkREI6OkN1cnNv
ckRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6
Om9wZW5PYmplY3RTdG9yZUtleUN1cnNvciIpOworICAgIExldmVsREJUcmFuc2FjdGlvbiogbGV2
ZWxEQlRyYW5zYWN0aW9uID0gSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6bGV2ZWxEQlRy
YW5zYWN0aW9uRnJvbSh0cmFuc2FjdGlvbik7CisgICAgSURCQmFja2luZ1N0b3JlOjpDdXJzb3I6
OkN1cnNvck9wdGlvbnMgY3Vyc29yT3B0aW9uczsKKyAgICBpZiAoIW9iamVjdFN0b3JlQ3Vyc29y
T3B0aW9ucyhsZXZlbERCVHJhbnNhY3Rpb24sIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIHJh
bmdlLCBkaXJlY3Rpb24sIGN1cnNvck9wdGlvbnMpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBS
ZWZQdHI8T2JqZWN0U3RvcmVLZXlDdXJzb3JJbXBsPiBjdXJzb3IgPSBPYmplY3RTdG9yZUtleUN1
cnNvckltcGw6OmNyZWF0ZShsZXZlbERCVHJhbnNhY3Rpb24sIGN1cnNvck9wdGlvbnMpOworICAg
IGlmICghY3Vyc29yLT5maXJzdFNlZWsoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1
cm4gY3Vyc29yLnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxJREJCYWNraW5nU3RvcmU6OkN1
cnNvcj4gSURCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IoSURCQmFja2luZ1N0b3Jl
OjpUcmFuc2FjdGlvbiogdHJhbnNhY3Rpb24sIGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQsIGNvbnN0IElEQktleVJhbmdlKiByYW5nZSwg
SW5kZXhlZERCOjpDdXJzb3JEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIElEQl9UUkFDRSgi
SURCQmFja2luZ1N0b3JlOjpvcGVuSW5kZXhLZXlDdXJzb3IiKTsKKyAgICBMZXZlbERCVHJhbnNh
Y3Rpb24qIGxldmVsREJUcmFuc2FjdGlvbiA9IElEQkJhY2tpbmdTdG9yZTo6VHJhbnNhY3Rpb246
OmxldmVsREJUcmFuc2FjdGlvbkZyb20odHJhbnNhY3Rpb24pOworICAgIElEQkJhY2tpbmdTdG9y
ZTo6Q3Vyc29yOjpDdXJzb3JPcHRpb25zIGN1cnNvck9wdGlvbnM7CisgICAgaWYgKCFpbmRleEN1
cnNvck9wdGlvbnMobGV2ZWxEQlRyYW5zYWN0aW9uLCBkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlk
LCBpbmRleElkLCByYW5nZSwgZGlyZWN0aW9uLCBjdXJzb3JPcHRpb25zKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgUmVmUHRyPEluZGV4S2V5Q3Vyc29ySW1wbD4gY3Vyc29yID0gSW5kZXhLZXlD
dXJzb3JJbXBsOjpjcmVhdGUobGV2ZWxEQlRyYW5zYWN0aW9uLCBjdXJzb3JPcHRpb25zKTsKKyAg
ICBpZiAoIWN1cnNvci0+Zmlyc3RTZWVrKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0
dXJuIGN1cnNvci5yZWxlYXNlKCk7Cit9CisKK1Bhc3NSZWZQdHI8SURCQmFja2luZ1N0b3JlOjpD
dXJzb3I+IElEQkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yKElEQkJhY2tpbmdTdG9yZTo6
VHJhbnNhY3Rpb24qIHRyYW5zYWN0aW9uLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkLCBjb25zdCBJREJLZXlSYW5nZSogcmFuZ2UsIElu
ZGV4ZWREQjo6Q3Vyc29yRGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBJREJfVFJBQ0UoIklE
QkJhY2tpbmdTdG9yZTo6b3BlbkluZGV4Q3Vyc29yIik7CisgICAgTGV2ZWxEQlRyYW5zYWN0aW9u
KiBsZXZlbERCVHJhbnNhY3Rpb24gPSBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpsZXZl
bERCVHJhbnNhY3Rpb25Gcm9tKHRyYW5zYWN0aW9uKTsKKyAgICBJREJCYWNraW5nU3RvcmU6OkN1
cnNvcjo6Q3Vyc29yT3B0aW9ucyBjdXJzb3JPcHRpb25zOworICAgIGlmICghaW5kZXhDdXJzb3JP
cHRpb25zKGxldmVsREJUcmFuc2FjdGlvbiwgZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5k
ZXhJZCwgcmFuZ2UsIGRpcmVjdGlvbiwgY3Vyc29yT3B0aW9ucykpCisgICAgICAgIHJldHVybiAw
OworICAgIFJlZlB0cjxJbmRleEN1cnNvckltcGw+IGN1cnNvciA9IEluZGV4Q3Vyc29ySW1wbDo6
Y3JlYXRlKGxldmVsREJUcmFuc2FjdGlvbiwgY3Vyc29yT3B0aW9ucyk7CisgICAgaWYgKCFjdXJz
b3ItPmZpcnN0U2VlaygpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBjdXJzb3Iu
cmVsZWFzZSgpOworfQorCitJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpUcmFuc2FjdGlv
bihJREJCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSkKKyAgICA6IG1fYmFja2luZ1N0b3JlKGJh
Y2tpbmdTdG9yZSkKK3sKK30KKwordm9pZCBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpi
ZWdpbigpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpi
ZWdpbiIpOworICAgIEFTU0VSVCghbV90cmFuc2FjdGlvbik7CisgICAgbV90cmFuc2FjdGlvbiA9
IExldmVsREJUcmFuc2FjdGlvbjo6Y3JlYXRlKG1fYmFja2luZ1N0b3JlLT5tX2RiLmdldCgpKTsK
K30KKworYm9vbCBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpjb21taXQoKQoreworICAg
IElEQl9UUkFDRSgiSURCQmFja2luZ1N0b3JlOjpUcmFuc2FjdGlvbjo6Y29tbWl0Iik7CisgICAg
QVNTRVJUKG1fdHJhbnNhY3Rpb24pOworICAgIGJvb2wgcmVzdWx0ID0gbV90cmFuc2FjdGlvbi0+
Y29tbWl0KCk7CisgICAgbV90cmFuc2FjdGlvbi5jbGVhcigpOworICAgIGlmICghcmVzdWx0KQor
ICAgICAgICBJTlRFUk5BTF9XUklURV9FUlJPUihUcmFuc2FjdGlvbkNvbW1pdCk7CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKwordm9pZCBJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpyb2xs
YmFjaygpCit7CisgICAgSURCX1RSQUNFKCJJREJCYWNraW5nU3RvcmU6OlRyYW5zYWN0aW9uOjpy
b2xsYmFjayIpOworICAgIEFTU0VSVChtX3RyYW5zYWN0aW9uKTsKKyAgICBtX3RyYW5zYWN0aW9u
LT5yb2xsYmFjaygpOworICAgIG1fdHJhbnNhY3Rpb24uY2xlYXIoKTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkxldmVs
REJDb2RpbmcuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9J
REJMZXZlbERCQ29kaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44
OGUwZTBiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVk
ZGIvbGV2ZWxkYi9JREJMZXZlbERCQ29kaW5nLmNwcApAQCAtMCwwICsxLDE4MDkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkNvZGluZy5oIgorCisj
aWYgRU5BQkxFKElOREVYRURfREFUQUJBU0UpCisjaWYgVVNFKExFVkVMREIpCisKKyNpbmNsdWRl
ICJJREJLZXkuaCIKKyNpbmNsdWRlICJJREJLZXlQYXRoLmgiCisjaW5jbHVkZSAiTGV2ZWxEQlNs
aWNlLmgiCisjaW5jbHVkZSA8d3RmL0J5dGVPcmRlci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0
cmluZ0J1aWxkZXIuaD4KKworLy8gTGV2ZWxEQiBzdG9yZXMga2V5L3ZhbHVlIHBhaXJzLiBLZXlz
IGFuZCB2YWx1ZXMgYXJlIHN0cmluZ3Mgb2YgYnl0ZXMsIG5vcm1hbGx5IG9mIHR5cGUgVmVjdG9y
PGNoYXI+LgorLy8KKy8vIFRoZSBrZXlzIGluIHRoZSBiYWNraW5nIHN0b3JlIGFyZSB2YXJpYWJs
ZS1sZW5ndGggdHVwbGVzIHdpdGggZGlmZmVyZW50IHR5cGVzCisvLyBvZiBmaWVsZHMuIEVhY2gg
a2V5IGluIHRoZSBiYWNraW5nIHN0b3JlIHN0YXJ0cyB3aXRoIGEgdGVybmFyeSBwcmVmaXg6IChk
YXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCkuIEZvciBlYWNoLCAwIGlzIHJl
c2VydmVkIGZvciBtZXRhLWRhdGEuCisvLyBUaGUgcHJlZml4IG1ha2VzIHN1cmUgdGhhdCBkYXRh
IGZvciBhIHNwZWNpZmljIGRhdGFiYXNlLCBvYmplY3Qgc3RvcmUsIGFuZCBpbmRleCBhcmUgZ3Jv
dXBlZCB0b2dldGhlci4gVGhlIGxvY2FsaXR5IGlzIGltcG9ydGFudCBmb3IgcGVyZm9ybWFuY2U6
IGNvbW1vbgorLy8gb3BlcmF0aW9ucyBzaG91bGQgb25seSBuZWVkIGEgbWluaW1hbCBudW1iZXIg
b2Ygc2VlayBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgYWxsIHRoZSBtZXRhLWRhdGEgZm9yIGEg
ZGF0YWJhc2UgaXMgZ3JvdXBlZCB0b2dldGhlciBzbyB0aGF0IHJlYWRpbmcgdGhhdAorLy8gbWV0
YS1kYXRhIG9ubHkgcmVxdWlyZXMgb25lIHNlZWsuCisvLworLy8gRWFjaCBrZXkgdHlwZSBoYXMg
YSBjbGFzcyAoaW4gc3F1YXJlIGJyYWNrZXRzIGJlbG93KSB3aGljaCBrbm93cyBob3cgdG8gZW5j
b2RlLCBkZWNvZGUsIGFuZCBjb21wYXJlIHRoYXQga2V5IHR5cGUuCisvLworLy8gR2xvYmFsIG1l
dGEtZGF0YSBoYXZlIGtleXMgd2l0aCBwcmVmaXggKDAsMCwwKSwgZm9sbG93ZWQgYnkgYSB0eXBl
IGJ5dGU6CisvLworLy8gICAgIDwwLCAwLCAwLCAwPiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICA9PiBJbmRleGVkREIvTGV2ZWxEQiBzY2hlbWEgdmVyc2lvbiBbU2No
ZW1hVmVyc2lvbktleV0KKy8vICAgICA8MCwgMCwgMCwgMT4gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgPT4gVGhlIG1heGltdW0gZGF0YWJhc2UgaWQgZXZlciBhbGxv
Y2F0ZWQgW01heERhdGFiYXNlSWRLZXldCisvLyAgICAgPDAsIDAsIDAsIDI+ICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSB2
ZXJzaW9uIFtEYXRhVmVyc2lvbktleV0KKy8vICAgICA8MCwgMCwgMCwgMTAwLCBkYXRhYmFzZSBp
ZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gRXhpc3RlbmNlIGltcGxpZXMgdGhlIGRh
dGFiYXNlIGlkIGlzIGluIHRoZSBmcmVlIGxpc3QgW0RhdGFiYXNlRnJlZUxpc3RLZXldCisvLyAg
ICAgPDAsIDAsIDAsIDIwMSwgdXRmMTYgb3JpZ2luIG5hbWUsIHV0ZjE2IGRhdGFiYXNlIG5hbWU+
ID0+IERhdGFiYXNlIGlkIFtEYXRhYmFzZU5hbWVLZXldCisvLworLy8KKy8vIERhdGFiYXNlIG1l
dGEtZGF0YToKKy8vCisvLyAgICAgQWdhaW4sIHRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0
eXBlIGJ5dGUuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMD4gPT4gdXRmMTYgb3Jp
Z2luIG5hbWUgW0RhdGFiYXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAw
LCAxPiA9PiB1dGYxNiBkYXRhYmFzZSBuYW1lIFtEYXRhYmFzZU1ldGFEYXRhS2V5XQorLy8gICAg
IDxkYXRhYmFzZSBpZCwgMCwgMCwgMj4gPT4gdXRmMTYgdXNlciB2ZXJzaW9uIGRhdGEgW0RhdGFi
YXNlTWV0YURhdGFLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAzPiA9PiBtYXhpbXVt
IG9iamVjdCBzdG9yZSBpZCBldmVyIGFsbG9jYXRlZCBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8v
ICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDQ+ID0+IHVzZXIgaW50ZWdlciB2ZXJzaW9uICh2YXIg
aW50KSBbRGF0YWJhc2VNZXRhRGF0YUtleV0KKy8vCisvLworLy8gT2JqZWN0IHN0b3JlIG1ldGEt
ZGF0YToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dlZCBieSBhIHR5cGUgYnl0ZSwg
dGhlbiBhIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLCBhbmQgdGhlbiBhbm90aGVyIHR5cGUgYnl0
ZS4KKy8vCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCA1MCwgb2JqZWN0IHN0b3JlIGlkLCAw
PiA9PiB1dGYxNiBvYmplY3Qgc3RvcmUgbmFtZSBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8v
ICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDE+ID0+IHV0ZjE2
IGtleSBwYXRoIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwg
MCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgMj4gPT4gaGFzIGF1dG8gaW5jcmVtZW50IFtPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVj
dCBzdG9yZSBpZCwgMz4gPT4gaXMgZXZpY3RhYmxlIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQor
Ly8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgND4gPT4gbGFz
dCAidmVyc2lvbiIgbnVtYmVyIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRh
YmFzZSBpZCwgMCwgMCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgNT4gPT4gbWF4aW11bSBpbmRleCBp
ZCBldmVyIGFsbG9jYXRlZCBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJh
c2UgaWQsIDAsIDAsIDUwLCBvYmplY3Qgc3RvcmUgaWQsIDY+ID0+IGhhcyBrZXkgcGF0aCAodnMu
IG51bGwpIFtPYmplY3RTdG9yZU1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwg
MCwgNTAsIG9iamVjdCBzdG9yZSBpZCwgNz4gPT4ga2V5IGdlbmVyYXRvciBjdXJyZW50IG51bWJl
ciBbT2JqZWN0U3RvcmVNZXRhRGF0YUtleV0KKy8vCisvLworLy8gSW5kZXggbWV0YS1kYXRhOgor
Ly8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlwZSBieXRlLCB0aGVuIHR3
byB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMsIGFuZCB0aGVuIGFub3RoZXIgdHlwZSBieXRlLgor
Ly8KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRl
eCBpZCwgMD4gPT4gdXRmMTYgaW5kZXggbmFtZSBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8
ZGF0YWJhc2UgaWQsIDAsIDAsIDEwMCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMT4gPT4g
YXJlIGluZGV4IGtleXMgdW5pcXVlIFtJbmRleE1ldGFEYXRhS2V5XQorLy8gICAgIDxkYXRhYmFz
ZSBpZCwgMCwgMCwgMTAwLCBvYmplY3Qgc3RvcmUgaWQsIGluZGV4IGlkLCAyPiA9PiB1dGYxNiBr
ZXkgcGF0aCBbSW5kZXhNZXRhRGF0YUtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDEw
MCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwgMz4gPT4gaXMgaW5kZXggbXVsdGktZW50cnkg
W0luZGV4TWV0YURhdGFLZXldCisvLworLy8KKy8vIE90aGVyIG9iamVjdCBzdG9yZSBhbmQgaW5k
ZXggbWV0YS1kYXRhOgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2VkIGJ5IGEgdHlw
ZSBieXRlLiBUaGUgb2JqZWN0IHN0b3JlIGFuZCBpbmRleCBpZCBhcmUgdmFyaWFibGUgbGVuZ3Ro
IGludGVnZXJzLCB0aGUgdXRmMTYgc3RyaW5ncyBhcmUgdmFyaWFibGUgbGVuZ3RoIHN0cmluZ3Mu
CisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgMCwgMCwgMTUwLCBvYmplY3Qgc3RvcmUgaWQ+ICAg
ICAgICAgICAgICAgICAgID0+IGV4aXN0ZW5jZSBpbXBsaWVzIHRoZSBvYmplY3Qgc3RvcmUgaWQg
aXMgaW4gdGhlIGZyZWUgbGlzdCBbT2JqZWN0U3RvcmVGcmVlTGlzdEtleV0KKy8vICAgICA8ZGF0
YWJhc2UgaWQsIDAsIDAsIDE1MSwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZD4gICAgICAgICA9
PiBleGlzdGVuY2UgaW1wbGllcyB0aGUgaW5kZXggaWQgaXMgaW4gdGhlIGZyZWUgbGlzdCBbSW5k
ZXhGcmVlTGlzdEtleV0KKy8vICAgICA8ZGF0YWJhc2UgaWQsIDAsIDAsIDIwMCwgdXRmMTYgb2Jq
ZWN0IHN0b3JlIG5hbWU+ICAgICAgICAgICA9PiBvYmplY3Qgc3RvcmUgaWQgW09iamVjdFN0b3Jl
TmFtZXNLZXldCisvLyAgICAgPGRhdGFiYXNlIGlkLCAwLCAwLCAyMDEsIG9iamVjdCBzdG9yZSBp
ZCwgdXRmMTYgaW5kZXggbmFtZT4gPT4gaW5kZXggaWQgW0luZGV4TmFtZXNLZXldCisvLworLy8K
Ky8vIE9iamVjdCBzdG9yZSBkYXRhOgorLy8KKy8vICAgICBUaGUgcHJlZml4IGlzIGZvbGxvd2Vk
IGJ5IGEgdHlwZSBieXRlLiBUaGUgdXNlciBrZXkgaXMgYW4gZW5jb2RlZCBJREJLZXkuCisvLwor
Ly8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCAxLCB1c2VyIGtleT4gPT4gInZl
cnNpb24iLCBzZXJpYWxpemVkIHNjcmlwdCB2YWx1ZSBbT2JqZWN0U3RvcmVEYXRhS2V5XQorLy8K
Ky8vCisvLyAiRXhpc3RzIiBlbnRyeToKKy8vCisvLyAgICAgVGhlIHByZWZpeCBpcyBmb2xsb3dl
ZCBieSBhIHR5cGUgYnl0ZS4gVGhlIHVzZXIga2V5IGlzIGFuIGVuY29kZWQgSURCS2V5LgorLy8K
Ky8vICAgICA8ZGF0YWJhc2UgaWQsIG9iamVjdCBzdG9yZSBpZCwgMiwgdXNlciBrZXk+ID0+ICJ2
ZXJzaW9uIiBbRXhpc3RzRW50cnlLZXldCisvLworLy8KKy8vIEluZGV4IGRhdGE6CisvLworLy8g
ICAgIFRoZSBwcmVmaXggaXMgZm9sbG93ZWQgYnkgYSB0eXBlIGJ5dGUuIFRoZSBpbmRleCBrZXkg
aXMgYW4gZW5jb2RlZCBJREJLZXkuIFRoZSBzZXF1ZW5jZSBudW1iZXIgaXMgYSB2YXJpYWJsZSBs
ZW5ndGggaW50ZWdlci4KKy8vICAgICBUaGUgcHJpbWFyeSBrZXkgaXMgYW4gZW5jb2RlZCBJREJL
ZXkuCisvLworLy8gICAgIDxkYXRhYmFzZSBpZCwgb2JqZWN0IHN0b3JlIGlkLCBpbmRleCBpZCwg
aW5kZXgga2V5LCBzZXF1ZW5jZSBudW1iZXIsIHByaW1hcnkga2V5PiA9PiAidmVyc2lvbiIsIHBy
aW1hcnkga2V5IFtJbmRleERhdGFLZXldCisvLworLy8gICAgIChUaGUgc2VxdWVuY2UgbnVtYmVy
IGlzIG9ic29sZXRlOyBpdCB3YXMgdXNlZCB0byBhbGxvdyB0d28gZW50cmllcyB3aXRoCisvLyAg
ICAgdGhlIHNhbWUgdXNlciAoaW5kZXgpIGtleSBpbiBub24tdW5pcXVlIGluZGV4ZXMgcHJpb3Ig
dG8gdGhlIGluY2x1c2lvbiBvZgorLy8gICAgIHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgZGF0YS4g
VGhlICJ2ZXJzaW9uIiBmaWVsZCBpcyB1c2VkIHRvIHdlZWQgb3V0IHN0YWxlCisvLyAgICAgaW5k
ZXggZGF0YS4gV2hlbmV2ZXIgbmV3IG9iamVjdCBzdG9yZSBkYXRhIGlzIGluc2VydGVkLCBpdCBn
ZXRzIGEgbmV3CisvLyAgICAgInZlcnNpb24iIG51bWJlciwgYW5kIG5ldyBpbmRleCBkYXRhIGlz
IHdyaXR0ZW4gd2l0aCB0aGlzIG51bWJlci4gV2hlbgorLy8gICAgIHRoZSBpbmRleCBpcyB1c2Vk
IGZvciBsb29rLXVwcywgZW50cmllcyBhcmUgdmFsaWRhdGVkIGFnYWluc3QgdGhlCisvLyAgICAg
ImV4aXN0cyIgZW50cmllcywgYW5kIHJlY29yZHMgd2l0aCBvbGQgInZlcnNpb24iIG51bWJlcnMg
YXJlIGRlbGV0ZWQKKy8vICAgICB3aGVuIHRoZXkgYXJlIGVuY291bnRlcmVkIGluIGdldFByaW1h
cnlLZXlWaWFJbmRleCwKKy8vICAgICBJbmRleEN1cnNvckltcGw6OmxvYWRDdXJyZW50Um93LCBh
bmQgSW5kZXhLZXlDdXJzb3JJbXBsOjpsb2FkQ3VycmVudFJvdykuCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKK25hbWVzcGFjZSBJREJMZXZlbERCQ29kaW5nIHsKKworI2lmbmRlZiBJTlQ2NF9NQVgK
KyNkZWZpbmUgSU5UNjRfTUFYIDB4N2ZmZmZmZmZmZmZmZmZmZkxMCisjZW5kaWYKKyNpZm5kZWYg
SU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAweDdmZmZmZmZmTAorI2VuZGlmCisKK3N0YXRp
YyBjb25zdCB1bnNpZ25lZCBjaGFyIElEQktleU51bGxUeXBlQnl0ZSA9IDA7CitzdGF0aWMgY29u
c3QgdW5zaWduZWQgY2hhciBJREJLZXlTdHJpbmdUeXBlQnl0ZSA9IDE7CitzdGF0aWMgY29uc3Qg
dW5zaWduZWQgY2hhciBJREJLZXlEYXRlVHlwZUJ5dGUgPSAyOworc3RhdGljIGNvbnN0IHVuc2ln
bmVkIGNoYXIgSURCS2V5TnVtYmVyVHlwZUJ5dGUgPSAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVk
IGNoYXIgSURCS2V5QXJyYXlUeXBlQnl0ZSA9IDQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hh
ciBJREJLZXlNaW5LZXlUeXBlQnl0ZSA9IDU7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFy
IElEQktleVBhdGhUeXBlQ29kZWRCeXRlMSA9IDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hh
ciBJREJLZXlQYXRoVHlwZUNvZGVkQnl0ZTIgPSAwOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQg
Y2hhciBPYmplY3RTdG9yZURhdGFJbmRleElkID0gMTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBj
aGFyIEV4aXN0c0VudHJ5SW5kZXhJZCA9IDI7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFy
IFNjaGVtYVZlcnNpb25UeXBlQnl0ZSA9IDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBN
YXhEYXRhYmFzZUlkVHlwZUJ5dGUgPSAxOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgRGF0
YVZlcnNpb25UeXBlQnl0ZSA9IDI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNYXhTaW1w
bGVHbG9iYWxNZXRhRGF0YVR5cGVCeXRlID0gMzsgLy8gSW5zZXJ0IGJlZm9yZSB0aGlzIGFuZCBp
bmNyZW1lbnQuCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBEYXRhYmFzZUZyZWVMaXN0VHlw
ZUJ5dGUgPSAxMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBEYXRhYmFzZU5hbWVUeXBl
Qnl0ZSA9IDIwMTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgT2JqZWN0U3RvcmVNZXRh
RGF0YVR5cGVCeXRlID0gNTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBJbmRleE1ldGFE
YXRhVHlwZUJ5dGUgPSAxMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBPYmplY3RTdG9y
ZUZyZWVMaXN0VHlwZUJ5dGUgPSAxNTA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBJbmRl
eEZyZWVMaXN0VHlwZUJ5dGUgPSAxNTE7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBPYmpl
Y3RTdG9yZU5hbWVzVHlwZUJ5dGUgPSAyMDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBJ
bmRleE5hbWVzS2V5VHlwZUJ5dGUgPSAyMDE7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFy
IE9iamVjdE1ldGFEYXRhVHlwZU1heGltdW0gPSAyNTU7CitzdGF0aWMgY29uc3QgdW5zaWduZWQg
Y2hhciBJbmRleE1ldGFEYXRhVHlwZU1heGltdW0gPSAyNTU7CisKK1ZlY3RvcjxjaGFyPiBlbmNv
ZGVCeXRlKHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgICBWZWN0b3I8Y2hhciwgRGVmYXVsdElubGlu
ZUJ1ZmZlclNpemU+IHY7CisgICAgdi5hcHBlbmQoYyk7CisKKyAgICBBU1NFUlQodi5zaXplKCkg
PD0gRGVmYXVsdElubGluZUJ1ZmZlclNpemUpOworICAgIHJldHVybiB2OworfQorCitjb25zdCBj
aGFyKiBkZWNvZGVCeXRlKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGxpbWl0LCB1bnNpZ25l
ZCBjaGFyJiBmb3VuZENoYXIpCit7CisgICAgaWYgKHAgPj0gbGltaXQpCisgICAgICAgIHJldHVy
biAwOworCisgICAgZm91bmRDaGFyID0gKnArKzsKKyAgICByZXR1cm4gcDsKK30KKworVmVjdG9y
PGNoYXI+IG1heElEQktleSgpCit7CisgICAgcmV0dXJuIGVuY29kZUJ5dGUoSURCS2V5TnVsbFR5
cGVCeXRlKTsKK30KKworVmVjdG9yPGNoYXI+IG1pbklEQktleSgpCit7CisgICAgcmV0dXJuIGVu
Y29kZUJ5dGUoSURCS2V5TWluS2V5VHlwZUJ5dGUpOworfQorCitWZWN0b3I8Y2hhcj4gZW5jb2Rl
Qm9vbChib29sIGIpCit7CisgICAgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXpl
PiByZXQ7CisgICAgcmV0LmFwcGVuZChiID8gMSA6IDApOworCisgICAgQVNTRVJUKHJldC5zaXpl
KCkgPD0gRGVmYXVsdElubGluZUJ1ZmZlclNpemUpOworICAgIHJldHVybiByZXQ7Cit9CisKK2Jv
b2wgZGVjb2RlQm9vbChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kKQoreworICAg
IEFTU0VSVF9VTlVTRUQoZW5kLCBiZWdpbiA8IGVuZCk7CisgICAgcmV0dXJuICpiZWdpbjsKK30K
KworVmVjdG9yPGNoYXI+IGVuY29kZUludChpbnQ2NF90IG5QYXJhbSkKK3sKKyAgICBBU1NFUlQo
blBhcmFtID49IDApOworICAgIHVpbnQ2NF90IG4gPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oblBh
cmFtKTsKKyAgICBWZWN0b3I8Y2hhciwgRGVmYXVsdElubGluZUJ1ZmZlclNpemU+IHJldDsKKwor
ICAgIGRvIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gbjsKKyAgICAgICAgcmV0LmFwcGVu
ZChjKTsKKyAgICAgICAgbiA+Pj0gODsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIEFTU0VSVChy
ZXQuc2l6ZSgpIDw9IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplKTsKKyAgICByZXR1cm4gcmV0Owor
fQorCitpbnQ2NF90IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5k
KQoreworICAgIEFTU0VSVChiZWdpbiA8PSBlbmQpOworICAgIGludDY0X3QgcmV0ID0gMDsKKwor
ICAgIGludCBzaGlmdCA9IDA7CisgICAgd2hpbGUgKGJlZ2luIDwgZW5kKSB7CisgICAgICAgIHVu
c2lnbmVkIGNoYXIgYyA9ICpiZWdpbisrOworICAgICAgICByZXQgfD0gc3RhdGljX2Nhc3Q8aW50
NjRfdD4oYykgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9IDg7CisgICAgfQorCisgICAgcmV0
dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb21wYXJlSW50cyhpbnQ2NF90IGEsIGludDY0X3Qg
YikKK3sKKyAgICBBU1NFUlQoYSA+PSAwKTsKKyAgICBBU1NFUlQoYiA+PSAwKTsKKworICAgIGlu
dDY0X3QgZGlmZiA9IGEgLSBiOworICAgIGlmIChkaWZmIDwgMCkKKyAgICAgICAgcmV0dXJuIC0x
OworICAgIGlmIChkaWZmID4gMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9
CisKK1ZlY3RvcjxjaGFyPiBlbmNvZGVWYXJJbnQoaW50NjRfdCBuUGFyYW0pCit7CisgICAgQVNT
RVJUKG5QYXJhbSA+PSAwKTsKKyAgICB1aW50NjRfdCBuID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+
KG5QYXJhbSk7CisgICAgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiByZXQ7
CisKKyAgICBkbyB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAweDdmOworICAgICAg
ICBuID4+PSA3OworICAgICAgICBpZiAobikKKyAgICAgICAgICAgIGMgfD0gMHg4MDsKKyAgICAg
ICAgcmV0LmFwcGVuZChjKTsKKyAgICB9IHdoaWxlIChuKTsKKworICAgIEFTU0VSVChyZXQuc2l6
ZSgpIDw9IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplKTsKKyAgICByZXR1cm4gcmV0OworfQorCitj
b25zdCBjaGFyKiBkZWNvZGVWYXJJbnQoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQs
IGludDY0X3QmIGZvdW5kSW50KQoreworICAgIEFTU0VSVChsaW1pdCA+PSBwKTsKKyAgICBmb3Vu
ZEludCA9IDA7CisgICAgaW50IHNoaWZ0ID0gMDsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKHAg
Pj0gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB1bnNpZ25lZCBjaGFy
IGMgPSAqcDsKKyAgICAgICAgZm91bmRJbnQgfD0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYyAmIDB4
N2YpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA3OworICAgIH0gd2hpbGUgKCpwKysgJiAw
eDgwKTsKKyAgICByZXR1cm4gcDsKK30KKworVmVjdG9yPGNoYXI+IGVuY29kZVN0cmluZyhjb25z
dCBTdHJpbmcmIHMpCit7CisgICAgLy8gQmFja2luZyBzdG9yZSBpcyBVVEYtMTZCRSwgY29udmVy
dCBmcm9tIGhvc3QgZW5kaWFubmVzcy4KKyAgICBzaXplX3QgbGVuZ3RoID0gcy5sZW5ndGgoKTsK
KyAgICBWZWN0b3I8Y2hhcj4gcmV0KGxlbmd0aCAqIHNpemVvZihVQ2hhcikpOworCisgICAgY29u
c3QgVUNoYXIqIHNyYyA9IHMuY2hhcmFjdGVycygpOworICAgIFVDaGFyKiBkc3QgPSByZWludGVy
cHJldF9jYXN0PFVDaGFyKj4ocmV0LmRhdGEoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGxlbmd0aDsgKytpKQorICAgICAgICAqZHN0KysgPSBodG9ucygqc3JjKyspOworCisgICAg
cmV0dXJuIHJldDsKK30KKworU3RyaW5nIGRlY29kZVN0cmluZyhjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogZW5kKQoreworICAgIC8vIEJhY2tpbmcgc3RvcmUgaXMgVVRGLTE2QkUsIGNv
bnZlcnQgdG8gaG9zdCBlbmRpYW5uZXNzLgorICAgIEFTU0VSVChlbmQgPj0gc3RhcnQpOworICAg
IEFTU0VSVCghKChlbmQgLSBzdGFydCkgJSBzaXplb2YoVUNoYXIpKSk7CisKKyAgICBzaXplX3Qg
bGVuZ3RoID0gKGVuZCAtIHN0YXJ0KSAvIHNpemVvZihVQ2hhcik7CisgICAgVmVjdG9yPFVDaGFy
PiBidWZmZXIobGVuZ3RoKTsKKworICAgIGNvbnN0IFVDaGFyKiBzcmMgPSByZWludGVycHJldF9j
YXN0PGNvbnN0IFVDaGFyKj4oc3RhcnQpOworICAgIFVDaGFyKiBkc3QgPSBidWZmZXIuZGF0YSgp
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgKmRz
dCsrID0gbnRvaHMoKnNyYysrKTsKKworICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KGJ1ZmZlcik7
Cit9CisKK1ZlY3RvcjxjaGFyPiBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IFN0cmluZyYg
cykKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gZW5jb2RlVmFySW50KHMubGVuZ3RoKCkpOwor
ICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nKHMpKTsKKyAgICByZXR1cm4gcmV0Owor
fQorCitjb25zdCBjaGFyKiBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKGNvbnN0IGNoYXIqIHAsIGNv
bnN0IGNoYXIqIGxpbWl0LCBTdHJpbmcmIGZvdW5kU3RyaW5nKQoreworICAgIEFTU0VSVChsaW1p
dCA+PSBwKTsKKyAgICBpbnQ2NF90IGxlbjsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0
LCBsZW4pOworICAgIGlmICghcCB8fCBsZW4gPCAwIHx8IHAgKyBsZW4gKiAyID4gbGltaXQpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgZm91bmRTdHJpbmcgPSBkZWNvZGVTdHJpbmcocCwgcCAr
IGxlbiAqIDIpOworICAgIHAgKz0gbGVuICogMjsKKyAgICByZXR1cm4gcDsKK30KKworaW50IGNv
bXBhcmVFbmNvZGVkU3RyaW5nc1dpdGhMZW5ndGgoY29uc3QgY2hhciomIHAsIGNvbnN0IGNoYXIq
IGxpbWl0UCwgY29uc3QgY2hhciomIHEsIGNvbnN0IGNoYXIqIGxpbWl0USwgYm9vbCYgb2spCit7
CisgICAgQVNTRVJUKCZwICE9ICZxKTsKKyAgICBBU1NFUlQobGltaXRQID49IHApOworICAgIEFT
U0VSVChsaW1pdFEgPj0gcSk7CisgICAgaW50NjRfdCBsZW5QLCBsZW5ROworICAgIHAgPSBkZWNv
ZGVWYXJJbnQocCwgbGltaXRQLCBsZW5QKTsKKyAgICBxID0gZGVjb2RlVmFySW50KHEsIGxpbWl0
USwgbGVuUSk7CisgICAgaWYgKCFwIHx8ICFxIHx8IGxlblAgPCAwIHx8IGxlblEgPCAwKSB7Cisg
ICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBU1NFUlQo
cCAmJiBxKTsKKyAgICBBU1NFUlQobGVuUCA+PSAwKTsKKyAgICBBU1NFUlQobGVuUSA+PSAwKTsK
KyAgICBBU1NFUlQocCArIGxlblAgKiAyIDw9IGxpbWl0UCk7CisgICAgQVNTRVJUKHEgKyBsZW5R
ICogMiA8PSBsaW1pdFEpOworCisgICAgY29uc3QgY2hhciogc3RhcnRQID0gcDsKKyAgICBjb25z
dCBjaGFyKiBzdGFydFEgPSBxOworICAgIHAgKz0gbGVuUCAqIDI7CisgICAgcSArPSBsZW5RICog
MjsKKworICAgIGlmIChwID4gbGltaXRQIHx8IHEgPiBsaW1pdFEpIHsKKyAgICAgICAgb2sgPSBm
YWxzZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb2sgPSB0cnVlOworICAgIGNv
bnN0IHNpemVfdCBsbWluID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihsZW5QIDwgbGVuUSA/IGxlblAg
OiBsZW5RKTsKKyAgICBpZiAoaW50IHggPSBtZW1jbXAoc3RhcnRQLCBzdGFydFEsIGxtaW4gKiAy
KSkKKyAgICAgICAgcmV0dXJuIHg7CisKKyAgICBpZiAobGVuUCA9PSBsZW5RKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIHJldHVybiAobGVuUCA+IGxlblEpID8gMSA6IC0xOworfQorCitWZWN0
b3I8Y2hhcj4gZW5jb2RlRG91YmxlKGRvdWJsZSB4KQoreworICAgIC8vIEZJWE1FOiBJdCB3b3Vs
ZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGJlIGJ5dGUgb3JkZXIgaW5kZXBlbmRlbnQuCisgICAgY29u
c3QgY2hhciogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ4KTsKKyAgICBWZWN0b3I8Y2hh
ciwgRGVmYXVsdElubGluZUJ1ZmZlclNpemU+IHY7CisgICAgdi5hcHBlbmQocCwgc2l6ZW9mKHgp
KTsKKworICAgIEFTU0VSVCh2LnNpemUoKSA8PSBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZSk7Cisg
ICAgcmV0dXJuIHY7Cit9CisKK2NvbnN0IGNoYXIqIGRlY29kZURvdWJsZShjb25zdCBjaGFyKiBw
LCBjb25zdCBjaGFyKiBsaW1pdCwgZG91YmxlKiBkKQoreworICAgIGlmIChwICsgc2l6ZW9mKCpk
KSA+IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNoYXIqIHggPSByZWludGVycHJl
dF9jYXN0PGNoYXIqPihkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZigqZCk7
ICsraSkKKyAgICAgICAgKngrKyA9ICpwKys7CisgICAgcmV0dXJuIHA7Cit9CisKK1ZlY3Rvcjxj
aGFyPiBlbmNvZGVJREJLZXkoY29uc3QgSURCS2V5JiBrZXkpCit7CisgICAgVmVjdG9yPGNoYXIs
IERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiByZXQ7CisgICAgZW5jb2RlSURCS2V5KGtleSwgcmV0
KTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGVuY29kZUlEQktleShjb25zdCBJREJLZXkm
IGtleSwgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiYgaW50bykKK3sKKyAg
ICBzaXplX3QgcHJldmlvdXNTaXplID0gaW50by5zaXplKCk7CisgICAgQVNTRVJUKGtleS5pc1Zh
bGlkKCkpOworICAgIHN3aXRjaCAoa2V5LnR5cGUoKSkgeworICAgIGNhc2UgSURCS2V5OjpJbnZh
bGlkVHlwZToKKyAgICBjYXNlIElEQktleTo6TWluVHlwZToKKyAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgIGludG8uYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSURCS2V5TnVs
bFR5cGVCeXRlKSk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIElEQktleTo6QXJyYXlUeXBl
OiB7CisgICAgICAgIGludG8uYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSURCS2V5QXJyYXlUeXBl
Qnl0ZSkpOworICAgICAgICBzaXplX3QgbGVuZ3RoID0ga2V5LmFycmF5KCkuc2l6ZSgpOworICAg
ICAgICBpbnRvLmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQobGVuZ3RoKSk7CisgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBlbmNvZGVJREJL
ZXkoKmtleS5hcnJheSgpW2ldLCBpbnRvKTsKKyAgICAgICAgQVNTRVJUX1VOVVNFRChwcmV2aW91
c1NpemUsIGludG8uc2l6ZSgpID4gcHJldmlvdXNTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICBjYXNlIElEQktleTo6U3RyaW5nVHlwZToKKyAgICAgICAgaW50by5hcHBlbmRWZWN0
b3IoZW5jb2RlQnl0ZShJREJLZXlTdHJpbmdUeXBlQnl0ZSkpOworICAgICAgICBpbnRvLmFwcGVu
ZFZlY3RvcihlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGtleS5zdHJpbmcoKSkpOworICAgICAgICBB
U1NFUlRfVU5VU0VEKHByZXZpb3VzU2l6ZSwgaW50by5zaXplKCkgPiBwcmV2aW91c1NpemUpOwor
ICAgICAgICByZXR1cm47CisgICAgY2FzZSBJREJLZXk6OkRhdGVUeXBlOgorICAgICAgICBpbnRv
LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKElEQktleURhdGVUeXBlQnl0ZSkpOworICAgICAgICBp
bnRvLmFwcGVuZFZlY3RvcihlbmNvZGVEb3VibGUoa2V5LmRhdGUoKSkpOworICAgICAgICBBU1NF
UlRfVU5VU0VEKHByZXZpb3VzU2l6ZSwgaW50by5zaXplKCkgLSBwcmV2aW91c1NpemUgPT0gOSk7
CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIElEQktleTo6TnVtYmVyVHlwZToKKyAgICAgICAg
aW50by5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShJREJLZXlOdW1iZXJUeXBlQnl0ZSkpOworICAg
ICAgICBpbnRvLmFwcGVuZFZlY3RvcihlbmNvZGVEb3VibGUoa2V5Lm51bWJlcigpKSk7CisgICAg
ICAgIEFTU0VSVF9VTlVTRUQocHJldmlvdXNTaXplLCBpbnRvLnNpemUoKSAtIHByZXZpb3VzU2l6
ZSA9PSA5KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworfQorCisKK2NvbnN0IGNoYXIqIGRlY29kZUlEQktleShjb25zdCBjaGFyKiBwLCBjb25z
dCBjaGFyKiBsaW1pdCwgUmVmUHRyPElEQktleT4mIGZvdW5kS2V5KQoreworICAgIEFTU0VSVChs
aW1pdCA+PSBwKTsKKyAgICBpZiAocCA+PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICB1bnNpZ25lZCBjaGFyIHR5cGUgPSAqcCsrOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVh
dGVJbnZhbGlkKCk7CisgICAgICAgIHJldHVybiBwOworCisgICAgY2FzZSBJREJLZXlBcnJheVR5
cGVCeXRlOiB7CisgICAgICAgIGludDY0X3QgbGVuZ3RoOworICAgICAgICBwID0gZGVjb2RlVmFy
SW50KHAsIGxpbWl0LCBsZW5ndGgpOworICAgICAgICBpZiAoIXAgfHwgbGVuZ3RoIDwgMCkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBJREJLZXk6OktleUFycmF5IGFycmF5OworICAg
ICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKKyAgICAgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleTsK
KyAgICAgICAgICAgIHAgPSBkZWNvZGVJREJLZXkocCwgbGltaXQsIGtleSk7CisgICAgICAgICAg
ICBpZiAoIXApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBhcnJheS5h
cHBlbmQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICBmb3VuZEtleSA9IElEQktleTo6Y3JlYXRl
QXJyYXkoYXJyYXkpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgY2FzZSBJREJLZXlT
dHJpbmdUeXBlQnl0ZTogeworICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgcCA9IGRlY29kZVN0
cmluZ1dpdGhMZW5ndGgocCwgbGltaXQsIHMpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgZm91bmRLZXkgPSBJREJLZXk6OmNyZWF0ZVN0cmluZyhzKTsK
KyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorICAgIGNhc2UgSURCS2V5RGF0ZVR5cGVCeXRlOiB7
CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBwID0gZGVjb2RlRG91YmxlKHAsIGxpbWl0LCAm
ZCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3Vu
ZEtleSA9IElEQktleTo6Y3JlYXRlRGF0ZShkKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQor
ICAgIGNhc2UgSURCS2V5TnVtYmVyVHlwZUJ5dGU6IHsKKyAgICAgICAgZG91YmxlIGQ7CisgICAg
ICAgIHAgPSBkZWNvZGVEb3VibGUocCwgbGltaXQsICZkKTsKKyAgICAgICAgaWYgKCFwKQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvdW5kS2V5ID0gSURCS2V5OjpjcmVhdGVOdW1i
ZXIoZCk7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgY2hhciogZXh0cmFjdEVuY29k
ZWRJREJLZXkoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBWZWN0b3I8Y2hh
cj4qIHJlc3VsdCA9IDApCit7CisgICAgY29uc3QgY2hhciogcCA9IHN0YXJ0OworICAgIGlmIChw
ID49IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHVuc2lnbmVkIGNoYXIgdHlwZSA9
ICpwKys7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIElEQktleU51bGxUeXBlQnl0
ZToKKyAgICBjYXNlIElEQktleU1pbktleVR5cGVCeXRlOgorICAgICAgICBicmVhazsKKyAgICBj
YXNlIElEQktleUFycmF5VHlwZUJ5dGU6IHsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAg
ICAgIHAgPSBkZWNvZGVWYXJJbnQocCwgbGltaXQsIGxlbmd0aCk7CisgICAgICAgIGlmICghcCB8
fCBsZW5ndGggPCAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHdoaWxlIChsZW5n
dGgtLSkgeworICAgICAgICAgICAgcCA9IGV4dHJhY3RFbmNvZGVkSURCS2V5KHAsIGxpbWl0KTsK
KyAgICAgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
fQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBJREJLZXlTdHJpbmdUeXBlQnl0ZTog
eworICAgICAgICBpbnQ2NF90IGxlbmd0aDsKKyAgICAgICAgcCA9IGRlY29kZVZhckludChwLCBs
aW1pdCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKCFwIHx8IGxlbmd0aCA8IDAgfHwgcCArIGxlbmd0
aCAqIDIgPiBsaW1pdCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwICs9IGxlbmd0
aCAqIDI7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIElEQktleURhdGVUeXBlQnl0
ZToKKyAgICBjYXNlIElEQktleU51bWJlclR5cGVCeXRlOgorICAgICAgICBpZiAocCArIHNpemVv
Zihkb3VibGUpID4gbGltaXQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCArPSBz
aXplb2YoZG91YmxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCkg
eworICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIEFTU0VSVChwIDw9IGxpbWl0KTsKKyAgICAg
ICAgcmVzdWx0LT5jbGVhcigpOworICAgICAgICByZXN1bHQtPmFwcGVuZChzdGFydCwgcCAtIHN0
YXJ0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcDsKK30KKworc3RhdGljIElEQktleTo6VHlwZSBr
ZXlUeXBlQnl0ZVRvS2V5VHlwZSh1bnNpZ25lZCBjaGFyIHR5cGUpCit7CisgICAgc3dpdGNoICh0
eXBlKSB7CisgICAgY2FzZSBJREJLZXlOdWxsVHlwZUJ5dGU6CisgICAgICAgIHJldHVybiBJREJL
ZXk6OkludmFsaWRUeXBlOworICAgIGNhc2UgSURCS2V5QXJyYXlUeXBlQnl0ZToKKyAgICAgICAg
cmV0dXJuIElEQktleTo6QXJyYXlUeXBlOworICAgIGNhc2UgSURCS2V5U3RyaW5nVHlwZUJ5dGU6
CisgICAgICAgIHJldHVybiBJREJLZXk6OlN0cmluZ1R5cGU7CisgICAgY2FzZSBJREJLZXlEYXRl
VHlwZUJ5dGU6CisgICAgICAgIHJldHVybiBJREJLZXk6OkRhdGVUeXBlOworICAgIGNhc2UgSURC
S2V5TnVtYmVyVHlwZUJ5dGU6CisgICAgICAgIHJldHVybiBJREJLZXk6Ok51bWJlclR5cGU7Cisg
ICAgY2FzZSBJREJLZXlNaW5LZXlUeXBlQnl0ZToKKyAgICAgICAgcmV0dXJuIElEQktleTo6TWlu
VHlwZTsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSURC
S2V5OjpJbnZhbGlkVHlwZTsKK30KKworaW50IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhjb25zdCBj
aGFyKiYgcHRyQSwgY29uc3QgY2hhciogbGltaXRBLCBjb25zdCBjaGFyKiYgcHRyQiwgY29uc3Qg
Y2hhciogbGltaXRCLCBib29sJiBvaykKK3sKKyAgICBvayA9IHRydWU7CisgICAgQVNTRVJUKCZw
dHJBICE9ICZwdHJCKTsKKyAgICBBU1NFUlQocHRyQSA8IGxpbWl0QSk7CisgICAgQVNTRVJUKHB0
ckIgPCBsaW1pdEIpOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUEgPSAqcHRyQSsrOworICAgIHVu
c2lnbmVkIGNoYXIgdHlwZUIgPSAqcHRyQisrOworCisgICAgaWYgKGludCB4ID0gSURCS2V5Ojpj
b21wYXJlVHlwZXMoa2V5VHlwZUJ5dGVUb0tleVR5cGUodHlwZUEpLCBrZXlUeXBlQnl0ZVRvS2V5
VHlwZSh0eXBlQikpKQorICAgICAgICByZXR1cm4geDsKKworICAgIHN3aXRjaCAodHlwZUEpIHsK
KyAgICBjYXNlIElEQktleU51bGxUeXBlQnl0ZToKKyAgICBjYXNlIElEQktleU1pbktleVR5cGVC
eXRlOgorICAgICAgICAvLyBOdWxsIHR5cGUgb3IgbWF4IHR5cGU7IG5vIHBheWxvYWQgdG8gY29t
cGFyZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBJREJLZXlBcnJheVR5cGVCeXRlOiB7
CisgICAgICAgIGludDY0X3QgbGVuZ3RoQSwgbGVuZ3RoQjsKKyAgICAgICAgcHRyQSA9IGRlY29k
ZVZhckludChwdHJBLCBsaW1pdEEsIGxlbmd0aEEpOworICAgICAgICBwdHJCID0gZGVjb2RlVmFy
SW50KHB0ckIsIGxpbWl0QiwgbGVuZ3RoQik7CisgICAgICAgIGlmICghcHRyQSB8fCAhcHRyQiB8
fCBsZW5ndGhBIDwgMCB8fCBsZW5ndGhCIDwgMCkgeworICAgICAgICAgICAgb2sgPSBmYWxzZTsK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50NjRfdCBp
ID0gMDsgaSA8IGxlbmd0aEEgJiYgaSA8IGxlbmd0aEI7ICsraSkgeworICAgICAgICAgICAgaW50
IHJlc3VsdCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhwdHJBLCBsaW1pdEEsIHB0ckIsIGxpbWl0
Qiwgb2spOworICAgICAgICAgICAgaWYgKCFvayB8fCByZXN1bHQpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuZ3RoQSA8IGxlbmd0aEIp
CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChsZW5ndGhBID4gbGVuZ3RoQikK
KyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2Fz
ZSBJREJLZXlTdHJpbmdUeXBlQnl0ZToKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkU3Ry
aW5nc1dpdGhMZW5ndGgocHRyQSwgbGltaXRBLCBwdHJCLCBsaW1pdEIsIG9rKTsKKyAgICBjYXNl
IElEQktleURhdGVUeXBlQnl0ZToKKyAgICBjYXNlIElEQktleU51bWJlclR5cGVCeXRlOiB7Cisg
ICAgICAgIGRvdWJsZSBkLCBlOworICAgICAgICBwdHJBID0gZGVjb2RlRG91YmxlKHB0ckEsIGxp
bWl0QSwgJmQpOworICAgICAgICBwdHJCID0gZGVjb2RlRG91YmxlKHB0ckIsIGxpbWl0QiwgJmUp
OworICAgICAgICBBU1NFUlQocHRyQSk7CisgICAgICAgIEFTU0VSVChwdHJCKTsKKyAgICAgICAg
aWYgKCFwdHJBIHx8ICFwdHJCKSB7CisgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGQgPCBlKQorICAgICAgICAgICAg
cmV0dXJuIC0xOworICAgICAgICBpZiAoZCA+IGUpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIHJldHVybiAwOworfQorCitpbnQgY29tcGFyZUVuY29kZWRJREJLZXlzKGNvbnN0IFZl
Y3RvcjxjaGFyPiYga2V5QSwgY29uc3QgVmVjdG9yPGNoYXI+JiBrZXlCLCBib29sJiBvaykKK3sK
KyAgICBBU1NFUlQoa2V5QS5zaXplKCkgPj0gMSk7CisgICAgQVNTRVJUKGtleUIuc2l6ZSgpID49
IDEpOworCisgICAgY29uc3QgY2hhciogcHRyQSA9IGtleUEuZGF0YSgpOworICAgIGNvbnN0IGNo
YXIqIGxpbWl0QSA9IHB0ckEgKyBrZXlBLnNpemUoKTsKKyAgICBjb25zdCBjaGFyKiBwdHJCID0g
a2V5Qi5kYXRhKCk7CisgICAgY29uc3QgY2hhciogbGltaXRCID0gcHRyQiArIGtleUIuc2l6ZSgp
OworCisgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhwdHJBLCBsaW1pdEEsIHB0ckIs
IGxpbWl0Qiwgb2spOworfQorCitWZWN0b3I8Y2hhcj4gZW5jb2RlSURCS2V5UGF0aChjb25zdCBJ
REJLZXlQYXRoJiBrZXlQYXRoKQoreworICAgIC8vIE1heSBiZSB0eXBlZCwgb3IgbWF5IGJlIGEg
cmF3IHN0cmluZy4gQW4gaW52YWxpZCBsZWFkaW5nCisgICAgLy8gYnl0ZSBpcyB1c2VkIHRvIGlk
ZW50aWZ5IHR5cGVkIGNvZGluZy4gTmV3IHJlY29yZHMgYXJlCisgICAgLy8gYWx3YXlzIHdyaXR0
ZW4gYXMgdHlwZWQuCisgICAgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxpbmVCdWZmZXJTaXplPiBy
ZXQ7CisgICAgcmV0LmFwcGVuZChJREJLZXlQYXRoVHlwZUNvZGVkQnl0ZTEpOworICAgIHJldC5h
cHBlbmQoSURCS2V5UGF0aFR5cGVDb2RlZEJ5dGUyKTsKKyAgICByZXQuYXBwZW5kKHN0YXRpY19j
YXN0PGNoYXI+KGtleVBhdGgudHlwZSgpKSk7CisgICAgc3dpdGNoIChrZXlQYXRoLnR5cGUoKSkg
eworICAgIGNhc2UgSURCS2V5UGF0aDo6TnVsbFR5cGU6CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgSURCS2V5UGF0aDo6U3RyaW5nVHlwZToKKyAgICAgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNv
ZGVTdHJpbmdXaXRoTGVuZ3RoKGtleVBhdGguc3RyaW5nKCkpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBJREJLZXlQYXRoOjpBcnJheVR5cGU6IHsKKyAgICAgICAgY29uc3QgVmVjdG9yPFN0
cmluZz4mIGFycmF5ID0ga2V5UGF0aC5hcnJheSgpOworICAgICAgICBzaXplX3QgY291bnQgPSBh
cnJheS5zaXplKCk7CisgICAgICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50KGNvdW50
KSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAg
ICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChhcnJheVtpXSkpOwor
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK0lEQktl
eVBhdGggZGVjb2RlSURCS2V5UGF0aChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCkK
K3sKKyAgICAvLyBNYXkgYmUgdHlwZWQsIG9yIG1heSBiZSBhIHJhdyBzdHJpbmcuIEFuIGludmFs
aWQgbGVhZGluZworICAgIC8vIGJ5dGUgc2VxdWVuY2UgaXMgdXNlZCB0byBpZGVudGlmeSB0eXBl
ZCBjb2RpbmcuIE5ldyByZWNvcmRzIGFyZQorICAgIC8vIGFsd2F5cyB3cml0dGVuIGFzIHR5cGVk
LgorICAgIGlmIChwID09IGxpbWl0IHx8IChsaW1pdCAtIHAgPj0gMiAmJiAoKnAgIT0gSURCS2V5
UGF0aFR5cGVDb2RlZEJ5dGUxIHx8ICoocCArIDEpICE9IElEQktleVBhdGhUeXBlQ29kZWRCeXRl
MikpKQorICAgICAgICByZXR1cm4gSURCS2V5UGF0aChkZWNvZGVTdHJpbmcocCwgbGltaXQpKTsK
KyAgICBwICs9IDI7CisKKyAgICBBU1NFUlQocCAhPSBsaW1pdCk7CisgICAgSURCS2V5UGF0aDo6
VHlwZSB0eXBlID0gc3RhdGljX2Nhc3Q8SURCS2V5UGF0aDo6VHlwZT4oKnArKyk7CisgICAgc3dp
dGNoICh0eXBlKSB7CisgICAgY2FzZSBJREJLZXlQYXRoOjpOdWxsVHlwZToKKyAgICAgICAgQVNT
RVJUKHAgPT0gbGltaXQpOworICAgICAgICByZXR1cm4gSURCS2V5UGF0aCgpOworICAgIGNhc2Ug
SURCS2V5UGF0aDo6U3RyaW5nVHlwZTogeworICAgICAgICBTdHJpbmcgc3RyaW5nOworICAgICAg
ICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgc3RyaW5nKTsKKyAgICAgICAg
QVNTRVJUKHAgPT0gbGltaXQpOworICAgICAgICByZXR1cm4gSURCS2V5UGF0aChzdHJpbmcpOwor
ICAgIH0KKyAgICBjYXNlIElEQktleVBhdGg6OkFycmF5VHlwZTogeworICAgICAgICBWZWN0b3I8
U3RyaW5nPiBhcnJheTsKKyAgICAgICAgaW50NjRfdCBjb3VudDsKKyAgICAgICAgcCA9IGRlY29k
ZVZhckludChwLCBsaW1pdCwgY291bnQpOworICAgICAgICBBU1NFUlQocCk7CisgICAgICAgIEFT
U0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgd2hpbGUgKGNvdW50LS0pIHsKKyAgICAgICAgICAg
IFN0cmluZyBzdHJpbmc7CisgICAgICAgICAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChw
LCBsaW1pdCwgc3RyaW5nKTsKKyAgICAgICAgICAgIEFTU0VSVChwKTsKKyAgICAgICAgICAgIGFy
cmF5LmFwcGVuZChzdHJpbmcpOworICAgICAgICB9CisgICAgICAgIEFTU0VSVChwID09IGxpbWl0
KTsKKyAgICAgICAgcmV0dXJuIElEQktleVBhdGgoYXJyYXkpOworICAgIH0KKyAgICB9CisgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIElEQktleVBhdGgoKTsKK30KKworbmFt
ZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VHlwZT4KK2ludCBjb21wYXJlKGNvbnN0
IExldmVsREJTbGljZSYgYSwgY29uc3QgTGV2ZWxEQlNsaWNlJiBiLCBib29sLCBib29sJiBvaykK
K3sKKyAgICBLZXlUeXBlIGtleUE7CisgICAgS2V5VHlwZSBrZXlCOworCisgICAgY29uc3QgY2hh
ciogcHRyQSA9IEtleVR5cGU6OmRlY29kZShhLmJlZ2luKCksIGEuZW5kKCksICZrZXlBKTsKKyAg
ICBBU1NFUlQocHRyQSk7CisgICAgaWYgKCFwdHJBKSB7CisgICAgICAgIG9rID0gZmFsc2U7Cisg
ICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5VHlwZTo6
ZGVjb2RlKGIuYmVnaW4oKSwgYi5lbmQoKSwgJmtleUIpOworICAgIEFTU0VSVChwdHJCKTsKKyAg
ICBpZiAoIXB0ckIpIHsKKyAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgb2sgPSB0cnVlOworICAgIHJldHVybiBrZXlBLmNvbXBhcmUoa2V5Qik7Cit9
CisKK3RlbXBsYXRlPD4KK2ludCBjb21wYXJlPEV4aXN0c0VudHJ5S2V5Pihjb25zdCBMZXZlbERC
U2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGljZSYgYiwgYm9vbCwgYm9vbCYgb2spCit7CisgICAg
S2V5UHJlZml4IHByZWZpeEE7CisgICAgS2V5UHJlZml4IHByZWZpeEI7CisgICAgY29uc3QgY2hh
ciogcHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKGEuYmVnaW4oKSwgYS5lbmQoKSwgJnByZWZpeEEp
OworICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBLZXlQcmVmaXg6OmRlY29kZShiLmJlZ2luKCksIGIu
ZW5kKCksICZwcmVmaXhCKTsKKyAgICBBU1NFUlQocHRyQSk7CisgICAgQVNTRVJUKHB0ckIpOwor
ICAgIEFTU0VSVChwcmVmaXhBLm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUKHByZWZpeEEubV9v
YmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQocHJlZml4QS5tX2luZGV4SWQgPT0gRXhpc3RzRW50
cnlLZXk6OlNwZWNpYWxJbmRleE51bWJlcik7CisgICAgQVNTRVJUKHByZWZpeEIubV9kYXRhYmFz
ZUlkKTsKKyAgICBBU1NFUlQocHJlZml4Qi5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVChw
cmVmaXhCLm1faW5kZXhJZCA9PSBFeGlzdHNFbnRyeUtleTo6U3BlY2lhbEluZGV4TnVtYmVyKTsK
KyAgICBBU1NFUlQocHRyQSAhPSBhLmVuZCgpKTsKKyAgICBBU1NFUlQocHRyQiAhPSBiLmVuZCgp
KTsKKyAgICAvLyBQcmVmaXhlcyBhcmUgbm90IGNvbXBhcmVkIC0gaXQgaXMgYXNzdW1lZCB0aGlz
IHdhcyBhbHJlYWR5IGRvbmUuCisgICAgQVNTRVJUKCFwcmVmaXhBLmNvbXBhcmUocHJlZml4Qikp
OworCisgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhwdHJBLCBhLmVuZCgpLCBwdHJC
LCBiLmVuZCgpLCBvayk7Cit9CisKK3RlbXBsYXRlPD4KK2ludCBjb21wYXJlPE9iamVjdFN0b3Jl
RGF0YUtleT4oY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIsIGJv
b2wsIGJvb2wmIG9rKQoreworICAgIEtleVByZWZpeCBwcmVmaXhBOworICAgIEtleVByZWZpeCBw
cmVmaXhCOworICAgIGNvbnN0IGNoYXIqIHB0ckEgPSBLZXlQcmVmaXg6OmRlY29kZShhLmJlZ2lu
KCksIGEuZW5kKCksICZwcmVmaXhBKTsKKyAgICBjb25zdCBjaGFyKiBwdHJCID0gS2V5UHJlZml4
OjpkZWNvZGUoYi5iZWdpbigpLCBiLmVuZCgpLCAmcHJlZml4Qik7CisgICAgQVNTRVJUKHB0ckEp
OworICAgIEFTU0VSVChwdHJCKTsKKyAgICBBU1NFUlQocHJlZml4QS5tX2RhdGFiYXNlSWQpOwor
ICAgIEFTU0VSVChwcmVmaXhBLm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKHByZWZpeEEu
bV9pbmRleElkID09IE9iamVjdFN0b3JlRGF0YUtleTo6U3BlY2lhbEluZGV4TnVtYmVyKTsKKyAg
ICBBU1NFUlQocHJlZml4Qi5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVChwcmVmaXhCLm1fb2Jq
ZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKHByZWZpeEIubV9pbmRleElkID09IE9iamVjdFN0b3Jl
RGF0YUtleTo6U3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICBBU1NFUlQocHRyQSAhPSBhLmVuZCgp
KTsKKyAgICBBU1NFUlQocHRyQiAhPSBiLmVuZCgpKTsKKyAgICAvLyBQcmVmaXhlcyBhcmUgbm90
IGNvbXBhcmVkIC0gaXQgaXMgYXNzdW1lZCB0aGlzIHdhcyBhbHJlYWR5IGRvbmUuCisgICAgQVNT
RVJUKCFwcmVmaXhBLmNvbXBhcmUocHJlZml4QikpOworCisgICAgcmV0dXJuIGNvbXBhcmVFbmNv
ZGVkSURCS2V5cyhwdHJBLCBhLmVuZCgpLCBwdHJCLCBiLmVuZCgpLCBvayk7Cit9CisKK3RlbXBs
YXRlPD4KK2ludCBjb21wYXJlPEluZGV4RGF0YUtleT4oY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBj
b25zdCBMZXZlbERCU2xpY2UmIGIsIGJvb2wgaWdub3JlRHVwbGljYXRlcywgYm9vbCYgb2spCit7
CisgICAgS2V5UHJlZml4IHByZWZpeEE7CisgICAgS2V5UHJlZml4IHByZWZpeEI7CisgICAgY29u
c3QgY2hhciogcHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKGEuYmVnaW4oKSwgYS5lbmQoKSwgJnBy
ZWZpeEEpOworICAgIGNvbnN0IGNoYXIqIHB0ckIgPSBLZXlQcmVmaXg6OmRlY29kZShiLmJlZ2lu
KCksIGIuZW5kKCksICZwcmVmaXhCKTsKKyAgICBBU1NFUlQocHRyQSk7CisgICAgQVNTRVJUKHB0
ckIpOworICAgIEFTU0VSVChwcmVmaXhBLm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUKHByZWZp
eEEubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQocHJlZml4QS5tX2luZGV4SWQgPj0gTWlu
aW11bUluZGV4SWQpOworICAgIEFTU0VSVChwcmVmaXhCLm1fZGF0YWJhc2VJZCk7CisgICAgQVNT
RVJUKHByZWZpeEIubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQocHJlZml4Qi5tX2luZGV4
SWQgPj0gTWluaW11bUluZGV4SWQpOworICAgIEFTU0VSVChwdHJBICE9IGEuZW5kKCkpOworICAg
IEFTU0VSVChwdHJCICE9IGIuZW5kKCkpOworICAgIC8vIFByZWZpeGVzIGFyZSBub3QgY29tcGFy
ZWQgLSBpdCBpcyBhc3N1bWVkIHRoaXMgd2FzIGFscmVhZHkgZG9uZS4KKyAgICBBU1NFUlQoIXBy
ZWZpeEEuY29tcGFyZShwcmVmaXhCKSk7CisKKyAgICAvLyBpbmRleCBrZXkKKyAgICBpbnQgcmVz
dWx0ID0gY29tcGFyZUVuY29kZWRJREJLZXlzKHB0ckEsIGEuZW5kKCksIHB0ckIsIGIuZW5kKCks
IG9rKTsKKyAgICBpZiAoIW9rIHx8IHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICBpZiAoaWdub3JlRHVwbGljYXRlcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBzZXF1
ZW5jZSBudW1iZXIgW29wdGlvbmFsXQorICAgIGludDY0X3Qgc2VxdWVuY2VOdW1iZXJBID0gLTE7
CisgICAgaW50NjRfdCBzZXF1ZW5jZU51bWJlckIgPSAtMTsKKyAgICBpZiAocHRyQSAhPSBhLmVu
ZCgpKQorICAgICAgICBwdHJBID0gZGVjb2RlVmFySW50KHB0ckEsIGEuZW5kKCksIHNlcXVlbmNl
TnVtYmVyQSk7CisgICAgaWYgKHB0ckIgIT0gYi5lbmQoKSkKKyAgICAgICAgcHRyQiA9IGRlY29k
ZVZhckludChwdHJCLCBiLmVuZCgpLCBzZXF1ZW5jZU51bWJlckIpOworCisgICAgLy8gcHJpbWFy
eSBrZXkgW29wdGlvbmFsXQorICAgIGlmICghcHRyQSB8fCAhcHRyQikKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgaWYgKHB0ckEgPT0gYS5lbmQoKSAmJiBwdHJCID09IGIuZW5kKCkpCisgICAgICAg
IHJldHVybiAwOworICAgIGlmIChwdHJBID09IGEuZW5kKCkpCisgICAgICAgIHJldHVybiAtMTsK
KyAgICBpZiAocHRyQiA9PSBiLmVuZCgpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJlc3Vs
dCA9IGNvbXBhcmVFbmNvZGVkSURCS2V5cyhwdHJBLCBhLmVuZCgpLCBwdHJCLCBiLmVuZCgpLCBv
ayk7CisgICAgaWYgKCFvayB8fCByZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAg
ICByZXR1cm4gY29tcGFyZUludHMoc2VxdWVuY2VOdW1iZXJBLCBzZXF1ZW5jZU51bWJlckIpOwor
fQorCitpbnQgY29tcGFyZShjb25zdCBMZXZlbERCU2xpY2UmIGEsIGNvbnN0IExldmVsREJTbGlj
ZSYgYiwgYm9vbCBpbmRleEtleXMsIGJvb2wmIG9rKQoreworICAgIGNvbnN0IGNoYXIqIHB0ckEg
PSBhLmJlZ2luKCk7CisgICAgY29uc3QgY2hhciogcHRyQiA9IGIuYmVnaW4oKTsKKyAgICBjb25z
dCBjaGFyKiBlbmRBID0gYS5lbmQoKTsKKyAgICBjb25zdCBjaGFyKiBlbmRCID0gYi5lbmQoKTsK
KworICAgIEtleVByZWZpeCBwcmVmaXhBOworICAgIEtleVByZWZpeCBwcmVmaXhCOworCisgICAg
cHRyQSA9IEtleVByZWZpeDo6ZGVjb2RlKHB0ckEsIGVuZEEsICZwcmVmaXhBKTsKKyAgICBwdHJC
ID0gS2V5UHJlZml4OjpkZWNvZGUocHRyQiwgZW5kQiwgJnByZWZpeEIpOworICAgIEFTU0VSVChw
dHJBKTsKKyAgICBBU1NFUlQocHRyQik7CisgICAgaWYgKCFwdHJBIHx8ICFwdHJCKSB7CisgICAg
ICAgIG9rID0gZmFsc2U7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG9rID0gdHJ1
ZTsKKyAgICBpZiAoaW50IHggPSBwcmVmaXhBLmNvbXBhcmUocHJlZml4QikpCisgICAgICAgIHJl
dHVybiB4OworCisgICAgaWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6R2xvYmFsTWV0
YURhdGEpIHsKKyAgICAgICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgIEFTU0VSVChw
dHJCICE9IGVuZEIpOworCisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckEr
KzsKKyAgICAgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOworCisgICAgICAg
IGlmIChpbnQgeCA9IHR5cGVCeXRlQSAtIHR5cGVCeXRlQikKKyAgICAgICAgICAgIHJldHVybiB4
OworICAgICAgICBpZiAodHlwZUJ5dGVBIDwgTWF4U2ltcGxlR2xvYmFsTWV0YURhdGFUeXBlQnl0
ZSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNvbnN0IGJvb2wgaWdub3JlRHVw
bGljYXRlcyA9IGZhbHNlOworICAgICAgICBpZiAodHlwZUJ5dGVBID09IERhdGFiYXNlRnJlZUxp
c3RUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlPERhdGFiYXNlRnJlZUxpc3RL
ZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKKyAgICAgICAgaWYgKHR5cGVCeXRlQSA9
PSBEYXRhYmFzZU5hbWVUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlPERhdGFi
YXNlTmFtZUtleT4oYSwgYiwgaWdub3JlRHVwbGljYXRlcywgb2spOworICAgIH0KKworICAgIGlm
IChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OkRhdGFiYXNlTWV0YURhdGEpIHsKKyAgICAg
ICAgQVNTRVJUKHB0ckEgIT0gZW5kQSk7CisgICAgICAgIEFTU0VSVChwdHJCICE9IGVuZEIpOwor
CisgICAgICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGVBID0gKnB0ckErKzsKKyAgICAgICAgdW5z
aWduZWQgY2hhciB0eXBlQnl0ZUIgPSAqcHRyQisrOworCisgICAgICAgIGlmIChpbnQgeCA9IHR5
cGVCeXRlQSAtIHR5cGVCeXRlQikKKyAgICAgICAgICAgIHJldHVybiB4OworICAgICAgICBpZiAo
dHlwZUJ5dGVBIDwgRGF0YWJhc2VNZXRhRGF0YUtleTo6TWF4U2ltcGxlTWV0YURhdGFUeXBlKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY29uc3QgYm9vbCBpZ25vcmVEdXBsaWNh
dGVzID0gZmFsc2U7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gT2JqZWN0U3RvcmVNZXRhRGF0
YVR5cGVCeXRlKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmU8T2JqZWN0U3RvcmVNZXRhRGF0
YUtleT4oYSwgYiwgaWdub3JlRHVwbGljYXRlcywgb2spOworICAgICAgICBpZiAodHlwZUJ5dGVB
ID09IEluZGV4TWV0YURhdGFUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlPElu
ZGV4TWV0YURhdGFLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKKyAgICAgICAgaWYg
KHR5cGVCeXRlQSA9PSBPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5dGUpCisgICAgICAgICAgICBy
ZXR1cm4gY29tcGFyZTxPYmplY3RTdG9yZUZyZWVMaXN0S2V5PihhLCBiLCBpZ25vcmVEdXBsaWNh
dGVzLCBvayk7CisgICAgICAgIGlmICh0eXBlQnl0ZUEgPT0gSW5kZXhGcmVlTGlzdFR5cGVCeXRl
KQorICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmU8SW5kZXhGcmVlTGlzdEtleT4oYSwgYiwgaWdu
b3JlRHVwbGljYXRlcywgb2spOworICAgICAgICBpZiAodHlwZUJ5dGVBID09IE9iamVjdFN0b3Jl
TmFtZXNUeXBlQnl0ZSkKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlPE9iamVjdFN0b3JlTmFt
ZXNLZXk+KGEsIGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKKyAgICAgICAgaWYgKHR5cGVCeXRl
QSA9PSBJbmRleE5hbWVzS2V5VHlwZUJ5dGUpCisgICAgICAgICAgICByZXR1cm4gY29tcGFyZTxJ
bmRleE5hbWVzS2V5PihhLCBiLCBpZ25vcmVEdXBsaWNhdGVzLCBvayk7CisgICAgfQorCisgICAg
aWYgKHByZWZpeEEudHlwZSgpID09IEtleVByZWZpeDo6T2JqZWN0U3RvcmVEYXRhKSB7CisgICAg
ICAgIGlmIChwdHJBID09IGVuZEEgJiYgcHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGlmIChwdHJBID09IGVuZEEpCisgICAgICAgICAgICByZXR1cm4gLTE7Cisg
ICAgICAgIGlmIChwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMTsgLy8gRklYTUU6
IFRoaXMgY2FzZSBvZiBub24tZXhpc3RpbmcgdXNlciBrZXlzIHNob3VsZCBub3QgaGF2ZSB0byBi
ZSBoYW5kbGVkIHRoaXMgd2F5LgorCisgICAgICAgIGNvbnN0IGJvb2wgaWdub3JlRHVwbGljYXRl
cyA9IGZhbHNlOworICAgICAgICByZXR1cm4gY29tcGFyZTxPYmplY3RTdG9yZURhdGFLZXk+KGEs
IGIsIGlnbm9yZUR1cGxpY2F0ZXMsIG9rKTsKKyAgICB9CisgICAgaWYgKHByZWZpeEEudHlwZSgp
ID09IEtleVByZWZpeDo6RXhpc3RzRW50cnkpIHsKKyAgICAgICAgaWYgKHB0ckEgPT0gZW5kQSAm
JiBwdHJCID09IGVuZEIpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHB0ckEg
PT0gZW5kQSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHB0ckIgPT0gZW5k
QikKKyAgICAgICAgICAgIHJldHVybiAxOyAvLyBGSVhNRTogVGhpcyBjYXNlIG9mIG5vbi1leGlz
dGluZyB1c2VyIGtleXMgc2hvdWxkIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQgdGhpcyB3YXkuCisK
KyAgICAgICAgY29uc3QgYm9vbCBpZ25vcmVEdXBsaWNhdGVzID0gZmFsc2U7CisgICAgICAgIHJl
dHVybiBjb21wYXJlPEV4aXN0c0VudHJ5S2V5PihhLCBiLCBpZ25vcmVEdXBsaWNhdGVzLCBvayk7
CisgICAgfQorICAgIGlmIChwcmVmaXhBLnR5cGUoKSA9PSBLZXlQcmVmaXg6OkluZGV4RGF0YSkg
eworICAgICAgICBpZiAocHRyQSA9PSBlbmRBICYmIHB0ckIgPT0gZW5kQikKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBpZiAocHRyQSA9PSBlbmRBKQorICAgICAgICAgICAgcmV0dXJu
IC0xOworICAgICAgICBpZiAocHRyQiA9PSBlbmRCKQorICAgICAgICAgICAgcmV0dXJuIDE7IC8v
IEZJWE1FOiBUaGlzIGNhc2Ugb2Ygbm9uLWV4aXN0aW5nIHVzZXIga2V5cyBzaG91bGQgbm90IGhh
dmUgdG8gYmUgaGFuZGxlZCB0aGlzIHdheS4KKworICAgICAgICBib29sIGlnbm9yZUR1cGxpY2F0
ZXMgPSBpbmRleEtleXM7CisgICAgICAgIHJldHVybiBjb21wYXJlPEluZGV4RGF0YUtleT4oYSwg
YiwgaWdub3JlRHVwbGljYXRlcywgb2spOworICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIG9rID0gZmFsc2U7CisgICAgcmV0dXJuIDA7Cit9CisKK30KKworaW50IGNvbXBh
cmUoY29uc3QgTGV2ZWxEQlNsaWNlJiBhLCBjb25zdCBMZXZlbERCU2xpY2UmIGIsIGJvb2wgaW5k
ZXhLZXlzKQoreworICAgIGJvb2wgb2s7CisgICAgaW50IHJlc3VsdCA9IGNvbXBhcmUoYSwgYiwg
aW5kZXhLZXlzLCBvayk7CisgICAgQVNTRVJUKG9rKTsKKyAgICBpZiAoIW9rKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitLZXlQcmVmaXg6OktleVByZWZpeCgp
CisgICAgOiBtX2RhdGFiYXNlSWQoSW52YWxpZFR5cGUpCisgICAgLCBtX29iamVjdFN0b3JlSWQo
SW52YWxpZFR5cGUpCisgICAgLCBtX2luZGV4SWQoSW52YWxpZFR5cGUpCit7Cit9CisKK0tleVBy
ZWZpeDo6S2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCkKKyAgICA6IG1fZGF0YWJhc2VJZChk
YXRhYmFzZUlkKQorICAgICwgbV9vYmplY3RTdG9yZUlkKDApCisgICAgLCBtX2luZGV4SWQoMCkK
K3sKKyAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZChkYXRhYmFzZUlkKSk7
Cit9CisKK0tleVByZWZpeDo6S2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBv
YmplY3RTdG9yZUlkKQorICAgIDogbV9kYXRhYmFzZUlkKGRhdGFiYXNlSWQpCisgICAgLCBtX29i
amVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkKKyAgICAsIG1faW5kZXhJZCgwKQoreworICAgIEFT
U0VSVChLZXlQcmVmaXg6OmlzVmFsaWREYXRhYmFzZUlkKGRhdGFiYXNlSWQpKTsKKyAgICBBU1NF
UlQoS2V5UHJlZml4Ojppc1ZhbGlkT2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKSk7Cit9CisK
K0tleVByZWZpeDo6S2V5UHJlZml4KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCisgICAgOiBtX2RhdGFiYXNlSWQoZGF0YWJhc2VJZCkK
KyAgICAsIG1fb2JqZWN0U3RvcmVJZChvYmplY3RTdG9yZUlkKQorICAgICwgbV9pbmRleElkKGlu
ZGV4SWQpCit7CisgICAgQVNTRVJUKEtleVByZWZpeDo6aXNWYWxpZERhdGFiYXNlSWQoZGF0YWJh
c2VJZCkpOworICAgIEFTU0VSVChLZXlQcmVmaXg6OmlzVmFsaWRPYmplY3RTdG9yZUlkKG9iamVj
dFN0b3JlSWQpKTsKKyAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1ZhbGlkSW5kZXhJZChpbmRleElk
KSk7Cit9CisKK0tleVByZWZpeDo6S2V5UHJlZml4KFR5cGUgdHlwZSwgaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCkKKyAgICA6IG1fZGF0
YWJhc2VJZChkYXRhYmFzZUlkKQorICAgICwgbV9vYmplY3RTdG9yZUlkKG9iamVjdFN0b3JlSWQp
CisgICAgLCBtX2luZGV4SWQoaW5kZXhJZCkKK3sKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGUsIHR5
cGUgPT0gSW52YWxpZFR5cGUpOworICAgIEFTU0VSVChLZXlQcmVmaXg6OmlzVmFsaWREYXRhYmFz
ZUlkKGRhdGFiYXNlSWQpKTsKKyAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1ZhbGlkT2JqZWN0U3Rv
cmVJZChvYmplY3RTdG9yZUlkKSk7Cit9CisKKworS2V5UHJlZml4IEtleVByZWZpeDo6Y3JlYXRl
V2l0aFNwZWNpYWxJbmRleChpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkKQoreworICAgIEFTU0VSVChLZXlQcmVmaXg6OmlzVmFsaWREYXRh
YmFzZUlkKGRhdGFiYXNlSWQpKTsKKyAgICBBU1NFUlQoS2V5UHJlZml4Ojppc1ZhbGlkT2JqZWN0
U3RvcmVJZChvYmplY3RTdG9yZUlkKSk7CisgICAgQVNTRVJUKGluZGV4SWQpOworICAgIHJldHVy
biBLZXlQcmVmaXgoSW52YWxpZFR5cGUsIGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIGluZGV4
SWQpOworfQorCisKK2Jvb2wgS2V5UHJlZml4Ojppc1ZhbGlkRGF0YWJhc2VJZChpbnQ2NF90IGRh
dGFiYXNlSWQpCit7CisgICAgcmV0dXJuIChkYXRhYmFzZUlkID4gMCkgJiYgKGRhdGFiYXNlSWQg
PCBLZXlQcmVmaXg6OmtNYXhEYXRhYmFzZUlkKTsKK30KKworYm9vbCBLZXlQcmVmaXg6OmlzVmFs
aWRPYmplY3RTdG9yZUlkKGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICByZXR1cm4gKG9i
amVjdFN0b3JlSWQgPiAwKSAmJiAob2JqZWN0U3RvcmVJZCA8IEtleVByZWZpeDo6a01heE9iamVj
dFN0b3JlSWQpOworfQorCitib29sIEtleVByZWZpeDo6aXNWYWxpZEluZGV4SWQoaW50NjRfdCBp
bmRleElkKQoreworICAgIHJldHVybiAoaW5kZXhJZCA+PSBNaW5pbXVtSW5kZXhJZCkgJiYgKGlu
ZGV4SWQgPCBLZXlQcmVmaXg6OmtNYXhJbmRleElkKTsKK30KKworY29uc3QgY2hhciogS2V5UHJl
Zml4OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBLZXlQcmVm
aXgqIHJlc3VsdCkKK3sKKyAgICBpZiAoc3RhcnQgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAw
OworCisgICAgdW5zaWduZWQgY2hhciBmaXJzdEJ5dGUgPSAqc3RhcnQrKzsKKworICAgIGludCBk
YXRhYmFzZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiA1KSAmIDB4NykgKyAxOworICAgIGludCBv
YmplY3RTdG9yZUlkQnl0ZXMgPSAoKGZpcnN0Qnl0ZSA+PiAyKSAmIDB4NykgKyAxOworICAgIGlu
dCBpbmRleElkQnl0ZXMgPSAoZmlyc3RCeXRlICYgMHgzKSArIDE7CisKKyAgICBpZiAoc3RhcnQg
KyBkYXRhYmFzZUlkQnl0ZXMgKyBvYmplY3RTdG9yZUlkQnl0ZXMgKyBpbmRleElkQnl0ZXMgPiBs
aW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXN1bHQtPm1fZGF0YWJhc2VJZCA9IGRl
Y29kZUludChzdGFydCwgc3RhcnQgKyBkYXRhYmFzZUlkQnl0ZXMpOworICAgIHN0YXJ0ICs9IGRh
dGFiYXNlSWRCeXRlczsKKyAgICByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCA9IGRlY29kZUludChz
dGFydCwgc3RhcnQgKyBvYmplY3RTdG9yZUlkQnl0ZXMpOworICAgIHN0YXJ0ICs9IG9iamVjdFN0
b3JlSWRCeXRlczsKKyAgICByZXN1bHQtPm1faW5kZXhJZCA9IGRlY29kZUludChzdGFydCwgc3Rh
cnQgKyBpbmRleElkQnl0ZXMpOworICAgIHN0YXJ0ICs9IGluZGV4SWRCeXRlczsKKworICAgIHJl
dHVybiBzdGFydDsKK30KKworVmVjdG9yPGNoYXI+IEtleVByZWZpeDo6ZW5jb2RlRW1wdHkoKQor
eworICAgIGNvbnN0IFZlY3RvcjxjaGFyLCA0PiByZXN1bHQoNCwgMCk7CisgICAgQVNTRVJUKGVu
Y29kZUludGVybmFsKDAsIDAsIDApID09IFZlY3RvcjxjaGFyPig0LCAwKSk7CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworVmVjdG9yPGNoYXI+IEtleVByZWZpeDo6ZW5jb2RlKCkgY29uc3QKK3sK
KyAgICBBU1NFUlQobV9kYXRhYmFzZUlkICE9IEludmFsaWRJZCk7CisgICAgQVNTRVJUKG1fb2Jq
ZWN0U3RvcmVJZCAhPSBJbnZhbGlkSWQpOworICAgIEFTU0VSVChtX2luZGV4SWQgIT0gSW52YWxp
ZElkKTsKKyAgICByZXR1cm4gZW5jb2RlSW50ZXJuYWwobV9kYXRhYmFzZUlkLCBtX29iamVjdFN0
b3JlSWQsIG1faW5kZXhJZCk7Cit9CisKK1ZlY3RvcjxjaGFyPiBLZXlQcmVmaXg6OmVuY29kZUlu
dGVybmFsKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90
IGluZGV4SWQpCit7CisgICAgVmVjdG9yPGNoYXI+IGRhdGFiYXNlSWRTdHJpbmcgPSBlbmNvZGVJ
bnRTYWZlbHkoZGF0YWJhc2VJZCwga01heERhdGFiYXNlSWQpOworICAgIFZlY3RvcjxjaGFyPiBv
YmplY3RTdG9yZUlkU3RyaW5nID0gZW5jb2RlSW50U2FmZWx5KG9iamVjdFN0b3JlSWQsIGtNYXhP
YmplY3RTdG9yZUlkKTsKKyAgICBWZWN0b3I8Y2hhcj4gaW5kZXhJZFN0cmluZyA9IGVuY29kZUlu
dFNhZmVseShpbmRleElkLCBrTWF4SW5kZXhJZCk7CisKKyAgICBBU1NFUlQoZGF0YWJhc2VJZFN0
cmluZy5zaXplKCkgPD0ga01heERhdGFiYXNlSWRTaXplQnl0ZXMpOworICAgIEFTU0VSVChvYmpl
Y3RTdG9yZUlkU3RyaW5nLnNpemUoKSA8PSBrTWF4T2JqZWN0U3RvcmVJZFNpemVCeXRlcyk7Cisg
ICAgQVNTRVJUKGluZGV4SWRTdHJpbmcuc2l6ZSgpIDw9IGtNYXhJbmRleElkU2l6ZUJ5dGVzKTsK
KworICAgIHVuc2lnbmVkIGNoYXIgZmlyc3RCeXRlID0gKGRhdGFiYXNlSWRTdHJpbmcuc2l6ZSgp
IC0gMSkgPDwgKGtNYXhPYmplY3RTdG9yZUlkU2l6ZUJpdHMgKyBrTWF4SW5kZXhJZFNpemVCaXRz
KSB8IChvYmplY3RTdG9yZUlkU3RyaW5nLnNpemUoKSAtIDEpIDw8IGtNYXhJbmRleElkU2l6ZUJp
dHMgfCAoaW5kZXhJZFN0cmluZy5zaXplKCkgLSAxKTsKKyAgICBDT01QSUxFX0FTU0VSVChrTWF4
RGF0YWJhc2VJZFNpemVCaXRzICsga01heE9iamVjdFN0b3JlSWRTaXplQml0cyArIGtNYXhJbmRl
eElkU2l6ZUJpdHMgPT0gc2l6ZW9mKGZpcnN0Qnl0ZSkgKiA4LCBDQU5UX0VOQ09ERV9JRFMpOwor
ICAgIFZlY3RvcjxjaGFyLCBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZT4gcmV0OworICAgIHJldC5h
cHBlbmQoZmlyc3RCeXRlKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGRhdGFiYXNlSWRTdHJpbmcp
OworICAgIHJldC5hcHBlbmRWZWN0b3Iob2JqZWN0U3RvcmVJZFN0cmluZyk7CisgICAgcmV0LmFw
cGVuZFZlY3RvcihpbmRleElkU3RyaW5nKTsKKworICAgIEFTU0VSVChyZXQuc2l6ZSgpIDw9IERl
ZmF1bHRJbmxpbmVCdWZmZXJTaXplKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgS2V5UHJl
Zml4Ojpjb21wYXJlKGNvbnN0IEtleVByZWZpeCYgb3RoZXIpIGNvbnN0Cit7CisgICAgQVNTRVJU
KG1fZGF0YWJhc2VJZCAhPSBJbnZhbGlkSWQpOworICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQg
IT0gSW52YWxpZElkKTsKKyAgICBBU1NFUlQobV9pbmRleElkICE9IEludmFsaWRJZCk7CisKKyAg
ICBpZiAobV9kYXRhYmFzZUlkICE9IG90aGVyLm1fZGF0YWJhc2VJZCkKKyAgICAgICAgcmV0dXJu
IGNvbXBhcmVJbnRzKG1fZGF0YWJhc2VJZCwgb3RoZXIubV9kYXRhYmFzZUlkKTsKKyAgICBpZiAo
bV9vYmplY3RTdG9yZUlkICE9IG90aGVyLm1fb2JqZWN0U3RvcmVJZCkKKyAgICAgICAgcmV0dXJu
IGNvbXBhcmVJbnRzKG1fb2JqZWN0U3RvcmVJZCwgb3RoZXIubV9vYmplY3RTdG9yZUlkKTsKKyAg
ICBpZiAobV9pbmRleElkICE9IG90aGVyLm1faW5kZXhJZCkKKyAgICAgICAgcmV0dXJuIGNvbXBh
cmVJbnRzKG1faW5kZXhJZCwgb3RoZXIubV9pbmRleElkKTsKKyAgICByZXR1cm4gMDsKK30KKwor
S2V5UHJlZml4OjpUeXBlIEtleVByZWZpeDo6dHlwZSgpIGNvbnN0Cit7CisgICAgQVNTRVJUKG1f
ZGF0YWJhc2VJZCAhPSBJbnZhbGlkSWQpOworICAgIEFTU0VSVChtX29iamVjdFN0b3JlSWQgIT0g
SW52YWxpZElkKTsKKyAgICBBU1NFUlQobV9pbmRleElkICE9IEludmFsaWRJZCk7CisKKyAgICBp
ZiAoIW1fZGF0YWJhc2VJZCkKKyAgICAgICAgcmV0dXJuIEdsb2JhbE1ldGFEYXRhOworICAgIGlm
ICghbV9vYmplY3RTdG9yZUlkKQorICAgICAgICByZXR1cm4gRGF0YWJhc2VNZXRhRGF0YTsKKyAg
ICBpZiAobV9pbmRleElkID09IE9iamVjdFN0b3JlRGF0YUluZGV4SWQpCisgICAgICAgIHJldHVy
biBPYmplY3RTdG9yZURhdGE7CisgICAgaWYgKG1faW5kZXhJZCA9PSBFeGlzdHNFbnRyeUluZGV4
SWQpCisgICAgICAgIHJldHVybiBFeGlzdHNFbnRyeTsKKyAgICBpZiAobV9pbmRleElkID49IE1p
bmltdW1JbmRleElkKQorICAgICAgICByZXR1cm4gSW5kZXhEYXRhOworCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIEludmFsaWRUeXBlOworfQorCitWZWN0b3I8Y2hhcj4g
U2NoZW1hVmVyc2lvbktleTo6ZW5jb2RlKCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gS2V5
UHJlZml4OjplbmNvZGVFbXB0eSgpOworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShT
Y2hlbWFWZXJzaW9uVHlwZUJ5dGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0b3I8Y2hh
cj4gTWF4RGF0YWJhc2VJZEtleTo6ZW5jb2RlKCkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0g
S2V5UHJlZml4OjplbmNvZGVFbXB0eSgpOworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0
ZShNYXhEYXRhYmFzZUlkVHlwZUJ5dGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0b3I8
Y2hhcj4gRGF0YVZlcnNpb25LZXk6OmVuY29kZSgpCit7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9
IEtleVByZWZpeDo6ZW5jb2RlRW1wdHkoKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5
dGUoRGF0YVZlcnNpb25UeXBlQnl0ZSkpOworICAgIHJldHVybiByZXQ7Cit9CisKK0RhdGFiYXNl
RnJlZUxpc3RLZXk6OkRhdGFiYXNlRnJlZUxpc3RLZXkoKQorICAgIDogbV9kYXRhYmFzZUlkKC0x
KQoreworfQorCitjb25zdCBjaGFyKiBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkZWNvZGUoY29uc3Qg
Y2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZUZyZWVMaXN0S2V5KiByZXN1
bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJl
Zml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAg
IHJldHVybiAwOworICAgIEFTU0VSVCghcHJlZml4Lm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJU
KCFwcmVmaXgubV9vYmplY3RTdG9yZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX2luZGV4SWQp
OworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBj
aGFyIHR5cGVCeXRlID0gMDsKKyAgICBwID0gZGVjb2RlQnl0ZShwLCBsaW1pdCwgdHlwZUJ5dGUp
OworICAgIEFTU0VSVF9VTlVTRUQodHlwZUJ5dGUsIHR5cGVCeXRlID09IERhdGFiYXNlRnJlZUxp
c3RUeXBlQnl0ZSk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAg
IHJldHVybiBkZWNvZGVWYXJJbnQocCwgbGltaXQsIHJlc3VsdC0+bV9kYXRhYmFzZUlkKTsKK30K
KworVmVjdG9yPGNoYXI+IERhdGFiYXNlRnJlZUxpc3RLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFi
YXNlSWQpCit7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IEtleVByZWZpeDo6ZW5jb2RlRW1wdHko
KTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoRGF0YWJhc2VGcmVlTGlzdFR5cGVC
eXRlKSk7CisgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQoZGF0YWJhc2VJZCkpOwor
ICAgIHJldHVybiByZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBEYXRhYmFzZUZyZWVMaXN0S2V5Ojpl
bmNvZGVNYXhLZXkoKQoreworICAgIHJldHVybiBlbmNvZGUoSU5UNjRfTUFYKTsKK30KKworaW50
NjRfdCBEYXRhYmFzZUZyZWVMaXN0S2V5OjpkYXRhYmFzZUlkKCkgY29uc3QKK3sKKyAgICBBU1NF
UlQobV9kYXRhYmFzZUlkID49IDApOworICAgIHJldHVybiBtX2RhdGFiYXNlSWQ7Cit9CisKK2lu
dCBEYXRhYmFzZUZyZWVMaXN0S2V5Ojpjb21wYXJlKGNvbnN0IERhdGFiYXNlRnJlZUxpc3RLZXkm
IG90aGVyKSBjb25zdAoreworICAgIEFTU0VSVChtX2RhdGFiYXNlSWQgPj0gMCk7CisgICAgcmV0
dXJuIGNvbXBhcmVJbnRzKG1fZGF0YWJhc2VJZCwgb3RoZXIubV9kYXRhYmFzZUlkKTsKK30KKwor
Y29uc3QgY2hhciogRGF0YWJhc2VOYW1lS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNv
bnN0IGNoYXIqIGxpbWl0LCBEYXRhYmFzZU5hbWVLZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQcmVm
aXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwg
bGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIHA7CisgICAgQVNT
RVJUKCFwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0
b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYgKHAgPT0gbGlt
aXQpCisgICAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAwOwor
ICAgIHAgPSBkZWNvZGVCeXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7CisgICAgQVNTRVJUX1VOVVNF
RCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0gRGF0YWJhc2VOYW1lVHlwZUJ5dGUpOworICAgIGlmIChw
ID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExl
bmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX29yaWdpbik7CisgICAgaWYgKCFwKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVz
dWx0LT5tX2RhdGFiYXNlTmFtZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBEYXRhYmFzZU5hbWVLZXk6
OmVuY29kZShjb25zdCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBkYXRhYmFzZU5hbWUp
Cit7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IEtleVByZWZpeDo6ZW5jb2RlRW1wdHkoKTsKKyAg
ICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoRGF0YWJhc2VOYW1lVHlwZUJ5dGUpKTsKKyAg
ICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVN0cmluZ1dpdGhMZW5ndGgob3JpZ2luKSk7CisgICAg
cmV0LmFwcGVuZFZlY3RvcihlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKGRhdGFiYXNlTmFtZSkpOwor
ICAgIHJldHVybiByZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBEYXRhYmFzZU5hbWVLZXk6OmVuY29k
ZU1pbktleUZvck9yaWdpbihjb25zdCBTdHJpbmcmIG9yaWdpbikKK3sKKyAgICByZXR1cm4gZW5j
b2RlKG9yaWdpbiwgIiIpOworfQorCitWZWN0b3I8Y2hhcj4gRGF0YWJhc2VOYW1lS2V5OjplbmNv
ZGVTdG9wS2V5Rm9yT3JpZ2luKGNvbnN0IFN0cmluZyYgb3JpZ2luKQoreworICAgIC8vIGp1c3Qg
YWZ0ZXIgb3JpZ2luIGluIGNvbGxhdGlvbiBvcmRlcgorICAgIHJldHVybiBlbmNvZGVNaW5LZXlG
b3JPcmlnaW4ob3JpZ2luICsgIlx4MDEiKTsKK30KKworaW50IERhdGFiYXNlTmFtZUtleTo6Y29t
cGFyZShjb25zdCBEYXRhYmFzZU5hbWVLZXkmIG90aGVyKQoreworICAgIGlmIChpbnQgeCA9IGNv
ZGVQb2ludENvbXBhcmUobV9vcmlnaW4sIG90aGVyLm1fb3JpZ2luKSkKKyAgICAgICAgcmV0dXJu
IHg7CisgICAgcmV0dXJuIGNvZGVQb2ludENvbXBhcmUobV9kYXRhYmFzZU5hbWUsIG90aGVyLm1f
ZGF0YWJhc2VOYW1lKTsKK30KKworVmVjdG9yPGNoYXI+IERhdGFiYXNlTWV0YURhdGFLZXk6OmVu
Y29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIE1ldGFEYXRhVHlwZSBtZXRhRGF0YVR5cGUpCit7Cisg
ICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0g
cHJlZml4LmVuY29kZSgpOworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShtZXRhRGF0
YVR5cGUpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjpP
YmplY3RTdG9yZU1ldGFEYXRhS2V5KCkKKyAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAgICAs
IG1fbWV0YURhdGFUeXBlKC0xKQoreworfQorCitjb25zdCBjaGFyKiBPYmplY3RTdG9yZU1ldGFE
YXRhS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmpl
Y3RTdG9yZU1ldGFEYXRhS2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHByZWZpeDsKKyAg
ICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4
KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIEFTU0VSVChwcmVmaXgubV9k
YXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFT
U0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJl
dHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAwOworICAgIHAgPSBkZWNvZGVC
eXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7CisgICAgQVNTRVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlw
ZUJ5dGUgPT0gT2JqZWN0U3RvcmVNZXRhRGF0YVR5cGVCeXRlKTsKKyAgICBpZiAocCA9PSBsaW1p
dCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9IGRlY29kZVZhckludChwLCBsaW1pdCwgcmVz
dWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgQVNTRVJUKHJlc3VsdC0+bV9vYmplY3RTdG9yZUlkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZUJ5dGUocCwgbGltaXQsIHJlc3Vs
dC0+bV9tZXRhRGF0YVR5cGUpOworfQorCitWZWN0b3I8Y2hhcj4gT2JqZWN0U3RvcmVNZXRhRGF0
YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCB1
bnNpZ25lZCBjaGFyIG1ldGFEYXRhVHlwZSkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFi
YXNlSWQpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0
LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRlKE9iamVjdFN0b3JlTWV0YURhdGFUeXBlQnl0ZSkpOwor
ICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50KG9iamVjdFN0b3JlSWQpKTsKKyAgICBy
ZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKSk7CisgICAgcmV0dXJuIHJl
dDsKK30KKworVmVjdG9yPGNoYXI+IE9iamVjdFN0b3JlTWV0YURhdGFLZXk6OmVuY29kZU1heEtl
eShpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBJ
TlQ2NF9NQVgsIE9iamVjdE1ldGFEYXRhVHlwZU1heGltdW0pOworfQorCitWZWN0b3I8Y2hhcj4g
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6ZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkKQoreworICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwg
b2JqZWN0U3RvcmVJZCwgT2JqZWN0TWV0YURhdGFUeXBlTWF4aW11bSk7Cit9CisKK2ludDY0X3Qg
T2JqZWN0U3RvcmVNZXRhRGF0YUtleTo6b2JqZWN0U3RvcmVJZCgpIGNvbnN0Cit7CisgICAgQVNT
RVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICByZXR1cm4gbV9vYmplY3RTdG9yZUlkOwor
fQordW5zaWduZWQgY2hhciBPYmplY3RTdG9yZU1ldGFEYXRhS2V5OjptZXRhRGF0YVR5cGUoKSBj
b25zdAoreworICAgIHJldHVybiBtX21ldGFEYXRhVHlwZTsKK30KKworaW50IE9iamVjdFN0b3Jl
TWV0YURhdGFLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSYgb3RoZXIp
Cit7CisgICAgQVNTRVJUKG1fb2JqZWN0U3RvcmVJZCA+PSAwKTsKKyAgICBpZiAoaW50IHggPSBj
b21wYXJlSW50cyhtX29iamVjdFN0b3JlSWQsIG90aGVyLm1fb2JqZWN0U3RvcmVJZCkpCisgICAg
ICAgIHJldHVybiB4OworICAgIGludDY0X3QgcmVzdWx0ID0gbV9tZXRhRGF0YVR5cGUgLSBvdGhl
ci5tX21ldGFEYXRhVHlwZTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgcmV0dXJuIC0x
OworICAgIHJldHVybiAocmVzdWx0ID4gMCkgPyAxIDogcmVzdWx0OworfQorCitJbmRleE1ldGFE
YXRhS2V5OjpJbmRleE1ldGFEYXRhS2V5KCkKKyAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKKyAg
ICAsIG1faW5kZXhJZCgtMSkKKyAgICAsIG1fbWV0YURhdGFUeXBlKDApCit7Cit9CisKK2NvbnN0
IGNoYXIqIEluZGV4TWV0YURhdGFLZXk6OmRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3Qg
Y2hhciogbGltaXQsIEluZGV4TWV0YURhdGFLZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQcmVmaXgg
cHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGlt
aXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQVNTRVJU
KHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJ
ZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9IDA7CisgICAg
cCA9IGRlY29kZUJ5dGUocCwgbGltaXQsIHR5cGVCeXRlKTsKKyAgICBBU1NFUlRfVU5VU0VEKHR5
cGVCeXRlLCB0eXBlQnl0ZSA9PSBJbmRleE1ldGFEYXRhVHlwZUJ5dGUpOworICAgIGlmIChwID09
IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0
LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4g
MDsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1faW5kZXhJZCk7Cisg
ICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAg
ICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZUJ5dGUocCwgbGltaXQsIHJlc3VsdC0+bV9t
ZXRhRGF0YVR5cGUpOworfQorCitWZWN0b3I8Y2hhcj4gSW5kZXhNZXRhRGF0YUtleTo6ZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQsIHVuc2lnbmVkIGNoYXIgbWV0YURhdGFUeXBlKQoreworICAgIEtleVByZWZpeCBwcmVmaXgo
ZGF0YWJhc2VJZCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAg
ICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSW5kZXhNZXRhRGF0YVR5cGVCeXRlKSk7Cisg
ICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkpOworICAgIHJl
dC5hcHBlbmRWZWN0b3IoZW5jb2RlVmFySW50KGluZGV4SWQpKTsKKyAgICByZXQuYXBwZW5kVmVj
dG9yKGVuY29kZUJ5dGUobWV0YURhdGFUeXBlKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworVmVj
dG9yPGNoYXI+IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShpbnQ2NF90IGRhdGFiYXNl
SWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCkKK3sKKyAgICByZXR1cm4gZW5jb2RlKGRhdGFiYXNl
SWQsIG9iamVjdFN0b3JlSWQsIElOVDY0X01BWCwgSW5kZXhNZXRhRGF0YVR5cGVNYXhpbXVtKTsK
K30KKworVmVjdG9yPGNoYXI+IEluZGV4TWV0YURhdGFLZXk6OmVuY29kZU1heEtleShpbnQ2NF90
IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKQorewor
ICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgSW5k
ZXhNZXRhRGF0YVR5cGVNYXhpbXVtKTsKK30KKworaW50IEluZGV4TWV0YURhdGFLZXk6OmNvbXBh
cmUoY29uc3QgSW5kZXhNZXRhRGF0YUtleSYgb3RoZXIpCit7CisgICAgQVNTRVJUKG1fb2JqZWN0
U3RvcmVJZCA+PSAwKTsKKyAgICBBU1NFUlQobV9pbmRleElkID49IDApOworCisgICAgaWYgKGlu
dCB4ID0gY29tcGFyZUludHMobV9vYmplY3RTdG9yZUlkLCBvdGhlci5tX29iamVjdFN0b3JlSWQp
KQorICAgICAgICByZXR1cm4geDsKKyAgICBpZiAoaW50IHggPSBjb21wYXJlSW50cyhtX2luZGV4
SWQsIG90aGVyLm1faW5kZXhJZCkpCisgICAgICAgIHJldHVybiB4OworICAgIHJldHVybiBtX21l
dGFEYXRhVHlwZSAtIG90aGVyLm1fbWV0YURhdGFUeXBlOworfQorCitpbnQ2NF90IEluZGV4TWV0
YURhdGFLZXk6OmluZGV4SWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX2luZGV4SWQgPj0gMCk7
CisgICAgcmV0dXJuIG1faW5kZXhJZDsKK30KKworT2JqZWN0U3RvcmVGcmVlTGlzdEtleTo6T2Jq
ZWN0U3RvcmVGcmVlTGlzdEtleSgpCisgICAgOiBtX29iamVjdFN0b3JlSWQoLTEpCit7Cit9CisK
K2NvbnN0IGNoYXIqIE9iamVjdFN0b3JlRnJlZUxpc3RLZXk6OmRlY29kZShjb25zdCBjaGFyKiBz
dGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkqIHJlc3VsdCkK
K3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQcmVmaXg6
OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOworICAgIEFTU0VSVCghcHJl
Zml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgubV9pbmRleElkKTsKKyAg
ICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgdW5zaWduZWQgY2hhciB0
eXBlQnl0ZSA9IDA7CisgICAgcCA9IGRlY29kZUJ5dGUocCwgbGltaXQsIHR5cGVCeXRlKTsKKyAg
ICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBPYmplY3RTdG9yZUZyZWVMaXN0
VHlwZUJ5dGUpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBy
ZXR1cm4gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJZCk7Cit9
CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZUZyZWVMaXN0S2V5OjplbmNvZGUoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7CisgICAgS2V5UHJlZml4IHByZWZp
eChkYXRhYmFzZUlkKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0gcHJlZml4LmVuY29kZSgpOwor
ICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShPYmplY3RTdG9yZUZyZWVMaXN0VHlwZUJ5
dGUpKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVZhckludChvYmplY3RTdG9yZUlkKSk7
CisgICAgcmV0dXJuIHJldDsKK30KKworVmVjdG9yPGNoYXI+IE9iamVjdFN0b3JlRnJlZUxpc3RL
ZXk6OmVuY29kZU1heEtleShpbnQ2NF90IGRhdGFiYXNlSWQpCit7CisgICAgcmV0dXJuIGVuY29k
ZShkYXRhYmFzZUlkLCBJTlQ2NF9NQVgpOworfQorCitpbnQ2NF90IE9iamVjdFN0b3JlRnJlZUxp
c3RLZXk6Om9iamVjdFN0b3JlSWQoKSBjb25zdAoreworICAgIEFTU0VSVChtX29iamVjdFN0b3Jl
SWQgPj0gMCk7CisgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsKK30KKworaW50IE9iamVjdFN0
b3JlRnJlZUxpc3RLZXk6OmNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYgb3Ro
ZXIpCit7CisgICAgLy8gRklYTUU6IEl0IG1heSBzZWVtIHN0cmFuZ2UgdGhhdCB3ZSdyZSBub3Qg
Y29tcGFyaW5nIGRhdGFiYXNlIGlkJ3MsCisgICAgLy8gYnV0IHRoYXQgY29tcGFyaXNvbiB3aWxs
IGhhdmUgYmVlbiBtYWRlIGVhcmxpZXIuCisgICAgLy8gV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2Ug
dGhpcyBtb3JlIGNsZWFyLCB0aG91Z2guLi4KKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOworICAgIHJldHVybiBjb21wYXJlSW50cyhtX29iamVjdFN0b3JlSWQsIG90aGVyLm1fb2Jq
ZWN0U3RvcmVJZCk7Cit9CisKK0luZGV4RnJlZUxpc3RLZXk6OkluZGV4RnJlZUxpc3RLZXkoKQor
ICAgIDogbV9vYmplY3RTdG9yZUlkKC0xKQorICAgICwgbV9pbmRleElkKC0xKQoreworfQorCitj
b25zdCBjaGFyKiBJbmRleEZyZWVMaXN0S2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNv
bnN0IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJl
Zml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQs
IGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAwOworICAgIEFT
U0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5tX29iamVjdFN0
b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYgKHAgPT0gbGlt
aXQpCisgICAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5dGUgPSAwOwor
ICAgIHAgPSBkZWNvZGVCeXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7CisgICAgQVNTRVJUX1VOVVNF
RCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0gSW5kZXhGcmVlTGlzdFR5cGVCeXRlKTsKKyAgICBpZiAo
cCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcCA9IGRlY29kZVZhckludChwLCBs
aW1pdCwgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIGRlY29kZVZhckludChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4
SWQpOworfQorCitWZWN0b3I8Y2hhcj4gSW5kZXhGcmVlTGlzdEtleTo6ZW5jb2RlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCit7Cisg
ICAgS2V5UHJlZml4IHByZWZpeChkYXRhYmFzZUlkKTsKKyAgICBWZWN0b3I8Y2hhcj4gcmV0ID0g
cHJlZml4LmVuY29kZSgpOworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlQnl0ZShJbmRleEZy
ZWVMaXN0VHlwZUJ5dGUpKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZVZhckludChvYmpl
Y3RTdG9yZUlkKSk7CisgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQoaW5kZXhJZCkp
OworICAgIHJldHVybiByZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBJbmRleEZyZWVMaXN0S2V5Ojpl
bmNvZGVNYXhLZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpCit7
CisgICAgcmV0dXJuIGVuY29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBJTlQ2NF9NQVgp
OworfQorCitpbnQgSW5kZXhGcmVlTGlzdEtleTo6Y29tcGFyZShjb25zdCBJbmRleEZyZWVMaXN0
S2V5JiBvdGhlcikKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAgIEFT
U0VSVChtX2luZGV4SWQgPj0gMCk7CisgICAgaWYgKGludCB4ID0gY29tcGFyZUludHMobV9vYmpl
Y3RTdG9yZUlkLCBvdGhlci5tX29iamVjdFN0b3JlSWQpKQorICAgICAgICByZXR1cm4geDsKKyAg
ICByZXR1cm4gY29tcGFyZUludHMobV9pbmRleElkLCBvdGhlci5tX2luZGV4SWQpOworfQorCitp
bnQ2NF90IEluZGV4RnJlZUxpc3RLZXk6Om9iamVjdFN0b3JlSWQoKSBjb25zdAoreworICAgIEFT
U0VSVChtX29iamVjdFN0b3JlSWQgPj0gMCk7CisgICAgcmV0dXJuIG1fb2JqZWN0U3RvcmVJZDsK
K30KKworaW50NjRfdCBJbmRleEZyZWVMaXN0S2V5OjppbmRleElkKCkgY29uc3QKK3sKKyAgICBB
U1NFUlQobV9pbmRleElkID49IDApOworICAgIHJldHVybiBtX2luZGV4SWQ7Cit9CisKKy8vIEZJ
WE1FOiBXZSBuZXZlciB1c2UgdGhpcyB0byBsb29rIHVwIG9iamVjdCBzdG9yZSBpZHMsIGJlY2F1
c2UgYSBtYXBwaW5nCisvLyBpcyBrZXB0IGluIHRoZSBJREJEYXRhYmFzZUJhY2tlbmRJbXBsLiBD
YW4gdGhlIG1hcHBpbmcgYmVjb21lIHVucmVsaWFibGU/CisvLyBDYW4gd2UgcmVtb3ZlIHRoaXM/
Citjb25zdCBjaGFyKiBPYmplY3RTdG9yZU5hbWVzS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3Rh
cnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RTdG9yZU5hbWVzS2V5KiByZXN1bHQpCit7Cisg
ICAgS2V5UHJlZml4IHByZWZpeDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNv
ZGUoc3RhcnQsIGxpbWl0LCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiAw
OworICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQoIXByZWZpeC5t
X29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVCghcHJlZml4Lm1faW5kZXhJZCk7CisgICAgaWYg
KHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGNoYXIgdHlwZUJ5
dGUgPSAwOworICAgIHAgPSBkZWNvZGVCeXRlKHAsIGxpbWl0LCB0eXBlQnl0ZSk7CisgICAgQVNT
RVJUX1VOVVNFRCh0eXBlQnl0ZSwgdHlwZUJ5dGUgPT0gT2JqZWN0U3RvcmVOYW1lc1R5cGVCeXRl
KTsKKyAgICByZXR1cm4gZGVjb2RlU3RyaW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5t
X29iamVjdFN0b3JlTmFtZSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmplY3RTdG9yZU5hbWVzS2V5
OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG9iamVjdFN0b3JlTmFt
ZSkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQpOworICAgIFZlY3RvcjxjaGFy
PiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVCeXRl
KE9iamVjdFN0b3JlTmFtZXNUeXBlQnl0ZSkpOworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2Rl
U3RyaW5nV2l0aExlbmd0aChvYmplY3RTdG9yZU5hbWUpKTsKKyAgICByZXR1cm4gcmV0OworfQor
CitpbnQgT2JqZWN0U3RvcmVOYW1lc0tleTo6Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZU5hbWVz
S2V5JiBvdGhlcikKK3sKKyAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShtX29iamVjdFN0b3Jl
TmFtZSwgb3RoZXIubV9vYmplY3RTdG9yZU5hbWUpOworfQorCitJbmRleE5hbWVzS2V5OjpJbmRl
eE5hbWVzS2V5KCkKKyAgICA6IG1fb2JqZWN0U3RvcmVJZCgtMSkKK3sKK30KKworLy8gRklYTUU6
IFdlIG5ldmVyIHVzZSB0aGlzIHRvIGxvb2sgdXAgaW5kZXggaWRzLCBiZWNhdXNlIGEgbWFwcGlu
ZworLy8gaXMga2VwdCBhdCBhIGhpZ2hlciBsZXZlbC4KK2NvbnN0IGNoYXIqIEluZGV4TmFtZXNL
ZXk6OmRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4TmFt
ZXNLZXkqIHJlc3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIq
IHAgPSBLZXlQcmVmaXg6OmRlY29kZShzdGFydCwgbGltaXQsICZwcmVmaXgpOworICAgIGlmICgh
cCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgQVNTRVJUKHByZWZpeC5tX2RhdGFiYXNlSWQpOwor
ICAgIEFTU0VSVCghcHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKCFwcmVmaXgu
bV9pbmRleElkKTsKKyAgICBpZiAocCA9PSBsaW1pdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
dW5zaWduZWQgY2hhciB0eXBlQnl0ZSA9IDA7CisgICAgcCA9IGRlY29kZUJ5dGUocCwgbGltaXQs
IHR5cGVCeXRlKTsKKyAgICBBU1NFUlRfVU5VU0VEKHR5cGVCeXRlLCB0eXBlQnl0ZSA9PSBJbmRl
eE5hbWVzS2V5VHlwZUJ5dGUpOworICAgIGlmIChwID09IGxpbWl0KQorICAgICAgICByZXR1cm4g
MDsKKyAgICBwID0gZGVjb2RlVmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fb2JqZWN0U3RvcmVJ
ZCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGVjb2RlU3Ry
aW5nV2l0aExlbmd0aChwLCBsaW1pdCwgcmVzdWx0LT5tX2luZGV4TmFtZSk7Cit9CisKK1ZlY3Rv
cjxjaGFyPiBJbmRleE5hbWVzS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGNvbnN0IFN0cmluZyYgaW5kZXhOYW1lKQoreworICAgIEtleVByZWZp
eCBwcmVmaXgoZGF0YWJhc2VJZCk7CisgICAgVmVjdG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNv
ZGUoKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVuY29kZUJ5dGUoSW5kZXhOYW1lc0tleVR5cGVC
eXRlKSk7CisgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVWYXJJbnQob2JqZWN0U3RvcmVJZCkp
OworICAgIHJldC5hcHBlbmRWZWN0b3IoZW5jb2RlU3RyaW5nV2l0aExlbmd0aChpbmRleE5hbWUp
KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgSW5kZXhOYW1lc0tleTo6Y29tcGFyZShjb25z
dCBJbmRleE5hbWVzS2V5JiBvdGhlcikKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49
IDApOworICAgIGlmIChpbnQgeCA9IGNvbXBhcmVJbnRzKG1fb2JqZWN0U3RvcmVJZCwgb3RoZXIu
bV9vYmplY3RTdG9yZUlkKSkKKyAgICAgICAgcmV0dXJuIHg7CisgICAgcmV0dXJuIGNvZGVQb2lu
dENvbXBhcmUobV9pbmRleE5hbWUsIG90aGVyLm1faW5kZXhOYW1lKTsKK30KKworY29uc3QgY2hh
ciogT2JqZWN0U3RvcmVEYXRhS2V5OjpkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNo
YXIqIGVuZCwgT2JqZWN0U3RvcmVEYXRhS2V5KiByZXN1bHQpCit7CisgICAgS2V5UHJlZml4IHBy
ZWZpeDsKKyAgICBjb25zdCBjaGFyKiBwID0gS2V5UHJlZml4OjpkZWNvZGUoc3RhcnQsIGVuZCwg
JnByZWZpeCk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJl
Zml4Lm1fZGF0YWJhc2VJZCk7CisgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOwor
ICAgIEFTU0VSVChwcmVmaXgubV9pbmRleElkID09IFNwZWNpYWxJbmRleE51bWJlcik7CisgICAg
aWYgKHAgPT0gZW5kKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZXh0cmFjdEVuY29k
ZWRJREJLZXkocCwgZW5kLCAmcmVzdWx0LT5tX2VuY29kZWRVc2VyS2V5KTsKK30KKworVmVjdG9y
PGNoYXI+IE9iamVjdFN0b3JlRGF0YUtleTo6ZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50
NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4gZW5jb2RlZFVzZXJLZXkpCit7
CisgICAgS2V5UHJlZml4IHByZWZpeChLZXlQcmVmaXg6OmNyZWF0ZVdpdGhTcGVjaWFsSW5kZXgo
ZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgU3BlY2lhbEluZGV4TnVtYmVyKSk7CisgICAgVmVj
dG9yPGNoYXI+IHJldCA9IHByZWZpeC5lbmNvZGUoKTsKKyAgICByZXQuYXBwZW5kVmVjdG9yKGVu
Y29kZWRVc2VyS2V5KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK1ZlY3RvcjxjaGFyPiBPYmpl
Y3RTdG9yZURhdGFLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0
U3RvcmVJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQoreworICAgIHJldHVybiBlbmNvZGUoZGF0
YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsKK30KKworaW50
IE9iamVjdFN0b3JlRGF0YUtleTo6Y29tcGFyZShjb25zdCBPYmplY3RTdG9yZURhdGFLZXkmIG90
aGVyLCBib29sJiBvaykKK3sKKyAgICByZXR1cm4gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5j
b2RlZFVzZXJLZXksIG90aGVyLm1fZW5jb2RlZFVzZXJLZXksIG9rKTsKK30KKworUGFzc1JlZlB0
cjxJREJLZXk+IE9iamVjdFN0b3JlRGF0YUtleTo6dXNlcktleSgpIGNvbnN0Cit7CisgICAgUmVm
UHRyPElEQktleT4ga2V5OworICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmJlZ2lu
KCksIG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7CisgICAgcmV0dXJuIGtleTsKK30KKwor
Y29uc3QgaW50NjRfdCBPYmplY3RTdG9yZURhdGFLZXk6OlNwZWNpYWxJbmRleE51bWJlciA9IE9i
amVjdFN0b3JlRGF0YUluZGV4SWQ7CisKK2NvbnN0IGNoYXIqIEV4aXN0c0VudHJ5S2V5OjpkZWNv
ZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGVuZCwgRXhpc3RzRW50cnlLZXkqIHJl
c3VsdCkKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4OworICAgIGNvbnN0IGNoYXIqIHAgPSBLZXlQ
cmVmaXg6OmRlY29kZShzdGFydCwgZW5kLCAmcHJlZml4KTsKKyAgICBpZiAoIXApCisgICAgICAg
IHJldHVybiAwOworICAgIEFTU0VSVChwcmVmaXgubV9kYXRhYmFzZUlkKTsKKyAgICBBU1NFUlQo
cHJlZml4Lm1fb2JqZWN0U3RvcmVJZCk7CisgICAgQVNTRVJUKHByZWZpeC5tX2luZGV4SWQgPT0g
U3BlY2lhbEluZGV4TnVtYmVyKTsKKyAgICBpZiAocCA9PSBlbmQpCisgICAgICAgIHJldHVybiAw
OworICAgIHJldHVybiBleHRyYWN0RW5jb2RlZElEQktleShwLCBlbmQsICZyZXN1bHQtPm1fZW5j
b2RlZFVzZXJLZXkpOworfQorCitWZWN0b3I8Y2hhcj4gRXhpc3RzRW50cnlLZXk6OmVuY29kZShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgVmVjdG9yPGNo
YXI+JiBlbmNvZGVkS2V5KQoreworICAgIEtleVByZWZpeCBwcmVmaXgoS2V5UHJlZml4OjpjcmVh
dGVXaXRoU3BlY2lhbEluZGV4KGRhdGFiYXNlSWQsIG9iamVjdFN0b3JlSWQsIFNwZWNpYWxJbmRl
eE51bWJlcikpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7CisgICAg
cmV0LmFwcGVuZFZlY3RvcihlbmNvZGVkS2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0
b3I8Y2hhcj4gRXhpc3RzRW50cnlLZXk6OmVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0
X3Qgb2JqZWN0U3RvcmVJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQoreworICAgIHJldHVybiBl
bmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgZW5jb2RlSURCS2V5KHVzZXJLZXkpKTsK
K30KKworaW50IEV4aXN0c0VudHJ5S2V5Ojpjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBv
dGhlciwgYm9vbCYgb2spCit7CisgICAgcmV0dXJuIGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtX2Vu
Y29kZWRVc2VyS2V5LCBvdGhlci5tX2VuY29kZWRVc2VyS2V5LCBvayk7Cit9CisKK1Bhc3NSZWZQ
dHI8SURCS2V5PiBFeGlzdHNFbnRyeUtleTo6dXNlcktleSgpIGNvbnN0Cit7CisgICAgUmVmUHRy
PElEQktleT4ga2V5OworICAgIGRlY29kZUlEQktleShtX2VuY29kZWRVc2VyS2V5LmJlZ2luKCks
IG1fZW5jb2RlZFVzZXJLZXkuZW5kKCksIGtleSk7CisgICAgcmV0dXJuIGtleTsKK30KKworY29u
c3QgaW50NjRfdCBFeGlzdHNFbnRyeUtleTo6U3BlY2lhbEluZGV4TnVtYmVyID0gRXhpc3RzRW50
cnlJbmRleElkOworCitJbmRleERhdGFLZXk6OkluZGV4RGF0YUtleSgpCisgICAgOiBtX2RhdGFi
YXNlSWQoLTEpCisgICAgLCBtX29iamVjdFN0b3JlSWQoLTEpCisgICAgLCBtX2luZGV4SWQoLTEp
CisgICAgLCBtX3NlcXVlbmNlTnVtYmVyKC0xKQoreworfQorCitjb25zdCBjaGFyKiBJbmRleERh
dGFLZXk6OmRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4
RGF0YUtleSogcmVzdWx0KQoreworICAgIEtleVByZWZpeCBwcmVmaXg7CisgICAgY29uc3QgY2hh
ciogcCA9IEtleVByZWZpeDo6ZGVjb2RlKHN0YXJ0LCBsaW1pdCwgJnByZWZpeCk7CisgICAgaWYg
KCFwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBBU1NFUlQocHJlZml4Lm1fZGF0YWJhc2VJZCk7
CisgICAgQVNTRVJUKHByZWZpeC5tX29iamVjdFN0b3JlSWQpOworICAgIEFTU0VSVChwcmVmaXgu
bV9pbmRleElkID49IE1pbmltdW1JbmRleElkKTsKKyAgICByZXN1bHQtPm1fZGF0YWJhc2VJZCA9
IHByZWZpeC5tX2RhdGFiYXNlSWQ7CisgICAgcmVzdWx0LT5tX29iamVjdFN0b3JlSWQgPSBwcmVm
aXgubV9vYmplY3RTdG9yZUlkOworICAgIHJlc3VsdC0+bV9pbmRleElkID0gcHJlZml4Lm1faW5k
ZXhJZDsKKyAgICByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIgPSAtMTsKKyAgICByZXN1bHQtPm1f
ZW5jb2RlZFByaW1hcnlLZXkgPSBtaW5JREJLZXkoKTsKKworICAgIHAgPSBleHRyYWN0RW5jb2Rl
ZElEQktleShwLCBsaW1pdCwgJnJlc3VsdC0+bV9lbmNvZGVkVXNlcktleSk7CisgICAgaWYgKCFw
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIFtvcHRpb25hbF0gc2VxdWVuY2UgbnVtYmVy
CisgICAgaWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiBwOworICAgIHAgPSAgZGVjb2Rl
VmFySW50KHAsIGxpbWl0LCByZXN1bHQtPm1fc2VxdWVuY2VOdW1iZXIpOworICAgIGlmICghcCkK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBbb3B0aW9uYWxdIHByaW1hcnkga2V5CisgICAg
aWYgKHAgPT0gbGltaXQpCisgICAgICAgIHJldHVybiBwOworICAgIHAgPSBleHRyYWN0RW5jb2Rl
ZElEQktleShwLCBsaW1pdCwgJnJlc3VsdC0+bV9lbmNvZGVkUHJpbWFyeUtleSk7CisgICAgaWYg
KCFwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBwOworfQorCitWZWN0b3I8Y2hh
cj4gSW5kZXhEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVj
dFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkVXNl
cktleSwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkUHJpbWFyeUtleSwgaW50NjRfdCBzZXF1
ZW5jZU51bWJlcikKK3sKKyAgICBLZXlQcmVmaXggcHJlZml4KGRhdGFiYXNlSWQsIG9iamVjdFN0
b3JlSWQsIGluZGV4SWQpOworICAgIFZlY3RvcjxjaGFyPiByZXQgPSBwcmVmaXguZW5jb2RlKCk7
CisgICAgcmV0LmFwcGVuZFZlY3RvcihlbmNvZGVkVXNlcktleSk7CisgICAgcmV0LmFwcGVuZFZl
Y3RvcihlbmNvZGVWYXJJbnQoc2VxdWVuY2VOdW1iZXIpKTsKKyAgICByZXQuYXBwZW5kVmVjdG9y
KGVuY29kZWRQcmltYXJ5S2V5KTsKKyAgICByZXR1cm4gcmV0OworfQorCitWZWN0b3I8Y2hhcj4g
SW5kZXhEYXRhS2V5OjplbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0
b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgSURCS2V5JiB1c2VyS2V5KQoreworICAgIHJl
dHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2JqZWN0U3RvcmVJZCwgaW5kZXhJZCwgZW5jb2RlSURC
S2V5KHVzZXJLZXkpLCBtaW5JREJLZXkoKSk7Cit9CisKK1ZlY3RvcjxjaGFyPiBJbmRleERhdGFL
ZXk6OmVuY29kZU1pbktleShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgaW50NjRfdCBpbmRleElkKQoreworICAgIHJldHVybiBlbmNvZGUoZGF0YWJhc2VJZCwgb2Jq
ZWN0U3RvcmVJZCwgaW5kZXhJZCwgbWluSURCS2V5KCksIG1pbklEQktleSgpKTsKK30KKworVmVj
dG9yPGNoYXI+IEluZGV4RGF0YUtleTo6ZW5jb2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwg
aW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQpCit7CisgICAgcmV0dXJuIGVu
Y29kZShkYXRhYmFzZUlkLCBvYmplY3RTdG9yZUlkLCBpbmRleElkLCBtYXhJREJLZXkoKSwgbWF4
SURCS2V5KCksIElOVDY0X01BWCk7Cit9CisKK2ludCBJbmRleERhdGFLZXk6OmNvbXBhcmUoY29u
c3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVEdXBsaWNhdGVzLCBib29sJiBvaykK
K3sKKyAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAgIEFTU0VSVChtX29iamVjdFN0
b3JlSWQgPj0gMCk7CisgICAgQVNTRVJUKG1faW5kZXhJZCA+PSAwKTsKKyAgICBpbnQgcmVzdWx0
ID0gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFVzZXJLZXksIG90aGVyLm1fZW5jb2Rl
ZFVzZXJLZXksIG9rKTsKKyAgICBpZiAoIW9rIHx8IHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICBpZiAoaWdub3JlRHVwbGljYXRlcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmVzdWx0ID0gY29tcGFyZUVuY29kZWRJREJLZXlzKG1fZW5jb2RlZFByaW1hcnlLZXksIG90aGVy
Lm1fZW5jb2RlZFByaW1hcnlLZXksIG9rKTsKKyAgICBpZiAoIW9rIHx8IHJlc3VsdCkKKyAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gY29tcGFyZUludHMobV9zZXF1ZW5jZU51bWJl
ciwgb3RoZXIubV9zZXF1ZW5jZU51bWJlcik7Cit9CisKK2ludDY0X3QgSW5kZXhEYXRhS2V5Ojpk
YXRhYmFzZUlkKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9kYXRhYmFzZUlkID49IDApOworICAg
IHJldHVybiBtX2RhdGFiYXNlSWQ7Cit9CisKK2ludDY0X3QgSW5kZXhEYXRhS2V5OjpvYmplY3RT
dG9yZUlkKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9vYmplY3RTdG9yZUlkID49IDApOworICAg
IHJldHVybiBtX29iamVjdFN0b3JlSWQ7Cit9CisKK2ludDY0X3QgSW5kZXhEYXRhS2V5OjppbmRl
eElkKCkgY29uc3QKK3sKKyAgICBBU1NFUlQobV9pbmRleElkID49IDApOworICAgIHJldHVybiBt
X2luZGV4SWQ7Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5PiBJbmRleERhdGFLZXk6OnVzZXJLZXko
KSBjb25zdAoreworICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICBkZWNvZGVJREJLZXkobV9l
bmNvZGVkVXNlcktleS5iZWdpbigpLCBtX2VuY29kZWRVc2VyS2V5LmVuZCgpLCBrZXkpOworICAg
IHJldHVybiBrZXk7Cit9CisKK1Bhc3NSZWZQdHI8SURCS2V5PiBJbmRleERhdGFLZXk6OnByaW1h
cnlLZXkoKSBjb25zdAoreworICAgIFJlZlB0cjxJREJLZXk+IGtleTsKKyAgICBkZWNvZGVJREJL
ZXkobV9lbmNvZGVkUHJpbWFyeUtleS5iZWdpbigpLCBtX2VuY29kZWRQcmltYXJ5S2V5LmVuZCgp
LCBrZXkpOworICAgIHJldHVybiBrZXk7Cit9CisKK30gLy8gbmFtZXNwYWNlIElEQkxldmVsREJD
b2RpbmcKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShMRVZFTERCKQor
I2VuZGlmIC8vIEVOQUJMRShJTkRFWEVEX0RBVEFCQVNFKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJMZXZlbERCQ29kaW5nLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9sZXZlbGRiL0lEQkxldmVsREJDb2RpbmcuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE5N2Y2Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvbGV2ZWxkYi9JREJMZXZlbERC
Q29kaW5nLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIElEQkxldmVsREJDb2Rp
bmdfaAorI2RlZmluZSBJREJMZXZlbERCQ29kaW5nX2gKKworI2lmIEVOQUJMRShJTkRFWEVEX0RB
VEFCQVNFKQorI2lmIFVTRShMRVZFTERCKQorCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBJREJLZXk7CitjbGFzcyBJREJLZXlQYXRoOwor
Y2xhc3MgTGV2ZWxEQlNsaWNlOworCituYW1lc3BhY2UgSURCTGV2ZWxEQkNvZGluZyB7CisKK2Nv
bnN0IHVuc2lnbmVkIGNoYXIgTWluaW11bUluZGV4SWQgPSAzMDsKKworLy8gQXMgbW9zdCBvZiB0
aGUgSURCS2V5cyBhbmQgZW5jb2RlZCB2YWx1ZXMgYXJlIHNob3J0LCB3ZSBpbml0aWFsaXplIHNv
bWUgVmVjdG9ycyB3aXRoIGEgZGVmYXVsdCBpbmxpbmUgYnVmZmVyIHNpemUKKy8vIHRvIHJlZHVj
ZSB0aGUgbWVtb3J5IHJlLWFsbG9jYXRpb25zIHdoZW4gdGhlIFZlY3RvcnMgYXJlIGFwcGVuZGVk
Lgorc3RhdGljIGNvbnN0IHNpemVfdCBEZWZhdWx0SW5saW5lQnVmZmVyU2l6ZSA9IDMyOworCitW
ZWN0b3I8Y2hhcj4gZW5jb2RlQnl0ZSh1bnNpZ25lZCBjaGFyKTsKK2NvbnN0IGNoYXIqIGRlY29k
ZUJ5dGUoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIHVuc2lnbmVkIGNoYXImIGZv
dW5kQ2hhcik7CitWZWN0b3I8Y2hhcj4gbWF4SURCS2V5KCk7CitWZWN0b3I8Y2hhcj4gbWluSURC
S2V5KCk7CitWZWN0b3I8Y2hhcj4gZW5jb2RlQm9vbChib29sKTsKK2Jvb2wgZGVjb2RlQm9vbChj
b25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kKTsKK1ZlY3RvcjxjaGFyPiBlbmNvZGVJ
bnQoaW50NjRfdCk7CitpbmxpbmUgVmVjdG9yPGNoYXI+IGVuY29kZUludFNhZmVseShpbnQ2NF90
IG5QYXJhbSwgaW50NjRfdCBtYXgpCit7CisgICAgQVNTRVJUX1VOVVNFRChtYXgsIG5QYXJhbSA8
PSBtYXgpOworICAgIHJldHVybiBlbmNvZGVJbnQoblBhcmFtKTsKK30KK2ludDY0X3QgZGVjb2Rl
SW50KGNvbnN0IGNoYXIqIGJlZ2luLCBjb25zdCBjaGFyKiBlbmQpOworVmVjdG9yPGNoYXI+IGVu
Y29kZVZhckludChpbnQ2NF90KTsKK2NvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFy
KiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYgZm91bmRJbnQpOworVmVjdG9yPGNoYXI+
IGVuY29kZVN0cmluZyhjb25zdCBTdHJpbmcmKTsKK1N0cmluZyBkZWNvZGVTdHJpbmcoY29uc3Qg
Y2hhciogcCwgY29uc3QgY2hhciogZW5kKTsKK1ZlY3RvcjxjaGFyPiBlbmNvZGVTdHJpbmdXaXRo
TGVuZ3RoKGNvbnN0IFN0cmluZyYpOworY29uc3QgY2hhciogZGVjb2RlU3RyaW5nV2l0aExlbmd0
aChjb25zdCBjaGFyKiBwLCBjb25zdCBjaGFyKiBsaW1pdCwgU3RyaW5nJiBmb3VuZFN0cmluZyk7
CitpbnQgY29tcGFyZUVuY29kZWRTdHJpbmdzV2l0aExlbmd0aChjb25zdCBjaGFyKiYgcCwgY29u
c3QgY2hhciogbGltaXRQLCBjb25zdCBjaGFyKiYgcSwgY29uc3QgY2hhciogbGltaXRRLCBib29s
JiBvayk7CitWZWN0b3I8Y2hhcj4gZW5jb2RlRG91YmxlKGRvdWJsZSk7Citjb25zdCBjaGFyKiBk
ZWNvZGVEb3VibGUoY29uc3QgY2hhciogcCwgY29uc3QgY2hhciogbGltaXQsIGRvdWJsZSopOwor
dm9pZCBlbmNvZGVJREJLZXkoY29uc3QgSURCS2V5JiwgVmVjdG9yPGNoYXIsIERlZmF1bHRJbmxp
bmVCdWZmZXJTaXplPiYgaW50byk7CitWZWN0b3I8Y2hhcj4gZW5jb2RlSURCS2V5KGNvbnN0IElE
QktleSYpOworY29uc3QgY2hhciogZGVjb2RlSURCS2V5KGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNo
YXIqIGxpbWl0LCBSZWZQdHI8SURCS2V5PiYgZm91bmRLZXkpOworY29uc3QgY2hhciogZXh0cmFj
dEVuY29kZWRJREJLZXkoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBWZWN0
b3I8Y2hhcj4qIHJlc3VsdCk7CitpbnQgY29tcGFyZUVuY29kZWRJREJLZXlzKGNvbnN0IFZlY3Rv
cjxjaGFyPiYsIGNvbnN0IFZlY3RvcjxjaGFyPiYsIGJvb2wmIG9rKTsKK1ZlY3RvcjxjaGFyPiBl
bmNvZGVJREJLZXlQYXRoKGNvbnN0IElEQktleVBhdGgmKTsKK0lEQktleVBhdGggZGVjb2RlSURC
S2V5UGF0aChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOworCitpbnQgY29tcGFyZShjb25zdCBM
ZXZlbERCU2xpY2UmLCBjb25zdCBMZXZlbERCU2xpY2UmLCBib29sIGluZGV4S2V5cyA9IGZhbHNl
KTsKKworY2xhc3MgS2V5UHJlZml4IHsKK3B1YmxpYzoKKyAgICBLZXlQcmVmaXgoKTsKKyAgICBl
eHBsaWNpdCBLZXlQcmVmaXgoaW50NjRfdCBkYXRhYmFzZUlkKTsKKyAgICBLZXlQcmVmaXgoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIEtleVByZWZpeChp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElk
KTsKKyAgICBzdGF0aWMgS2V5UHJlZml4IGNyZWF0ZVdpdGhTcGVjaWFsSW5kZXgoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCk7CisKKyAg
ICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFy
KiBsaW1pdCwgS2V5UHJlZml4KiByZXN1bHQpOworICAgIFZlY3RvcjxjaGFyPiBlbmNvZGUoKSBj
b25zdDsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUVtcHR5KCk7CisgICAgaW50IGNv
bXBhcmUoY29uc3QgS2V5UHJlZml4JiBvdGhlcikgY29uc3Q7CisKKyAgICBlbnVtIFR5cGUgewor
ICAgICAgICBHbG9iYWxNZXRhRGF0YSwKKyAgICAgICAgRGF0YWJhc2VNZXRhRGF0YSwKKyAgICAg
ICAgT2JqZWN0U3RvcmVEYXRhLAorICAgICAgICBFeGlzdHNFbnRyeSwKKyAgICAgICAgSW5kZXhE
YXRhLAorICAgICAgICBJbnZhbGlkVHlwZQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6
ZV90IGtNYXhEYXRhYmFzZUlkU2l6ZUJpdHMgPSAzOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qg
a01heE9iamVjdFN0b3JlSWRTaXplQml0cyA9IDM7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBr
TWF4SW5kZXhJZFNpemVCaXRzID0gMjsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heERh
dGFiYXNlSWRTaXplQnl0ZXMgPSAxVUxMIDw8IGtNYXhEYXRhYmFzZUlkU2l6ZUJpdHM7IC8vIDgK
KyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhPYmplY3RTdG9yZUlkU2l6ZUJ5dGVzID0gMVVM
TCA8PCBrTWF4T2JqZWN0U3RvcmVJZFNpemVCaXRzOyAvLyA4CisgICAgc3RhdGljIGNvbnN0IHNp
emVfdCBrTWF4SW5kZXhJZFNpemVCeXRlcyA9IDFVTEwgPDwga01heEluZGV4SWRTaXplQml0czsg
Ly8gNAorCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RGF0YWJhc2VJZEJpdHMgPSBrTWF4
RGF0YWJhc2VJZFNpemVCeXRlcyAqIDggLSAxOyAvLyA2MworICAgIHN0YXRpYyBjb25zdCBzaXpl
X3Qga01heE9iamVjdFN0b3JlSWRCaXRzID0ga01heE9iamVjdFN0b3JlSWRTaXplQnl0ZXMgKiA4
IC0gMTsgLy8gNjMKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhJbmRleElkQml0cyA9IGtN
YXhJbmRleElkU2l6ZUJ5dGVzICogOCAtIDE7IC8vIDMxCisKKyAgICBzdGF0aWMgY29uc3QgaW50
NjRfdCBrTWF4RGF0YWJhc2VJZCA9ICgxVUxMIDw8IGtNYXhEYXRhYmFzZUlkQml0cykgLSAxOyAv
LyBtYXggc2lnbmVkIGludDY0X3QKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4T2JqZWN0
U3RvcmVJZCA9ICgxVUxMIDw8IGtNYXhPYmplY3RTdG9yZUlkQml0cykgLSAxOyAvLyBtYXggc2ln
bmVkIGludDY0X3QKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4SW5kZXhJZCA9ICgxVUxM
IDw8IGtNYXhJbmRleElkQml0cykgLSAxOyAvLyBtYXggc2lnbmVkIGludDMyX3QKKworICAgIHN0
YXRpYyBib29sIGlzVmFsaWREYXRhYmFzZUlkKGludDY0X3QgZGF0YWJhc2VJZCk7CisgICAgc3Rh
dGljIGJvb2wgaXNWYWxpZE9iamVjdFN0b3JlSWQoaW50NjRfdCBpbmRleElkKTsKKyAgICBzdGF0
aWMgYm9vbCBpc1ZhbGlkSW5kZXhJZChpbnQ2NF90IGluZGV4SWQpOworICAgIHN0YXRpYyBib29s
IHZhbGlkSWRzKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2
NF90IGluZGV4SWQpCisgICAgeworICAgICAgICByZXR1cm4gaXNWYWxpZERhdGFiYXNlSWQoZGF0
YWJhc2VJZCkgJiYgaXNWYWxpZE9iamVjdFN0b3JlSWQob2JqZWN0U3RvcmVJZCkgJiYgaXNWYWxp
ZEluZGV4SWQoaW5kZXhJZCk7CisgICAgfQorICAgIHN0YXRpYyBib29sIHZhbGlkSWRzKGludDY0
X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGlzVmFsaWREYXRhYmFzZUlkKGRhdGFiYXNlSWQpICYmIGlzVmFsaWRPYmplY3RTdG9yZUlk
KG9iamVjdFN0b3JlSWQpOworICAgIH0KKworICAgIFR5cGUgdHlwZSgpIGNvbnN0OworCisgICAg
aW50NjRfdCBtX2RhdGFiYXNlSWQ7CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAg
aW50NjRfdCBtX2luZGV4SWQ7CisKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBJbnZhbGlkSWQg
PSAtMTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZUludGVybmFs
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4
SWQpOworICAgIC8vIFNwZWNpYWwgY29uc3RydWN0b3IgZm9yIGNyZWF0ZVdpdGhTcGVjaWFsSW5k
ZXgoKQorICAgIEtleVByZWZpeChUeXBlLCBpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2Jq
ZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKK307CisKK2NsYXNzIFNjaGVtYVZlcnNpb25L
ZXkgeworcHVibGljOgorICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKCk7Cit9OworCitj
bGFzcyBNYXhEYXRhYmFzZUlkS2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+
IGVuY29kZSgpOworfTsKKworY2xhc3MgRGF0YVZlcnNpb25LZXkgeworcHVibGljOgorICAgIHN0
YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKCk7Cit9OworCitjbGFzcyBEYXRhYmFzZUZyZWVMaXN0
S2V5IHsKK3B1YmxpYzoKKyAgICBEYXRhYmFzZUZyZWVMaXN0S2V5KCk7CisgICAgc3RhdGljIGNv
bnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIERh
dGFiYXNlRnJlZUxpc3RLZXkqIHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNv
ZGUoaW50NjRfdCBkYXRhYmFzZUlkKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1h
eEtleSgpOworICAgIGludDY0X3QgZGF0YWJhc2VJZCgpIGNvbnN0OworICAgIGludCBjb21wYXJl
KGNvbnN0IERhdGFiYXNlRnJlZUxpc3RLZXkmIG90aGVyKSBjb25zdDsKKworcHJpdmF0ZToKKyAg
ICBpbnQ2NF90IG1fZGF0YWJhc2VJZDsKK307CisKK2NsYXNzIERhdGFiYXNlTmFtZUtleSB7Citw
dWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwg
Y29uc3QgY2hhciogbGltaXQsIERhdGFiYXNlTmFtZUtleSogcmVzdWx0KTsKKyAgICBzdGF0aWMg
VmVjdG9yPGNoYXI+IGVuY29kZShjb25zdCBTdHJpbmcmIG9yaWdpbiwgY29uc3QgU3RyaW5nJiBk
YXRhYmFzZU5hbWUpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWluS2V5Rm9yT3Jp
Z2luKGNvbnN0IFN0cmluZyYgb3JpZ2luKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29k
ZVN0b3BLZXlGb3JPcmlnaW4oY29uc3QgU3RyaW5nJiBvcmlnaW4pOworICAgIFN0cmluZyBvcmln
aW4oKSBjb25zdCB7IHJldHVybiBtX29yaWdpbjsgfQorICAgIFN0cmluZyBkYXRhYmFzZU5hbWUo
KSBjb25zdCB7IHJldHVybiBtX2RhdGFiYXNlTmFtZTsgfQorICAgIGludCBjb21wYXJlKGNvbnN0
IERhdGFiYXNlTmFtZUtleSYgb3RoZXIpOworCitwcml2YXRlOgorICAgIFN0cmluZyBtX29yaWdp
bjsgLy8gRklYTUU6IFN0b3JlIGVuY29kZWQgc3RyaW5ncywgb3IganVzdCBwb2ludGVycy4KKyAg
ICBTdHJpbmcgbV9kYXRhYmFzZU5hbWU7Cit9OworCitjbGFzcyBEYXRhYmFzZU1ldGFEYXRhS2V5
IHsKK3B1YmxpYzoKKyAgICBlbnVtIE1ldGFEYXRhVHlwZSB7CisgICAgICAgIE9yaWdpbk5hbWUg
PSAwLAorICAgICAgICBEYXRhYmFzZU5hbWUgPSAxLAorICAgICAgICBVc2VyVmVyc2lvbiA9IDIs
CisgICAgICAgIE1heE9iamVjdFN0b3JlSWQgPSAzLAorICAgICAgICBVc2VySW50VmVyc2lvbiA9
IDQsCisgICAgICAgIE1heFNpbXBsZU1ldGFEYXRhVHlwZSA9IDUKKyAgICB9OworCisgICAgc3Rh
dGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBNZXRhRGF0YVR5cGUp
OworfTsKKworY2xhc3MgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSB7CitwdWJsaWM6CisgICAgZW51
bSBNZXRhRGF0YVR5cGUgeworICAgICAgICBOYW1lID0gMCwKKyAgICAgICAgS2V5UGF0aCA9IDEs
CisgICAgICAgIEF1dG9JbmNyZW1lbnQgPSAyLAorICAgICAgICBFdmljdGFibGUgPSAzLAorICAg
ICAgICBMYXN0VmVyc2lvbiA9IDQsCisgICAgICAgIE1heEluZGV4SWQgPSA1LAorICAgICAgICBI
YXNLZXlQYXRoID0gNiwKKyAgICAgICAgS2V5R2VuZXJhdG9yQ3VycmVudE51bWJlciA9IDcKKyAg
ICB9OworCisgICAgT2JqZWN0U3RvcmVNZXRhRGF0YUtleSgpOworICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBPYmplY3RT
dG9yZU1ldGFEYXRhS2V5KiByZXN1bHQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2Rl
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCB1bnNpZ25lZCBjaGFy
IG1ldGFEYXRhVHlwZSk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhLZXkoaW50
NjRfdCBkYXRhYmFzZUlkKTsKKyAgICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1heEtleShp
bnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJZCk7CisgICAgaW50NjRfdCBv
YmplY3RTdG9yZUlkKCkgY29uc3Q7CisgICAgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUoKSBj
b25zdDsKKyAgICBpbnQgY29tcGFyZShjb25zdCBPYmplY3RTdG9yZU1ldGFEYXRhS2V5JiBvdGhl
cik7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgdW5zaWdu
ZWQgY2hhciBtX21ldGFEYXRhVHlwZTsKK307CisKK2NsYXNzIEluZGV4TWV0YURhdGFLZXkgewor
cHVibGljOgorICAgIGVudW0gTWV0YURhdGFUeXBlIHsKKyAgICAgICAgTmFtZSA9IDAsCisgICAg
ICAgIFVuaXF1ZSA9IDEsCisgICAgICAgIEtleVBhdGggPSAyLAorICAgICAgICBNdWx0aUVudHJ5
ID0gMworICAgIH07CisKKyAgICBJbmRleE1ldGFEYXRhS2V5KCk7CisgICAgc3RhdGljIGNvbnN0
IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIEluZGV4
TWV0YURhdGFLZXkqIHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50
NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwg
dW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAg
ICBzdGF0aWMgVmVjdG9yPGNoYXI+IGVuY29kZU1heEtleShpbnQ2NF90IGRhdGFiYXNlSWQsIGlu
dDY0X3Qgb2JqZWN0U3RvcmVJZCwgaW50NjRfdCBpbmRleElkKTsKKyAgICBpbnQgY29tcGFyZShj
b25zdCBJbmRleE1ldGFEYXRhS2V5JiBvdGhlcik7CisgICAgaW50NjRfdCBpbmRleElkKCkgY29u
c3Q7CisgICAgdW5zaWduZWQgY2hhciBtZXRhRGF0YVR5cGUoKSBjb25zdCB7IHJldHVybiBtX21l
dGFEYXRhVHlwZTsgfQorCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOwor
ICAgIGludDY0X3QgbV9pbmRleElkOworICAgIHVuc2lnbmVkIGNoYXIgbV9tZXRhRGF0YVR5cGU7
Cit9OworCitjbGFzcyBPYmplY3RTdG9yZUZyZWVMaXN0S2V5IHsKK3B1YmxpYzoKKyAgICBPYmpl
Y3RTdG9yZUZyZWVMaXN0S2V5KCk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25z
dCBjaGFyKiBzdGFydCwgY29uc3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlRnJlZUxpc3RLZXkq
IHJlc3VsdCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFz
ZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5j
b2RlTWF4S2V5KGludDY0X3QgZGF0YWJhc2VJZCk7CisgICAgaW50NjRfdCBvYmplY3RTdG9yZUlk
KCkgY29uc3Q7CisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVGcmVlTGlzdEtleSYg
b3RoZXIpOworCitwcml2YXRlOgorICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworfTsKKwor
Y2xhc3MgSW5kZXhGcmVlTGlzdEtleSB7CitwdWJsaWM6CisgICAgSW5kZXhGcmVlTGlzdEtleSgp
OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3RhcnQsIGNvbnN0
IGNoYXIqIGxpbWl0LCBJbmRleEZyZWVMaXN0S2V5KiByZXN1bHQpOworICAgIHN0YXRpYyBWZWN0
b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlk
LCBpbnQ2NF90IGluZGV4SWQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlTWF4S2V5
KGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkKTsKKyAgICBpbnQgY29t
cGFyZShjb25zdCBJbmRleEZyZWVMaXN0S2V5JiBvdGhlcik7CisgICAgaW50NjRfdCBvYmplY3RT
dG9yZUlkKCkgY29uc3Q7CisgICAgaW50NjRfdCBpbmRleElkKCkgY29uc3Q7CisKK3ByaXZhdGU6
CisgICAgaW50NjRfdCBtX29iamVjdFN0b3JlSWQ7CisgICAgaW50NjRfdCBtX2luZGV4SWQ7Cit9
OworCitjbGFzcyBPYmplY3RTdG9yZU5hbWVzS2V5IHsKK3B1YmxpYzoKKyAgICAvLyBGSVhNRTog
V2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBvYmplY3Qgc3RvcmUgaWRzLCBiZWNhdXNlIGEg
bWFwcGluZworICAgIC8vIGlzIGtlcHQgaW4gdGhlIElEQkRhdGFiYXNlQmFja2VuZEltcGwuIENh
biB0aGUgbWFwcGluZyBiZWNvbWUgdW5yZWxpYWJsZT8KKyAgICAvLyBDYW4gd2UgcmVtb3ZlIHRo
aXM/CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRlY29kZShjb25zdCBjaGFyKiBzdGFydCwgY29u
c3QgY2hhciogbGltaXQsIE9iamVjdFN0b3JlTmFtZXNLZXkqIHJlc3VsdCk7CisgICAgc3RhdGlj
IFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBjb25zdCBTdHJpbmcmIG9i
amVjdFN0b3JlTmFtZSk7CisgICAgaW50IGNvbXBhcmUoY29uc3QgT2JqZWN0U3RvcmVOYW1lc0tl
eSYgb3RoZXIpOworICAgIFN0cmluZyBvYmplY3RTdG9yZU5hbWUoKSBjb25zdCB7IHJldHVybiBt
X29iamVjdFN0b3JlTmFtZTsgfQorCitwcml2YXRlOgorICAgIFN0cmluZyBtX29iamVjdFN0b3Jl
TmFtZTsgLy8gRklYTUU6IFN0b3JlIHRoZSBlbmNvZGVkIHN0cmluZywgb3IganVzdCBwb2ludGVy
cyB0byBpdC4KK307CisKK2NsYXNzIEluZGV4TmFtZXNLZXkgeworcHVibGljOgorICAgIEluZGV4
TmFtZXNLZXkoKTsKKyAgICAvLyBGSVhNRTogV2UgbmV2ZXIgdXNlIHRoaXMgdG8gbG9vayB1cCBp
bmRleCBpZHMsIGJlY2F1c2UgYSBtYXBwaW5nCisgICAgLy8gaXMga2VwdCBhdCBhIGhpZ2hlciBs
ZXZlbC4KKyAgICBzdGF0aWMgY29uc3QgY2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBj
b25zdCBjaGFyKiBsaW1pdCwgSW5kZXhOYW1lc0tleSogcmVzdWx0KTsKKyAgICBzdGF0aWMgVmVj
dG9yPGNoYXI+IGVuY29kZShpbnQ2NF90IGRhdGFiYXNlSWQsIGludDY0X3Qgb2JqZWN0U3RvcmVJ
ZCwgY29uc3QgU3RyaW5nJiBpbmRleE5hbWUpOworICAgIGludCBjb21wYXJlKGNvbnN0IEluZGV4
TmFtZXNLZXkmIG90aGVyKTsKKyAgICBTdHJpbmcgaW5kZXhOYW1lKCkgY29uc3QgeyByZXR1cm4g
bV9pbmRleE5hbWU7IH0KKworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1fb2JqZWN0U3RvcmVJZDsK
KyAgICBTdHJpbmcgbV9pbmRleE5hbWU7Cit9OworCitjbGFzcyBPYmplY3RTdG9yZURhdGFLZXkg
eworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3QgY2hhciogc3Rh
cnQsIGNvbnN0IGNoYXIqIGVuZCwgT2JqZWN0U3RvcmVEYXRhS2V5KiByZXN1bHQpOworICAgIHN0
YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmpl
Y3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4gZW5jb2RlZFVzZXJLZXkpOworICAgIHN0YXRp
YyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RT
dG9yZUlkLCBjb25zdCBJREJLZXkmIHVzZXJLZXkpOworICAgIGludCBjb21wYXJlKGNvbnN0IE9i
amVjdFN0b3JlRGF0YUtleSYgb3RoZXIsIGJvb2wmIG9rKTsKKyAgICBQYXNzUmVmUHRyPElEQktl
eT4gdXNlcktleSgpIGNvbnN0OworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IFNwZWNpYWxJbmRl
eE51bWJlcjsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y2hhcj4gbV9lbmNvZGVkVXNlcktleTsK
K307CisKK2NsYXNzIEV4aXN0c0VudHJ5S2V5IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qg
Y2hhciogZGVjb2RlKGNvbnN0IGNoYXIqIHN0YXJ0LCBjb25zdCBjaGFyKiBlbmQsIEV4aXN0c0Vu
dHJ5S2V5KiByZXN1bHQpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3Qg
ZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBWZWN0b3I8Y2hhcj4mIGVu
Y29kZWRLZXkpOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGludDY0X3QgZGF0YWJh
c2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBjb25zdCBJREJLZXkmIHVzZXJLZXkpOworICAg
IGludCBjb21wYXJlKGNvbnN0IEV4aXN0c0VudHJ5S2V5JiBvdGhlciwgYm9vbCYgb2spOworICAg
IFBhc3NSZWZQdHI8SURCS2V5PiB1c2VyS2V5KCkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3Qg
aW50NjRfdCBTcGVjaWFsSW5kZXhOdW1iZXI7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPGNoYXI+
IG1fZW5jb2RlZFVzZXJLZXk7Cit9OworCitjbGFzcyBJbmRleERhdGFLZXkgeworcHVibGljOgor
ICAgIEluZGV4RGF0YUtleSgpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkZWNvZGUoY29uc3Qg
Y2hhciogc3RhcnQsIGNvbnN0IGNoYXIqIGxpbWl0LCBJbmRleERhdGFLZXkqIHJlc3VsdCk7Cisg
ICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGUoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90
IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNv
ZGVkVXNlcktleSwgY29uc3QgVmVjdG9yPGNoYXI+JiBlbmNvZGVkUHJpbWFyeUtleSwgaW50NjRf
dCBzZXF1ZW5jZU51bWJlciA9IDApOworICAgIHN0YXRpYyBWZWN0b3I8Y2hhcj4gZW5jb2RlKGlu
dDY0X3QgZGF0YWJhc2VJZCwgaW50NjRfdCBvYmplY3RTdG9yZUlkLCBpbnQ2NF90IGluZGV4SWQs
IGNvbnN0IElEQktleSYgdXNlcktleSk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVN
aW5LZXkoaW50NjRfdCBkYXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3Qg
aW5kZXhJZCk7CisgICAgc3RhdGljIFZlY3RvcjxjaGFyPiBlbmNvZGVNYXhLZXkoaW50NjRfdCBk
YXRhYmFzZUlkLCBpbnQ2NF90IG9iamVjdFN0b3JlSWQsIGludDY0X3QgaW5kZXhJZCk7CisgICAg
aW50IGNvbXBhcmUoY29uc3QgSW5kZXhEYXRhS2V5JiBvdGhlciwgYm9vbCBpZ25vcmVEdXBsaWNh
dGVzLCBib29sJiBvayk7CisgICAgaW50NjRfdCBkYXRhYmFzZUlkKCkgY29uc3Q7CisgICAgaW50
NjRfdCBvYmplY3RTdG9yZUlkKCkgY29uc3Q7CisgICAgaW50NjRfdCBpbmRleElkKCkgY29uc3Q7
CisgICAgUGFzc1JlZlB0cjxJREJLZXk+IHVzZXJLZXkoKSBjb25zdDsKKyAgICBQYXNzUmVmUHRy
PElEQktleT4gcHJpbWFyeUtleSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGludDY0X3QgbV9k
YXRhYmFzZUlkOworICAgIGludDY0X3QgbV9vYmplY3RTdG9yZUlkOworICAgIGludDY0X3QgbV9p
bmRleElkOworICAgIFZlY3RvcjxjaGFyPiBtX2VuY29kZWRVc2VyS2V5OworICAgIFZlY3Rvcjxj
aGFyPiBtX2VuY29kZWRQcmltYXJ5S2V5OworICAgIGludDY0X3QgbV9zZXF1ZW5jZU51bWJlcjsK
K307CisKK30gLy8gbmFtZXNwYWNlIElEQkxldmVsREJDb2RpbmcKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxFKElOREVY
RURfREFUQUJBU0UpCisKKyNlbmRpZiAvLyBJREJMZXZlbERCQ29kaW5nX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagppbmRleCAxODc0ZTdk
Li5mNzg3ODNkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCkBAIC0zMTIzLDcgKzMxMjMsNiBAQAogCQk5NzEyQTVEQzE1MDA0RURBMDA0
OEFGMTAgLyogSURCS2V5LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA5NzEyQTU4MzE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5LmggKi87IH07CiAJCTk3
MTJBNURGMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXlQYXRoLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA5NzEyQTU4NjE1MDA0RURBMDA0OEFGMTAgLyog
SURCS2V5UGF0aC5oICovOyB9OwogCQk5NzEyQTVFMzE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5
UmFuZ2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDk3
MTJBNThBMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXlSYW5nZS5oICovOyB9OwotCQk5NzEyQTVF
ODE1MDA0RURBMDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcxMkE1OEYxNTAwNEVEQTAwNDhBRjEwIC8q
IElEQkxldmVsREJDb2RpbmcuaCAqLzsgfTsKIAkJOTcxMkE1RUExNTAwNEVEQTAwNDhBRjEwIC8q
IElEQk9iamVjdFN0b3JlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA5NzEyQTU5MTE1MDA0RURBMDA0OEFGMTAgLyogSURCT2JqZWN0U3RvcmUuaCAqLzsg
fTsKIAkJOTcxMkE1RUMxNTAwNEVEQTAwNDhBRjEwIC8qIElEQk9iamVjdFN0b3JlQmFja2VuZElt
cGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcx
MkE1OTMxNTAwNEVEQTAwNDhBRjEwIC8qIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3BwICov
OyB9OwogCQk5NzEyQTVFRDE1MDA0RURBMDA0OEFGMTAgLyogSURCT2JqZWN0U3RvcmVCYWNrZW5k
SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gOTcx
MkE1OTQxNTAwNEVEQTAwNDhBRjEwIC8qIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaCAqLzsg
fTsKQEAgLTk3MDgsNyArOTcwNyw2IEBACiAJCTk3MTJBNTg2MTUwMDRFREEwMDQ4QUYxMCAvKiBJ
REJLZXlQYXRoLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IElEQktleVBhdGgu
aDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQktleVBhdGguaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJOTcxMkE1OEExNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IElEQktleVJhbmdlLmg7IHBhdGggPSBN
b2R1bGVzL2luZGV4ZWRkYi9JREJLZXlSYW5nZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk5NzEyQTU4QjE1MDA0RURBMDA0OEFGMTAgLyogSURCS2V5UmFuZ2UuaWRsICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gdGV4dDsgbmFtZSA9IElEQktleVJhbmdlLmlkbDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRi
L0lEQktleVJhbmdlLmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJOTcxMkE1OEYx
NTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJDb2RpbmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gSURCTGV2ZWxEQkNvZGluZy5oOyBwYXRoID0gTW9kdWxlcy9pbmRleGVk
ZGIvSURCTGV2ZWxEQkNvZGluZy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5NzEy
QTU5MTE1MDA0RURBMDA0OEFGMTAgLyogSURCT2JqZWN0U3RvcmUuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBuYW1lID0gSURCT2JqZWN0U3RvcmUuaDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhl
ZGRiL0lEQk9iamVjdFN0b3JlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTk3MTJB
NTkyMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJPYmplY3RTdG9yZS5pZGwgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0
OyBuYW1lID0gSURCT2JqZWN0U3RvcmUuaWRsOyBwYXRoID0gTW9kdWxlcy9pbmRleGVkZGIvSURC
T2JqZWN0U3RvcmUuaWRsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk5NzEyQTU5MzE1
MDA0RURBMDA0OEFGMTAgLyogSURCT2JqZWN0U3RvcmVCYWNrZW5kSW1wbC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBJREJPYmplY3RTdG9yZUJhY2tlbmRJbXBsLmNw
cDsgcGF0aCA9IE1vZHVsZXMvaW5kZXhlZGRiL0lEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuY3Bw
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTY2OTcsNyArMTY2OTUsNiBAQAogCQkJ
CTk3MTJBNTg2MTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXlQYXRoLmggKi8sCiAJCQkJOTcxMkE1
OEExNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmggKi8sCiAJCQkJOTcxMkE1OEIxNTAw
NEVEQTAwNDhBRjEwIC8qIElEQktleVJhbmdlLmlkbCAqLywKLQkJCQk5NzEyQTU4RjE1MDA0RURB
MDA0OEFGMTAgLyogSURCTGV2ZWxEQkNvZGluZy5oICovLAogCQkJCUJDQzY1MTQ1MTU5Mjk0QzMw
MEFDQzlFNCAvKiBJREJNZXRhZGF0YS5oICovLAogCQkJCTk3MTJBNTkxMTUwMDRFREEwMDQ4QUYx
MCAvKiBJREJPYmplY3RTdG9yZS5oICovLAogCQkJCTk3MTJBNTkyMTUwMDRFREEwMDQ4QUYxMCAv
KiBJREJPYmplY3RTdG9yZS5pZGwgKi8sCkBAIC0yMjY5Niw3ICsyMjY5Myw2IEBACiAJCQkJMDcy
NzdFNTExN0QwMThDQzAwMTU1MzREIC8qIEpTTWVkaWFTdHJlYW1FdmVudC5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJOTcxMkE1REYxNTAwNEVEQTAwNDhBRjEwIC8qIElEQktleVBhdGguaCBpbiBIZWFk
ZXJzICovLAogCQkJCTk3MTJBNUUzMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJLZXlSYW5nZS5oIGlu
IEhlYWRlcnMgKi8sCi0JCQkJOTcxMkE1RTgxNTAwNEVEQTAwNDhBRjEwIC8qIElEQkxldmVsREJD
b2RpbmcuaCBpbiBIZWFkZXJzICovLAogCQkJCTk3MTJBNUVBMTUwMDRFREEwMDQ4QUYxMCAvKiBJ
REJPYmplY3RTdG9yZS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTcxMkE1RUQxNTAwNEVEQTAwNDhB
RjEwIC8qIElEQk9iamVjdFN0b3JlQmFja2VuZEltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTk3
MTJBNUYwMTUwMDRFREEwMDQ4QUYxMCAvKiBJREJQZW5kaW5nVHJhbnNhY3Rpb25Nb25pdG9yLmgg
aW4gSGVhZGVycyAqLywK
</data>
<flag name="review"
          id="234605"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>