<?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>142404</bug_id>
          
          <creation_ts>2015-03-06 10:42:53 -0800</creation_ts>
          <short_desc>Rename BreakingContextInlineHeaders.h to BreakingContext.h</short_desc>
          <delta_ts>2015-03-06 11:06:54 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>dino</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>jonlee</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1075009</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-06 10:42:53 -0800</bug_when>
    <thetext>Rename BreakingContextInlineHeaders.h to BreakingContext.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1075010</commentid>
    <comment_count>1</comment_count>
      <attachid>248077</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-06 10:44:11 -0800</bug_when>
    <thetext>Created attachment 248077
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1075013</commentid>
    <comment_count>2</comment_count>
      <attachid>248078</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-06 10:45:23 -0800</bug_when>
    <thetext>Created attachment 248078
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1075022</commentid>
    <comment_count>3</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2015-03-06 11:06:54 -0800</bug_when>
    <thetext>Committed r181171: &lt;http://trac.webkit.org/changeset/181171&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>248077</attachid>
            <date>2015-03-06 10:44:11 -0800</date>
            <delta_ts>2015-03-06 10:45:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142404-20150306104350.patch</filename>
            <type>text/plain</type>
            <size>127384</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgxMTY3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDdjMmQ1ZjRlOWE1MTdh
MjFmZTg2NDYwYTFkOTliMjVlODg0NjI2Yi4uMjQ1NDA0MGFlN2U5Y2IxMTEzYzZlZDU1ZTI2M2Mw
N2I0NTRjMWM4MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDcyIEBACiAyMDE1LTAzLTA2ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKKyAgICAgICAgUmVuYW1lIEJy
ZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCB0byBCcmVha2luZ0NvbnRleHQuaAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNDA0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gcG9pbnQgbmFtaW5n
IGl0ICJJbmxpbmVIZWFkZXJzIiB3aGVuIHRoZXJlIGFyZSBubyBub24tYnJlYWtpbmctaGVhZGVy
cyBmaWxlcy4KKworICAgICAgICBObyBuZXcgdGVzdHMgYmVjYXVzZSB0aGlzIGlzIGp1c3QgYSBy
ZW5hbWUgb2YgYSBmaWxlLgorCisgICAgICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4
cHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qLmZpbHRlcnM6
CisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwOgorICAgICAgICAqIHJlbmRlcmlu
Zy9saW5lL0JyZWFraW5nQ29udGV4dC5oOiBSZW5hbWVkIGZyb20gU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oLgorICAgICAgICAoV2Vi
Q29yZTo6V29yZE1lYXN1cmVtZW50OjpXb3JkTWVhc3VyZW1lbnQpOgorICAgICAgICAoV2ViQ29y
ZTo6QnJlYWtpbmdDb250ZXh0OjpCcmVha2luZ0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
QnJlYWtpbmdDb250ZXh0OjpjdXJyZW50T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6bGluZUJyZWFrKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4
dDo6bGluZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6YXRFbmQp
OgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjbGVhckxpbmVCcmVha0lmRml0
c09uTGluZSk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNvbW1pdExpbmVC
cmVha0F0Q3VycmVudFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpJbmxpbmVJdGVyYXRvckhpc3RvcnkpOgorICAgICAgICAo
V2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OnB1c2gpOgor
ICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6
OnVwZGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJh
dG9ySGlzdG9yeTo6cmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0
OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Om9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVh
a2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6YXRUZXh0UGFyYWdyYXBoU2VwYXJh
dG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JI
aXN0b3J5OjpwcmV2aW91c0luU2FtZU5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdD
b250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OmdldCk6CisgICAgICAgIChXZWJDb3JlOjpC
cmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6Y3VycmVudCk6CisgICAgICAg
IChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlzdG9yeTo6aGlzdG9y
eUxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJh
dG9ySGlzdG9yeTo6bW92ZVRvKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
SW5saW5lSXRlcmF0b3JIaXN0b3J5OjppbmNyZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6QnJl
YWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OmNsZWFyKToKKyAgICAgICAgKFdl
YkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5pdGlhbGl6ZUZvckN1cnJlbnRPYmplY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjppbmNyZW1lbnQpOgorICAgICAgICAoV2Vi
Q29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVCUik6CisgICAgICAgIChXZWJDb3JlOjpib3Jk
ZXJQYWRkaW5nTWFyZ2luU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6Ym9yZGVyUGFkZGluZ01h
cmdpbkVuZCk6CisgICAgICAgIChXZWJDb3JlOjpzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2lu
KToKKyAgICAgICAgKFdlYkNvcmU6OnByZXZpb3VzSW5GbG93U2libGluZyk6CisgICAgICAgIChX
ZWJDb3JlOjppbmxpbmVMb2dpY2FsV2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdD
b250ZXh0OjpoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlRmxvYXQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkU2tp
cFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5n
Q29udGV4dDo6aGFuZGxlRW1wdHlJbmxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdD
b250ZXh0OjpoYW5kbGVSZXBsYWNlZCk6CisgICAgICAgIChXZWJDb3JlOjpmaXJzdFBvc2l0aXZl
V2lkdGgpOgorICAgICAgICAoV2ViQ29yZTo6aXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29t
YmluZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6bmV4dENoYXJhY3Rlcik6CisgICAgICAgIChX
ZWJDb3JlOjp1cGRhdGVDb3VudGVySWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6bWVhc3Vy
ZUh5cGhlbldpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRXaWR0aCk6CisgICAgICAgIChX
ZWJDb3JlOjplbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveCk6CisgICAgICAgIChXZWJDb3JlOjp0
cnlIeXBoZW5hdGluZyk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRs
ZVRleHQpOgorICAgICAgICAoV2ViQ29yZTo6dGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlzUG9z
aXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRBbmRVcGRh
dGVMaW5lQnJlYWtJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpjaGVja01pZHBvaW50cyk6
CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVuZE9mTGluZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Om9wdGltYWxMaW5lQnJlYWtMb2NhdGlv
bkZvclRyYWlsaW5nV29yZCk6CisgICAgICAgICogcmVuZGVyaW5nL2xpbmUvTGluZUJyZWFrZXIu
Y3BwOgorCisyMDE1LTAzLTA2ICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5j
b20+CisKICAgICAgICAgVGVzdCBob3Jpei1vcmlnaW4teCBhbmQgaG9yaXotb3JpZ2luLXkgaW4g
U1ZHIGZvbnRzCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0xNDI0MDMKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dl
YkNvcmUudmN4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZj
eHByb2oKaW5kZXggMzEwZGJiNzcyNzA2YjUxMGZkNzE1ZTgwMmY2M2UyYTQxNGE3MjMzMy4uNDgz
MGYwZDc2YzM4ZTI3M2U3NWU3MmRiYmVlNGE1YzUwOTgxMzE0ZSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qCkBAIC0yMDM0NSw3ICsyMDM0NSw3
IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcUmVuZGVyU2VsZWN0aW9u
SW5mby5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFJlbmRlclNs
aWRlci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFJlbmRlclNu
YXBzaG90dGVkUGx1Z0luLmgiIC8+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJp
bmdcbGluZVxCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgiIC8+CisgICAgPENsSW5jbHVk
ZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxCcmVha2luZ0NvbnRleHQuaCIgLz4KICAgICA8
Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVCcmVha2VyLmgiIC8+CiAg
ICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lSW5mby5oIiAvPgog
ICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUlubGluZUhlYWRl
cnMuaCIgLz4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJD
b3JlLnZjeHByb2ouZmlsdGVycyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJD
b3JlLnZjeHByb2ouZmlsdGVycwppbmRleCBiOTFmMDhmOTUxYzhlY2MxZGRhNTAzNzUxN2QxODMx
ZGRiNTM2NDYyLi5hZjQzYTZkNzdlZTBhM2FkYWM4YWViZTUyODM2OWEwZDY3ZjkyNjIzIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qLmZp
bHRlcnMKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJv
ai5maWx0ZXJzCkBAIC0xNDQwOCw3ICsxNDQwOCw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRl
PSIuLlxyZW5kZXJpbmdcQm9yZGVyRWRnZS5oIj4KICAgICAgIDxGaWx0ZXI+cmVuZGVyaW5nPC9G
aWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+Ci0gICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5k
ZXJpbmdcbGluZVxCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgiPgorICAgIDxDbEluY2x1
ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcQnJlYWtpbmdDb250ZXh0LmgiPgogICAgICAg
PEZpbHRlcj5yZW5kZXJpbmdcbGluZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgogICAgIDxD
bEluY2x1ZGUgSW5jbHVkZT0iLi5ccGFnZVxDb250ZXh0TWVudUNvbnRleHQuaCI+CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9T
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggMWMz
ZTk5ZTJmNmIyZTZkODE1ODM5MjJkOGM3ODE0ZDE3OGZmNWYxOS4uY2ZkZTlmMWQ3NWZjOGM2OTFl
ZjU2ZmVhN2UxZTc5ZDM3OGQ3OWVlMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMTQzNjAsNyArMTQzNjAsNyBAQAogCQlGRjk0
NUVDQTE2MUY3RjM2MDA5NzFCQzggLyogUHNldWRvRWxlbWVudC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBQc2V1ZG9FbGVtZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUZGQUMzMEZDMTg0RkIxNDUwMDhDNEYxRSAvKiBUcmFpbGluZ09iamVjdHMuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVHJhaWxpbmdPYmplY3RzLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZGQUMzMEZEMTg0RkIxNDUwMDhDNEYxRSAvKiBUcmFpbGlu
Z09iamVjdHMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gVHJhaWxp
bmdPYmplY3RzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJRkZCNjk4QzkxODMy
RjEwQjAwMTU4QTMxIC8qIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGRkI2OThDOTE4MzJGMTBCMDAxNThBMzEgLyog
QnJlYWtpbmdDb250ZXh0LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJyZWFr
aW5nQ29udGV4dC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRkI2OThDQTE4MzNF
QzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
Y3BwOyBwYXRoID0gTGluZUJyZWFrZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQlGRkI2OThDQjE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuYy5oOyBwYXRoID0gTGluZUJyZWFrZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJRkZCNjk4Q0QxODMzRjE3NjAwMTU4QTMxIC8qIExpbmVJbmZvLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IExpbmVJbmZvLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKQEAgLTIzNDQ5LDcgKzIzNDQ5LDcgQEAKIAkJRkZCNjk4QzgxODMyRjEw
QjAwMTU4QTMxIC8qIGxpbmUgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVu
ID0gKAotCQkJCUZGQjY5OEM5MTgzMkYxMEIwMDE1OEEzMSAvKiBCcmVha2luZ0NvbnRleHRJbmxp
bmVIZWFkZXJzLmggKi8sCisJCQkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMxIC8qIEJyZWFraW5n
Q29udGV4dC5oICovLAogCQkJCUZGQjY5OENBMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtl
ci5jcHAgKi8sCiAJCQkJRkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmgg
Ki8sCiAJCQkJRkZCNjk4Q0QxODMzRjE3NjAwMTU4QTMxIC8qIExpbmVJbmZvLmNwcCAqLywKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQu
Y3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAK
aW5kZXggYTdhNzg4ODE2ZTBiZGJlZWQ0NmNlZWE3Zjk5ZDRhZDc1OGUyMjAzYy4uZThlZTZiMGQ2
ODZmMDExNzMwYWVlMjFjNDdlNzVlNzg4ZjZjNzY1YSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKKysrIGIvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrTGluZUxheW91dC5jcHAKQEAgLTI2LDcgKzI2LDcgQEAK
IAogI2luY2x1ZGUgIkFYT2JqZWN0Q2FjaGUuaCIKICNpbmNsdWRlICJCaWRpUmVzb2x2ZXIuaCIK
LSNpbmNsdWRlICJCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgiCisjaW5jbHVkZSAiQnJl
YWtpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAiRmxvYXRpbmdPYmplY3RzLmgiCiAjaW5jbHVkZSAi
SW5saW5lRWxlbWVudEJveC5oIgogI2luY2x1ZGUgIklubGluZUl0ZXJhdG9yLmgiCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHQuaCBiL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0JyZWFraW5nQ29udGV4dC5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
LjE2MDU3YWMwMTI1Mzk0ZDM1YjEzOTk2YzIwOWVlZTdlOTQzOTk4OGEKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHQuaApAQCAt
MCwwICsxLDEyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9sbCAoa25v
bGxAa2RlLm9yZykKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAwNywgMjAw
OCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+CisgKiBD
b3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICov
CisKKyNpZm5kZWYgQnJlYWtpbmdDb250ZXh0X2gKKyNkZWZpbmUgQnJlYWtpbmdDb250ZXh0X2gK
KworI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgiCisjaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKKyNp
bmNsdWRlICJMaW5lSW5mby5oIgorI2luY2x1ZGUgIkxpbmVXaWR0aC5oIgorI2luY2x1ZGUgIlJl
bmRlckNvbWJpbmVUZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyQ291bnRlci5oIgorI2luY2x1ZGUg
IlJlbmRlcklubGluZS5oIgorI2luY2x1ZGUgIlJlbmRlckxpbmVCcmVhay5oIgorI2luY2x1ZGUg
IlJlbmRlckxpc3RNYXJrZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJSdWJ5UnVuLmgiCisjaW5jbHVk
ZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgorI2luY2x1ZGUgIlRyYWlsaW5nT2JqZWN0cy5oIgor
I2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nVmlldy5o
PgorI2luY2x1ZGUgPHd0Zi91bmljb2RlL0NoYXJhY3Rlck5hbWVzLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gV2UgZG9uJ3QgbGV0IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmds
ZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4gdGhpcy4KK2NvbnN0IHVuc2lnbmVkIGNNYXhMaW5l
RGVwdGggPSAyMDA7CisKK3N0cnVjdCBXb3JkTWVhc3VyZW1lbnQgeworICAgIFdvcmRNZWFzdXJl
bWVudCgpCisgICAgICAgIDogcmVuZGVyZXIoMCkKKyAgICAgICAgLCB3aWR0aCgwKQorICAgICAg
ICAsIHN0YXJ0T2Zmc2V0KDApCisgICAgICAgICwgZW5kT2Zmc2V0KDApCisgICAgeworICAgIH0K
KworICAgIFJlbmRlclRleHQqIHJlbmRlcmVyOworICAgIGZsb2F0IHdpZHRoOworICAgIGludCBz
dGFydE9mZnNldDsKKyAgICBpbnQgZW5kT2Zmc2V0OworICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+
IGZhbGxiYWNrRm9udHM7Cit9OworCitjbGFzcyBCcmVha2luZ0NvbnRleHQgeworcHVibGljOgor
ICAgIEJyZWFraW5nQ29udGV4dChMaW5lQnJlYWtlciYgbGluZUJyZWFrZXIsIElubGluZUJpZGlS
ZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZvJiBpbkxpbmVJbmZvLCBMaW5lV2lkdGgmIGxpbmVX
aWR0aCwgUmVuZGVyVGV4dEluZm8mIGluUmVuZGVyVGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBp
bkxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIGJvb2wgYXBwbGllZFN0YXJ0V2lkdGgsIFJlbmRl
ckJsb2NrRmxvdyYgYmxvY2spCisgICAgICAgIDogbV9saW5lQnJlYWtlcihsaW5lQnJlYWtlcikK
KyAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29sdmVyKQorICAgICAgICAsIG1fY3VycmVudChyZXNv
bHZlci5wb3NpdGlvbigpKQorI2lmIEVOQUJMRShDU1NfVFJBSUxJTkdfV09SRCkKKyAgICAgICAg
LCBtX2xpbmVCcmVha0hpc3RvcnkoSW5saW5lSXRlcmF0b3IocmVzb2x2ZXIucG9zaXRpb24oKSks
IGJsb2NrLnN0eWxlKCkudHJhaWxpbmdXb3JkKCkgPT0gVHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlC
YWxhbmNlZCA/IDUgOiAxKQorI2Vsc2UKKyAgICAgICAgLCBtX2xpbmVCcmVha0hpc3RvcnkoSW5s
aW5lSXRlcmF0b3IocmVzb2x2ZXIucG9zaXRpb24oKSksIDEpCisjZW5kaWYKKyAgICAgICAgLCBt
X2Jsb2NrKGJsb2NrKQorICAgICAgICAsIG1fbGFzdE9iamVjdChtX2N1cnJlbnQucmVuZGVyZXIo
KSkKKyAgICAgICAgLCBtX25leHRPYmplY3QobnVsbHB0cikKKyAgICAgICAgLCBtX2N1cnJlbnRT
dHlsZShudWxscHRyKQorICAgICAgICAsIG1fYmxvY2tTdHlsZShibG9jay5zdHlsZSgpKQorICAg
ICAgICAsIG1fbGluZUluZm8oaW5MaW5lSW5mbykKKyAgICAgICAgLCBtX3JlbmRlclRleHRJbmZv
KGluUmVuZGVyVGV4dEluZm8pCisgICAgICAgICwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5l
KGluTGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSkKKyAgICAgICAgLCBtX3dpZHRoKGxpbmVXaWR0
aCkKKyAgICAgICAgLCBtX2N1cnJXUyhOT1JNQUwpCisgICAgICAgICwgbV9sYXN0V1MoTk9STUFM
KQorICAgICAgICAsIG1fcHJlc2VydmVzTmV3bGluZShmYWxzZSkKKyAgICAgICAgLCBtX2F0U3Rh
cnQodHJ1ZSkKKyAgICAgICAgLCBtX2lnbm9yaW5nU3BhY2VzKGZhbHNlKQorICAgICAgICAsIG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UoZmFsc2UpCisgICAgICAgICwgbV9jdXJyZW50Q2hhcmFj
dGVySXNXUyhmYWxzZSkKKyAgICAgICAgLCBtX2FwcGxpZWRTdGFydFdpZHRoKGFwcGxpZWRTdGFy
dFdpZHRoKQorICAgICAgICAsIG1faW5jbHVkZUVuZFdpZHRoKHRydWUpCisgICAgICAgICwgbV9h
dXRvV3JhcChmYWxzZSkKKyAgICAgICAgLCBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUoZmFs
c2UpCisgICAgICAgICwgbV9mbG9hdHNGaXRPbkxpbmUodHJ1ZSkKKyAgICAgICAgLCBtX2NvbGxh
cHNlV2hpdGVTcGFjZShmYWxzZSkKKyAgICAgICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKG1f
bGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KCkpCisgICAgICAgICwgbV9hbGxvd0lt
YWdlc1RvQnJlYWsoIWJsb2NrLmRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJsb2NrLmlz
VGFibGVDZWxsKCkgfHwgIW1fYmxvY2tTdHlsZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJpbnNpY09y
QXV0bygpKQorICAgICAgICAsIG1fYXRFbmQoZmFsc2UpCisgICAgICAgICwgbV9oYWRVbmNvbW1p
dHRlZFdpZHRoQmVmb3JlQ3VycmVudChmYWxzZSkKKyAgICAgICAgLCBtX2xpbmVNaWRwb2ludFN0
YXRlKHJlc29sdmVyLm1pZHBvaW50U3RhdGUoKSkKKyAgICB7CisgICAgICAgIG1fbGluZUluZm8u
c2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KGZhbHNlKTsKKyAgICB9CisKKyAgICBSZW5kZXJP
YmplY3QqIGN1cnJlbnRPYmplY3QoKSB7IHJldHVybiBtX2N1cnJlbnQucmVuZGVyZXIoKTsgfQor
ICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVhaygpIHsgcmV0dXJuIG1fbGluZUJyZWFrSGlzdG9y
eS5jdXJyZW50KCk7IH0KKyAgICBMaW5lV2lkdGgmIGxpbmVXaWR0aCgpIHsgcmV0dXJuIG1fd2lk
dGg7IH0KKyAgICBib29sIGF0RW5kKCkgeyByZXR1cm4gbV9hdEVuZDsgfQorCisgICAgdm9pZCBp
bml0aWFsaXplRm9yQ3VycmVudE9iamVjdCgpOworCisgICAgdm9pZCBpbmNyZW1lbnQoKTsKKwor
ICAgIHZvaWQgaGFuZGxlQlIoRUNsZWFyJik7CisgICAgdm9pZCBoYW5kbGVPdXRPZkZsb3dQb3Np
dGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVjdHMpOworICAgIHZvaWQg
aGFuZGxlRmxvYXQoKTsKKyAgICB2b2lkIGhhbmRsZUVtcHR5SW5saW5lKCk7CisgICAgdm9pZCBo
YW5kbGVSZXBsYWNlZCgpOworICAgIGJvb2wgaGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiwg
Ym9vbCYgaHlwaGVuYXRlZCwgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsK
KyAgICBib29sIGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKTsKKyAgICB2b2lkIGNvbW1pdEFuZFVw
ZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCk7CisgICAgSW5saW5lSXRlcmF0b3IgaGFuZGxlRW5kT2ZM
aW5lKCk7CisjaWYgRU5BQkxFKENTU19UUkFJTElOR19XT1JEKQorICAgIElubGluZUl0ZXJhdG9y
IG9wdGltYWxMaW5lQnJlYWtMb2NhdGlvbkZvclRyYWlsaW5nV29yZCgpOworI2VuZGlmCisKKyAg
ICB2b2lkIGNsZWFyTGluZUJyZWFrSWZGaXRzT25MaW5lKGJvb2wgaWdub3JpbmdUcmFpbGluZ1Nw
YWNlID0gZmFsc2UpCisgICAgeworICAgICAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKGlnbm9y
aW5nVHJhaWxpbmdTcGFjZSkgfHwgbV9sYXN0V1MgPT0gTk9XUkFQKQorICAgICAgICAgICAgbV9s
aW5lQnJlYWtIaXN0b3J5LmNsZWFyKCk7CisgICAgfQorCisgICAgdm9pZCBjb21taXRMaW5lQnJl
YWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmplY3QmIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0g
MCwgaW50IG5leHRCcmVhayA9IC0xKQorICAgIHsKKyAgICAgICAgbV93aWR0aC5jb21taXQoKTsK
KyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbygmb2JqZWN0LCBvZmZzZXQsIG5leHRC
cmVhayk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIFRoaXMgY2xhc3Mga2VlcHMgYSBzbGlk
aW5nIHdpbmRvdyBvZiB0aGUgcGFzdCBuIGxvY2F0aW9ucyBmb3IgYW4gSW5saW5lSXRlcmF0b3Iu
CisgICAgY2xhc3MgSW5saW5lSXRlcmF0b3JIaXN0b3J5IDogcHJpdmF0ZSBWZWN0b3I8SW5saW5l
SXRlcmF0b3IsIDE+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9y
eSgpID0gZGVsZXRlOworICAgICAgICBJbmxpbmVJdGVyYXRvckhpc3RvcnkoY29uc3QgSW5saW5l
SXRlcmF0b3ImIGluaXRpYWwsIHNpemVfdCBjYXBhY2l0eSkKKyAgICAgICAgICAgIDogbV9jYXBh
Y2l0eShjYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKGNhcGFjaXR5ID4g
MCk7CisgICAgICAgICAgICB0aGlzLT5hcHBlbmQoaW5pdGlhbCk7CisgICAgICAgIH0KKworICAg
ICAgICB2b2lkIHB1c2goc3RkOjpmdW5jdGlvbjx2b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlN
ZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0
eSgpKTsKKyAgICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9IDEpCisgICAgICAgICAgICAgICAg
dGhpcy0+aW5zZXJ0KDAsIElubGluZUl0ZXJhdG9yKHRoaXMtPmF0KDApKSk7CisgICAgICAgICAg
ICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKKyAgICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9IDEp
CisgICAgICAgICAgICAgICAgdGhpcy0+cmVzaXplKG1fY2FwYWNpdHkpOworICAgICAgICB9CisK
KyAgICAgICAgdm9pZCB1cGRhdGUoc3RkOjpmdW5jdGlvbjx2b2lkKElubGluZUl0ZXJhdG9yJiBt
b2RpZnlNZSk+IHVwZGF0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghdGhpcy0+
aXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHVwZGF0ZXIodGhpcy0+YXQoMCkpOworICAgICAgICB9
CisKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMt
PmF0KDApLnJlbmRlcmVyKCk7IH0KKyAgICAgICAgdW5zaWduZWQgb2Zmc2V0KCkgY29uc3QgeyBy
ZXR1cm4gdGhpcy0+YXQoMCkub2Zmc2V0KCk7IH0KKyAgICAgICAgYm9vbCBhdFRleHRQYXJhZ3Jh
cGhTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5hdFRleHRQYXJhZ3JhcGhT
ZXBhcmF0b3IoKTsgfQorICAgICAgICBVQ2hhciBwcmV2aW91c0luU2FtZU5vZGUoKSBjb25zdCB7
IHJldHVybiB0aGlzLT5hdCgwKS5wcmV2aW91c0luU2FtZU5vZGUoKTsgfQorICAgICAgICBjb25z
dCBJbmxpbmVJdGVyYXRvciYgZ2V0KHNpemVfdCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdChp
KTsgfTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIGN1cnJlbnQoKSBjb25zdCB7IHJl
dHVybiBnZXQoMCk7IH0KKyAgICAgICAgc2l6ZV90IGhpc3RvcnlMZW5ndGgoKSBjb25zdCB7IHJl
dHVybiB0aGlzLT5zaXplKCk7IH0KKworICAgICAgICB2b2lkIG1vdmVUbyhSZW5kZXJPYmplY3Qq
IG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgbmV4dEJyZWFrID0gLTEpCisgICAgICAgIHsK
KyAgICAgICAgICAgIHB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAg
ICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKKyAg
ICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbmNyZW1lbnQoKQorICAg
ICAgICB7CisgICAgICAgICAgICB1cGRhdGUoW10oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7
CisgICAgICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7CisgICAgICAgICAgICB9KTsK
KyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKQorICAgICAgICB7CisgICAgICAgICAg
ICBwdXNoKFtdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgIG1v
ZGlmeU1lLmNsZWFyKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1fY2FwYWNpdHk7CisgICAgfTsKKworICAgIExpbmVC
cmVha2VyJiBtX2xpbmVCcmVha2VyOworICAgIElubGluZUJpZGlSZXNvbHZlciYgbV9yZXNvbHZl
cjsKKworICAgIElubGluZUl0ZXJhdG9yIG1fY3VycmVudDsKKyAgICBJbmxpbmVJdGVyYXRvckhp
c3RvcnkgbV9saW5lQnJlYWtIaXN0b3J5OworICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZkln
bm9yZWRTcGFjZXM7CisKKyAgICBSZW5kZXJCbG9ja0Zsb3cmIG1fYmxvY2s7CisgICAgUmVuZGVy
T2JqZWN0KiBtX2xhc3RPYmplY3Q7CisgICAgUmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7CisK
KyAgICBjb25zdCBSZW5kZXJTdHlsZSogbV9jdXJyZW50U3R5bGU7CisKKyAgICAvLyBGaXJlZm94
IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFibGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFn
ZSBpbnNpZGUgaXQgdW5kZXIKKyAgICAvLyB2ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGlu
IG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5JRSByZW5kZXJpbmdzKS4KKyAgICAvLyBOb3Qgc3Vw
cG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNlZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBz
aXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4pCisgICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHls
ZTsKKworICAgIExpbmVJbmZvJiBtX2xpbmVJbmZvOworCisgICAgUmVuZGVyVGV4dEluZm8mIG1f
cmVuZGVyVGV4dEluZm87CisKKyAgICBGbG9hdGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJl
dmlvdXNMaW5lOworCisgICAgTGluZVdpZHRoIG1fd2lkdGg7CisKKyAgICBFV2hpdGVTcGFjZSBt
X2N1cnJXUzsKKyAgICBFV2hpdGVTcGFjZSBtX2xhc3RXUzsKKworICAgIGJvb2wgbV9wcmVzZXJ2
ZXNOZXdsaW5lOworICAgIGJvb2wgbV9hdFN0YXJ0OworCisgICAgLy8gVGhpcyB2YXJpYWJsZSBp
cyB1c2VkIG9ubHkgaWYgd2hpdGVzcGFjZSBpc24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMg
dXMgd2hldGhlcgorICAgIC8vIG9yIG5vdCB3ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRl
c3BhY2UuCisgICAgYm9vbCBtX2lnbm9yaW5nU3BhY2VzOworCisgICAgLy8gVGhpcyB2YXJpYWJs
ZSB0cmFja3Mgd2hldGhlciB0aGUgdmVyeSBsYXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3Bh
Y2UuIFdlIHVzZQorICAgIC8vIHRoaXMgdG8gZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vj
b25kIHNwYWNlIHNvIHdlIGtub3cgd2UgaGF2ZSB0byB0ZXJtaW5hdGUKKyAgICAvLyBhIHJ1bi4K
KyAgICBib29sIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2U7CisgICAgYm9vbCBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1dTOworICAgIGJvb2wgbV9hcHBsaWVkU3RhcnRXaWR0aDsKKyAgICBib29sIG1f
aW5jbHVkZUVuZFdpZHRoOworICAgIGJvb2wgbV9hdXRvV3JhcDsKKyAgICBib29sIG1fYXV0b1dy
YXBXYXNFdmVyVHJ1ZU9uTGluZTsKKyAgICBib29sIG1fZmxvYXRzRml0T25MaW5lOworICAgIGJv
b2wgbV9jb2xsYXBzZVdoaXRlU3BhY2U7CisgICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBo
OworICAgIGJvb2wgbV9hbGxvd0ltYWdlc1RvQnJlYWs7CisgICAgYm9vbCBtX2F0RW5kOworICAg
IGJvb2wgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudDsKKworICAgIExpbmVNaWRw
b2ludFN0YXRlJiBtX2xpbmVNaWRwb2ludFN0YXRlOworCisgICAgVHJhaWxpbmdPYmplY3RzIG1f
dHJhaWxpbmdPYmplY3RzOworfTsKKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0
aWFsaXplRm9yQ3VycmVudE9iamVjdCgpCit7CisgICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVm
b3JlQ3VycmVudCA9ICEhbV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCk7CisKKyAgICBtX2N1cnJl
bnRTdHlsZSA9ICZtX2N1cnJlbnQucmVuZGVyZXIoKS0+c3R5bGUoKTsgLy8gRklYTUU6IFNob3Vs
ZCB0aGlzIGJlICZsaW5lU3R5bGUoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2xpbmVJbmZvKTsg
PworCisgICAgQVNTRVJUKG1fY3VycmVudFN0eWxlKTsKKworICAgIG1fbmV4dE9iamVjdCA9IGJp
ZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMobV9ibG9jaywgbV9jdXJyZW50LnJlbmRlcmVyKCkp
OworICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5wYXJlbnQoKSAmJiAhbV9u
ZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNjZW5kYW50T2YobV9jdXJyZW50LnJlbmRlcmVyKCkt
PnBhcmVudCgpKSkKKyAgICAgICAgbV9pbmNsdWRlRW5kV2lkdGggPSB0cnVlOworCisgICAgbV9j
dXJyV1MgPSBtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNSZXBsYWNlZCgpID8gbV9jdXJyZW50LnJl
bmRlcmVyKCktPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxl
LT53aGl0ZVNwYWNlKCk7CisgICAgbV9sYXN0V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQo
KSA/IG1fbGFzdE9iamVjdC0+cGFyZW50KCktPnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0
T2JqZWN0LT5zdHlsZSgpLndoaXRlU3BhY2UoKTsKKworICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJT
dHlsZTo6YXV0b1dyYXAobV9jdXJyV1MpOworICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGlu
ZSA9IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSB8fCBtX2F1dG9XcmFwOworCisgICAgbV9w
cmVzZXJ2ZXNOZXdsaW5lID0gbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzU1ZHSW5saW5lVGV4dCgp
ID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJlc2VydmVOZXdsaW5lKG1fY3VycldTKTsKKworICAg
IG1fY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVuZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZSht
X2N1cnJXUyk7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkK
K3sKKyAgICAvLyBDbGVhciBvdXQgb3VyIGNoYXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxp
bmUgPHByZT5zIGRvbid0IGNvbGxhcHNlIHdoaXRlc3BhY2UKKyAgICAvLyB3aXRoIGFkamFjZW50
IGlubGluZSBub3JtYWwvbm93cmFwIHNwYW5zLgorICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3Bh
Y2UpCisgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKworICAgIG1f
Y3VycmVudC5tb3ZlVG9TdGFydE9mKG1fbmV4dE9iamVjdCk7CisgICAgbV9hdFN0YXJ0ID0gZmFs
c2U7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBj
bGVhcikKK3sKKyAgICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgUmVuZGVy
T2JqZWN0KiBiciA9IG1fY3VycmVudC5yZW5kZXJlcigpOworICAgICAgICBtX2xpbmVCcmVha0hp
c3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICBt
b2RpZnlNZS5tb3ZlVG9TdGFydE9mKGJyKTsKKyAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVu
dCgpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBBIDxicj4gYWx3YXlzIGJyZWFrcyBhIGxp
bmUsIHNvIGRvbid0IGxldCB0aGUgbGluZSBiZSBjb2xsYXBzZWQKKyAgICAgICAgLy8gYXdheS4g
QWxzbywgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHdpdGggYSA8YnI+IGRvZXMgbm90
CisgICAgICAgIC8vIGdldCBjb2xsYXBzZWQgYXdheS4gSXQgb25seSBkb2VzIHRoaXMgaWYgdGhl
IHByZXZpb3VzIGxpbmUgYnJva2UKKyAgICAgICAgLy8gY2xlYW5seS4gT3RoZXJ3aXNlIHRoZSA8
YnI+IGhhcyBubyBlZmZlY3Qgb24gd2hldGhlciB0aGUgbGluZSBpcworICAgICAgICAvLyBlbXB0
eSBvciBub3QuCisgICAgICAgIGlmIChtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKQorICAgICAgICAg
ICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKKyAgICAg
ICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKyAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2
aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7CisKKyAgICAgICAgLy8gQSA8YnI+IHdpdGggY2xl
YXJhbmNlIGFsd2F5cyBuZWVkcyBhIGxpbmVib3ggaW4gY2FzZSB0aGUgbGluZXMgYmVsb3cgaXQg
Z2V0IGRpcnRpZWQgbGF0ZXIgYW5kCisgICAgICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGZsb2F0
cyB0byBjbGVhciAtIHNvIGlmIHdlJ3JlIGlnbm9yaW5nIHNwYWNlcywgc3RvcCBpZ25vcmluZyB0
aGVtIGFuZCBhZGQgYQorICAgICAgICAvLyBydW4gZm9yIHRoaXMgb2JqZWN0LgorICAgICAgICBp
ZiAobV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y2xlYXIoKSAhPSBDTk9ORSkK
KyAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuZW5zdXJlTGluZUJveEluc2lkZUlnbm9y
ZWRTcGFjZXMoYnIpOworICAgICAgICAvLyBJZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNvbGxhcHNp
bmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0LWFsaWduZWQgY29udGFpbmVyIHdlIG5lZWQgdG8g
ZW5zdXJlIHRoZSBzcGFjZSBnZXRzCisgICAgICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNvIHRoYXQg
aXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRoZSBjb250YWluZXIncyByaWdodC1o
YW5kIGVkZ2UuCisgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNv
bnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qgb2Yg
dGVzdCByZXN1bHRzLgorICAgICAgICBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIChtX2Js
b2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigp
ID09IFdFQktJVF9SSUdIVCkpCisgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0b3BJ
Z25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9j
dXJyZW50Lm9mZnNldCgpKSk7CisKKyAgICAgICAgaWYgKCFtX2xpbmVJbmZvLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIGNsZWFyID0gbV9jdXJyZW50U3R5bGUtPmNsZWFyKCk7CisgICAgfQorICAg
IG1fYXRFbmQgPSB0cnVlOworfQorCitpbmxpbmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFy
Z2luU3RhcnQoY29uc3QgUmVuZGVySW5saW5lJiBjaGlsZCkKK3sKKyAgICByZXR1cm4gY2hpbGQu
bWFyZ2luU3RhcnQoKSArIGNoaWxkLnBhZGRpbmdTdGFydCgpICsgY2hpbGQuYm9yZGVyU3RhcnQo
KTsKK30KKworaW5saW5lIExheW91dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBS
ZW5kZXJJbmxpbmUmIGNoaWxkKQoreworICAgIHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNo
aWxkLnBhZGRpbmdFbmQoKSArIGNoaWxkLmJvcmRlckVuZCgpOworfQorCitpbmxpbmUgYm9vbCBz
aG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKFJlbmRlck9iamVjdCogY2hpbGQpCit7CisgICAg
aWYgKCFjaGlsZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gV2hlbiBkZWNpZGluZyB3
aGV0aGVyIHdlJ3JlIGF0IHRoZSBlZGdlIG9mIGFuIGlubGluZSwgYWRqYWNlbnQgY29sbGFwc2Vk
IHdoaXRlc3BhY2UgaXMgdGhlIHNhbWUgYXMgbm8gc2libGluZyBhdCBhbGwuCisgICAgaWYgKGlz
PFJlbmRlclRleHQ+KCpjaGlsZCkgJiYgIWRvd25jYXN0PFJlbmRlclRleHQ+KCpjaGlsZCkudGV4
dExlbmd0aCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyNpZiBFTkFCTEUoQ1NTX0JPWF9ERUNP
UkFUSU9OX0JSRUFLKQorICAgIGlmIChpczxSZW5kZXJMaW5lQnJlYWs+KCpjaGlsZCkgJiYgY2hp
bGQtPnBhcmVudCgpLT5zdHlsZSgpLmJveERlY29yYXRpb25CcmVhaygpID09IERDTE9ORSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGlu
ZSBSZW5kZXJPYmplY3QqIHByZXZpb3VzSW5GbG93U2libGluZyhSZW5kZXJPYmplY3QqIGNoaWxk
KQoreworICAgIGRvIHsKKyAgICAgICAgY2hpbGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7
CisgICAgfSB3aGlsZSAoY2hpbGQgJiYgY2hpbGQtPmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsK
KyAgICByZXR1cm4gY2hpbGQ7Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGlubGluZUxvZ2ljYWxX
aWR0aChSZW5kZXJPYmplY3QqIGNoaWxkLCBib29sIGNoZWNrU3RhcnRFZGdlID0gdHJ1ZSwgYm9v
bCBjaGVja0VuZEVkZ2UgPSB0cnVlKQoreworICAgIHVuc2lnbmVkIGxpbmVEZXB0aCA9IDE7Cisg
ICAgTGF5b3V0VW5pdCBleHRyYVdpZHRoID0gMDsKKyAgICBSZW5kZXJFbGVtZW50KiBwYXJlbnQg
PSBjaGlsZC0+cGFyZW50KCk7CisgICAgd2hpbGUgKGlzPFJlbmRlcklubGluZT4oKnBhcmVudCkg
JiYgbGluZURlcHRoKysgPCBjTWF4TGluZURlcHRoKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHBh
cmVudEFzUmVuZGVySW5saW5lID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPigqcGFyZW50KTsKKyAg
ICAgICAgaWYgKCFpc0VtcHR5SW5saW5lKHBhcmVudEFzUmVuZGVySW5saW5lKSkgeworICAgICAg
ICAgICAgY2hlY2tTdGFydEVkZ2UgPSBjaGVja1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQ
YWRkaW5nTWFyZ2luKHByZXZpb3VzSW5GbG93U2libGluZyhjaGlsZCkpOworICAgICAgICAgICAg
aWYgKGNoZWNrU3RhcnRFZGdlKQorICAgICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVy
UGFkZGluZ01hcmdpblN0YXJ0KHBhcmVudEFzUmVuZGVySW5saW5lKTsKKyAgICAgICAgICAgIGNo
ZWNrRW5kRWRnZSA9IGNoZWNrRW5kRWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2lu
KGNoaWxkLT5uZXh0U2libGluZygpKTsKKyAgICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2UpCisg
ICAgICAgICAgICAgICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVu
dEFzUmVuZGVySW5saW5lKTsKKyAgICAgICAgICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYgIWNo
ZWNrRW5kRWRnZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFXaWR0aDsKKyAgICAgICAg
fQorICAgICAgICBjaGlsZCA9IHBhcmVudDsKKyAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBhcmVu
dCgpOworICAgIH0KKyAgICByZXR1cm4gZXh0cmFXaWR0aDsKK30KKworaW5saW5lIHZvaWQgQnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gq
PiYgcG9zaXRpb25lZE9iamVjdHMpCit7CisgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkg
d2Fzbid0IGFuIGlubGluZSB0eXBlLCB0aGVuIHdlIGNhbgorICAgIC8vIGdvIGFoZWFkIGFuZCBk
ZXRlcm1pbmUgb3VyIHN0YXRpYyBpbmxpbmUgcG9zaXRpb24gbm93LgorICAgIGF1dG8mIGJveCA9
IGRvd25jYXN0PFJlbmRlckJveD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKKyAgICBib29sIGlz
SW5saW5lVHlwZSA9IGJveC5zdHlsZSgpLmlzT3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpOwor
ICAgIGlmICghaXNJbmxpbmVUeXBlKQorICAgICAgICBtX2Jsb2NrLnNldFN0YXRpY0lubGluZVBv
c2l0aW9uRm9yQ2hpbGQoYm94LCBtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFy
dE9mZnNldEZvckNvbnRlbnQobV9ibG9jay5sb2dpY2FsSGVpZ2h0KCkpKTsKKyAgICBlbHNlIHsK
KyAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0
aGVuIHdlIGNhbiBnbyBhaGVhZAorICAgICAgICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMg
eSBwb3NpdGlvbiBub3cuCisgICAgICAgIGJveC5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0
aW9uKG1fYmxvY2subG9naWNhbEhlaWdodCgpKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSdyZSBp
Z25vcmluZyBzcGFjZXMsIHdlIGhhdmUgdG8gc3RvcCBhbmQgaW5jbHVkZSB0aGlzIG9iamVjdCBh
bmQKKyAgICAvLyB0aGVuIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KKyAgICBpZiAoaXNJ
bmxpbmVUeXBlIHx8IGJveC5jb250YWluZXIoKS0+aXNSZW5kZXJJbmxpbmUoKSkgeworICAgICAg
ICBpZiAobV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUu
ZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMoJmJveCk7CisgICAgICAgIG1fdHJhaWxp
bmdPYmplY3RzLmFwcGVuZEJveElmTmVlZGVkKCZib3gpOworICAgIH0gZWxzZQorICAgICAgICBw
b3NpdGlvbmVkT2JqZWN0cy5hcHBlbmQoJmJveCk7CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0
dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKCZib3gpKTsKKyAgICAvLyBSZXNldCBwcmlvciBs
aW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycy4KKyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGlu
ZUJyZWFrSXRlcmF0b3IucmVzZXRQcmlvckNvbnRleHQoKTsKK30KKworaW5saW5lIHZvaWQgQnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVGbG9hdCgpCit7CisgICAgYXV0byYgZmxvYXRCb3ggPSBkb3du
Y2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgRmxvYXRpbmdPYmpl
Y3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9saW5lQnJlYWtlci5pbnNlcnRGbG9hdGluZ09iamVjdChm
bG9hdEJveCk7CisgICAgLy8gY2hlY2sgaWYgaXQgZml0cyBpbiB0aGUgY3VycmVudCBsaW5lLgor
ICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9uIGl0IG5vdywgb3RoZXJ3aXNlLCBwb3NpdGlvbgor
ICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBuZXh0IGxpbmUgKGluIGNsZWFyRmxvYXRzKCkgZnVu
YykKKyAgICBpZiAobV9mbG9hdHNGaXRPbkxpbmUgJiYgbV93aWR0aC5maXRzT25MaW5lRXhjbHVk
aW5nVHJhaWxpbmdXaGl0ZXNwYWNlKG1fYmxvY2subG9naWNhbFdpZHRoRm9yRmxvYXQoZmxvYXRp
bmdPYmplY3QpKSkgeworICAgICAgICBtX2xpbmVCcmVha2VyLnBvc2l0aW9uTmV3RmxvYXRPbkxp
bmUoZmxvYXRpbmdPYmplY3QsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZSwgbV9saW5lSW5m
bywgbV93aWR0aCk7CisgICAgICAgIGlmIChtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSA9
PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgeworICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVh
a0hpc3Rvcnkub2Zmc2V0KCkpOworICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3Jl
bWVudCgpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIG1fZmxvYXRzRml0T25MaW5l
ID0gZmFsc2U7CisgICAgLy8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0
ZXJzLCB1c2luZyBVK0ZGRkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciBmbG9h
dGluZyBlbGVtZW50LgorICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51
cGRhdGVQcmlvckNvbnRleHQocmVwbGFjZW1lbnRDaGFyYWN0ZXIpOworfQorCisvLyBUaGlzIGlz
IGN1cnJlbnRseSBqdXN0IHVzZWQgZm9yIGxpc3QgbWFya2VycyBhbmQgaW5saW5lIGZsb3dzIHRo
YXQgaGF2ZSBsaW5lIGJveGVzLiBOZWl0aGVyIHNob3VsZAorLy8gaGF2ZSBhbiBlZmZlY3Qgb24g
d2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCitpbmxpbmUgYm9vbCBzaG91bGRT
a2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVu
ZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCit7Cisg
ICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhibG9j
aywgbyk7CisgICAgd2hpbGUgKG5leHQgJiYgbmV4dC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9z
aXRpb25lZCgpKQorICAgICAgICBuZXh0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhi
bG9jaywgbmV4dCk7CisKKyAgICBpZiAoaXM8UmVuZGVyVGV4dD4obmV4dCkgJiYgZG93bmNhc3Q8
UmVuZGVyVGV4dD4oKm5leHQpLnRleHRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgUmVuZGVyVGV4
dCYgbmV4dFRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbmV4dCk7CisgICAgICAgIFVDaGFy
IG5leHRDaGFyID0gbmV4dFRleHQuY2hhcmFjdGVyQXQoMCk7CisgICAgICAgIGlmIChuZXh0VGV4
dC5zdHlsZSgpLmlzQ29sbGFwc2libGVXaGl0ZVNwYWNlKG5leHRDaGFyKSkgeworICAgICAgICAg
ICAgbGluZU1pZHBvaW50U3RhdGUuc3RhcnRJZ25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcihu
dWxscHRyLCBvLCAwKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0
OjpoYW5kbGVFbXB0eUlubGluZSgpCit7CisgICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOworCisgICAgLy8gVGhp
cyBzaG91bGQgb25seSBlbmQgdXAgYmVpbmcgY2FsbGVkIG9uIGVtcHR5IGlubGluZXMKKyAgICBB
U1NFUlQoaXNFbXB0eUlubGluZShmbG93Qm94KSk7CisKKyAgICAvLyBOb3cgdGhhdCBzb21lIGlu
bGluZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMsIGlmIHdlIGFyZSBhbHJlYWR5IGlnbm9yaW5nIHNw
YWNlcywgd2UgbmVlZAorICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIHN0b3AgdG8gaW5jbHVk
ZSB0aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAg
Ly8gSWYgdGhpcyBvYmplY3QgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB3ZSBuZWVkIHRv
IGJlaGF2ZSBsaWtlIGxpc3QgbWFya2VycyBhbmQKKyAgICAvLyBzdGFydCBpZ25vcmluZyBzcGFj
ZXMuCisgICAgYm9vbCByZXF1aXJlc0xpbmVCb3ggPSBhbHdheXNSZXF1aXJlc0xpbmVCb3goZmxv
d0JveCk7CisgICAgaWYgKHJlcXVpcmVzTGluZUJveCB8fCByZXF1aXJlc0xpbmVCb3hGb3JDb250
ZW50KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7CisgICAgICAgIC8vIEFuIGVtcHR5IGlubGluZSB0
aGF0IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2ZXJ0aWNhbC1hbGlnbiBvciBmb250LW1ldHJpY3Mg
d2lsbCBvbmx5IGdldCBhCisgICAgICAgIC8vIGxpbmUgYm94IHRvIGFmZmVjdCB0aGUgaGVpZ2h0
IG9mIHRoZSBsaW5lIGlmIHRoZSByZXN0IG9mIHRoZSBsaW5lIGlzIG5vdCBlbXB0eS4KKyAgICAg
ICAgaWYgKHJlcXVpcmVzTGluZUJveCkKKyAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHko
ZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2Vz
KSB7CisgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworICAgICAgICAgICAg
bV9saW5lTWlkcG9pbnRTdGF0ZS5lbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhtX2N1
cnJlbnQucmVuZGVyZXIoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmNvbGxh
cHNlV2hpdGVTcGFjZSgpICYmIG1fcmVzb2x2ZXIucG9zaXRpb24oKS5yZW5kZXJlcigpID09IG1f
Y3VycmVudC5yZW5kZXJlcigpCisgICAgICAgICAgICAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFm
dGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fbGluZU1pZHBv
aW50U3RhdGUpKSB7CisgICAgICAgICAgICAvLyBMaWtlIHdpdGggbGlzdCBtYXJrZXJzLCB3ZSBz
dGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55CisgICAgICAgICAgICAv
LyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBiZSBkaXNjYXJkZWQuCisgICAgICAgICAg
ICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fY3VycmVu
dENoYXJhY3RlcklzV1MgPSB0cnVlOworICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRy
dWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5k
Qm94SWZOZWVkZWQoJmZsb3dCb3gpOworICAgIH0KKworICAgIG1fd2lkdGguYWRkVW5jb21taXR0
ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJlbmRlcmVyKCkpICsgYm9yZGVy
UGFkZGluZ01hcmdpblN0YXJ0KGZsb3dCb3gpICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93
Qm94KSk7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQo
KQoreworICAgIGF1dG8mIHJlcGxhY2VkQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9jdXJy
ZW50LnJlbmRlcmVyKCkpOworCisgICAgaWYgKG1fYXRTdGFydCkKKyAgICAgICAgbV93aWR0aC51
cGRhdGVBdmFpbGFibGVXaWR0aChyZXBsYWNlZEJveC5sb2dpY2FsSGVpZ2h0KCkpOworCisgICAg
Ly8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVudHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUt
c3BhY2UuCisgICAgaWYgKChtX2F1dG9XcmFwIHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xh
c3RXUykpICYmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1h
Z2VzVG9CcmVhaykKKyAgICAgICAgJiYgKCFtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNSdWJ5UnVu
KCkgfHwgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4obV9jdXJyZW50LnJlbmRlcmVyKCkpLT5jYW5C
cmVha0JlZm9yZShtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IpKSkgeworICAg
ICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9jdXJyZW50LnJlbmRlcmVyKCkp
OworICAgIH0KKworICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICBtX2xpbmVNaWRw
b2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQu
cmVuZGVyZXIoKSwgMCkpOworCisgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxv
Y2ssICZtX3dpZHRoKTsKKyAgICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNlOworICAgIG1fY3VycmVudENoYXJhY3RlcklzV1Mg
PSBmYWxzZTsKKyAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgLy8gT3B0aW1p
emUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdlIGNhbid0IGZpbmQgd2hpdGVzcGFjZSBhZnRlciB0
aGUgbGlzdAorICAgIC8vIGl0ZW0sIHRoZW4gdGhpcyBpcyBhbGwgbW9vdC4KKyAgICBMYXlvdXRV
bml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0gbV9ibG9jay5sb2dpY2FsV2lkdGhGb3JDaGlsZChy
ZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpblN0YXJ0Rm9yQ2hpbGQocmVwbGFjZWRCb3gpICsg
bV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBpbmxpbmVMb2dpY2FsV2lk
dGgobV9jdXJyZW50LnJlbmRlcmVyKCkpOworICAgIGlmIChpczxSZW5kZXJMaXN0TWFya2VyPigq
bV9jdXJyZW50LnJlbmRlcmVyKCkpKSB7CisgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUuY29sbGFw
c2VXaGl0ZVNwYWNlKCkgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KG1f
YmxvY2ssIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgeworICAg
ICAgICAgICAgLy8gTGlrZSB3aXRoIGlubGluZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3Bh
Y2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQorICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFj
ZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZSA9IHRydWU7CisgICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0g
ZmFsc2U7CisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgfQor
ICAgICAgICBpZiAoZG93bmNhc3Q8UmVuZGVyTGlzdE1hcmtlcj4oKm1fY3VycmVudC5yZW5kZXJl
cigpKS5pc0luc2lkZSgpKQorICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRo
KHJlcGxhY2VkTG9naWNhbFdpZHRoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV93aWR0aC5hZGRV
bmNvbW1pdHRlZFdpZHRoKHJlcGxhY2VkTG9naWNhbFdpZHRoKTsKKyAgICBpZiAoaXM8UmVuZGVy
UnVieVJ1bj4oKm1fY3VycmVudC5yZW5kZXJlcigpKSkgeworICAgICAgICBtX3dpZHRoLmFwcGx5
T3ZlcmhhbmcoZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4obV9jdXJyZW50LnJlbmRlcmVyKCkpLCBt
X2xhc3RPYmplY3QsIG1fbmV4dE9iamVjdCk7CisgICAgICAgIGRvd25jYXN0PFJlbmRlclJ1YnlS
dW4+KG1fY3VycmVudC5yZW5kZXJlcigpKS0+dXBkYXRlUHJpb3JDb250ZXh0RnJvbUNhY2hlZEJy
ZWFrSXRlcmF0b3IobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yKTsKKyAgICB9
IGVsc2UgeworICAgICAgICAvLyBVcGRhdGUgcHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJh
Y3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNUIFJFUExBQ0VNRU5UIENIQVJBQ1RFUikgZm9yIHJl
cGxhY2VkIGVsZW1lbnQuCisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVy
YXRvci51cGRhdGVQcmlvckNvbnRleHQocmVwbGFjZW1lbnRDaGFyYWN0ZXIpOworICAgIH0KK30K
KworaW5saW5lIGZsb2F0IGZpcnN0UG9zaXRpdmVXaWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRz
JiB3b3JkTWVhc3VyZW1lbnRzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1l
YXN1cmVtZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tp
XS53aWR0aCA+IDApCisgICAgICAgICAgICByZXR1cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0
aDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2lubGluZSBib29sIGl0ZXJhdG9ySXNCZXlv
bmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KGNvbnN0IElubGluZUl0ZXJhdG9yJiBpdGVyLCBSZW5k
ZXJDb21iaW5lVGV4dCYgcmVuZGVyZXIpCit7CisgICAgcmV0dXJuIGl0ZXIucmVuZGVyZXIoKSA9
PSAmcmVuZGVyZXIgJiYgaXRlci5vZmZzZXQoKSA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Cit9
CisKK2lubGluZSB2b2lkIG5leHRDaGFyYWN0ZXIoVUNoYXImIGN1cnJlbnRDaGFyYWN0ZXIsIFVD
aGFyJiBsYXN0Q2hhcmFjdGVyLCBVQ2hhciYgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKQoreworICAg
IHNlY29uZFRvTGFzdENoYXJhY3RlciA9IGxhc3RDaGFyYWN0ZXI7CisgICAgbGFzdENoYXJhY3Rl
ciA9IGN1cnJlbnRDaGFyYWN0ZXI7Cit9CisKKy8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMg
bWFyayB0aGVtc2VsdmVzIGFzIG5lZWRpbmcgcHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlv
dXQKKy8vIHNvIHdlIGRvbid0IG5lZWQgdGhpcyBoYWNrLgoraW5saW5lIHZvaWQgdXBkYXRlQ291
bnRlcklmTmVlZGVkKFJlbmRlclRleHQmIHJlbmRlclRleHQpCit7CisgICAgaWYgKCFyZW5kZXJU
ZXh0LnByZWZlcnJlZExvZ2ljYWxXaWR0aHNEaXJ0eSgpIHx8ICFpczxSZW5kZXJDb3VudGVyPihy
ZW5kZXJUZXh0KSkKKyAgICAgICAgcmV0dXJuOworICAgIGRvd25jYXN0PFJlbmRlckNvdW50ZXI+
KHJlbmRlclRleHQpLnVwZGF0ZUNvdW50ZXIoKTsKK30KKworaW5saW5lIGZsb2F0IG1lYXN1cmVI
eXBoZW5XaWR0aChSZW5kZXJUZXh0JiByZW5kZXJlciwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQs
IEhhc2hTZXQ8Y29uc3QgRm9udCo+KiBmYWxsYmFja0ZvbnRzID0gMCkKK3sKKyAgICBjb25zdCBS
ZW5kZXJTdHlsZSYgc3R5bGUgPSByZW5kZXJlci5zdHlsZSgpOworICAgIHJldHVybiBmb250Lndp
ZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZyZW5kZXJlciwgZm9udCwgc3R5bGUu
aHlwaGVuU3RyaW5nKCkuc3RyaW5nKCksIHN0eWxlKSwgZmFsbGJhY2tGb250cyk7Cit9CisKK0FM
V0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRoKFJlbmRlclRleHQmIHRleHQsIHVuc2lnbmVkIGZy
b20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGZsb2F0IHhQb3MsIGJv
b2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgSGFzaFNldDxjb25zdCBG
b250Kj4mIGZhbGxiYWNrRm9udHMsIFRleHRMYXlvdXQqIGxheW91dCA9IG51bGxwdHIpCit7Cisg
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC5zdHlsZSgpOworCisgICAgR2x5cGhP
dmVyZmxvdyBnbHlwaE92ZXJmbG93OworICAgIGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9tICYm
IGxlbiA9PSB0ZXh0LnRleHRMZW5ndGgoKSkgfHwgc3R5bGUuaGFzVGV4dENvbWJpbmUoKSkKKyAg
ICAgICAgcmV0dXJuIHRleHQud2lkdGgoZnJvbSwgbGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tG
b250cywgJmdseXBoT3ZlcmZsb3cpOworCisgICAgaWYgKGxheW91dCkKKyAgICAgICAgcmV0dXJu
IEZvbnRDYXNjYWRlOjp3aWR0aCgqbGF5b3V0LCBmcm9tLCBsZW4sICZmYWxsYmFja0ZvbnRzKTsK
KworICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnRleHQs
IGZvbnQsICZ0ZXh0LCBmcm9tLCBsZW4sIHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xl
bmd0aCh0ZXh0LnRleHRMZW5ndGgoKSAtIGZyb20pOworICAgIEFTU0VSVChydW4uY2hhcmFjdGVy
c0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7CisKKyAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZv
ckNvZGVQYXRoKCF0ZXh0LmNhblVzZVNpbXBsZUZvbnRDb2RlUGF0aCgpKTsKKyAgICBydW4uc2V0
VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJTaXplKCkpOworICAgIHJ1bi5z
ZXRYUG9zKHhQb3MpOworICAgIHJldHVybiBmb250LndpZHRoKHJ1biwgJmZhbGxiYWNrRm9udHMs
ICZnbHlwaE92ZXJmbG93KTsKK30KKworLy8gQWRkaW5nIGEgcGFpciBvZiBtaWRwb2ludHMgYmVm
b3JlIGEgY2hhcmFjdGVyIHdpbGwgc3BsaXQgaXQgb3V0IGludG8gYSBuZXcgbGluZSBib3guCitp
bmxpbmUgdm9pZCBlbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChMaW5lTWlkcG9pbnRTdGF0ZSYg
bGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yJiB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9y
KQoreworICAgIElubGluZUl0ZXJhdG9yIG1pZHBvaW50KDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0
b3IucmVuZGVyZXIoKSwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5vZmZzZXQoKSk7CisgICAgbGlu
ZU1pZHBvaW50U3RhdGUuc3RhcnRJZ25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCB0ZXh0
UGFyYWdyYXBoU2VwYXJhdG9yLnJlbmRlcmVyKCksIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3Iub2Zm
c2V0KCkgLSAxKSk7CisgICAgbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElu
bGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IucmVuZGVyZXIoKSwgdGV4dFBh
cmFncmFwaFNlcGFyYXRvci5vZmZzZXQoKSkpOworfQorCitpbmxpbmUgdm9pZCB0cnlIeXBoZW5h
dGluZyhSZW5kZXJUZXh0JiB0ZXh0LCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgY29uc3QgQXRv
bWljU3RyaW5nJiBsb2NhbGVJZGVudGlmaWVyLCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0
ZWRMaW5lcywgaW50IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQsIGludCBtaW5pbXVt
UHJlZml4TGltaXQsIGludCBtaW5pbXVtU3VmZml4TGltaXQsIHVuc2lnbmVkIGxhc3RTcGFjZSwg
dW5zaWduZWQgcG9zLCBmbG9hdCB4UG9zLCBpbnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhl
ZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVTcGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5n
LCBJbmxpbmVJdGVyYXRvciYgbGluZUJyZWFrLCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlw
aGVuYXRlZCkKK3sKKyAgICAvLyBNYXAgJ2h5cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFmdGVyfTog
YXV0bzsnIHRvIDIuCisgICAgdW5zaWduZWQgbWluaW11bVByZWZpeExlbmd0aDsKKyAgICB1bnNp
Z25lZCBtaW5pbXVtU3VmZml4TGVuZ3RoOworCisgICAgaWYgKG1pbmltdW1QcmVmaXhMaW1pdCA8
IDApCisgICAgICAgIG1pbmltdW1QcmVmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAgICAgICAg
bWluaW11bVByZWZpeExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtUHJlZml4
TGltaXQpOworCisgICAgaWYgKG1pbmltdW1TdWZmaXhMaW1pdCA8IDApCisgICAgICAgIG1pbmlt
dW1TdWZmaXhMZW5ndGggPSAyOworICAgIGVsc2UKKyAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0
aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtaW5pbXVtU3VmZml4TGltaXQpOworCisgICAgaWYg
KHBvcyAtIGxhc3RTcGFjZSA8PSBtaW5pbXVtU3VmZml4TGVuZ3RoKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXNMaW1pdCA+PSAwICYmIGNvbnNl
Y3V0aXZlSHlwaGVuYXRlZExpbmVzID49IHN0YXRpY19jYXN0PHVuc2lnbmVkPihjb25zZWN1dGl2
ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW50IGh5cGhl
bldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRoKHRleHQsIGZvbnQpOworCisgICAgZmxvYXQgbWF4
UHJlZml4V2lkdGggPSBhdmFpbGFibGVXaWR0aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAtIGxhc3RT
cGFjZVdvcmRTcGFjaW5nOworICAgIC8vIElmIHRoZSBtYXhpbXVtIHdpZHRoIGF2YWlsYWJsZSBm
b3IgdGhlIHByZWZpeCBiZWZvcmUgdGhlIGh5cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBpcyB2ZXJ5
IHVubGlrZWx5CisgICAgLy8gdGhhdCBhbiBoeXBoZW5hdGlvbiBvcHBvcnR1bml0eSBleGlzdHMs
IHNvIGRvIG5vdCBib3RoZXIgdG8gbG9vayBmb3IgaXQuCisgICAgaWYgKG1heFByZWZpeFdpZHRo
IDw9IGZvbnQucGl4ZWxTaXplKCkgKiA1IC8gNCkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4dC5zdHlsZSgpOworICAgIFRleHRSdW4gcnVuID0g
UmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnRleHQsIGZvbnQsICZ0ZXh0LCBsYXN0U3Bh
Y2UsIHBvcyAtIGxhc3RTcGFjZSwgc3R5bGUpOworICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3Ro
KHRleHQudGV4dExlbmd0aCgpIC0gbGFzdFNwYWNlKTsKKyAgICBBU1NFUlQocnVuLmNoYXJhY3Rl
cnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOworCisgICAgcnVuLnNldFRhYlNpemUoIWNvbGxh
cHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0WFBvcyh4UG9zICsg
bGFzdFNwYWNlV29yZFNwYWNpbmcpOworCisgICAgdW5zaWduZWQgcHJlZml4TGVuZ3RoID0gZm9u
dC5vZmZzZXRGb3JQb3NpdGlvbihydW4sIG1heFByZWZpeFdpZHRoLCBmYWxzZSk7CisgICAgaWYg
KHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKwor
ICAgIHByZWZpeExlbmd0aCA9IGxhc3RIeXBoZW5Mb2NhdGlvbihTdHJpbmdWaWV3KHRleHQudGV4
dCgpKS5zdWJzdHJpbmcobGFzdFNwYWNlLCBwb3MgLSBsYXN0U3BhY2UpLCBzdGQ6Om1pbihwcmVm
aXhMZW5ndGgsIHBvcyAtIGxhc3RTcGFjZSAtIG1pbmltdW1TdWZmaXhMZW5ndGgpICsgMSwgbG9j
YWxlSWRlbnRpZmllcik7CisgICAgaWYgKCFwcmVmaXhMZW5ndGggfHwgcHJlZml4TGVuZ3RoIDwg
bWluaW11bVByZWZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gV2hlbiBsYXN0
U3BhY2UgaXMgYSBzcGFjZSwgd2hpY2ggaXQgYWx3YXlzIGlzIGV4Y2VwdCBzb21ldGltZXMgYXQg
dGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgb3IgYWZ0ZXIgY29sbGFwc2VkCisgICAgLy8gc3BhY2Us
IGl0IHNob3VsZCBub3QgY291bnQgdG93YXJkcyBoeXBoZW5hdGUtbGltaXQtYmVmb3JlLgorICAg
IGlmIChwcmVmaXhMZW5ndGggPT0gbWluaW11bVByZWZpeExlbmd0aCkgeworICAgICAgICBVQ2hh
ciBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9IHRleHQuY2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKKyAg
ICAgICAgaWYgKGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RT
cGFjZSA9PSAnXG4nIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gbm9CcmVha1NwYWNlKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIEFTU0VSVChwb3MgLSBsYXN0U3BhY2UgLSBwcmVmaXhMZW5ndGggPj0gbWluaW11bVN1
ZmZpeExlbmd0aCk7CisKKyNpZiAhQVNTRVJUX0RJU0FCTEVECisgICAgSGFzaFNldDxjb25zdCBG
b250Kj4gZmFsbGJhY2tGb250czsKKyAgICBmbG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRo
ICsgdGV4dFdpZHRoKHRleHQsIGxhc3RTcGFjZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBp
c0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKKyAgICBBU1NFUlQoeFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJs
ZVdpZHRoKTsKKyNlbHNlCisgICAgVU5VU0VEX1BBUkFNKGlzRml4ZWRQaXRjaCk7CisjZW5kaWYK
KworICAgIGxpbmVCcmVhay5tb3ZlVG8oJnRleHQsIGxhc3RTcGFjZSArIHByZWZpeExlbmd0aCwg
bmV4dEJyZWFrYWJsZSk7CisgICAgaHlwaGVuYXRlZCA9IHRydWU7Cit9CisKK2lubGluZSBib29s
IEJyZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3Vy
ZW1lbnRzLCBib29sJiBoeXBoZW5hdGVkLCAgdW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRl
ZExpbmVzKQoreworICAgIGlmICghbV9jdXJyZW50Lm9mZnNldCgpKQorICAgICAgICBtX2FwcGxp
ZWRTdGFydFdpZHRoID0gZmFsc2U7CisKKyAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93
bmNhc3Q8UmVuZGVyVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKKworICAgIGJvb2wgaXNT
VkdUZXh0ID0gcmVuZGVyVGV4dC5pc1NWR0lubGluZVRleHQoKTsKKworICAgIC8vIElmIHdlIGhh
dmUgbGVmdCBhIG5vLXdyYXAgaW5saW5lIGFuZCBlbnRlcmVkIGFuIGF1dG93cmFwIGlubGluZSB3
aGlsZSBpZ25vcmluZyBzcGFjZXMKKyAgICAvLyB0aGVuIHdlIG5lZWQgdG8gbWFyayB0aGUgc3Rh
cnQgb2YgdGhlIGF1dG93cmFwIGlubGluZSBhcyBhIHBvdGVudGlhbCBsaW5lYnJlYWsgbm93Lgor
ICAgIGlmIChtX2F1dG9XcmFwICYmICFSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpICYm
IG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRo
KHJlbmRlclRleHQpOworCisgICAgaWYgKHJlbmRlclRleHQuc3R5bGUoKS5oYXNUZXh0Q29tYmlu
ZSgpICYmIGlzPFJlbmRlckNvbWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpICYmICFk
b3duY2FzdDxSZW5kZXJDb21iaW5lVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKS5pc0NvbWJp
bmVkKCkpIHsKKyAgICAgICAgYXV0byYgY29tYmluZVJlbmRlcmVyID0gZG93bmNhc3Q8UmVuZGVy
Q29tYmluZVRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgICAgIGNvbWJpbmVSZW5k
ZXJlci5jb21iaW5lVGV4dCgpOworICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSByZW5kZXJl
cidzIHRleHQgbWF5IGhhdmUgY2hhbmdlZC4gSW5jcmVtZW50IHN0YWxlIGl0ZXJhdG9yIHBvc2l0
aW9ucworICAgICAgICBpZiAoaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQo
bV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSwgY29tYmluZVJlbmRlcmVyKSkgeworICAgICAg
ICAgICAgQVNTRVJUKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fcmVz
b2x2ZXIucG9zaXRpb24oKSwgY29tYmluZVJlbmRlcmVyKSk7CisgICAgICAgICAgICBtX2xpbmVC
cmVha0hpc3RvcnkuaW5jcmVtZW50KCk7CisgICAgICAgICAgICBtX3Jlc29sdmVyLmluY3JlbWVu
dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0g
bGluZVN0eWxlKHJlbmRlclRleHQsIG1fbGluZUluZm8pOworICAgIGNvbnN0IEZvbnRDYXNjYWRl
JiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKKyAgICBib29sIGlzRml4ZWRQaXRjaCA9IGZv
bnQuaXNGaXhlZFBpdGNoKCk7CisgICAgYm9vbCBjYW5IeXBoZW5hdGUgPSBzdHlsZS5oeXBoZW5z
KCkgPT0gSHlwaGVuc0F1dG8gJiYgV2ViQ29yZTo6Y2FuSHlwaGVuYXRlKHN0eWxlLmxvY2FsZSgp
KTsKKworICAgIHVuc2lnbmVkIGxhc3RTcGFjZSA9IG1fY3VycmVudC5vZmZzZXQoKTsKKyAgICBm
bG9hdCB3b3JkU3BhY2luZyA9IG1fY3VycmVudFN0eWxlLT5mb250Q2FzY2FkZSgpLndvcmRTcGFj
aW5nKCk7CisgICAgZmxvYXQgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOworICAgIGZsb2F0IHdv
cmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKKworICAgIGZsb2F0IHdyYXBXID0gbV93
aWR0aC51bmNvbW1pdHRlZFdpZHRoKCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJl
bmRlcmVyKCksICFtX2FwcGxpZWRTdGFydFdpZHRoLCB0cnVlKTsKKyAgICBmbG9hdCBjaGFyV2lk
dGggPSAwOworICAgIGJvb2wgYnJlYWtOQlNQID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHls
ZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKKyAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxk
IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25seSBpZiBpdCBjb3VsZCBub3Qgd3JhcCBi
ZWZvcmUgdGhlIHdvcmQsCisgICAgLy8gd2hpY2ggaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgd29y
ZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhlIGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBpcyB6ZXJv
LgorICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1fY3VycmVudFN0eWxlLT5icmVha1dvcmRzKCkgJiYg
KChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHx8IG1fY3VycldTID09
IFBSRSk7CisgICAgYm9vbCBtaWRXb3JkQnJlYWsgPSBmYWxzZTsKKyAgICBib29sIGJyZWFrQWxs
ID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVhaygpID09IEJyZWFrQWxsV29yZEJyZWFrICYmIG1f
YXV0b1dyYXA7CisgICAgZmxvYXQgaHlwaGVuV2lkdGggPSAwOworICAgIGJvb2wgaXNMb29zZUNK
S01vZGUgPSBmYWxzZTsKKworICAgIGlmIChpc1NWR1RleHQpIHsKKyAgICAgICAgYnJlYWtXb3Jk
cyA9IGZhbHNlOworICAgICAgICBicmVha0FsbCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICht
X3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSAmcmVuZGVyVGV4dCkgeworICAgICAgICB1cGRhdGVD
b3VudGVySWZOZWVkZWQocmVuZGVyVGV4dCk7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV90
ZXh0ID0gJnJlbmRlclRleHQ7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZv
bnQ7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91
dCgmcmVuZGVyVGV4dCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3Bh
Y2UpOworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRT
dHJpbmdBbmRSZWxlYXNlSXRlcmF0b3IocmVuZGVyVGV4dC50ZXh0KCksIHN0eWxlLmxvY2FsZSgp
LCBtYXBMaW5lQnJlYWtUb0l0ZXJhdG9yTW9kZShtX2Jsb2NrU3R5bGUubGluZUJyZWFrKCkpKTsK
KyAgICAgICAgaXNMb29zZUNKS01vZGUgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRl
cmF0b3IuaXNMb29zZUNKS01vZGUoKTsKKyAgICB9IGVsc2UgaWYgKG1fcmVuZGVyVGV4dEluZm8u
bV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgIT0gJmZvbnQpIHsKKyAgICAgICAg
bV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5m
by5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KCZyZW5kZXJUZXh0LCBtX3dpZHRoLmN1cnJl
bnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7CisgICAgfQorCisgICAgVGV4dExheW91
dCogdGV4dExheW91dCA9IG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQuZ2V0KCk7CisKKyAgICAv
LyBOb24temVybyBvbmx5IHdoZW4ga2VybmluZyBpcyBlbmFibGVkIGFuZCBUZXh0TGF5b3V0IGlz
bid0IHVzZWQsIGluIHdoaWNoIGNhc2Ugd2UgbWVhc3VyZQorICAgIC8vIHdvcmRzIHdpdGggdGhl
aXIgdHJhaWxpbmcgc3BhY2UsIHRoZW4gc3VidHJhY3QgaXRzIHdpZHRoLgorICAgIEhhc2hTZXQ8
Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7CisgICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VX
aWR0aCA9IChmb250LnR5cGVzZXR0aW5nRmVhdHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5
b3V0ID8gZm9udC53aWR0aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bigmcmVuZGVyVGV4
dCwgZm9udCwgJnNwYWNlLCAxLCBzdHlsZSksICZmYWxsYmFja0ZvbnRzKSArIHdvcmRTcGFjaW5n
IDogMDsKKworICAgIFVDaGFyIGxhc3RDaGFyYWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGlu
ZUJyZWFrSXRlcmF0b3IubGFzdENoYXJhY3RlcigpOworICAgIFVDaGFyIHNlY29uZFRvTGFzdENo
YXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5zZWNvbmRUb0xh
c3RDaGFyYWN0ZXIoKTsKKyAgICBmb3IgKDsgbV9jdXJyZW50Lm9mZnNldCgpIDwgcmVuZGVyVGV4
dC50ZXh0TGVuZ3RoKCk7IG1fY3VycmVudC5mYXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7Cisg
ICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZTsKKyAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1dTOworICAgICAgICBVQ2hhciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKKyAg
ICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8
fCAoIW1fcHJlc2VydmVzTmV3bGluZSAmJiAoYyA9PSAnXG4nKSk7CisKKyAgICAgICAgaWYgKCFt
X2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKKyAgICAg
ICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisK
KyAgICAgICAgaWYgKGMgPT0gc29mdEh5cGhlbiAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0
aCAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsKKyAgICAgICAgICAgIGh5cGhl
bldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRoKHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0Zv
bnRzKTsKKyAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0
aCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsK
KworICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSB8fCAoYnJlYWtOQlNQICYmIGMgPT0gbm9CcmVha1NwYWNlKTsKKworICAgICAgICBpZiAo
KGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYmICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRD
aGFyYWN0ZXJJc1NwYWNlIHx8IHN0eWxlLndoaXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKKyAg
ICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0aDsKKyAgICAgICAgICAgIGJvb2wgbWlkV29yZEJy
ZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0gVTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm9m
ZnNldCgpICsgMSA8IHJlbmRlclRleHQudGV4dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTChyZW5k
ZXJUZXh0W21fY3VycmVudC5vZmZzZXQoKSArIDFdKTsKKyAgICAgICAgICAgIGNoYXJXaWR0aCA9
IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zmc2V0KCksIG1pZFdvcmRCcmVha0lz
QmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAxLCBmb250LCBtX3dpZHRoLmNvbW1pdHRlZFdpZHRo
KCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tG
b250cywgdGV4dExheW91dCk7CisgICAgICAgICAgICBtaWRXb3JkQnJlYWsgPSBtX3dpZHRoLmNv
bW1pdHRlZFdpZHRoKCkgKyB3cmFwVyArIGNoYXJXaWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lk
dGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSBt
X2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCk7CisgICAgICAgIGJvb2wgYmV0d2Vlbldv
cmRzID0gYyA9PSAnXG4nIHx8IChtX2N1cnJXUyAhPSBQUkUgJiYgIW1fYXRTdGFydCAmJiBpc0Jy
ZWFrYWJsZShtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IsIG1fY3VycmVudC5v
ZmZzZXQoKSwgbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBicmVha05CU1AsIGlzTG9vc2VDSktNb2Rl
KQorICAgICAgICAgICAgJiYgKHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSB8fCAobV9j
dXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgpICE9IHNvZnRIeXBoZW4pKSk7CisgICAgICAgIG1f
Y3VycmVudC5zZXROZXh0QnJlYWthYmxlUG9zaXRpb24obmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsK
KworICAgICAgICBpZiAoYmV0d2VlbldvcmRzIHx8IG1pZFdvcmRCcmVhaykgeworICAgICAgICAg
ICAgYm9vbCBzdG9wcGVkSWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmICht
X2lnbm9yaW5nU3BhY2VzKSB7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcg
PSAwOworICAgICAgICAgICAgICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkgewor
ICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQg
dGhpcworICAgICAgICAgICAgICAgICAgICAvLyBuZXcgcG9pbnQuCisgICAgICAgICAgICAgICAg
ICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgd29yZFNw
YWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAwOworICAgICAgICAgICAgICAgICAgICBsYXN0U3Bh
Y2UgPSBtX2N1cnJlbnQub2Zmc2V0KCk7IC8vIGUuZy4sICJGb28gICAgZ29vIiwgZG9uJ3QgYWRk
IGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFjZXMuCisgICAgICAgICAgICAgICAgICAgIG1fbGlu
ZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3Vy
cmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCkpKTsKKyAgICAgICAgICAgICAgICAg
ICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2Vz
LgorICAgICAgICAgICAgICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNl
Y29uZFRvTGFzdENoYXJhY3Rlcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd29yZE1lYXN1cmVt
ZW50cy5ncm93KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICBXb3Jk
TWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwor
CisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSAmcmVuZGVyVGV4dDsKKyAg
ICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2N1cnJlbnQub2Zmc2V0KCk7
CisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisK
KyAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGg7CisgICAgICAgICAgICBpZiAo
d29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBjID09ICcgJykKKyAgICAgICAgICAgICAgICBhZGRp
dGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJy
ZW50Lm9mZnNldCgpICsgMSAtIGxhc3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZh
bGxiYWNrRm9udHMsIHRleHRMYXlvdXQpIC0gd29yZFRyYWlsaW5nU3BhY2VXaWR0aDsKKyAgICAg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdp
ZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpIC0gbGFzdFNwYWNl
LCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VX
aGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7CisK
KyAgICAgICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkg
JiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJl
bWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFsbGJhY2tGb250cyk7CisgICAgICAgICAgICBmYWxs
YmFja0ZvbnRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9
IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKKyAg
ICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Cisg
ICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0
aCk7CisKKyAgICAgICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBwcmV2aW91c0No
YXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFs
VGVtcFdpZHRoKQorICAgICAgICAgICAgICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNl
V2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7CisKKyAgICAgICAgICAgIGlmICghbV9hcHBsaWVk
U3RhcnRXaWR0aCkgeworICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0
aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJlbmRlcmVyKCksIHRydWUsIGZhbHNlKSk7
CisgICAgICAgICAgICAgICAgbV9hcHBsaWVkU3RhcnRXaWR0aCA9IHRydWU7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGFwcGx5V29yZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOworCisgICAgICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0
dGVkV2lkdGgoKSAmJiBtX2F1dG9XcmFwICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkKKyAgICAg
ICAgICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUo
KSk7CisKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwIHx8IGJyZWFrV29yZHMpIHsKKyAgICAg
ICAgICAgICAgICAvLyBJZiB3ZSBicmVhayBvbmx5IGFmdGVyIHdoaXRlLXNwYWNlLCBjb25zaWRl
ciB0aGUgY3VycmVudCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUg
d2lkdGggZm9yIHRoaXMgbGluZS4KKyAgICAgICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRl
ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZSgpICYmIG1f
Y3VycmVudENoYXJhY3RlcklzV1MgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hp
dGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWspIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQg
Y2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1fY3VycmVudC5vZmZzZXQoKSwgMSwg
Zm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpICsgKGFw
cGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDApOworICAgICAgICAgICAgICAgICAgICAv
LyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcgZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFjZQor
ICAgICAgICAgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLiBJZiBpdCBpcyBu
b3QsIGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5lZWRz
IHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJlIHRvbyBsb25nLAorICAgICAgICAgICAgICAgICAg
ICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJlYWsgdG8gdGhlIHNwYWNlIGFuZCBza2lwIGFsbAor
ICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHdoaXRlc3BhY2UuCisgICAgICAgICAg
ICAgICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChjaGFy
V2lkdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lV2FzVG9vV2lkZSA9IHRydWU7
CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5s
aW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9k
aWZ5TWUubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1f
Y3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJhaWxpbmdXaGl0ZXNwYWNlKG1vZGlmeU1lLCBtX2xp
bmVJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9vV2lk
ZSB8fCAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNh
bkh5cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5
TWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlIeXBoZW5hdGluZyhyZW5kZXJU
ZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1f
YmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1p
dEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1
cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3VycmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdp
ZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdo
aXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBtb2RpZnlNZSwgbV9jdXJyZW50Lm5leHRC
cmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVC
cmVha2VyLm1faHlwaGVuYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRF
bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmF0VGV4dFBhcmFncmFwaFNlcGFyYXRv
cigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNl
cyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVu
dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50
KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJy
b2tlQ2xlYW5seSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVu
dC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCk7CisgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZz
ZXQoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PihtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIo
KSkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigp
KS50ZXh0TGVuZ3RoKCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9y
eS5yZW5kZXJlcigpKS5jaGFyYWN0ZXJBdChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkgLSAx
KSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAg
ICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpICYmIG1fbGluZUJyZWFrSGlzdG9yeS5v
ZmZzZXQoKSAhPSAodW5zaWduZWQpd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1l
YXN1cmVtZW50LndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRo
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNl
dCA9IG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBjaGFyV2lkdGg7CisgICAgICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8g
RGlkbid0IGZpdC4gSnVtcCB0byB0aGUgZW5kIHVubGVzcyB0aGVyZSdzIHN0aWxsIGFuIG9wcG9y
dHVuaXR5IHRvIGNvbGxhcHNlIHdoaXRlc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIGlmICht
X2lnbm9yaW5nU3BhY2VzIHx8ICFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSB8fCAhcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghYmV0d2VlbldvcmRzIHx8IChtaWRXb3JkQnJl
YWsgJiYgIW1fYXV0b1dyYXApKQorICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRV
bmNvbW1pdHRlZFdpZHRoKC1hZGRpdGlvbmFsVGVtcFdpZHRoKTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKGh5cGhlbldpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFj
dCB0aGUgd2lkdGggb2YgdGhlIHNvZnQgaHlwaGVuIG91dCBzaW5jZSB3ZSBmaXQgb24gYSBsaW5l
LgorICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1o
eXBoZW5XaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoeXBoZW5XaWR0aCA9IDA7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgIGlmIChjID09ICdcbicgJiYgbV9wcmVzZXJ2ZXNOZXdsaW5lKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm9mZnNl
dCgpKQorICAgICAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xp
bmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOworICAgICAgICAgICAgICAgIGNvbW1pdExpbmVC
cmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNl
dCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAg
IG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBtX2xpbmVJ
bmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAg
JiYgYmV0d2VlbldvcmRzKSB7CisgICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJy
ZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3Vy
cmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgd3JhcFcgPSAw
OworICAgICAgICAgICAgICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgbm90IHdyYXAg
aW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25jZSBpdCBoYXMgaGFkIGFuCisgICAgICAgICAgICAg
ICAgLy8gb3Bwb3J0dW5pdHkgdG8gYnJlYWsgYWZ0ZXIgYSB3b3JkLgorICAgICAgICAgICAgICAg
IGJyZWFrV29yZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1p
ZFdvcmRCcmVhayAmJiAhVTE2X0lTX1RSQUlMKGMpICYmICEoVV9HRVRfR0NfTUFTSyhjKSAmIFVf
R0NfTV9NQVNLKSkgeworICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgYXMgYSBicmVh
a2FibGUgcG9zaXRpb24gaW4gY2FzZQorICAgICAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgZW5k
IHdpZHRoIGZvcmNlcyBhIGJyZWFrLgorICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9y
eS5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJy
ZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBtaWRXb3JkQnJl
YWsgJj0gKGJyZWFrV29yZHMgfHwgYnJlYWtBbGwpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoYmV0d2VlbldvcmRzKSB7CisgICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNw
YWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAg
ICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYg
d29yZE1lYXN1cmVtZW50LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAg
ICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQub2Zmc2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGlmICghbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VX
aGl0ZVNwYWNlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBuZXds
aW5lLCBvciBpZiB3ZSBlbmNvdW50ZXIgYQorICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFj
ZSwgd2UgbmVlZCB0byBnbyBhaGVhZCBhbmQgYnJlYWsgdXAgdGhpcworICAgICAgICAgICAgICAg
IC8vIHJ1biBhbmQgZW50ZXIgYSBtb2RlIHdoZXJlIHdlIHN0YXJ0IGNvbGxhcHNpbmcgc3BhY2Vz
LgorICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZp
b3VzQ2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgICAgICAgICBtX2lnbm9yaW5nU3Bh
Y2VzID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBXZSBqdXN0IGVudGVyZWQgYSBt
b2RlIHdoZXJlIHdlIGFyZSBpZ25vcmluZworICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZXMu
IENyZWF0ZSBhIG1pZHBvaW50IHRvIHRlcm1pbmF0ZSB0aGUgcnVuCisgICAgICAgICAgICAgICAg
ICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICBtX2xp
bmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMobV9zdGFydE9mSWdub3JlZFNwYWNl
cyk7CisgICAgICAgICAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50
c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoKSwg
VHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1faWdub3JpbmdTcGFjZXMp
IHsKKyAgICAgICAgICAgIC8vIFN0b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlz
CisgICAgICAgICAgICAvLyBuZXcgcG9pbnQuCisgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2Vz
ID0gZmFsc2U7CisgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNw
YWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRN
ZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdvcmRNZWFzdXJlbWVudHMubGFzdCgp
LndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3Vy
cmVudC5vZmZzZXQoKTsgLy8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9m
IHRoZSBpZ25vcmVkIHNwYWNlcy4KKyAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3Rv
cElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCBt
X2N1cnJlbnQub2Zmc2V0KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc1NWR1RleHQg
JiYgbV9jdXJyZW50Lm9mZnNldCgpKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBjcmVhdGlvbiBv
ZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2ggYWJzb2x1dGUgcG9zaXRpb25lZCBjaGFyYWN0ZXIg
KHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQgY2h1bmtzKS4KKyAgICAgICAgICAgIGlmIChkb3du
Y2FzdDxSZW5kZXJTVkdJbmxpbmVUZXh0PihyZW5kZXJUZXh0KS5jaGFyYWN0ZXJTdGFydHNOZXdU
ZXh0Q2h1bmsobV9jdXJyZW50Lm9mZnNldCgpKSkKKyAgICAgICAgICAgICAgICBlbnN1cmVDaGFy
YWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQpOworICAgICAg
ICB9CisKKyAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIXByZXZpb3Vz
Q2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5z
ZXRSZW5kZXJlcihtX2N1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgICAgICAgICBtX3N0YXJ0T2ZJ
Z25vcmVkU3BhY2VzLnNldE9mZnNldChtX2N1cnJlbnQub2Zmc2V0KCkpOworICAgICAgICAgICAg
Ly8gU3BhY2VzIGFmdGVyIHJpZ2h0LWFsaWduZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVh
ayBnZXQgY29sbGFwc2VkIGF3YXkgY29tcGxldGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZworICAg
ICAgICAgICAgLy8gc3BhY2UgZG9lc24ndCBzZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20g
dGhlIHJpZ2h0LWhhbmQgZWRnZS4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2Fy
ZGxlc3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2Vs
aW5pbmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRzLgorICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVj
dCAmJiBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm9mZnNldCgpICYmIG1fbmV4dE9iamVjdC0+aXNC
UigpICYmIChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxl
LnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpIHsKKyAgICAgICAgICAgICAgICBtX3N0YXJ0
T2ZJZ25vcmVkU3BhY2VzLnNldE9mZnNldChtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm9mZnNldCgp
IC0gMSk7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHRyYWls
aW5nIHNwYWNlIHN0YXJ0IGlnbm9yaW5nIGl0IG5vdyBzbyBpdCBjb2xsYXBzZXMgYXdheS4KKyAg
ICAgICAgICAgICAgICBpZiAobV9jdXJyZW50Lm9mZnNldCgpID09IHJlbmRlclRleHQudGV4dExl
bmd0aCgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdGFy
dElnbm9yaW5nU3BhY2VzKG1fc3RhcnRPZklnbm9yZWRTcGFjZXMpOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTICYmIHByZXZp
b3VzQ2hhcmFjdGVySXNXUykgeworICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJy
ZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpKQorICAgICAgICAgICAgICAgIG1f
bGluZUJyZWFrSGlzdG9yeS5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5v
ZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgfQor
CisgICAgICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2VzKQorICAgICAgICAgICAgbV90cmFpbGluZ09iamVj
dHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKGRvd25jYXN0PFJlbmRlclRleHQ+KG1fY3VycmVudC5y
ZW5kZXJlcigpKSk7CisgICAgICAgIGVsc2UgaWYgKCFtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VX
aGl0ZVNwYWNlKCkgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAgICAgICBt
X3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOworCisgICAgICAgIG1fYXRTdGFydCA9IGZhbHNlOwor
ICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJh
Y3Rlcik7CisgICAgfQorCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9y
LnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwor
CisgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7
CisgICAgV29yZE1lYXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRz
Lmxhc3QoKTsKKyAgICB3b3JkTWVhc3VyZW1lbnQucmVuZGVyZXIgPSAmcmVuZGVyVGV4dDsKKwor
ICAgIC8vIElNUE9SVEFOVDogY3VycmVudC5tX3BvcyBpcyA+IGxlbmd0aCBoZXJlIQorICAgIGZs
b2F0IGFkZGl0aW9uYWxUZW1wV2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0
aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwg
Zm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworICAg
IHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKKyAgICB3b3JkTWVhc3Vy
ZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOworICAgIHdvcmRNZWFzdXJlbWVu
dC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMgPyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCArIHdv
cmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OworICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggKz0g
bGFzdFNwYWNlV29yZFNwYWNpbmc7CisKKyAgICBmbG9hdCBpbmxpbmVMb2dpY2FsVGVtcFdpZHRo
ID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5kZXJlcigpLCAhbV9hcHBsaWVkU3Rh
cnRXaWR0aCwgbV9pbmNsdWRlRW5kV2lkdGgpOworICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRX
aWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoICsgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7CisKKyAg
ICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxsYmFj
a0ZvbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMu
c3dhcChmYWxsYmFja0ZvbnRzKTsKKyAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7CisKKyAgICBp
ZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBh
ZGRpdGlvbmFsVGVtcFdpZHRoKQorICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFj
ZVdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgsIGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOworCisg
ICAgbV9pbmNsdWRlRW5kV2lkdGggPSBmYWxzZTsKKworICAgIGlmICghbV93aWR0aC5maXRzT25M
aW5lKCkpIHsKKyAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSkgeworICAgICAgICAgICAgbV9saW5l
QnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAg
ICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgp
LCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGlt
aXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5j
dXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lk
dGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNw
YWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGlu
ZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAg
ICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1fbGluZUJyZWFrSGlzdG9yeS5wcmV2aW91c0luU2Ft
ZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkg
eworICAgICAgICAgICAgaHlwaGVuYXRlZCA9IHRydWU7CisgICAgICAgICAgICBtX2F0RW5kID0g
dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBi
b29sIHRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24oUmVuZGVyVGV4dCYgbmV4dFRleHQp
Cit7CisgICAgVUNoYXIgYyA9IG5leHRUZXh0LmNoYXJhY3RlckF0KDApOworICAgIHJldHVybiBj
ID09ICcgJyB8fCBjID09ICdcdCcgfHwgKGMgPT0gJ1xuJyAmJiAhbmV4dFRleHQucHJlc2VydmVz
TmV3bGluZSgpKTsKK30KKworaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0
VGhpc1Bvc2l0aW9uKCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgbm8td3JhcCBhbmQgaGF2ZSBmb3Vu
ZCBhIGxpbmUtYnJlYWtpbmcgb3Bwb3J0dW5pdHkgYWxyZWFkeSB0aGVuIHdlIHNob3VsZCB0YWtl
IGl0LgorICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgIW1fd2lkdGguZml0c09u
TGluZShtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSAmJiBtX2N1cnJXUyA9PSBOT1dSQVApCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQXZvaWQgYnJlYWtpbmcgb24gZW1wdHkgaW5s
aW5lcy4KKyAgICBpZiAoaXM8UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpICYm
IGlzRW1wdHlJbmxpbmUoZG93bmNhc3Q8UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVy
KCkpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQXZvaWQgYnJlYWtpbmcgYmVm
b3JlIGVtcHR5IGlubGluZXMgKGFzIGxvbmcgYXMgdGhlIGN1cnJlbnQgb2JqZWN0IGlzbid0IHJl
cGxhY2VkKS4KKyAgICBpZiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc1JlcGxhY2VkKCkgJiYg
aXM8UmVuZGVySW5saW5lPihtX25leHRPYmplY3QpICYmIGlzRW1wdHlJbmxpbmUoZG93bmNhc3Q8
UmVuZGVySW5saW5lPigqbV9uZXh0T2JqZWN0KSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIFJldHVybiBlYXJseSBpZiB3ZSBhdXRvd3JhcCBhbmQgdGhlIGN1cnJlbnQgY2hhcmFj
dGVyIGlzIGEgc3BhY2UgYXMgd2Ugd2lsbCBhbHdheXMgd2FudCB0byBicmVhayBhdCBzdWNoIGEg
cG9zaXRpb24uCisgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFj
ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4
dE9iamVjdC0+aXNMaW5lQnJlYWtPcHBvcnR1bml0eSgpKQorICAgICAgICByZXR1cm4gbV9hdXRv
V3JhcDsKKworICAgIGJvb2wgbmV4dElzQXV0b1dyYXBwaW5nVGV4dCA9IGlzPFJlbmRlclRleHQ+
KG1fbmV4dE9iamVjdCkgJiYgKG1fYXV0b1dyYXAgfHwgbV9uZXh0T2JqZWN0LT5zdHlsZSgpLmF1
dG9XcmFwKCkpOworICAgIGlmICghbmV4dElzQXV0b1dyYXBwaW5nVGV4dCkKKyAgICAgICAgcmV0
dXJuIG1fYXV0b1dyYXA7CisgICAgUmVuZGVyVGV4dCYgbmV4dFJlbmRlclRleHQgPSBkb3duY2Fz
dDxSZW5kZXJUZXh0PigqbV9uZXh0T2JqZWN0KTsKKyAgICBib29sIGN1cnJlbnRJc1RleHRPckVt
cHR5SW5saW5lID0gaXM8UmVuZGVyVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKSB8fCAoaXM8
UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpICYmIGlzRW1wdHlJbmxpbmUoZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpKSk7CisgICAgaWYgKCFj
dXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSkKKyAgICAgICAgcmV0dXJuIG1fYXV0b1dyYXAgJiYg
IW1fY3VycmVudC5yZW5kZXJlcigpLT5pc1J1YnlSdW4oKTsKKworICAgIGJvb2wgY2FuQnJlYWtI
ZXJlID0gIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2Fi
bGVQb3NpdGlvbihuZXh0UmVuZGVyVGV4dCk7CisKKyAgICAvLyBTZWUgaWYgYXR0ZW1wdGluZyB0
byBmaXQgYmVsb3cgZmxvYXRzIGNyZWF0ZXMgbW9yZSBhdmFpbGFibGUgd2lkdGggb24gdGhlIGxp
bmUuCisgICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRX
aWR0aCgpKQorICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKG1fbGluZUluZm8uaXNGaXJz
dExpbmUoKSk7CisKKyAgICBib29sIGNhblBsYWNlT25MaW5lID0gbV93aWR0aC5maXRzT25MaW5l
KCkgfHwgIW1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZTsKKworICAgIGlmIChjYW5QbGFjZU9u
TGluZSAmJiBjYW5CcmVha0hlcmUpCisgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdp
ZHRoKG5leHRSZW5kZXJUZXh0KTsKKworICAgIHJldHVybiBjYW5CcmVha0hlcmU7Cit9CisKK2lu
bGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVk
ZWQoKQoreworICAgIGJvb2wgY2hlY2tGb3JCcmVhayA9IGNhbkJyZWFrQXRUaGlzUG9zaXRpb24o
KTsKKworICAgIGlmIChjaGVja0ZvckJyZWFrICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9pZ25v
cmluZ1NwYWNlcykpIHsKKyAgICAgICAgLy8gaWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0byBnZXQg
YmVsb3cgdGhlbS4KKyAgICAgICAgaWYgKG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1f
aWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKQor
ICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgICAgICBpZiAobV93
aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB7CisgICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fd2lkdGguZml0QmVsb3dG
bG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKKworICAgICAgICAvLyB8d2lkdGh8IG1h
eSBoYXZlIGJlZW4gYWRqdXN0ZWQgYmVjYXVzZSB3ZSBnb3Qgc2hvdmVkIGRvd24gcGFzdCBhIGZs
b2F0ICh0aHVzCisgICAgICAgIC8vIGdpdmluZyB1cyBtb3JlIHJvb20pLCBzbyB3ZSBuZWVkIHRv
IHJldGVzdCwgYW5kIG9ubHkganVtcCB0bworICAgICAgICAvLyB0aGUgZW5kIGxhYmVsIGlmIHdl
IHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGluZS4gLWR3aAorICAgICAgICBpZiAoIW1fd2lkdGgu
Zml0c09uTGluZShtX2lnbm9yaW5nU3BhY2VzKSkgeworICAgICAgICAgICAgbV9hdEVuZCA9IHRy
dWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fYmxv
Y2tTdHlsZS5hdXRvV3JhcCgpICYmICFtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5j
b21taXR0ZWRXaWR0aCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBjb250YWluZXIgYXV0b3dyYXBz
IGJ1dCB0aGUgY3VycmVudCBjaGlsZCBkb2VzIG5vdCB0aGVuIHdlIHN0aWxsIG5lZWQgdG8gZW5z
dXJlIHRoYXQgaXQKKyAgICAgICAgLy8gd3JhcHMgYW5kIG1vdmVzIGJlbG93IGFueSBmbG9hdHMu
CisgICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgp
KTsKKyAgICB9CisKKyAgICBpZiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc0Zsb2F0aW5nT3JP
dXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJyZW50
LnJlbmRlcmVyKCk7CisgICAgICAgIGlmIChtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSAmJiBt
X2F1dG9XcmFwICYmICFtX2xhc3RPYmplY3QtPmlzUnVieVJ1bigpICYmICghbV9sYXN0T2JqZWN0
LT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdlc1RvQnJlYWspICYmICghaXM8UmVuZGVyTGlzdE1h
cmtlcj4oKm1fbGFzdE9iamVjdCkgfHwgZG93bmNhc3Q8UmVuZGVyTGlzdE1hcmtlcj4oKm1fbGFz
dE9iamVjdCkuaXNJbnNpZGUoKSkpCisgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJl
bnRXaWR0aCgqbV9uZXh0T2JqZWN0KTsKKyAgICB9Cit9CisKK2lubGluZSBUcmFpbGluZ09iamVj
dHM6OkNvbGxhcHNlRmlyc3RTcGFjZU9yTm90IGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0
YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKK3sK
KyAgICAvLyBDaGVjayB0byBzZWUgaWYgb3VyIGxhc3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2lu
dCBiZXlvbmQgdGhlIGxpbmUgYnJlYWsuIElmIHNvLAorICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUg
bGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWlsaW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQg
cG9pbnQgZG9lc24ndAorICAgIC8vIHByZXNlcnZlIHdoaXRlc3BhY2UuCisgICAgaWYgKGxCcmVh
ay5yZW5kZXJlcigpICYmIGxpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cygpICYmICEobGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgJSAyKSkgeworICAgICAgICBJbmxpbmVJdGVy
YXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBvaW50U3RhdGUubWlkcG9pbnRzKCkuZGF0YSgpOwor
ICAgICAgICBJbmxpbmVJdGVyYXRvciYgZW5kcG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50
U3RhdGUubnVtTWlkcG9pbnRzKCkgLSAyXTsKKyAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Im
IHN0YXJ0cG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkg
LSAxXTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3IgY3VycnBvaW50ID0gZW5kcG9pbnQ7CisgICAg
ICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5kKCkgJiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQg
JiYgY3VycnBvaW50ICE9IGxCcmVhaykKKyAgICAgICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQo
KTsKKyAgICAgICAgaWYgKGN1cnJwb2ludCA9PSBsQnJlYWspIHsKKyAgICAgICAgICAgIC8vIFdl
IGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUgdGhlIHN0YXJ0IHBvaW50LiBTaGF2ZSBvZmYgdGhl
IHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuZGVjcmVhc2VOdW1N
aWRwb2ludHMoKTsKKyAgICAgICAgICAgIGlmIChlbmRwb2ludC5yZW5kZXJlcigpLT5zdHlsZSgp
LmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZHBvaW50LnJlbmRlcmVyKCktPmlzVGV4dCgpKSB7
CisgICAgICAgICAgICAgICAgZW5kcG9pbnQuZmFzdERlY3JlbWVudCgpOworICAgICAgICAgICAg
ICAgIHJldHVybiBUcmFpbGluZ09iamVjdHM6OkRvTm90Q29sbGFwc2VGaXJzdFNwYWNlOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBUcmFpbGluZ09iamVjdHM6
OkNvbGxhcHNlRmlyc3RTcGFjZTsKK30KKworaW5saW5lIElubGluZUl0ZXJhdG9yIEJyZWFraW5n
Q29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkKK3sKKyAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5
LmN1cnJlbnQoKSA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpIHsKKyAgICAgICAgaWYgKCFtX2xp
bmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSB8fCAhbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVy
KCktPmlzQlIoKSkgeworICAgICAgICAgICAgLy8gd2UganVzdCBhZGQgYXMgbXVjaCBhcyBwb3Nz
aWJsZQorICAgICAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJFICYm
ICFtX2N1cnJlbnQub2Zmc2V0KCkpCisgICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRD
dXJyZW50V2lkdGgoKm1fbGFzdE9iamVjdCwgbV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFz
dE9iamVjdC0+bGVuZ3RoKCkgOiAwKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG1fbGluZUJyZWFr
SGlzdG9yeS5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgZXZlciBicmVh
ayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBpZiB3ZSBjYW4gaGVscCBpdC4KKyAgICAgICAgICAg
ICAgICAvLyBUaGVyZSdzIG5vIHJvb20gYXQgYWxsLiBXZSBqdXN0IGhhdmUgdG8gYmUgb24gdGhp
cyBsaW5lLAorICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4K
KyAgICAgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9jdXJyZW50
LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIvb2Jq
ZWN0LgorICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSA9PSBtX3Jlc29s
dmVyLnBvc2l0aW9uKCkpCisgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50
KCk7CisgICAgfSBlbHNlIGlmICghbV9jdXJyZW50Lm9mZnNldCgpICYmICFtX3dpZHRoLmNvbW1p
dHRlZFdpZHRoKCkgJiYgbV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCkgJiYgIW1faGFkVW5jb21t
aXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQpIHsKKyAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1
cnJlbnQgb2JqZWN0IHRvIHRoZSBuZXh0IGxpbmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNv
bnRlbnQsIGJ1dCBpdCBpcyBzdGlsbCBjb25zaWRlcmVkIGVtcHR5LgorICAgICAgICAvLyBFbXB0
eSBpbmxpbmUgZWxlbWVudHMgbGlrZSA8c3Bhbj48L3NwYW4+IGNhbiBwcm9kdWNlIHN1Y2ggbGlu
ZXMgYW5kIG5vdyB3ZSBqdXN0IGlnbm9yZSB0aGVzZSBicmVhayBvcHBvcnR1bml0aWVzCisgICAg
ICAgIC8vIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUsIGlmIG5vIHdpZHRoIGhhcyBiZWVuIGNvbW1p
dHRlZCB5ZXQuCisgICAgICAgIC8vIEJlaGF2ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkg
YW5kIGNvbnN1bWUgYXQgbGVhc3Qgb25lIG9iamVjdC4KKyAgICAgICAgbV9saW5lQnJlYWtIaXN0
b3J5LmluY3JlbWVudCgpOworICAgIH0KKworICAgIC8vIFNhbml0eSBjaGVjayBvdXIgbWlkcG9p
bnRzLgorICAgIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29sbGFw
c2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0
b3J5LmN1cnJlbnQoKSk7CisKKyAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2ludHNG
b3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrSGlzdG9yeS5j
dXJyZW50KCksIGNvbGxhcHNlZCk7CisKKyAgICAvLyBXZSBtaWdodCBoYXZlIG1hZGUgbGluZUJy
ZWFrIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHBhc3QgdGhlIGVuZAorICAgIC8vIG9mIHRoZSBv
YmplY3QuIERvIHRoaXMgYWRqdXN0bWVudCB0byBtYWtlIGl0IHBvaW50IHRvIHRoZSBzdGFydAor
ICAgIC8vIG9mIHRoZSBuZXh0IG9iamVjdCBpbnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUg
cmVzdCBvZiB0aGUKKyAgICAvLyBjb2RlLgorICAgIGlmIChtX2xpbmVCcmVha0hpc3Rvcnkub2Zm
c2V0KCkpIHsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnVwZGF0ZShbXShJbmxpbmVJdGVy
YXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgIG1vZGlmeU1lLnNldE9mZnNldChtb2RpZnlN
ZS5vZmZzZXQoKSAtIDEpOworICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7CisgICAg
ICAgIH0pOworICAgIH0KKworI2lmIEVOQUJMRShDU1NfVFJBSUxJTkdfV09SRCkKKyAgICBpZiAo
bV9ibG9ja1N0eWxlLnRyYWlsaW5nV29yZCgpID09IFRyYWlsaW5nV29yZDo6UGFydGlhbGx5QmFs
YW5jZWQpCisgICAgICAgIHJldHVybiBvcHRpbWFsTGluZUJyZWFrTG9jYXRpb25Gb3JUcmFpbGlu
Z1dvcmQoKTsKKyNlbmRpZgorICAgIHJldHVybiBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgp
OworfQorCisjaWYgRU5BQkxFKENTU19UUkFJTElOR19XT1JEKQoraW5saW5lIElubGluZUl0ZXJh
dG9yIEJyZWFraW5nQ29udGV4dDo6b3B0aW1hbExpbmVCcmVha0xvY2F0aW9uRm9yVHJhaWxpbmdX
b3JkKCkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nVHJhaWxpbmdXb3JkTGVuZ3RoID0gMjA7
CisgICAgY29uc3QgZmxvYXQgb3B0aW1hbFRyYWlsaW5nTGluZVJhdGlvID0gMC4xOworICAgIElu
bGluZUl0ZXJhdG9yIGxpbmVCcmVhayA9IG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7Cisg
ICAgaWYgKCFsaW5lQnJlYWsucmVuZGVyZXIoKSB8fCAhbV9saW5lSW5mby5pc0ZpcnN0TGluZSgp
IHx8IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoKmxpbmVCcmVhay5yb290KCksIGxpbmVC
cmVhay5yZW5kZXJlcigpKSB8fCAhaXM8UmVuZGVyVGV4dD4obGluZUJyZWFrLnJlbmRlcmVyKCkp
KQorICAgICAgICByZXR1cm4gbGluZUJyZWFrOworICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQg
PSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbGluZUJyZWFrLnJlbmRlcmVyKCkpOworICAgIC8vIERv
bid0IGV2ZW4gYm90aGVyIG1lYXN1cmluZyBpZiBvdXIgcmVtYWluaW5nIGxpbmUgaGFzIG1hbnkg
Y2hhcmFjdGVycworICAgIGlmIChyZW5kZXJUZXh0LnRleHRMZW5ndGgoKSA9PSBsaW5lQnJlYWsu
b2Zmc2V0KCkgfHwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgLSBsaW5lQnJlYWsub2Zmc2V0KCkg
PiBsb25nVHJhaWxpbmdXb3JkTGVuZ3RoKQorICAgICAgICByZXR1cm4gbGluZUJyZWFrOworICAg
IGJvb2wgaXNMb29zZUNKS01vZGUgPSBtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSAmcmVuZGVy
VGV4dCAmJiBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IuaXNMb29zZUNKS01v
ZGUoKTsKKyAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUt
Pm5ic3BNb2RlKCkgPT0gU1BBQ0U7CisgICAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbiA9IGxp
bmVCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRpb24oKTsKKyAgICBpc0JyZWFrYWJsZShtX3JlbmRl
clRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IsIGxpbmVCcmVhay5vZmZzZXQoKSArIDEsIG5l
eHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtOQlNQLCBpc0xvb3NlQ0pLTW9kZSk7CisgICAgaWYg
KG5leHRCcmVha2FibGVQb3NpdGlvbiA8IDAgfHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG5leHRC
cmVha2FibGVQb3NpdGlvbikgIT0gcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkpCisgICAgICAgIHJl
dHVybiBsaW5lQnJlYWs7CisgICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0eWxl
KHJlbmRlclRleHQsIG1fbGluZUluZm8pOworICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0g
c3R5bGUuZm9udENhc2NhZGUoKTsKKyAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBkdW1teUZvbnRz
OworICAgIElubGluZUl0ZXJhdG9yIGJlc3QgPSBsaW5lQnJlYWs7CisgICAgZm9yIChzaXplX3Qg
aSA9IDE7IGkgPCBtX2xpbmVCcmVha0hpc3RvcnkuaGlzdG9yeUxlbmd0aCgpOyArK2kpIHsKKyAg
ICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIGNhbmRpZGF0ZSA9IG1fbGluZUJyZWFrSGlzdG9y
eS5nZXQoaSk7CisgICAgICAgIGlmIChjYW5kaWRhdGUucmVuZGVyZXIoKSAhPSBsaW5lQnJlYWsu
cmVuZGVyZXIoKSkKKyAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICBmbG9hdCB3aWR0
aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBjYW5kaWRhdGUub2Zmc2V0KCksIHJlbmRlclRleHQu
dGV4dExlbmd0aCgpIC0gY2FuZGlkYXRlLm9mZnNldCgpLCBmb250LCAwLCBmb250LmlzRml4ZWRQ
aXRjaCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgZHVtbXlGb250cyk7CisgICAgICAgIGlmICh3
aWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSkKKyAgICAgICAgICAgIHJldHVybiBiZXN0
OworICAgICAgICBpZiAod2lkdGggLyBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCkgPiBvcHRpbWFs
VHJhaWxpbmdMaW5lUmF0aW8pIC8vIFN1YnNlcXVlbnQgbGluZSBpcyBsb25nIGVub3VnaAorICAg
ICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsKKyAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKKyAg
ICB9CisgICAgcmV0dXJuIGJlc3Q7Cit9CisjZW5kaWYKKworfQorCisjZW5kaWYgLy8gQnJlYWtp
bmdDb250ZXh0X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0Jy
ZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9s
aW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggZjQwN2JhZjVjNTFjMTJiYWFiMmRjY2Y1YTM1MGRiNmVhMmYyZjkxZC4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgKKysrIC9kZXYvbnVs
bApAQCAtMSwxMjAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGFycyBLbm9s
bCAoa25vbGxAa2RlLm9yZykKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCwgMjAwNiwgMjAw
NywgMjAwOCwgMjAwOSwgMjAxMCwgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodCByZXNlcnZlZC4K
LSAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgot
ICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5nU2VvayBPaCA8c2hpdmFtaWRvd0BnbWFpbC5jb20+
Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQWRvYmUgU3lzdGVtcyBJbmMuIEFsbCByaWdodCByZXNl
cnZlZC4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0g
KgotICovCi0KLSNpZm5kZWYgQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVyc19oCi0jZGVmaW5l
IEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAotCi0jaW5jbHVkZSAiSHlwaGVuYXRpb24u
aCIKLSNpbmNsdWRlICJMaW5lQnJlYWtlci5oIgotI2luY2x1ZGUgIkxpbmVJbmZvLmgiCi0jaW5j
bHVkZSAiTGluZVdpZHRoLmgiCi0jaW5jbHVkZSAiUmVuZGVyQ29tYmluZVRleHQuaCIKLSNpbmNs
dWRlICJSZW5kZXJDb3VudGVyLmgiCi0jaW5jbHVkZSAiUmVuZGVySW5saW5lLmgiCi0jaW5jbHVk
ZSAiUmVuZGVyTGluZUJyZWFrLmgiCi0jaW5jbHVkZSAiUmVuZGVyTGlzdE1hcmtlci5oIgotI2lu
Y2x1ZGUgIlJlbmRlclJ1YnlSdW4uaCIKLSNpbmNsdWRlICJSZW5kZXJTVkdJbmxpbmVUZXh0Lmgi
Ci0jaW5jbHVkZSAiVHJhaWxpbmdPYmplY3RzLmgiCi0jaW5jbHVkZSAiYnJlYWtfbGluZXMuaCIK
LSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdWaWV3Lmg+Ci0jaW5jbHVkZSA8d3RmL3VuaWNvZGUv
Q2hhcmFjdGVyTmFtZXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi0vLyBXZSBkb24ndCBs
ZXQgb3VyIGxpbmUgYm94IHRyZWUgZm9yIGEgc2luZ2xlIGxpbmUgZ2V0IGFueSBkZWVwZXIgdGhh
biB0aGlzLgotY29uc3QgdW5zaWduZWQgY01heExpbmVEZXB0aCA9IDIwMDsKLQotc3RydWN0IFdv
cmRNZWFzdXJlbWVudCB7Ci0gICAgV29yZE1lYXN1cmVtZW50KCkKLSAgICAgICAgOiByZW5kZXJl
cigwKQotICAgICAgICAsIHdpZHRoKDApCi0gICAgICAgICwgc3RhcnRPZmZzZXQoMCkKLSAgICAg
ICAgLCBlbmRPZmZzZXQoMCkKLSAgICB7Ci0gICAgfQotCi0gICAgUmVuZGVyVGV4dCogcmVuZGVy
ZXI7Ci0gICAgZmxvYXQgd2lkdGg7Ci0gICAgaW50IHN0YXJ0T2Zmc2V0OwotICAgIGludCBlbmRP
ZmZzZXQ7Ci0gICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250czsKLX07Ci0KLWNs
YXNzIEJyZWFraW5nQ29udGV4dCB7Ci1wdWJsaWM6Ci0gICAgQnJlYWtpbmdDb250ZXh0KExpbmVC
cmVha2VyJiBsaW5lQnJlYWtlciwgSW5saW5lQmlkaVJlc29sdmVyJiByZXNvbHZlciwgTGluZUlu
Zm8mIGluTGluZUluZm8sIExpbmVXaWR0aCYgbGluZVdpZHRoLCBSZW5kZXJUZXh0SW5mbyYgaW5S
ZW5kZXJUZXh0SW5mbywgRmxvYXRpbmdPYmplY3QqIGluTGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSwgYm9vbCBhcHBsaWVkU3RhcnRXaWR0aCwgUmVuZGVyQmxvY2tGbG93JiBibG9jaykKLSAgICAg
ICAgOiBtX2xpbmVCcmVha2VyKGxpbmVCcmVha2VyKQotICAgICAgICAsIG1fcmVzb2x2ZXIocmVz
b2x2ZXIpCi0gICAgICAgICwgbV9jdXJyZW50KHJlc29sdmVyLnBvc2l0aW9uKCkpCi0jaWYgRU5B
QkxFKENTU19UUkFJTElOR19XT1JEKQotICAgICAgICAsIG1fbGluZUJyZWFrSGlzdG9yeShJbmxp
bmVJdGVyYXRvcihyZXNvbHZlci5wb3NpdGlvbigpKSwgYmxvY2suc3R5bGUoKS50cmFpbGluZ1dv
cmQoKSA9PSBUcmFpbGluZ1dvcmQ6OlBhcnRpYWxseUJhbGFuY2VkID8gNSA6IDEpCi0jZWxzZQot
ICAgICAgICAsIG1fbGluZUJyZWFrSGlzdG9yeShJbmxpbmVJdGVyYXRvcihyZXNvbHZlci5wb3Np
dGlvbigpKSwgMSkKLSNlbmRpZgotICAgICAgICAsIG1fYmxvY2soYmxvY2spCi0gICAgICAgICwg
bV9sYXN0T2JqZWN0KG1fY3VycmVudC5yZW5kZXJlcigpKQotICAgICAgICAsIG1fbmV4dE9iamVj
dChudWxscHRyKQotICAgICAgICAsIG1fY3VycmVudFN0eWxlKG51bGxwdHIpCi0gICAgICAgICwg
bV9ibG9ja1N0eWxlKGJsb2NrLnN0eWxlKCkpCi0gICAgICAgICwgbV9saW5lSW5mbyhpbkxpbmVJ
bmZvKQotICAgICAgICAsIG1fcmVuZGVyVGV4dEluZm8oaW5SZW5kZXJUZXh0SW5mbykKLSAgICAg
ICAgLCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUoaW5MYXN0RmxvYXRGcm9tUHJldmlvdXNM
aW5lKQotICAgICAgICAsIG1fd2lkdGgobGluZVdpZHRoKQotICAgICAgICAsIG1fY3VycldTKE5P
Uk1BTCkKLSAgICAgICAgLCBtX2xhc3RXUyhOT1JNQUwpCi0gICAgICAgICwgbV9wcmVzZXJ2ZXNO
ZXdsaW5lKGZhbHNlKQotICAgICAgICAsIG1fYXRTdGFydCh0cnVlKQotICAgICAgICAsIG1faWdu
b3JpbmdTcGFjZXMoZmFsc2UpCi0gICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZShm
YWxzZSkKLSAgICAgICAgLCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTKGZhbHNlKQotICAgICAgICAs
IG1fYXBwbGllZFN0YXJ0V2lkdGgoYXBwbGllZFN0YXJ0V2lkdGgpCi0gICAgICAgICwgbV9pbmNs
dWRlRW5kV2lkdGgodHJ1ZSkKLSAgICAgICAgLCBtX2F1dG9XcmFwKGZhbHNlKQotICAgICAgICAs
IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZShmYWxzZSkKLSAgICAgICAgLCBtX2Zsb2F0c0Zp
dE9uTGluZSh0cnVlKQotICAgICAgICAsIG1fY29sbGFwc2VXaGl0ZVNwYWNlKGZhbHNlKQotICAg
ICAgICAsIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGgobV9saW5lSW5mby5wcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHkoKSkKLSAgICAgICAgLCBtX2FsbG93SW1hZ2VzVG9CcmVhayghYmxvY2suZG9jdW1l
bnQoKS5pblF1aXJrc01vZGUoKSB8fCAhYmxvY2suaXNUYWJsZUNlbGwoKSB8fCAhbV9ibG9ja1N0
eWxlLmxvZ2ljYWxXaWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCi0gICAgICAgICwgbV9hdEVu
ZChmYWxzZSkKLSAgICAgICAgLCBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50KGZh
bHNlKQotICAgICAgICAsIG1fbGluZU1pZHBvaW50U3RhdGUocmVzb2x2ZXIubWlkcG9pbnRTdGF0
ZSgpKQotICAgIHsKLSAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFu
bHkoZmFsc2UpOwotICAgIH0KLQotICAgIFJlbmRlck9iamVjdCogY3VycmVudE9iamVjdCgpIHsg
cmV0dXJuIG1fY3VycmVudC5yZW5kZXJlcigpOyB9Ci0gICAgSW5saW5lSXRlcmF0b3IgbGluZUJy
ZWFrKCkgeyByZXR1cm4gbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKTsgfQotICAgIExpbmVX
aWR0aCYgbGluZVdpZHRoKCkgeyByZXR1cm4gbV93aWR0aDsgfQotICAgIGJvb2wgYXRFbmQoKSB7
IHJldHVybiBtX2F0RW5kOyB9Ci0KLSAgICB2b2lkIGluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0
KCk7Ci0KLSAgICB2b2lkIGluY3JlbWVudCgpOwotCi0gICAgdm9pZCBoYW5kbGVCUihFQ2xlYXIm
KTsKLSAgICB2b2lkIGhhbmRsZU91dE9mRmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+
JiBwb3NpdGlvbmVkT2JqZWN0cyk7Ci0gICAgdm9pZCBoYW5kbGVGbG9hdCgpOwotICAgIHZvaWQg
aGFuZGxlRW1wdHlJbmxpbmUoKTsKLSAgICB2b2lkIGhhbmRsZVJlcGxhY2VkKCk7Ci0gICAgYm9v
bCBoYW5kbGVUZXh0KFdvcmRNZWFzdXJlbWVudHMmLCBib29sJiBoeXBoZW5hdGVkLCB1bnNpZ25l
ZCYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpOwotICAgIGJvb2wgY2FuQnJlYWtBdFRoaXNQ
b3NpdGlvbigpOwotICAgIHZvaWQgY29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKTsK
LSAgICBJbmxpbmVJdGVyYXRvciBoYW5kbGVFbmRPZkxpbmUoKTsKLSNpZiBFTkFCTEUoQ1NTX1RS
QUlMSU5HX1dPUkQpCi0gICAgSW5saW5lSXRlcmF0b3Igb3B0aW1hbExpbmVCcmVha0xvY2F0aW9u
Rm9yVHJhaWxpbmdXb3JkKCk7Ci0jZW5kaWYKLQotICAgIHZvaWQgY2xlYXJMaW5lQnJlYWtJZkZp
dHNPbkxpbmUoYm9vbCBpZ25vcmluZ1RyYWlsaW5nU3BhY2UgPSBmYWxzZSkKLSAgICB7Ci0gICAg
ICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoaWdub3JpbmdUcmFpbGluZ1NwYWNlKSB8fCBtX2xh
c3RXUyA9PSBOT1dSQVApCi0gICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuY2xlYXIoKTsK
LSAgICB9Ci0KLSAgICB2b2lkIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKFJlbmRlck9i
amVjdCYgb2JqZWN0LCB1bnNpZ25lZCBvZmZzZXQgPSAwLCBpbnQgbmV4dEJyZWFrID0gLTEpCi0g
ICAgewotICAgICAgICBtX3dpZHRoLmNvbW1pdCgpOwotICAgICAgICBtX2xpbmVCcmVha0hpc3Rv
cnkubW92ZVRvKCZvYmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKLSAgICB9Ci0KLXByaXZhdGU6
Ci0gICAgLy8gVGhpcyBjbGFzcyBrZWVwcyBhIHNsaWRpbmcgd2luZG93IG9mIHRoZSBwYXN0IG4g
bG9jYXRpb25zIGZvciBhbiBJbmxpbmVJdGVyYXRvci4KLSAgICBjbGFzcyBJbmxpbmVJdGVyYXRv
ckhpc3RvcnkgOiBwcml2YXRlIFZlY3RvcjxJbmxpbmVJdGVyYXRvciwgMT4gewotICAgIHB1Ymxp
YzoKLSAgICAgICAgSW5saW5lSXRlcmF0b3JIaXN0b3J5KCkgPSBkZWxldGU7Ci0gICAgICAgIElu
bGluZUl0ZXJhdG9ySGlzdG9yeShjb25zdCBJbmxpbmVJdGVyYXRvciYgaW5pdGlhbCwgc2l6ZV90
IGNhcGFjaXR5KQotICAgICAgICAgICAgOiBtX2NhcGFjaXR5KGNhcGFjaXR5KQotICAgICAgICB7
Ci0gICAgICAgICAgICBBU1NFUlQoY2FwYWNpdHkgPiAwKTsKLSAgICAgICAgICAgIHRoaXMtPmFw
cGVuZChpbml0aWFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcHVzaChzdGQ6OmZ1bmN0
aW9uPHZvaWQoSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKT4gdXBkYXRlcikKLSAgICAgICAgewot
ICAgICAgICAgICAgQVNTRVJUKCF0aGlzLT5pc0VtcHR5KCkpOwotICAgICAgICAgICAgaWYgKG1f
Y2FwYWNpdHkgIT0gMSkKLSAgICAgICAgICAgICAgICB0aGlzLT5pbnNlcnQoMCwgSW5saW5lSXRl
cmF0b3IodGhpcy0+YXQoMCkpKTsKLSAgICAgICAgICAgIHVwZGF0ZXIodGhpcy0+YXQoMCkpOwot
ICAgICAgICAgICAgaWYgKG1fY2FwYWNpdHkgIT0gMSkKLSAgICAgICAgICAgICAgICB0aGlzLT5y
ZXNpemUobV9jYXBhY2l0eSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShzdGQ6
OmZ1bmN0aW9uPHZvaWQoSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKT4gdXBkYXRlcikKLSAgICAg
ICAgewotICAgICAgICAgICAgQVNTRVJUKCF0aGlzLT5pc0VtcHR5KCkpOwotICAgICAgICAgICAg
dXBkYXRlcih0aGlzLT5hdCgwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkucmVuZGVyZXIoKTsgfQotICAg
ICAgICB1bnNpZ25lZCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5vZmZzZXQo
KTsgfQotICAgICAgICBib29sIGF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpIGNvbnN0IHsgcmV0
dXJuIHRoaXMtPmF0KDApLmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpOyB9Ci0gICAgICAgIFVD
aGFyIHByZXZpb3VzSW5TYW1lTm9kZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLnByZXZp
b3VzSW5TYW1lTm9kZSgpOyB9Ci0gICAgICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBnZXQoc2l6
ZV90IGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KGkpOyB9OwotICAgICAgICBjb25zdCBJbmxp
bmVJdGVyYXRvciYgY3VycmVudCgpIGNvbnN0IHsgcmV0dXJuIGdldCgwKTsgfQotICAgICAgICBz
aXplX3QgaGlzdG9yeUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPnNpemUoKTsgfQotCi0g
ICAgICAgIHZvaWQgbW92ZVRvKFJlbmRlck9iamVjdCogb2JqZWN0LCB1bnNpZ25lZCBvZmZzZXQs
IGludCBuZXh0QnJlYWsgPSAtMSkKLSAgICAgICAgewotICAgICAgICAgICAgcHVzaChbJl0oSW5s
aW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7Ci0gICAgICAgICAgICAgICAgbW9kaWZ5TWUubW92ZVRv
KG9iamVjdCwgb2Zmc2V0LCBuZXh0QnJlYWspOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0K
LQotICAgICAgICB2b2lkIGluY3JlbWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0
ZShbXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKLSAgICAgICAgICAgICAgICBtb2RpZnlN
ZS5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9p
ZCBjbGVhcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goW10oSW5saW5lSXRlcmF0b3Im
IG1vZGlmeU1lKSB7Ci0gICAgICAgICAgICAgICAgbW9kaWZ5TWUuY2xlYXIoKTsKLSAgICAgICAg
ICAgIH0pOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCBzaXplX3Qg
bV9jYXBhY2l0eTsKLSAgICB9OwotCi0gICAgTGluZUJyZWFrZXImIG1fbGluZUJyZWFrZXI7Ci0g
ICAgSW5saW5lQmlkaVJlc29sdmVyJiBtX3Jlc29sdmVyOwotCi0gICAgSW5saW5lSXRlcmF0b3Ig
bV9jdXJyZW50OwotICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeSBtX2xpbmVCcmVha0hpc3Rvcnk7
Ci0gICAgSW5saW5lSXRlcmF0b3IgbV9zdGFydE9mSWdub3JlZFNwYWNlczsKLQotICAgIFJlbmRl
ckJsb2NrRmxvdyYgbV9ibG9jazsKLSAgICBSZW5kZXJPYmplY3QqIG1fbGFzdE9iamVjdDsKLSAg
ICBSZW5kZXJPYmplY3QqIG1fbmV4dE9iamVjdDsKLQotICAgIGNvbnN0IFJlbmRlclN0eWxlKiBt
X2N1cnJlbnRTdHlsZTsKLQotICAgIC8vIEZpcmVmb3ggYW5kIE9wZXJhIHdpbGwgYWxsb3cgYSB0
YWJsZSBjZWxsIHRvIGdyb3cgdG8gZml0IGFuIGltYWdlIGluc2lkZSBpdCB1bmRlcgotICAgIC8v
IHZlcnkgc3BlY2lmaWMgY2lyY3Vtc3RhbmNlcyAoaW4gb3JkZXIgdG8gbWF0Y2ggY29tbW9uIFdp
bklFIHJlbmRlcmluZ3MpLgotICAgIC8vIE5vdCBzdXBwb3J0aW5nIHRoZSBxdWlyayBoYXMgY2F1
c2VkIHVzIHRvIG1pcy1yZW5kZXIgc29tZSByZWFsIHNpdGVzLiAoU2VlIEJ1Z3ppbGxhIDEwNTE3
LikKLSAgICBSZW5kZXJTdHlsZSYgbV9ibG9ja1N0eWxlOwotCi0gICAgTGluZUluZm8mIG1fbGlu
ZUluZm87Ci0KLSAgICBSZW5kZXJUZXh0SW5mbyYgbV9yZW5kZXJUZXh0SW5mbzsKLQotICAgIEZs
b2F0aW5nT2JqZWN0KiBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmU7Ci0KLSAgICBMaW5lV2lk
dGggbV93aWR0aDsKLQotICAgIEVXaGl0ZVNwYWNlIG1fY3VycldTOwotICAgIEVXaGl0ZVNwYWNl
IG1fbGFzdFdTOwotCi0gICAgYm9vbCBtX3ByZXNlcnZlc05ld2xpbmU7Ci0gICAgYm9vbCBtX2F0
U3RhcnQ7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgb25seSBpZiB3aGl0ZXNwYWNl
IGlzbid0IHNldCB0byBQUkUsIGFuZCBpdCB0ZWxscyB1cyB3aGV0aGVyCi0gICAgLy8gb3Igbm90
IHdlIGFyZSBjdXJyZW50bHkgaWdub3Jpbmcgd2hpdGVzcGFjZS4KLSAgICBib29sIG1faWdub3Jp
bmdTcGFjZXM7Ci0KLSAgICAvLyBUaGlzIHZhcmlhYmxlIHRyYWNrcyB3aGV0aGVyIHRoZSB2ZXJ5
IGxhc3QgY2hhcmFjdGVyIHdlIHNhdyB3YXMgYSBzcGFjZS4gV2UgdXNlCi0gICAgLy8gdGhpcyB0
byBkZXRlY3Qgd2hlbiB3ZSBlbmNvdW50ZXIgYSBzZWNvbmQgc3BhY2Ugc28gd2Uga25vdyB3ZSBo
YXZlIHRvIHRlcm1pbmF0ZQotICAgIC8vIGEgcnVuLgotICAgIGJvb2wgbV9jdXJyZW50Q2hhcmFj
dGVySXNTcGFjZTsKLSAgICBib29sIG1fY3VycmVudENoYXJhY3RlcklzV1M7Ci0gICAgYm9vbCBt
X2FwcGxpZWRTdGFydFdpZHRoOwotICAgIGJvb2wgbV9pbmNsdWRlRW5kV2lkdGg7Ci0gICAgYm9v
bCBtX2F1dG9XcmFwOwotICAgIGJvb2wgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lOwotICAg
IGJvb2wgbV9mbG9hdHNGaXRPbkxpbmU7Ci0gICAgYm9vbCBtX2NvbGxhcHNlV2hpdGVTcGFjZTsK
LSAgICBib29sIG1fc3RhcnRpbmdOZXdQYXJhZ3JhcGg7Ci0gICAgYm9vbCBtX2FsbG93SW1hZ2Vz
VG9CcmVhazsKLSAgICBib29sIG1fYXRFbmQ7Ci0gICAgYm9vbCBtX2hhZFVuY29tbWl0dGVkV2lk
dGhCZWZvcmVDdXJyZW50OwotCi0gICAgTGluZU1pZHBvaW50U3RhdGUmIG1fbGluZU1pZHBvaW50
U3RhdGU7Ci0KLSAgICBUcmFpbGluZ09iamVjdHMgbV90cmFpbGluZ09iamVjdHM7Ci19OwotCi1p
bmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KCkK
LXsKLSAgICBtX2hhZFVuY29tbWl0dGVkV2lkdGhCZWZvcmVDdXJyZW50ID0gISFtX3dpZHRoLnVu
Y29tbWl0dGVkV2lkdGgoKTsKLQotICAgIG1fY3VycmVudFN0eWxlID0gJm1fY3VycmVudC5yZW5k
ZXJlcigpLT5zdHlsZSgpOyAvLyBGSVhNRTogU2hvdWxkIHRoaXMgYmUgJmxpbmVTdHlsZSgqbV9j
dXJyZW50LnJlbmRlcmVyKCksIG1fbGluZUluZm8pOyA/Ci0KLSAgICBBU1NFUlQobV9jdXJyZW50
U3R5bGUpOwotCi0gICAgbV9uZXh0T2JqZWN0ID0gYmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5l
cyhtX2Jsb2NrLCBtX2N1cnJlbnQucmVuZGVyZXIoKSk7Ci0gICAgaWYgKG1fbmV4dE9iamVjdCAm
JiBtX25leHRPYmplY3QtPnBhcmVudCgpICYmICFtX25leHRPYmplY3QtPnBhcmVudCgpLT5pc0Rl
c2NlbmRhbnRPZihtX2N1cnJlbnQucmVuZGVyZXIoKS0+cGFyZW50KCkpKQotICAgICAgICBtX2lu
Y2x1ZGVFbmRXaWR0aCA9IHRydWU7Ci0KLSAgICBtX2N1cnJXUyA9IG1fY3VycmVudC5yZW5kZXJl
cigpLT5pc1JlcGxhY2VkKCkgPyBtX2N1cnJlbnQucmVuZGVyZXIoKS0+cGFyZW50KCktPnN0eWxl
KCkud2hpdGVTcGFjZSgpIDogbV9jdXJyZW50U3R5bGUtPndoaXRlU3BhY2UoKTsKLSAgICBtX2xh
c3RXUyA9IG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpID8gbV9sYXN0T2JqZWN0LT5wYXJlbnQo
KS0+c3R5bGUoKS53aGl0ZVNwYWNlKCkgOiBtX2xhc3RPYmplY3QtPnN0eWxlKCkud2hpdGVTcGFj
ZSgpOwotCi0gICAgbV9hdXRvV3JhcCA9IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2N1cnJXUyk7
Ci0gICAgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lID0gbV9hdXRvV3JhcFdhc0V2ZXJUcnVl
T25MaW5lIHx8IG1fYXV0b1dyYXA7Ci0KLSAgICBtX3ByZXNlcnZlc05ld2xpbmUgPSBtX2N1cnJl
bnQucmVuZGVyZXIoKS0+aXNTVkdJbmxpbmVUZXh0KCkgPyBmYWxzZSA6IFJlbmRlclN0eWxlOjpw
cmVzZXJ2ZU5ld2xpbmUobV9jdXJyV1MpOwotCi0gICAgbV9jb2xsYXBzZVdoaXRlU3BhY2UgPSBS
ZW5kZXJTdHlsZTo6Y29sbGFwc2VXaGl0ZVNwYWNlKG1fY3VycldTKTsKLX0KLQotaW5saW5lIHZv
aWQgQnJlYWtpbmdDb250ZXh0OjppbmNyZW1lbnQoKQotewotICAgIC8vIENsZWFyIG91dCBvdXIg
Y2hhcmFjdGVyIHNwYWNlIGJvb2wsIHNpbmNlIGlubGluZSA8cHJlPnMgZG9uJ3QgY29sbGFwc2Ug
d2hpdGVzcGFjZQotICAgIC8vIHdpdGggYWRqYWNlbnQgaW5saW5lIG5vcm1hbC9ub3dyYXAgc3Bh
bnMuCi0gICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSkKLSAgICAgICAgbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSA9IGZhbHNlOwotCi0gICAgbV9jdXJyZW50Lm1vdmVUb1N0YXJ0T2YobV9u
ZXh0T2JqZWN0KTsKLSAgICBtX2F0U3RhcnQgPSBmYWxzZTsKLX0KLQotaW5saW5lIHZvaWQgQnJl
YWtpbmdDb250ZXh0OjpoYW5kbGVCUihFQ2xlYXImIGNsZWFyKQotewotICAgIGlmIChtX3dpZHRo
LmZpdHNPbkxpbmUoKSkgewotICAgICAgICBSZW5kZXJPYmplY3QqIGJyID0gbV9jdXJyZW50LnJl
bmRlcmVyKCk7Ci0gICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVy
YXRvciYgbW9kaWZ5TWUpIHsKLSAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUb1N0YXJ0T2YoYnIp
OwotICAgICAgICAgICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0pOwotCi0gICAg
ICAgIC8vIEEgPGJyPiBhbHdheXMgYnJlYWtzIGEgbGluZSwgc28gZG9uJ3QgbGV0IHRoZSBsaW5l
IGJlIGNvbGxhcHNlZAotICAgICAgICAvLyBhd2F5LiBBbHNvLCB0aGUgc3BhY2UgYXQgdGhlIGVu
ZCBvZiBhIGxpbmUgd2l0aCBhIDxicj4gZG9lcyBub3QKLSAgICAgICAgLy8gZ2V0IGNvbGxhcHNl
ZCBhd2F5LiBJdCBvbmx5IGRvZXMgdGhpcyBpZiB0aGUgcHJldmlvdXMgbGluZSBicm9rZQotICAg
ICAgICAvLyBjbGVhbmx5LiBPdGhlcndpc2UgdGhlIDxicj4gaGFzIG5vIGVmZmVjdCBvbiB3aGV0
aGVyIHRoZSBsaW5lIGlzCi0gICAgICAgIC8vIGVtcHR5IG9yIG5vdC4KLSAgICAgICAgaWYgKG1f
c3RhcnRpbmdOZXdQYXJhZ3JhcGgpCi0gICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZh
bHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwotICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVh
cigpOwotICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVl
KTsKLQotICAgICAgICAvLyBBIDxicj4gd2l0aCBjbGVhcmFuY2UgYWx3YXlzIG5lZWRzIGEgbGlu
ZWJveCBpbiBjYXNlIHRoZSBsaW5lcyBiZWxvdyBpdCBnZXQgZGlydGllZCBsYXRlciBhbmQKLSAg
ICAgICAgLy8gbmVlZCB0byBjaGVjayBmb3IgZmxvYXRzIHRvIGNsZWFyIC0gc28gaWYgd2UncmUg
aWdub3Jpbmcgc3BhY2VzLCBzdG9wIGlnbm9yaW5nIHRoZW0gYW5kIGFkZCBhCi0gICAgICAgIC8v
IHJ1biBmb3IgdGhpcyBvYmplY3QuCi0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIG1f
Y3VycmVudFN0eWxlLT5jbGVhcigpICE9IENOT05FKQotICAgICAgICAgICAgbV9saW5lTWlkcG9p
bnRTdGF0ZS5lbnN1cmVMaW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhicik7Ci0gICAgICAgIC8v
IElmIHdlIHdlcmUgcHJlY2VkZWQgYnkgY29sbGFwc2luZyBzcGFjZSBhbmQgYXJlIGluIGEgcmln
aHQtYWxpZ25lZCBjb250YWluZXIgd2UgbmVlZCB0byBlbnN1cmUgdGhlIHNwYWNlIGdldHMKLSAg
ICAgICAgLy8gY29sbGFwc2VkIGF3YXkgc28gdGhhdCBpdCBkb2Vzbid0IHB1c2ggdGhlIHRleHQg
b3V0IGZyb20gdGhlIGNvbnRhaW5lcidzIHJpZ2h0LWhhbmQgZWRnZS4KLSAgICAgICAgLy8gRklY
TUU6IERvIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3MgYWxpZ25tZW50IC0gd2ls
bCByZXF1aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3VsdHMuCi0gICAgICAgIGVs
c2UgaWYgKG1faWdub3JpbmdTcGFjZXMgJiYgKG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9PSBS
SUdIVCB8fCBtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJR0hUKSkKLSAgICAg
ICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJh
dG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCkpKTsKLQotICAg
ICAgICBpZiAoIW1fbGluZUluZm8uaXNFbXB0eSgpKQotICAgICAgICAgICAgY2xlYXIgPSBtX2N1
cnJlbnRTdHlsZS0+Y2xlYXIoKTsKLSAgICB9Ci0gICAgbV9hdEVuZCA9IHRydWU7Ci19Ci0KLWlu
bGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5TdGFydChjb25zdCBSZW5kZXJJbmxp
bmUmIGNoaWxkKQotewotICAgIHJldHVybiBjaGlsZC5tYXJnaW5TdGFydCgpICsgY2hpbGQucGFk
ZGluZ1N0YXJ0KCkgKyBjaGlsZC5ib3JkZXJTdGFydCgpOwotfQotCi1pbmxpbmUgTGF5b3V0VW5p
dCBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGNvbnN0IFJlbmRlcklubGluZSYgY2hpbGQpCi17Ci0g
ICAgcmV0dXJuIGNoaWxkLm1hcmdpbkVuZCgpICsgY2hpbGQucGFkZGluZ0VuZCgpICsgY2hpbGQu
Ym9yZGVyRW5kKCk7Ci19Ci0KLWlubGluZSBib29sIHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJn
aW4oUmVuZGVyT2JqZWN0KiBjaGlsZCkKLXsKLSAgICBpZiAoIWNoaWxkKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICAvLyBXaGVuIGRlY2lkaW5nIHdoZXRoZXIgd2UncmUgYXQgdGhlIGVkZ2Ug
b2YgYW4gaW5saW5lLCBhZGphY2VudCBjb2xsYXBzZWQgd2hpdGVzcGFjZSBpcyB0aGUgc2FtZSBh
cyBubyBzaWJsaW5nIGF0IGFsbC4KLSAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKmNoaWxkKSAmJiAh
ZG93bmNhc3Q8UmVuZGVyVGV4dD4oKmNoaWxkKS50ZXh0TGVuZ3RoKCkpCi0gICAgICAgIHJldHVy
biB0cnVlOwotI2lmIEVOQUJMRShDU1NfQk9YX0RFQ09SQVRJT05fQlJFQUspCi0gICAgaWYgKGlz
PFJlbmRlckxpbmVCcmVhaz4oKmNoaWxkKSAmJiBjaGlsZC0+cGFyZW50KCktPnN0eWxlKCkuYm94
RGVjb3JhdGlvbkJyZWFrKCkgPT0gRENMT05FKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRp
ZgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIFJlbmRlck9iamVjdCogcHJldmlvdXNJ
bkZsb3dTaWJsaW5nKFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgZG8gewotICAgICAgICBj
aGlsZCA9IGNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICB9IHdoaWxlIChjaGlsZCAmJiBj
aGlsZC0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkpOwotICAgIHJldHVybiBjaGlsZDsKLX0KLQot
aW5saW5lIExheW91dFVuaXQgaW5saW5lTG9naWNhbFdpZHRoKFJlbmRlck9iamVjdCogY2hpbGQs
IGJvb2wgY2hlY2tTdGFydEVkZ2UgPSB0cnVlLCBib29sIGNoZWNrRW5kRWRnZSA9IHRydWUpCi17
Ci0gICAgdW5zaWduZWQgbGluZURlcHRoID0gMTsKLSAgICBMYXlvdXRVbml0IGV4dHJhV2lkdGgg
PSAwOwotICAgIFJlbmRlckVsZW1lbnQqIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQoKTsKLSAgICB3
aGlsZSAoaXM8UmVuZGVySW5saW5lPigqcGFyZW50KSAmJiBsaW5lRGVwdGgrKyA8IGNNYXhMaW5l
RGVwdGgpIHsKLSAgICAgICAgY29uc3QgYXV0byYgcGFyZW50QXNSZW5kZXJJbmxpbmUgPSBkb3du
Y2FzdDxSZW5kZXJJbmxpbmU+KCpwYXJlbnQpOwotICAgICAgICBpZiAoIWlzRW1wdHlJbmxpbmUo
cGFyZW50QXNSZW5kZXJJbmxpbmUpKSB7Ci0gICAgICAgICAgICBjaGVja1N0YXJ0RWRnZSA9IGNo
ZWNrU3RhcnRFZGdlICYmIHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4ocHJldmlvdXNJbkZs
b3dTaWJsaW5nKGNoaWxkKSk7Ci0gICAgICAgICAgICBpZiAoY2hlY2tTdGFydEVkZ2UpCi0gICAg
ICAgICAgICAgICAgZXh0cmFXaWR0aCArPSBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQocGFyZW50
QXNSZW5kZXJJbmxpbmUpOwotICAgICAgICAgICAgY2hlY2tFbmRFZGdlID0gY2hlY2tFbmRFZGdl
ICYmIHNob3VsZEFkZEJvcmRlclBhZGRpbmdNYXJnaW4oY2hpbGQtPm5leHRTaWJsaW5nKCkpOwot
ICAgICAgICAgICAgaWYgKGNoZWNrRW5kRWRnZSkKLSAgICAgICAgICAgICAgICBleHRyYVdpZHRo
ICs9IGJvcmRlclBhZGRpbmdNYXJnaW5FbmQocGFyZW50QXNSZW5kZXJJbmxpbmUpOwotICAgICAg
ICAgICAgaWYgKCFjaGVja1N0YXJ0RWRnZSAmJiAhY2hlY2tFbmRFZGdlKQotICAgICAgICAgICAg
ICAgIHJldHVybiBleHRyYVdpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gcGFyZW50
OwotICAgICAgICBwYXJlbnQgPSBjaGlsZC0+cGFyZW50KCk7Ci0gICAgfQotICAgIHJldHVybiBl
eHRyYVdpZHRoOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZU91dE9m
Rmxvd1Bvc2l0aW9uZWQoVmVjdG9yPFJlbmRlckJveCo+JiBwb3NpdGlvbmVkT2JqZWN0cykKLXsK
LSAgICAvLyBJZiBvdXIgb3JpZ2luYWwgZGlzcGxheSB3YXNuJ3QgYW4gaW5saW5lIHR5cGUsIHRo
ZW4gd2UgY2FuCi0gICAgLy8gZ28gYWhlYWQgYW5kIGRldGVybWluZSBvdXIgc3RhdGljIGlubGlu
ZSBwb3NpdGlvbiBub3cuCi0gICAgYXV0byYgYm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9j
dXJyZW50LnJlbmRlcmVyKCkpOwotICAgIGJvb2wgaXNJbmxpbmVUeXBlID0gYm94LnN0eWxlKCku
aXNPcmlnaW5hbERpc3BsYXlJbmxpbmVUeXBlKCk7Ci0gICAgaWYgKCFpc0lubGluZVR5cGUpCi0g
ICAgICAgIG1fYmxvY2suc2V0U3RhdGljSW5saW5lUG9zaXRpb25Gb3JDaGlsZChib3gsIG1fYmxv
Y2subG9naWNhbEhlaWdodCgpLCBtX2Jsb2NrLnN0YXJ0T2Zmc2V0Rm9yQ29udGVudChtX2Jsb2Nr
LmxvZ2ljYWxIZWlnaHQoKSkpOwotICAgIGVsc2UgewotICAgICAgICAvLyBJZiBvdXIgb3JpZ2lu
YWwgZGlzcGxheSB3YXMgYW4gSU5MSU5FIHR5cGUsIHRoZW4gd2UgY2FuIGdvIGFoZWFkCi0gICAg
ICAgIC8vIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyB5IHBvc2l0aW9uIG5vdy4KLSAgICAgICAg
Ym94LmxheWVyKCktPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24obV9ibG9jay5sb2dpY2FsSGVpZ2h0
KCkpOwotICAgIH0KLQotICAgIC8vIElmIHdlJ3JlIGlnbm9yaW5nIHNwYWNlcywgd2UgaGF2ZSB0
byBzdG9wIGFuZCBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIHRoZW4gc3RhcnQgaWdu
b3Jpbmcgc3BhY2VzIGFnYWluLgotICAgIGlmIChpc0lubGluZVR5cGUgfHwgYm94LmNvbnRhaW5l
cigpLT5pc1JlbmRlcklubGluZSgpKSB7Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKQot
ICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5lbnN1cmVMaW5lQm94SW5zaWRlSWdub3Jl
ZFNwYWNlcygmYm94KTsKLSAgICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94SWZOZWVk
ZWQoJmJveCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHBvc2l0aW9uZWRPYmplY3RzLmFwcGVuZCgm
Ym94KTsKLQotICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lk
dGgoJmJveCkpOwotICAgIC8vIFJlc2V0IHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0
ZXJzLgotICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFByaW9y
Q29udGV4dCgpOwotfQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0
KCkKLXsKLSAgICBhdXRvJiBmbG9hdEJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fY3VycmVu
dC5yZW5kZXJlcigpKTsKLSAgICBGbG9hdGluZ09iamVjdCogZmxvYXRpbmdPYmplY3QgPSBtX2xp
bmVCcmVha2VyLmluc2VydEZsb2F0aW5nT2JqZWN0KGZsb2F0Qm94KTsKLSAgICAvLyBjaGVjayBp
ZiBpdCBmaXRzIGluIHRoZSBjdXJyZW50IGxpbmUuCi0gICAgLy8gSWYgaXQgZG9lcywgcG9zaXRp
b24gaXQgbm93LCBvdGhlcndpc2UsIHBvc2l0aW9uCi0gICAgLy8gaXQgYWZ0ZXIgbW92aW5nIHRv
IG5leHQgbGluZSAoaW4gY2xlYXJGbG9hdHMoKSBmdW5jKQotICAgIGlmIChtX2Zsb2F0c0ZpdE9u
TGluZSAmJiBtX3dpZHRoLmZpdHNPbkxpbmVFeGNsdWRpbmdUcmFpbGluZ1doaXRlc3BhY2UobV9i
bG9jay5sb2dpY2FsV2lkdGhGb3JGbG9hdChmbG9hdGluZ09iamVjdCkpKSB7Ci0gICAgICAgIG1f
bGluZUJyZWFrZXIucG9zaXRpb25OZXdGbG9hdE9uTGluZShmbG9hdGluZ09iamVjdCwgbV9sYXN0
RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBtX2xpbmVJbmZvLCBtX3dpZHRoKTsKLSAgICAgICAgaWYg
KG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpID09IG1fY3VycmVudC5yZW5kZXJlcigpKSB7
Ci0gICAgICAgICAgICBBU1NFUlQoIW1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSk7Ci0gICAg
ICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9
IGVsc2UKLSAgICAgICAgbV9mbG9hdHNGaXRPbkxpbmUgPSBmYWxzZTsKLSAgICAvLyBVcGRhdGUg
cHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNU
IFJFUExBQ0VNRU5UIENIQVJBQ1RFUikgZm9yIGZsb2F0aW5nIGVsZW1lbnQuCi0gICAgbV9yZW5k
ZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChyZXBsYWNl
bWVudENoYXJhY3Rlcik7Ci19Ci0KLS8vIFRoaXMgaXMgY3VycmVudGx5IGp1c3QgdXNlZCBmb3Ig
bGlzdCBtYXJrZXJzIGFuZCBpbmxpbmUgZmxvd3MgdGhhdCBoYXZlIGxpbmUgYm94ZXMuIE5laXRo
ZXIgc2hvdWxkCi0vLyBoYXZlIGFuIGVmZmVjdCBvbiB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBv
ZiB0aGUgbGluZS4KLWlubGluZSBib29sIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9i
amVjdChSZW5kZXJCbG9ja0Zsb3cmIGJsb2NrLCBSZW5kZXJPYmplY3QqIG8sIExpbmVNaWRwb2lu
dFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSkKLXsKLSAgICBSZW5kZXJPYmplY3QqIG5leHQgPSBi
aWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2NrLCBvKTsKLSAgICB3aGlsZSAobmV4dCAm
JiBuZXh0LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCi0gICAgICAgIG5leHQg
PSBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKGJsb2NrLCBuZXh0KTsKLQotICAgIGlmIChp
czxSZW5kZXJUZXh0PihuZXh0KSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0PigqbmV4dCkudGV4dExl
bmd0aCgpID4gMCkgewotICAgICAgICBSZW5kZXJUZXh0JiBuZXh0VGV4dCA9IGRvd25jYXN0PFJl
bmRlclRleHQ+KCpuZXh0KTsKLSAgICAgICAgVUNoYXIgbmV4dENoYXIgPSBuZXh0VGV4dC5jaGFy
YWN0ZXJBdCgwKTsKLSAgICAgICAgaWYgKG5leHRUZXh0LnN0eWxlKCkuaXNDb2xsYXBzaWJsZVdo
aXRlU3BhY2UobmV4dENoYXIpKSB7Ci0gICAgICAgICAgICBsaW5lTWlkcG9pbnRTdGF0ZS5zdGFy
dElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKG51bGxwdHIsIG8sIDApKTsKLSAgICAgICAg
ICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1pbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKCkKLXsK
LSAgICBSZW5kZXJJbmxpbmUmIGZsb3dCb3ggPSBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX2N1
cnJlbnQucmVuZGVyZXIoKSk7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGVuZCB1cCBiZWlu
ZyBjYWxsZWQgb24gZW1wdHkgaW5saW5lcwotICAgIEFTU0VSVChpc0VtcHR5SW5saW5lKGZsb3dC
b3gpKTsKLQotICAgIC8vIE5vdyB0aGF0IHNvbWUgaW5saW5lIGZsb3dzIGhhdmUgbGluZSBib3hl
cywgaWYgd2UgYXJlIGFscmVhZHkgaWdub3Jpbmcgc3BhY2VzLCB3ZSBuZWVkCi0gICAgLy8gdG8g
bWFrZSBzdXJlIHRoYXQgd2Ugc3RvcCB0byBpbmNsdWRlIHRoaXMgb2JqZWN0IGFuZCB0aGVuIHN0
YXJ0IGlnbm9yaW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICAvLyBJZiB0aGlzIG9iamVjdCBpcyBhdCB0
aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdlIG5lZWQgdG8gYmVoYXZlIGxpa2UgbGlzdCBtYXJrZXJz
IGFuZAotICAgIC8vIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcy4KLSAgICBib29sIHJlcXVpcmVzTGlu
ZUJveCA9IGFsd2F5c1JlcXVpcmVzTGluZUJveChmbG93Qm94KTsKLSAgICBpZiAocmVxdWlyZXNM
aW5lQm94IHx8IHJlcXVpcmVzTGluZUJveEZvckNvbnRlbnQoZmxvd0JveCwgbV9saW5lSW5mbykp
IHsKLSAgICAgICAgLy8gQW4gZW1wdHkgaW5saW5lIHRoYXQgb25seSBoYXMgbGluZS1oZWlnaHQs
IHZlcnRpY2FsLWFsaWduIG9yIGZvbnQtbWV0cmljcyB3aWxsIG9ubHkgZ2V0IGEKLSAgICAgICAg
Ly8gbGluZSBib3ggdG8gYWZmZWN0IHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgaWYgdGhlIHJlc3Qg
b2YgdGhlIGxpbmUgaXMgbm90IGVtcHR5LgotICAgICAgICBpZiAocmVxdWlyZXNMaW5lQm94KQot
ICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRo
KTsKLSAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIG1fdHJhaWxp
bmdPYmplY3RzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLmVuc3Vy
ZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKG1fY3VycmVudC5yZW5kZXJlcigpKTsKLSAgICAg
ICAgfSBlbHNlIGlmIChtX2Jsb2NrU3R5bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgbV9yZXNv
bHZlci5wb3NpdGlvbigpLnJlbmRlcmVyKCkgPT0gbV9jdXJyZW50LnJlbmRlcmVyKCkKLSAgICAg
ICAgICAgICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChtX2Jsb2NrLCBt
X2N1cnJlbnQucmVuZGVyZXIoKSwgbV9saW5lTWlkcG9pbnRTdGF0ZSkpIHsKLSAgICAgICAgICAg
IC8vIExpa2Ugd2l0aCBsaXN0IG1hcmtlcnMsIHdlIHN0YXJ0IGlnbm9yaW5nIHNwYWNlcyB0byBt
YWtlIHN1cmUgdGhhdCBhbnkKLSAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgc3BhY2VzIHdlIHNl
ZSB3aWxsIGJlIGRpc2NhcmRlZC4KLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgPSB0cnVlOwotICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IHRydWU7Ci0g
ICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlCi0gICAg
ICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZCgmZmxvd0JveCk7Ci0g
ICAgfQotCi0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0
aChtX2N1cnJlbnQucmVuZGVyZXIoKSkgKyBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoZmxvd0Jv
eCkgKyBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKGZsb3dCb3gpKTsKLX0KLQotaW5saW5lIHZvaWQg
QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVSZXBsYWNlZCgpCi17Ci0gICAgYXV0byYgcmVwbGFjZWRC
b3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7Ci0KLSAgICBp
ZiAobV9hdFN0YXJ0KQotICAgICAgICBtX3dpZHRoLnVwZGF0ZUF2YWlsYWJsZVdpZHRoKHJlcGxh
Y2VkQm94LmxvZ2ljYWxIZWlnaHQoKSk7Ci0KLSAgICAvLyBCcmVhayBvbiByZXBsYWNlZCBlbGVt
ZW50cyBpZiBlaXRoZXIgaGFzIG5vcm1hbCB3aGl0ZS1zcGFjZS4KLSAgICBpZiAoKG1fYXV0b1dy
YXAgfHwgUmVuZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdTKSkgJiYgKCFtX2N1cnJlbnQucmVu
ZGVyZXIoKS0+aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKQotICAgICAgICAmJiAo
IW1fY3VycmVudC5yZW5kZXJlcigpLT5pc1J1YnlSdW4oKSB8fCBkb3duY2FzdDxSZW5kZXJSdWJ5
UnVuPihtX2N1cnJlbnQucmVuZGVyZXIoKSktPmNhbkJyZWFrQmVmb3JlKG1fcmVuZGVyVGV4dElu
Zm8ubV9saW5lQnJlYWtJdGVyYXRvcikpKSB7Ci0gICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3Vy
cmVudFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSk7Ci0gICAgfQotCi0gICAgaWYgKG1faWdu
b3JpbmdTcGFjZXMpCi0gICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5nU3Bh
Y2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCAwKSk7Ci0KLSAgICBt
X2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOwotICAgIG1faWdu
b3JpbmdTcGFjZXMgPSBmYWxzZTsKLSAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gZmFs
c2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IGZhbHNlOwotICAgIG1fdHJhaWxpbmdP
YmplY3RzLmNsZWFyKCk7Ci0KLSAgICAvLyBPcHRpbWl6ZSBmb3IgYSBjb21tb24gY2FzZS4gSWYg
d2UgY2FuJ3QgZmluZCB3aGl0ZXNwYWNlIGFmdGVyIHRoZSBsaXN0Ci0gICAgLy8gaXRlbSwgdGhl
biB0aGlzIGlzIGFsbCBtb290LgotICAgIExheW91dFVuaXQgcmVwbGFjZWRMb2dpY2FsV2lkdGgg
PSBtX2Jsb2NrLmxvZ2ljYWxXaWR0aEZvckNoaWxkKHJlcGxhY2VkQm94KSArIG1fYmxvY2subWFy
Z2luU3RhcnRGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdpbkVuZEZvckNoaWxk
KHJlcGxhY2VkQm94KSArIGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSk7
Ci0gICAgaWYgKGlzPFJlbmRlckxpc3RNYXJrZXI+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpIHsK
LSAgICAgICAgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBzaG91bGRT
a2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9jdXJyZW50LnJlbmRlcmVy
KCksIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0gICAgICAgICAgICAvLyBMaWtlIHdpdGggaW5s
aW5lIGZsb3dzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFrZSBzdXJlIHRoYXQgYW55
Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUgd2lsbCBiZSBkaXNjYXJk
ZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gdHJ1ZTsKLSAgICAg
ICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICAgICAgICAgIG1faWdu
b3JpbmdTcGFjZXMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb3duY2FzdDxSZW5k
ZXJMaXN0TWFya2VyPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpLmlzSW5zaWRlKCkpCi0gICAgICAg
ICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRMb2dpY2FsV2lkdGgpOwot
ICAgIH0gZWxzZQotICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgocmVwbGFjZWRM
b2dpY2FsV2lkdGgpOwotICAgIGlmIChpczxSZW5kZXJSdWJ5UnVuPigqbV9jdXJyZW50LnJlbmRl
cmVyKCkpKSB7Ci0gICAgICAgIG1fd2lkdGguYXBwbHlPdmVyaGFuZyhkb3duY2FzdDxSZW5kZXJS
dWJ5UnVuPihtX2N1cnJlbnQucmVuZGVyZXIoKSksIG1fbGFzdE9iamVjdCwgbV9uZXh0T2JqZWN0
KTsKLSAgICAgICAgZG93bmNhc3Q8UmVuZGVyUnVieVJ1bj4obV9jdXJyZW50LnJlbmRlcmVyKCkp
LT51cGRhdGVQcmlvckNvbnRleHRGcm9tQ2FjaGVkQnJlYWtJdGVyYXRvcihtX3JlbmRlclRleHRJ
bmZvLm1fbGluZUJyZWFrSXRlcmF0b3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFVwZGF0
ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVycywgdXNpbmcgVStGRkZEIChPQkpF
Q1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgcmVwbGFjZWQgZWxlbWVudC4KLSAgICAgICAg
bV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnVwZGF0ZVByaW9yQ29udGV4dChy
ZXBsYWNlbWVudENoYXJhY3Rlcik7Ci0gICAgfQotfQotCi1pbmxpbmUgZmxvYXQgZmlyc3RQb3Np
dGl2ZVdpZHRoKGNvbnN0IFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMpCi17Ci0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3JkTWVhc3VyZW1lbnRzLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgIGlmICh3b3JkTWVhc3VyZW1lbnRzW2ldLndpZHRoID4gMCkKLSAgICAgICAgICAg
IHJldHVybiB3b3JkTWVhc3VyZW1lbnRzW2ldLndpZHRoOwotICAgIH0KLSAgICByZXR1cm4gMDsK
LX0KLQotaW5saW5lIGJvb2wgaXRlcmF0b3JJc0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQo
Y29uc3QgSW5saW5lSXRlcmF0b3ImIGl0ZXIsIFJlbmRlckNvbWJpbmVUZXh0JiByZW5kZXJlcikK
LXsKLSAgICByZXR1cm4gaXRlci5yZW5kZXJlcigpID09ICZyZW5kZXJlciAmJiBpdGVyLm9mZnNl
dCgpID49IHJlbmRlcmVyLnRleHRMZW5ndGgoKTsKLX0KLQotaW5saW5lIHZvaWQgbmV4dENoYXJh
Y3RlcihVQ2hhciYgY3VycmVudENoYXJhY3RlciwgVUNoYXImIGxhc3RDaGFyYWN0ZXIsIFVDaGFy
JiBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpCi17Ci0gICAgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0g
bGFzdENoYXJhY3RlcjsKLSAgICBsYXN0Q2hhcmFjdGVyID0gY3VycmVudENoYXJhY3RlcjsKLX0K
LQotLy8gRklYTUU6IERvbid0IGxldCBjb3VudGVycyBtYXJrIHRoZW1zZWx2ZXMgYXMgbmVlZGlu
ZyBwcmVmIHdpZHRoIHJlY2FsY3MgZHVyaW5nIGxheW91dAotLy8gc28gd2UgZG9uJ3QgbmVlZCB0
aGlzIGhhY2suCi1pbmxpbmUgdm9pZCB1cGRhdGVDb3VudGVySWZOZWVkZWQoUmVuZGVyVGV4dCYg
cmVuZGVyVGV4dCkKLXsKLSAgICBpZiAoIXJlbmRlclRleHQucHJlZmVycmVkTG9naWNhbFdpZHRo
c0RpcnR5KCkgfHwgIWlzPFJlbmRlckNvdW50ZXI+KHJlbmRlclRleHQpKQotICAgICAgICByZXR1
cm47Ci0gICAgZG93bmNhc3Q8UmVuZGVyQ291bnRlcj4ocmVuZGVyVGV4dCkudXBkYXRlQ291bnRl
cigpOwotfQotCi1pbmxpbmUgZmxvYXQgbWVhc3VyZUh5cGhlbldpZHRoKFJlbmRlclRleHQmIHJl
bmRlcmVyLCBjb25zdCBGb250Q2FzY2FkZSYgZm9udCwgSGFzaFNldDxjb25zdCBGb250Kj4qIGZh
bGxiYWNrRm9udHMgPSAwKQotewotICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHJlbmRl
cmVyLnN0eWxlKCk7Ci0gICAgcmV0dXJuIGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVj
dFRleHRSdW4oJnJlbmRlcmVyLCBmb250LCBzdHlsZS5oeXBoZW5TdHJpbmcoKS5zdHJpbmcoKSwg
c3R5bGUpLCBmYWxsYmFja0ZvbnRzKTsKLX0KLQotQUxXQVlTX0lOTElORSBmbG9hdCB0ZXh0V2lk
dGgoUmVuZGVyVGV4dCYgdGV4dCwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgbGVuLCBjb25zdCBG
b250Q2FzY2FkZSYgZm9udCwgZmxvYXQgeFBvcywgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29s
bGFwc2VXaGl0ZVNwYWNlLCBIYXNoU2V0PGNvbnN0IEZvbnQqPiYgZmFsbGJhY2tGb250cywgVGV4
dExheW91dCogbGF5b3V0ID0gbnVsbHB0cikKLXsKLSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUgPSB0ZXh0LnN0eWxlKCk7Ci0KLSAgICBHbHlwaE92ZXJmbG93IGdseXBoT3ZlcmZsb3c7Ci0g
ICAgaWYgKGlzRml4ZWRQaXRjaCB8fCAoIWZyb20gJiYgbGVuID09IHRleHQudGV4dExlbmd0aCgp
KSB8fCBzdHlsZS5oYXNUZXh0Q29tYmluZSgpKQotICAgICAgICByZXR1cm4gdGV4dC53aWR0aChm
cm9tLCBsZW4sIGZvbnQsIHhQb3MsICZmYWxsYmFja0ZvbnRzLCAmZ2x5cGhPdmVyZmxvdyk7Ci0K
LSAgICBpZiAobGF5b3V0KQotICAgICAgICByZXR1cm4gRm9udENhc2NhZGU6OndpZHRoKCpsYXlv
dXQsIGZyb20sIGxlbiwgJmZhbGxiYWNrRm9udHMpOwotCi0gICAgVGV4dFJ1biBydW4gPSBSZW5k
ZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bigmdGV4dCwgZm9udCwgJnRleHQsIGZyb20sIGxlbiwg
c3R5bGUpOwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQudGV4dExlbmd0aCgpIC0g
ZnJvbSk7Ci0gICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJzTGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgp
KTsKLQotICAgIHJ1bi5zZXRDaGFyYWN0ZXJTY2FuRm9yQ29kZVBhdGgoIXRleHQuY2FuVXNlU2lt
cGxlRm9udENvZGVQYXRoKCkpOwotICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBzZVdoaXRlU3Bh
Y2UsIHN0eWxlLnRhYlNpemUoKSk7Ci0gICAgcnVuLnNldFhQb3MoeFBvcyk7Ci0gICAgcmV0dXJu
IGZvbnQud2lkdGgocnVuLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwotfQotCi0v
LyBBZGRpbmcgYSBwYWlyIG9mIG1pZHBvaW50cyBiZWZvcmUgYSBjaGFyYWN0ZXIgd2lsbCBzcGxp
dCBpdCBvdXQgaW50byBhIG5ldyBsaW5lIGJveC4KLWlubGluZSB2b2lkIGVuc3VyZUNoYXJhY3Rl
ckdldHNMaW5lQm94KExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgSW5saW5l
SXRlcmF0b3ImIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IpCi17Ci0gICAgSW5saW5lSXRlcmF0b3Ig
bWlkcG9pbnQoMCwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdy
YXBoU2VwYXJhdG9yLm9mZnNldCgpKTsKLSAgICBsaW5lTWlkcG9pbnRTdGF0ZS5zdGFydElnbm9y
aW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IucmVuZGVy
ZXIoKSwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5vZmZzZXQoKSAtIDEpKTsKLSAgICBsaW5lTWlk
cG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBhcmFn
cmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNldCgp
KSk7Ci19Ci0KLWlubGluZSB2b2lkIHRyeUh5cGhlbmF0aW5nKFJlbmRlclRleHQmIHRleHQsIGNv
bnN0IEZvbnRDYXNjYWRlJiBmb250LCBjb25zdCBBdG9taWNTdHJpbmcmIGxvY2FsZUlkZW50aWZp
ZXIsIHVuc2lnbmVkIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBpbnQgY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXNMaW1pdCwgaW50IG1pbmltdW1QcmVmaXhMaW1pdCwgaW50IG1pbmltdW1T
dWZmaXhMaW1pdCwgdW5zaWduZWQgbGFzdFNwYWNlLCB1bnNpZ25lZCBwb3MsIGZsb2F0IHhQb3Ms
IGludCBhdmFpbGFibGVXaWR0aCwgYm9vbCBpc0ZpeGVkUGl0Y2gsIGJvb2wgY29sbGFwc2VXaGl0
ZVNwYWNlLCBpbnQgbGFzdFNwYWNlV29yZFNwYWNpbmcsIElubGluZUl0ZXJhdG9yJiBsaW5lQnJl
YWssIGludCBuZXh0QnJlYWthYmxlLCBib29sJiBoeXBoZW5hdGVkKQotewotICAgIC8vIE1hcCAn
aHlwaGVuYXRlLWxpbWl0LXtiZWZvcmUsYWZ0ZXJ9OiBhdXRvOycgdG8gMi4KLSAgICB1bnNpZ25l
ZCBtaW5pbXVtUHJlZml4TGVuZ3RoOwotICAgIHVuc2lnbmVkIG1pbmltdW1TdWZmaXhMZW5ndGg7
Ci0KLSAgICBpZiAobWluaW11bVByZWZpeExpbWl0IDwgMCkKLSAgICAgICAgbWluaW11bVByZWZp
eExlbmd0aCA9IDI7Ci0gICAgZWxzZQotICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gc3Rh
dGljX2Nhc3Q8dW5zaWduZWQ+KG1pbmltdW1QcmVmaXhMaW1pdCk7Ci0KLSAgICBpZiAobWluaW11
bVN1ZmZpeExpbWl0IDwgMCkKLSAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IDI7Ci0gICAg
ZWxzZQotICAgICAgICBtaW5pbXVtU3VmZml4TGVuZ3RoID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+
KG1pbmltdW1TdWZmaXhMaW1pdCk7Ci0KLSAgICBpZiAocG9zIC0gbGFzdFNwYWNlIDw9IG1pbmlt
dW1TdWZmaXhMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChjb25zZWN1dGl2ZUh5
cGhlbmF0ZWRMaW5lc0xpbWl0ID49IDAgJiYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMgPj0g
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBpbnQgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lk
dGgodGV4dCwgZm9udCk7Ci0KLSAgICBmbG9hdCBtYXhQcmVmaXhXaWR0aCA9IGF2YWlsYWJsZVdp
ZHRoIC0geFBvcyAtIGh5cGhlbldpZHRoIC0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgLy8g
SWYgdGhlIG1heGltdW0gd2lkdGggYXZhaWxhYmxlIGZvciB0aGUgcHJlZml4IGJlZm9yZSB0aGUg
aHlwaGVuIGlzIHNtYWxsLCB0aGVuIGl0IGlzIHZlcnkgdW5saWtlbHkKLSAgICAvLyB0aGF0IGFu
IGh5cGhlbmF0aW9uIG9wcG9ydHVuaXR5IGV4aXN0cywgc28gZG8gbm90IGJvdGhlciB0byBsb29r
IGZvciBpdC4KLSAgICBpZiAobWF4UHJlZml4V2lkdGggPD0gZm9udC5waXhlbFNpemUoKSAqIDUg
LyA0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSB0
ZXh0LnN0eWxlKCk7Ci0gICAgVGV4dFJ1biBydW4gPSBSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4
dFJ1bigmdGV4dCwgZm9udCwgJnRleHQsIGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlLCBzdHls
ZSk7Ci0gICAgcnVuLnNldENoYXJhY3RlcnNMZW5ndGgodGV4dC50ZXh0TGVuZ3RoKCkgLSBsYXN0
U3BhY2UpOwotICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgo
KSk7Ci0KLSAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNlLCBzdHlsZS50YWJT
aXplKCkpOwotICAgIHJ1bi5zZXRYUG9zKHhQb3MgKyBsYXN0U3BhY2VXb3JkU3BhY2luZyk7Ci0K
LSAgICB1bnNpZ25lZCBwcmVmaXhMZW5ndGggPSBmb250Lm9mZnNldEZvclBvc2l0aW9uKHJ1biwg
bWF4UHJlZml4V2lkdGgsIGZhbHNlKTsKLSAgICBpZiAocHJlZml4TGVuZ3RoIDwgbWluaW11bVBy
ZWZpeExlbmd0aCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcHJlZml4TGVuZ3RoID0gbGFzdEh5
cGhlbkxvY2F0aW9uKFN0cmluZ1ZpZXcodGV4dC50ZXh0KCkpLnN1YnN0cmluZyhsYXN0U3BhY2Us
IHBvcyAtIGxhc3RTcGFjZSksIHN0ZDo6bWluKHByZWZpeExlbmd0aCwgcG9zIC0gbGFzdFNwYWNl
IC0gbWluaW11bVN1ZmZpeExlbmd0aCkgKyAxLCBsb2NhbGVJZGVudGlmaWVyKTsKLSAgICBpZiAo
IXByZWZpeExlbmd0aCB8fCBwcmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBXaGVuIGxhc3RTcGFjZSBpcyBhIHNwYWNlLCB3aGljaCBp
dCBhbHdheXMgaXMgZXhjZXB0IHNvbWV0aW1lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBv
ciBhZnRlciBjb2xsYXBzZWQKLSAgICAvLyBzcGFjZSwgaXQgc2hvdWxkIG5vdCBjb3VudCB0b3dh
cmRzIGh5cGhlbmF0ZS1saW1pdC1iZWZvcmUuCi0gICAgaWYgKHByZWZpeExlbmd0aCA9PSBtaW5p
bXVtUHJlZml4TGVuZ3RoKSB7Ci0gICAgICAgIFVDaGFyIGNoYXJhY3RlckF0TGFzdFNwYWNlID0g
dGV4dC5jaGFyYWN0ZXJBdChsYXN0U3BhY2UpOwotICAgICAgICBpZiAoY2hhcmFjdGVyQXRMYXN0
U3BhY2UgPT0gJyAnIHx8IGNoYXJhY3RlckF0TGFzdFNwYWNlID09ICdcbicgfHwgY2hhcmFjdGVy
QXRMYXN0U3BhY2UgPT0gJ1x0JyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSBub0JyZWFrU3Bh
Y2UpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVNTRVJUKHBvcyAtIGxhc3RT
cGFjZSAtIHByZWZpeExlbmd0aCA+PSBtaW5pbXVtU3VmZml4TGVuZ3RoKTsKLQotI2lmICFBU1NF
UlRfRElTQUJMRUQKLSAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBmYWxsYmFja0ZvbnRzOwotICAg
IGZsb2F0IHByZWZpeFdpZHRoID0gaHlwaGVuV2lkdGggKyB0ZXh0V2lkdGgodGV4dCwgbGFzdFNw
YWNlLCBwcmVmaXhMZW5ndGgsIGZvbnQsIHhQb3MsIGlzRml4ZWRQaXRjaCwgY29sbGFwc2VXaGl0
ZVNwYWNlLCBmYWxsYmFja0ZvbnRzKSArIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotICAgIEFTU0VS
VCh4UG9zICsgcHJlZml4V2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpOwotI2Vsc2UKLSAgICBVTlVT
RURfUEFSQU0oaXNGaXhlZFBpdGNoKTsKLSNlbmRpZgotCi0gICAgbGluZUJyZWFrLm1vdmVUbygm
dGV4dCwgbGFzdFNwYWNlICsgcHJlZml4TGVuZ3RoLCBuZXh0QnJlYWthYmxlKTsKLSAgICBoeXBo
ZW5hdGVkID0gdHJ1ZTsKLX0KLQotaW5saW5lIGJvb2wgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVU
ZXh0KFdvcmRNZWFzdXJlbWVudHMmIHdvcmRNZWFzdXJlbWVudHMsIGJvb2wmIGh5cGhlbmF0ZWQs
ICB1bnNpZ25lZCYgY29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMpCi17Ci0gICAgaWYgKCFtX2N1
cnJlbnQub2Zmc2V0KCkpCi0gICAgICAgIG1fYXBwbGllZFN0YXJ0V2lkdGggPSBmYWxzZTsKLQot
ICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9jdXJy
ZW50LnJlbmRlcmVyKCkpOwotCi0gICAgYm9vbCBpc1NWR1RleHQgPSByZW5kZXJUZXh0LmlzU1ZH
SW5saW5lVGV4dCgpOwotCi0gICAgLy8gSWYgd2UgaGF2ZSBsZWZ0IGEgbm8td3JhcCBpbmxpbmUg
YW5kIGVudGVyZWQgYW4gYXV0b3dyYXAgaW5saW5lIHdoaWxlIGlnbm9yaW5nIHNwYWNlcwotICAg
IC8vIHRoZW4gd2UgbmVlZCB0byBtYXJrIHRoZSBzdGFydCBvZiB0aGUgYXV0b3dyYXAgaW5saW5l
IGFzIGEgcG90ZW50aWFsIGxpbmVicmVhayBub3cuCi0gICAgaWYgKG1fYXV0b1dyYXAgJiYgIVJl
bmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykgJiYgbV9pZ25vcmluZ1NwYWNlcykKLSAgICAg
ICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgocmVuZGVyVGV4dCk7Ci0KLSAgICBpZiAo
cmVuZGVyVGV4dC5zdHlsZSgpLmhhc1RleHRDb21iaW5lKCkgJiYgaXM8UmVuZGVyQ29tYmluZVRl
eHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgIWRvd25jYXN0PFJlbmRlckNvbWJpbmVUZXh0
PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpLmlzQ29tYmluZWQoKSkgewotICAgICAgICBhdXRvJiBj
b21iaW5lUmVuZGVyZXIgPSBkb3duY2FzdDxSZW5kZXJDb21iaW5lVGV4dD4oKm1fY3VycmVudC5y
ZW5kZXJlcigpKTsKLSAgICAgICAgY29tYmluZVJlbmRlcmVyLmNvbWJpbmVUZXh0KCk7Ci0gICAg
ICAgIC8vIFRoZSBsZW5ndGggb2YgdGhlIHJlbmRlcmVyJ3MgdGV4dCBtYXkgaGF2ZSBjaGFuZ2Vk
LiBJbmNyZW1lbnQgc3RhbGUgaXRlcmF0b3IgcG9zaXRpb25zCi0gICAgICAgIGlmIChpdGVyYXRv
cklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVu
dCgpLCBjb21iaW5lUmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoaXRlcmF0b3JJc0Jl
eW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9yZXNvbHZlci5wb3NpdGlvbigpLCBjb21iaW5l
UmVuZGVyZXIpKTsKLSAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsK
LSAgICAgICAgICAgIG1fcmVzb2x2ZXIuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSBsaW5lU3R5bGUocmVuZGVyVGV4dCwgbV9s
aW5lSW5mbyk7Ci0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBzdHlsZS5mb250Q2FzY2Fk
ZSgpOwotICAgIGJvb2wgaXNGaXhlZFBpdGNoID0gZm9udC5pc0ZpeGVkUGl0Y2goKTsKLSAgICBi
b29sIGNhbkh5cGhlbmF0ZSA9IHN0eWxlLmh5cGhlbnMoKSA9PSBIeXBoZW5zQXV0byAmJiBXZWJD
b3JlOjpjYW5IeXBoZW5hdGUoc3R5bGUubG9jYWxlKCkpOwotCi0gICAgdW5zaWduZWQgbGFzdFNw
YWNlID0gbV9jdXJyZW50Lm9mZnNldCgpOwotICAgIGZsb2F0IHdvcmRTcGFjaW5nID0gbV9jdXJy
ZW50U3R5bGUtPmZvbnRDYXNjYWRlKCkud29yZFNwYWNpbmcoKTsKLSAgICBmbG9hdCBsYXN0U3Bh
Y2VXb3JkU3BhY2luZyA9IDA7Ci0gICAgZmxvYXQgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1l
bnQgPSAwOwotCi0gICAgZmxvYXQgd3JhcFcgPSBtX3dpZHRoLnVuY29tbWl0dGVkV2lkdGgoKSAr
IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSwgIW1fYXBwbGllZFN0YXJ0
V2lkdGgsIHRydWUpOwotICAgIGZsb2F0IGNoYXJXaWR0aCA9IDA7Ci0gICAgYm9vbCBicmVha05C
U1AgPSBtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5uYnNwTW9kZSgpID09IFNQQUNFOwot
ICAgIC8vIEF1dG8td3JhcHBpbmcgdGV4dCBzaG91bGQgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEg
d29yZCBvbmx5IGlmIGl0IGNvdWxkIG5vdCB3cmFwIGJlZm9yZSB0aGUgd29yZCwKLSAgICAvLyB3
aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSB3b3JkIGlzIHRoZSBmaXJzdCB0aGluZyBvbiB0
aGUgbGluZSwgdGhhdCBpcywgaWYgfHd8IGlzIHplcm8uCi0gICAgYm9vbCBicmVha1dvcmRzID0g
bV9jdXJyZW50U3R5bGUtPmJyZWFrV29yZHMoKSAmJiAoKG1fYXV0b1dyYXAgJiYgIW1fd2lkdGgu
Y29tbWl0dGVkV2lkdGgoKSkgfHwgbV9jdXJyV1MgPT0gUFJFKTsKLSAgICBib29sIG1pZFdvcmRC
cmVhayA9IGZhbHNlOwotICAgIGJvb2wgYnJlYWtBbGwgPSBtX2N1cnJlbnRTdHlsZS0+d29yZEJy
ZWFrKCkgPT0gQnJlYWtBbGxXb3JkQnJlYWsgJiYgbV9hdXRvV3JhcDsKLSAgICBmbG9hdCBoeXBo
ZW5XaWR0aCA9IDA7Ci0gICAgYm9vbCBpc0xvb3NlQ0pLTW9kZSA9IGZhbHNlOwotCi0gICAgaWYg
KGlzU1ZHVGV4dCkgewotICAgICAgICBicmVha1dvcmRzID0gZmFsc2U7Ci0gICAgICAgIGJyZWFr
QWxsID0gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV90ZXh0ICE9
ICZyZW5kZXJUZXh0KSB7Ci0gICAgICAgIHVwZGF0ZUNvdW50ZXJJZk5lZWRlZChyZW5kZXJUZXh0
KTsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgPSAmcmVuZGVyVGV4dDsKLSAgICAg
ICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAmZm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0
SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5b3V0KCZyZW5kZXJUZXh0LCBtX3dpZHRoLmN1
cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSk7Ci0gICAgICAgIG1fcmVuZGVyVGV4
dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5yZXNldFN0cmluZ0FuZFJlbGVhc2VJdGVyYXRvcihy
ZW5kZXJUZXh0LnRleHQoKSwgc3R5bGUubG9jYWxlKCksIG1hcExpbmVCcmVha1RvSXRlcmF0b3JN
b2RlKG1fYmxvY2tTdHlsZS5saW5lQnJlYWsoKSkpOwotICAgICAgICBpc0xvb3NlQ0pLTW9kZSA9
IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5pc0xvb3NlQ0pLTW9kZSgpOwot
ICAgIH0gZWxzZSBpZiAobV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCAmJiBtX3JlbmRlclRleHRJ
bmZvLm1fZm9udCAhPSAmZm9udCkgewotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9
ICZmb250OwotICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVM
YXlvdXQoJnJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0
ZVNwYWNlKTsKLSAgICB9Ci0KLSAgICBUZXh0TGF5b3V0KiB0ZXh0TGF5b3V0ID0gbV9yZW5kZXJU
ZXh0SW5mby5tX2xheW91dC5nZXQoKTsKLQotICAgIC8vIE5vbi16ZXJvIG9ubHkgd2hlbiBrZXJu
aW5nIGlzIGVuYWJsZWQgYW5kIFRleHRMYXlvdXQgaXNuJ3QgdXNlZCwgaW4gd2hpY2ggY2FzZSB3
ZSBtZWFzdXJlCi0gICAgLy8gd29yZHMgd2l0aCB0aGVpciB0cmFpbGluZyBzcGFjZSwgdGhlbiBz
dWJ0cmFjdCBpdHMgd2lkdGguCi0gICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250
czsKLSAgICBmbG9hdCB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoID0gKGZvbnQudHlwZXNldHRpbmdG
ZWF0dXJlcygpICYgS2VybmluZykgJiYgIXRleHRMYXlvdXQgPyBmb250LndpZHRoKFJlbmRlckJs
b2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZyZW5kZXJUZXh0LCBmb250LCAmc3BhY2UsIDEsIHN0eWxl
KSwgJmZhbGxiYWNrRm9udHMpICsgd29yZFNwYWNpbmcgOiAwOwotCi0gICAgVUNoYXIgbGFzdENo
YXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5sYXN0Q2hhcmFj
dGVyKCk7Ci0gICAgVUNoYXIgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yLnNlY29uZFRvTGFzdENoYXJhY3RlcigpOwotICAgIGZvciAo
OyBtX2N1cnJlbnQub2Zmc2V0KCkgPCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKTsgbV9jdXJyZW50
LmZhc3RJbmNyZW1lbnRJblRleHROb2RlKCkpIHsKLSAgICAgICAgYm9vbCBwcmV2aW91c0NoYXJh
Y3RlcklzU3BhY2UgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwotICAgICAgICBib29sIHBy
ZXZpb3VzQ2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENoYXJhY3RlcklzV1M7Ci0gICAgICAgIFVD
aGFyIGMgPSBtX2N1cnJlbnQuY3VycmVudCgpOwotICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJ
c1NwYWNlID0gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8ICghbV9wcmVzZXJ2ZXNOZXdsaW5lICYm
IChjID09ICdcbicpKTsKLQotICAgICAgICBpZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNlIHx8ICFt
X2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0
eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLQotICAgICAgICBpZiAoYyA9PSBzb2Z0SHlw
aGVuICYmIG1fYXV0b1dyYXAgJiYgIWh5cGhlbldpZHRoICYmIHN0eWxlLmh5cGhlbnMoKSAhPSBI
eXBoZW5zTm9uZSkgewotICAgICAgICAgICAgaHlwaGVuV2lkdGggPSBtZWFzdXJlSHlwaGVuV2lk
dGgocmVuZGVyVGV4dCwgZm9udCwgJmZhbGxiYWNrRm9udHMpOwotICAgICAgICAgICAgbV93aWR0
aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGh5cGhlbldpZHRoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGJvb2wgYXBwbHlXb3JkU3BhY2luZyA9IGZhbHNlOwotCi0gICAgICAgIG1fY3VycmVudENoYXJh
Y3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IChicmVha05CU1AgJiYgYyA9
PSBub0JyZWFrU3BhY2UpOwotCi0gICAgICAgIGlmICgoYnJlYWtBbGwgfHwgYnJlYWtXb3Jkcykg
JiYgIW1pZFdvcmRCcmVhayAmJiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgfHwgc3R5bGUu
d2hpdGVTcGFjZSgpICE9IFBSRV9XUkFQKSkgewotICAgICAgICAgICAgd3JhcFcgKz0gY2hhcldp
ZHRoOwotICAgICAgICAgICAgYm9vbCBtaWRXb3JkQnJlYWtJc0JlZm9yZVN1cnJvZ2F0ZVBhaXIg
PSBVMTZfSVNfTEVBRChjKSAmJiBtX2N1cnJlbnQub2Zmc2V0KCkgKyAxIDwgcmVuZGVyVGV4dC50
ZXh0TGVuZ3RoKCkgJiYgVTE2X0lTX1RSQUlMKHJlbmRlclRleHRbbV9jdXJyZW50Lm9mZnNldCgp
ICsgMV0pOwotICAgICAgICAgICAgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIG1f
Y3VycmVudC5vZmZzZXQoKSwgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID8gMiA6
IDEsIGZvbnQsIG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXLCBpc0ZpeGVkUGl0Y2gs
IG1fY29sbGFwc2VXaGl0ZVNwYWNlLCBmYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLSAgICAg
ICAgICAgIG1pZFdvcmRCcmVhayA9IG1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSArIHdyYXBXICsg
Y2hhcldpZHRoID4gbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaW50IG5leHRCcmVha2FibGVQb3NpdGlvbiA9IG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9z
aXRpb24oKTsKLSAgICAgICAgYm9vbCBiZXR3ZWVuV29yZHMgPSBjID09ICdcbicgfHwgKG1fY3Vy
cldTICE9IFBSRSAmJiAhbV9hdFN0YXJ0ICYmIGlzQnJlYWthYmxlKG1fcmVuZGVyVGV4dEluZm8u
bV9saW5lQnJlYWtJdGVyYXRvciwgbV9jdXJyZW50Lm9mZnNldCgpLCBuZXh0QnJlYWthYmxlUG9z
aXRpb24sIGJyZWFrTkJTUCwgaXNMb29zZUNKS01vZGUpCi0gICAgICAgICAgICAmJiAoc3R5bGUu
aHlwaGVucygpICE9IEh5cGhlbnNOb25lIHx8IChtX2N1cnJlbnQucHJldmlvdXNJblNhbWVOb2Rl
KCkgIT0gc29mdEh5cGhlbikpKTsKLSAgICAgICAgbV9jdXJyZW50LnNldE5leHRCcmVha2FibGVQ
b3NpdGlvbihuZXh0QnJlYWthYmxlUG9zaXRpb24pOwotCi0gICAgICAgIGlmIChiZXR3ZWVuV29y
ZHMgfHwgbWlkV29yZEJyZWFrKSB7Ci0gICAgICAgICAgICBib29sIHN0b3BwZWRJZ25vcmluZ1Nw
YWNlcyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAg
ICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYg
KCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN0
b3AgaWdub3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAg
IC8vIG5ldyBwb2ludC4KLSAgICAgICAgICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZh
bHNlOwotICAgICAgICAgICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9
IDA7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5vZmZzZXQoKTsg
Ly8gZS5nLiwgIkZvbyAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBpZ25vcmVkIHNw
YWNlcy4KLSAgICAgICAgICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdub3Jp
bmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVu
dC5vZmZzZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICBzdG9wcGVkSWdub3JpbmdTcGFjZXMg
PSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IEp1c3Qga2VlcCBpZ25vcmluZyB0aGVzZSBzcGFjZXMuCi0gICAgICAgICAgICAgICAgICAgIG5l
eHRDaGFyYWN0ZXIoYywgbGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKLSAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAg
ICAgfQotCi0gICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnRzLmdyb3cod29yZE1lYXN1cmVtZW50
cy5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVt
ZW50ID0gd29yZE1lYXN1cmVtZW50cy5sYXN0KCk7Ci0KLSAgICAgICAgICAgIHdvcmRNZWFzdXJl
bWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OwotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50
LmVuZE9mZnNldCA9IG1fY3VycmVudC5vZmZzZXQoKTsKLSAgICAgICAgICAgIHdvcmRNZWFzdXJl
bWVudC5zdGFydE9mZnNldCA9IGxhc3RTcGFjZTsKLQotICAgICAgICAgICAgZmxvYXQgYWRkaXRp
b25hbFRlbXBXaWR0aDsKLSAgICAgICAgICAgIGlmICh3b3JkVHJhaWxpbmdTcGFjZVdpZHRoICYm
IGMgPT0gJyAnKQotICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lk
dGgocmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCkgKyAxIC0gbGFzdFNw
YWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFw
c2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cywgdGV4dExheW91dCkg
LSB3b3JkVHJhaWxpbmdTcGFjZVdpZHRoOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggPSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgbGFzdFNwYWNl
LCBtX2N1cnJlbnQub2Zmc2V0KCkgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdp
ZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVu
dC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKLQotICAgICAgICAgICAgaWYgKHdvcmRNZWFz
dXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tGb250cy5pc0VtcHR5
KCkpCi0gICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChm
YWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQotICAg
ICAgICAgICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gYWRkaXRpb25hbFRlbXBXaWR0aCArIHdv
cmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50OwotICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBX
aWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAgICAgICAgICAgIG1fd2lkdGguYWRkVW5j
b21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoKTsKLQotICAgICAgICAgICAgaWYgKG1f
Y29sbGFwc2VXaGl0ZVNwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSAmJiBtX2N1cnJl
bnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAgICAgICAgICAg
ICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRo
KTsKLQotICAgICAgICAgICAgaWYgKCFtX2FwcGxpZWRTdGFydFdpZHRoKSB7Ci0gICAgICAgICAg
ICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aChtX2N1
cnJlbnQucmVuZGVyZXIoKSwgdHJ1ZSwgZmFsc2UpKTsKLSAgICAgICAgICAgICAgICBtX2FwcGxp
ZWRTdGFydFdpZHRoID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXBwbHlX
b3JkU3BhY2luZyA9IHdvcmRTcGFjaW5nICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2U7Ci0K
LSAgICAgICAgICAgIGlmICghbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmIG1fYXV0b1dyYXAg
JiYgIW1fd2lkdGguZml0c09uTGluZSgpKQotICAgICAgICAgICAgICAgIG1fd2lkdGguZml0QmVs
b3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKLQotICAgICAgICAgICAgaWYgKG1f
YXV0b1dyYXAgfHwgYnJlYWtXb3JkcykgewotICAgICAgICAgICAgICAgIC8vIElmIHdlIGJyZWFr
IG9ubHkgYWZ0ZXIgd2hpdGUtc3BhY2UsIGNvbnNpZGVyIHRoZSBjdXJyZW50IGNoYXJhY3Rlcgot
ICAgICAgICAgICAgICAgIC8vIGFzIGNhbmRpZGF0ZSB3aWR0aCBmb3IgdGhpcyBsaW5lLgotICAg
ICAgICAgICAgICAgIGJvb2wgbGluZVdhc1Rvb1dpZGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAg
ICBpZiAobV93aWR0aC5maXRzT25MaW5lKCkgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBt
X2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJXaGl0ZVNwYWNlKCkgJiYgIW1pZFdvcmRCcmVh
aykgewotICAgICAgICAgICAgICAgICAgICBmbG9hdCBjaGFyV2lkdGggPSB0ZXh0V2lkdGgocmVu
ZGVyVGV4dCwgbV9jdXJyZW50Lm9mZnNldCgpLCAxLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQu
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCkgKyAoYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFj
aW5nIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgdG9vIGJp
ZyBldmVuIHdpdGhvdXQgdGhlIGV4dHJhIHNwYWNlCi0gICAgICAgICAgICAgICAgICAgIC8vIGF0
IHRoZSBlbmQgb2YgdGhlIGxpbmUuIElmIGl0IGlzIG5vdCwgZG8gbm90aGluZy4KLSAgICAgICAg
ICAgICAgICAgICAgLy8gSWYgdGhlIGxpbmUgbmVlZHMgdGhlIGV4dHJhIHdoaXRlc3BhY2UgdG8g
YmUgdG9vIGxvbmcsCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gbW92ZSB0aGUgbGluZSBi
cmVhayB0byB0aGUgc3BhY2UgYW5kIHNraXAgYWxsCi0gICAgICAgICAgICAgICAgICAgIC8vIGFk
ZGl0aW9uYWwgd2hpdGVzcGFjZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3dpZHRoLmZp
dHNPbkxpbmVJbmNsdWRpbmdFeHRyYVdpZHRoKGNoYXJXaWR0aCkpIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIGxpbmVXYXNUb29XaWRlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAg
IG1fbGluZUJyZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZnlNZS5tb3ZlVG8obV9jdXJyZW50LnJl
bmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3Np
dGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2xpbmVCcmVha2VyLnNraXBU
cmFpbGluZ1doaXRlc3BhY2UobW9kaWZ5TWUsIG1fbGluZUluZm8pOwotICAgICAgICAgICAgICAg
ICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0g
ICAgICAgICAgICAgICAgaWYgKGxpbmVXYXNUb29XaWRlIHx8ICFtX3dpZHRoLmZpdHNPbkxpbmUo
KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuSHlwaGVuYXRlICYmICFtX3dpZHRoLmZp
dHNPbkxpbmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5
LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJlbmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgp
LCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGlt
aXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlvbkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5j
dXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxUZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lk
dGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNw
YWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGlu
ZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAg
ICAgICAgICAgICAgICAgICAgICAgaWYgKG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVh
a0hpc3RvcnkuYXRUZXh0UGFyYWdyYXBoU2VwYXJhdG9yKCkpIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudC5vZmZzZXQoKSA+
IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVC
b3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFr
SGlzdG9yeS5vZmZzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpICYmIGRvd25jYXN0PFJlbmRlclRl
eHQ+KG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0
PigqbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkpLnRleHRMZW5ndGgoKSAmJiBkb3duY2Fz
dDxSZW5kZXJUZXh0PigqbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkpLmNoYXJhY3RlckF0
KG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAtIDEpID09IHNvZnRIeXBoZW4gJiYgc3R5bGUu
aHlwaGVucygpICE9IEh5cGhlbnNOb25lKQotICAgICAgICAgICAgICAgICAgICAgICAgaHlwaGVu
YXRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVha0hpc3Rvcnku
b2Zmc2V0KCkgJiYgbV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpICE9ICh1bnNpZ25lZCl3b3Jk
TWVhc3VyZW1lbnQuZW5kT2Zmc2V0ICYmICF3b3JkTWVhc3VyZW1lbnQud2lkdGgpIHsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChjaGFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9saW5lQnJlYWtIaXN0b3J5Lm9m
ZnNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0
aCA9IGNoYXJXaWR0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBEaWRuJ3QgZml0LiBKdW1wIHRvIHRoZSBl
bmQgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgYW4gb3Bwb3J0dW5pdHkgdG8gY29sbGFwc2Ugd2hpdGVz
cGFjZS4KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faWdub3JpbmdTcGFjZXMgfHwgIW1fY29s
bGFwc2VXaGl0ZVNwYWNlIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8ICFwcmV2aW91
c0NoYXJhY3RlcklzU3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQgPSB0
cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAg
aWYgKCFiZXR3ZWVuV29yZHMgfHwgKG1pZFdvcmRCcmVhayAmJiAhbV9hdXRvV3JhcCkpCi0gICAg
ICAgICAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWFkZGl0aW9u
YWxUZW1wV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaHlwaGVuV2lkdGgpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSB3aWR0aCBvZiB0aGUgc29mdCBo
eXBoZW4gb3V0IHNpbmNlIHdlIGZpdCBvbiBhIGxpbmUuCi0gICAgICAgICAgICAgICAgICAgICAg
ICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoLWh5cGhlbldpZHRoKTsKLSAgICAgICAgICAg
ICAgICAgICAgICAgIGh5cGhlbldpZHRoID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGMgPT0gJ1xu
JyAmJiBtX3ByZXNlcnZlc05ld2xpbmUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0b3BwZWRJ
Z25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkpCi0gICAgICAgICAgICAgICAgICAg
IGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVu
dCk7Ci0gICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3Vy
cmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWth
YmxlUG9zaXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3Jl
bWVudCgpOwotICAgICAgICAgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KHRydWUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBiZXR3ZWVuV29yZHMpIHsKLSAgICAg
ICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9jdXJyZW50LnJlbmRl
cmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlv
bigpKTsKLSAgICAgICAgICAgICAgICB3cmFwVyA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gQXV0
by13cmFwcGluZyB0ZXh0IHNob3VsZCBub3Qgd3JhcCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBv
bmNlIGl0IGhhcyBoYWQgYW4KLSAgICAgICAgICAgICAgICAvLyBvcHBvcnR1bml0eSB0byBicmVh
ayBhZnRlciBhIHdvcmQuCi0gICAgICAgICAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAg
ICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobWlkV29yZEJyZWFrICYmICFVMTZfSVNfVFJB
SUwoYykgJiYgIShVX0dFVF9HQ19NQVNLKGMpICYgVV9HQ19NX01BU0spKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gUmVtZW1iZXIgdGhpcyBhcyBhIGJyZWFrYWJsZSBwb3NpdGlvbiBpbiBjYXNlCi0g
ICAgICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBlbmQgd2lkdGggZm9yY2VzIGEgYnJlYWsuCi0g
ICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbyhtX2N1cnJlbnQucmVuZGVy
ZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9u
KCkpOwotICAgICAgICAgICAgICAgIG1pZFdvcmRCcmVhayAmPSAoYnJlYWtXb3JkcyB8fCBicmVh
a0FsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiZXR3ZWVuV29yZHMpIHsK
LSAgICAgICAgICAgICAgICBsYXN0U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcg
PyB3b3JkU3BhY2luZyA6IDA7Ci0gICAgICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVh
c3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiB3b3JkTWVhc3VyZW1lbnQud2lkdGgpID8g
d29yZFNwYWNpbmcgOiAwOwotICAgICAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5v
ZmZzZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtX2lnbm9yaW5nU3Bh
Y2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkgewotICAgICAgICAg
ICAgICAgIC8vIElmIHdlIGVuY291bnRlciBhIG5ld2xpbmUsIG9yIGlmIHdlIGVuY291bnRlciBh
Ci0gICAgICAgICAgICAgICAgLy8gc2Vjb25kIHNwYWNlLCB3ZSBuZWVkIHRvIGdvIGFoZWFkIGFu
ZCBicmVhayB1cCB0aGlzCi0gICAgICAgICAgICAgICAgLy8gcnVuIGFuZCBlbnRlciBhIG1vZGUg
d2hlcmUgd2Ugc3RhcnQgY29sbGFwc2luZyBzcGFjZXMuCi0gICAgICAgICAgICAgICAgaWYgKG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVlOwotCi0gICAgICAgICAg
ICAgICAgICAgIC8vIFdlIGp1c3QgZW50ZXJlZCBhIG1vZGUgd2hlcmUgd2UgYXJlIGlnbm9yaW5n
Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNwYWNlcy4gQ3JlYXRlIGEgbWlkcG9pbnQgdG8gdGVy
bWluYXRlIHRoZSBydW4KLSAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQg
c3BhY2UuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RhcnRJZ25v
cmluZ1NwYWNlcyhtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsKLSAgICAgICAgICAgICAgICAgICAg
bV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9yVHJhaWxpbmdCb3hlcyhtX2xpbmVN
aWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvcigpLCBUcmFpbGluZ09iamVjdHM6OkRvTm90Q29s
bGFwc2VGaXJzdFNwYWNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0gZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcykgewotICAgICAgICAgICAgLy8gU3RvcCBp
Z25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRoaXMKLSAgICAgICAgICAgIC8vIG5ldyBwb2lu
dC4KLSAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGxh
c3RTcGFjZVdvcmRTcGFjaW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsK
LSAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50ID0gKGFwcGx5V29yZFNw
YWNpbmcgJiYgd29yZE1lYXN1cmVtZW50cy5sYXN0KCkud2lkdGgpID8gd29yZFNwYWNpbmcgOiAw
OwotICAgICAgICAgICAgbGFzdFNwYWNlID0gbV9jdXJyZW50Lm9mZnNldCgpOyAvLyBlLmcuLCAi
Rm9vICAgIGdvbyIsIGRvbid0IGFkZCBpbiBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgotICAg
ICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRl
cmF0b3IoMCwgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSkpOwotICAg
ICAgICB9Ci0KLSAgICAgICAgaWYgKGlzU1ZHVGV4dCAmJiBtX2N1cnJlbnQub2Zmc2V0KCkpIHsK
LSAgICAgICAgICAgIC8vIEZvcmNlIGNyZWF0aW9uIG9mIG5ldyBJbmxpbmVCb3hlcyBmb3IgZWFj
aCBhYnNvbHV0ZSBwb3NpdGlvbmVkIGNoYXJhY3RlciAodGhvc2UgdGhhdCBzdGFydCBuZXcgdGV4
dCBjaHVua3MpLgotICAgICAgICAgICAgaWYgKGRvd25jYXN0PFJlbmRlclNWR0lubGluZVRleHQ+
KHJlbmRlclRleHQpLmNoYXJhY3RlclN0YXJ0c05ld1RleHRDaHVuayhtX2N1cnJlbnQub2Zmc2V0
KCkpKQotICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94KG1fbGluZU1p
ZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhcHJldmlvdXNDaGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAg
ICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldFJlbmRlcmVyKG1fY3VycmVudC5yZW5k
ZXJlcigpKTsKLSAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMuc2V0T2Zmc2V0KG1f
Y3VycmVudC5vZmZzZXQoKSk7Ci0gICAgICAgICAgICAvLyBTcGFjZXMgYWZ0ZXIgcmlnaHQtYWxp
Z25lZCB0ZXh0IGFuZCBiZWZvcmUgYSBsaW5lLWJyZWFrIGdldCBjb2xsYXBzZWQgYXdheSBjb21w
bGV0ZWx5IHNvIHRoYXQgdGhlIHRyYWlsaW5nCi0gICAgICAgICAgICAvLyBzcGFjZSBkb2Vzbid0
IHNlZW0gdG8gcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUgcmlnaHQtaGFuZCBlZGdlLgotICAg
ICAgICAgICAgLy8gRklYTUU6IERvIHRoaXMgcmVnYXJkbGVzcyBvZiB0aGUgY29udGFpbmVyJ3Mg
YWxpZ25tZW50IC0gd2lsbCByZXF1aXJlIHJlYmFzZWxpbmluZyBhIGxvdCBvZiB0ZXN0IHJlc3Vs
dHMuCi0gICAgICAgICAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fc3RhcnRPZklnbm9yZWRTcGFj
ZXMub2Zmc2V0KCkgJiYgbV9uZXh0T2JqZWN0LT5pc0JSKCkgJiYgKG1fYmxvY2tTdHlsZS50ZXh0
QWxpZ24oKSA9PSBSSUdIVCB8fCBtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gV0VCS0lUX1JJ
R0hUKSkgewotICAgICAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMuc2V0T2Zmc2V0
KG1fc3RhcnRPZklnbm9yZWRTcGFjZXMub2Zmc2V0KCkgLSAxKTsKLSAgICAgICAgICAgICAgICAv
LyBJZiB0aGVyZSdzIGp1c3QgYSBzaW5nbGUgdHJhaWxpbmcgc3BhY2Ugc3RhcnQgaWdub3Jpbmcg
aXQgbm93IHNvIGl0IGNvbGxhcHNlcyBhd2F5LgotICAgICAgICAgICAgICAgIGlmIChtX2N1cnJl
bnQub2Zmc2V0KCkgPT0gcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAg
ICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMobV9zdGFydE9m
SWdub3JlZFNwYWNlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAo
IW1fY3VycmVudENoYXJhY3RlcklzV1MgJiYgcHJldmlvdXNDaGFyYWN0ZXJJc1dTKSB7Ci0gICAg
ICAgICAgICBpZiAobV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHlsZS0+YnJlYWtPbmx5QWZ0ZXJX
aGl0ZVNwYWNlKCkpCi0gICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5Lm1vdmVUbyht
X2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJy
ZWFrYWJsZVBvc2l0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fY29sbGFwc2VX
aGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdub3JpbmdTcGFj
ZXMpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5zZXRUcmFpbGluZ1doaXRlc3BhY2Uo
ZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9jdXJyZW50LnJlbmRlcmVyKCkpKTsKLSAgICAgICAgZWxz
ZSBpZiAoIW1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSB8fCAhbV9jdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7
Ci0KLSAgICAgICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIG5leHRDaGFyYWN0ZXIoYywg
bGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKLSAgICB9Ci0KLSAgICBtX3Jl
bmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc2V0UHJpb3JDb250ZXh0KGxhc3RDaGFy
YWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7Ci0KLSAgICB3b3JkTWVhc3VyZW1lbnRzLmdy
b3cod29yZE1lYXN1cmVtZW50cy5zaXplKCkgKyAxKTsKLSAgICBXb3JkTWVhc3VyZW1lbnQmIHdv
cmRNZWFzdXJlbWVudCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwotICAgIHdvcmRNZWFzdXJl
bWVudC5yZW5kZXJlciA9ICZyZW5kZXJUZXh0OwotCi0gICAgLy8gSU1QT1JUQU5UOiBjdXJyZW50
Lm1fcG9zIGlzID4gbGVuZ3RoIGhlcmUhCi0gICAgZmxvYXQgYWRkaXRpb25hbFRlbXBXaWR0aCA9
IG1faWdub3JpbmdTcGFjZXMgPyAwIDogdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm9mZnNldCgpIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQu
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7Ci0gICAgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zm
c2V0ID0gbGFzdFNwYWNlOwotICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2N1cnJl
bnQub2Zmc2V0KCk7Ci0gICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gbV9pZ25vcmluZ1NwYWNl
cyA/IDAgOiBhZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1l
bnQ7Ci0gICAgYWRkaXRpb25hbFRlbXBXaWR0aCArPSBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLQot
ICAgIGZsb2F0IGlubGluZUxvZ2ljYWxUZW1wV2lkdGggPSBpbmxpbmVMb2dpY2FsV2lkdGgobV9j
dXJyZW50LnJlbmRlcmVyKCksICFtX2FwcGxpZWRTdGFydFdpZHRoLCBtX2luY2x1ZGVFbmRXaWR0
aCk7Ci0gICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgg
KyBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKLQotICAgIGlmICh3b3JkTWVhc3VyZW1lbnQuZmFs
bGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgpKQotICAgICAg
ICB3b3JkTWVhc3VyZW1lbnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxiYWNrRm9udHMpOwotICAg
IGZhbGxiYWNrRm9udHMuY2xlYXIoKTsKLQotICAgIGlmIChtX2NvbGxhcHNlV2hpdGVTcGFjZSAm
JiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIGFkZGl0aW9uYWxUZW1wV2lkdGgpCi0gICAg
ICAgIG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0
aCwgaW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0KLSAgICBtX2luY2x1ZGVFbmRXaWR0aCA9IGZh
bHNlOwotCi0gICAgaWYgKCFtX3dpZHRoLmZpdHNPbkxpbmUoKSkgewotICAgICAgICBpZiAoY2Fu
SHlwaGVuYXRlKSB7Ci0gICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5s
aW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7Ci0gICAgICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmco
cmVuZGVyVGV4dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExp
bmVzLCBtX2Jsb2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0
aW9uTGltaXRCZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFj
ZSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25h
bFRlbXBXaWR0aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29s
bGFwc2VXaGl0ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbW9kaWZ5TWUsIG1fY3VycmVu
dC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOwot
ICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWh5cGhlbmF0ZWQgJiYg
bV9saW5lQnJlYWtIaXN0b3J5LnByZXZpb3VzSW5TYW1lTm9kZSgpID09IHNvZnRIeXBoZW4gJiYg
c3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKSB7Ci0gICAgICAgICAgICBoeXBoZW5hdGVk
ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotaW5saW5lIGJvb2wgdGV4dEJlZ2luc1dpdGhCcmVha2Fi
bGVQb3NpdGlvbihSZW5kZXJUZXh0JiBuZXh0VGV4dCkKLXsKLSAgICBVQ2hhciBjID0gbmV4dFRl
eHQuY2hhcmFjdGVyQXQoMCk7Ci0gICAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAo
YyA9PSAnXG4nICYmICFuZXh0VGV4dC5wcmVzZXJ2ZXNOZXdsaW5lKCkpOwotfQotCi1pbmxpbmUg
Ym9vbCBCcmVha2luZ0NvbnRleHQ6OmNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKQotewotICAgIC8v
IElmIHdlIGFyZSBuby13cmFwIGFuZCBoYXZlIGZvdW5kIGEgbGluZS1icmVha2luZyBvcHBvcnR1
bml0eSBhbHJlYWR5IHRoZW4gd2Ugc2hvdWxkIHRha2UgaXQuCi0gICAgaWYgKG1fd2lkdGguY29t
bWl0dGVkV2lkdGgoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2UpICYmIG1fY3VycldTID09IE5PV1JBUCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICAvLyBBdm9pZCBicmVha2luZyBvbiBlbXB0eSBpbmxpbmVzLgotICAgIGlmIChpczxSZW5kZXJJ
bmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgJiYgaXNFbXB0eUlubGluZShkb3duY2FzdDxS
ZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAvLyBBdm9pZCBicmVha2luZyBiZWZvcmUgZW1wdHkgaW5saW5lcyAoYXMgbG9u
ZyBhcyB0aGUgY3VycmVudCBvYmplY3QgaXNuJ3QgcmVwbGFjZWQpLgotICAgIGlmICghbV9jdXJy
ZW50LnJlbmRlcmVyKCktPmlzUmVwbGFjZWQoKSAmJiBpczxSZW5kZXJJbmxpbmU+KG1fbmV4dE9i
amVjdCkgJiYgaXNFbXB0eUlubGluZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX25leHRPYmpl
Y3QpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gUmV0dXJuIGVhcmx5IGlmIHdl
IGF1dG93cmFwIGFuZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBhcyB3ZSB3aWxs
IGFsd2F5cyB3YW50IHRvIGJyZWFrIGF0IHN1Y2ggYSBwb3NpdGlvbi4KLSAgICBpZiAobV9hdXRv
V3JhcCAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQotICAgICAgICByZXR1cm4gdHJ1ZTsK
LQotICAgIGlmIChtX25leHRPYmplY3QgJiYgbV9uZXh0T2JqZWN0LT5pc0xpbmVCcmVha09wcG9y
dHVuaXR5KCkpCi0gICAgICAgIHJldHVybiBtX2F1dG9XcmFwOwotCi0gICAgYm9vbCBuZXh0SXNB
dXRvV3JhcHBpbmdUZXh0ID0gaXM8UmVuZGVyVGV4dD4obV9uZXh0T2JqZWN0KSAmJiAobV9hdXRv
V3JhcCB8fCBtX25leHRPYmplY3QtPnN0eWxlKCkuYXV0b1dyYXAoKSk7Ci0gICAgaWYgKCFuZXh0
SXNBdXRvV3JhcHBpbmdUZXh0KQotICAgICAgICByZXR1cm4gbV9hdXRvV3JhcDsKLSAgICBSZW5k
ZXJUZXh0JiBuZXh0UmVuZGVyVGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KCptX25leHRPYmpl
Y3QpOwotICAgIGJvb2wgY3VycmVudElzVGV4dE9yRW1wdHlJbmxpbmUgPSBpczxSZW5kZXJUZXh0
PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpIHx8IChpczxSZW5kZXJJbmxpbmU+KCptX2N1cnJlbnQu
cmVuZGVyZXIoKSkgJiYgaXNFbXB0eUlubGluZShkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX2N1
cnJlbnQucmVuZGVyZXIoKSkpKTsKLSAgICBpZiAoIWN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5l
KQotICAgICAgICByZXR1cm4gbV9hdXRvV3JhcCAmJiAhbV9jdXJyZW50LnJlbmRlcmVyKCktPmlz
UnVieVJ1bigpOwotCi0gICAgYm9vbCBjYW5CcmVha0hlcmUgPSAhbV9jdXJyZW50Q2hhcmFjdGVy
SXNTcGFjZSAmJiB0ZXh0QmVnaW5zV2l0aEJyZWFrYWJsZVBvc2l0aW9uKG5leHRSZW5kZXJUZXh0
KTsKLQotICAgIC8vIFNlZSBpZiBhdHRlbXB0aW5nIHRvIGZpdCBiZWxvdyBmbG9hdHMgY3JlYXRl
cyBtb3JlIGF2YWlsYWJsZSB3aWR0aCBvbiB0aGUgbGluZS4KLSAgICBpZiAoIW1fd2lkdGguZml0
c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpCi0gICAgICAgIG1fd2lkdGgu
Zml0QmVsb3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKLQotICAgIGJvb2wgY2Fu
UGxhY2VPbkxpbmUgPSBtX3dpZHRoLmZpdHNPbkxpbmUoKSB8fCAhbV9hdXRvV3JhcFdhc0V2ZXJU
cnVlT25MaW5lOwotCi0gICAgaWYgKGNhblBsYWNlT25MaW5lICYmIGNhbkJyZWFrSGVyZSkKLSAg
ICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgobmV4dFJlbmRlclRleHQpOwotCi0g
ICAgcmV0dXJuIGNhbkJyZWFrSGVyZTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0
Ojpjb21taXRBbmRVcGRhdGVMaW5lQnJlYWtJZk5lZWRlZCgpCi17Ci0gICAgYm9vbCBjaGVja0Zv
ckJyZWFrID0gY2FuQnJlYWtBdFRoaXNQb3NpdGlvbigpOwotCi0gICAgaWYgKGNoZWNrRm9yQnJl
YWsgJiYgIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9yaW5nU3BhY2VzKSkgewotICAgICAgICAv
LyBpZiB3ZSBoYXZlIGZsb2F0cywgdHJ5IHRvIGdldCBiZWxvdyB0aGVtLgotICAgICAgICBpZiAo
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJl
bnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2Jq
ZWN0cy5jbGVhcigpOwotCi0gICAgICAgIGlmIChtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsK
LSAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICB9Ci0KLSAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RM
aW5lKCkpOwotCi0gICAgICAgIC8vIHx3aWR0aHwgbWF5IGhhdmUgYmVlbiBhZGp1c3RlZCBiZWNh
dXNlIHdlIGdvdCBzaG92ZWQgZG93biBwYXN0IGEgZmxvYXQgKHRodXMKLSAgICAgICAgLy8gZ2l2
aW5nIHVzIG1vcmUgcm9vbSksIHNvIHdlIG5lZWQgdG8gcmV0ZXN0LCBhbmQgb25seSBqdW1wIHRv
Ci0gICAgICAgIC8vIHRoZSBlbmQgbGFiZWwgaWYgd2Ugc3RpbGwgZG9uJ3QgZml0IG9uIHRoZSBs
aW5lLiAtZHdoCi0gICAgICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKG1faWdub3JpbmdTcGFj
ZXMpKSB7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsK
LSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmF1dG9XcmFwKCkgJiYgIW1f
d2lkdGguZml0c09uTGluZSgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkpIHsKLSAgICAg
ICAgLy8gSWYgdGhlIGNvbnRhaW5lciBhdXRvd3JhcHMgYnV0IHRoZSBjdXJyZW50IGNoaWxkIGRv
ZXMgbm90IHRoZW4gd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdCBpdAotICAgICAgICAvLyB3
cmFwcyBhbmQgbW92ZXMgYmVsb3cgYW55IGZsb2F0cy4KLSAgICAgICAgbV93aWR0aC5maXRCZWxv
d0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkpOwotICAgIH0KLQotICAgIGlmICghbV9j
dXJyZW50LnJlbmRlcmVyKCktPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgewot
ICAgICAgICBtX2xhc3RPYmplY3QgPSBtX2N1cnJlbnQucmVuZGVyZXIoKTsKLSAgICAgICAgaWYg
KG1fbGFzdE9iamVjdC0+aXNSZXBsYWNlZCgpICYmIG1fYXV0b1dyYXAgJiYgIW1fbGFzdE9iamVj
dC0+aXNSdWJ5UnVuKCkgJiYgKCFtX2xhc3RPYmplY3QtPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1h
Z2VzVG9CcmVhaykgJiYgKCFpczxSZW5kZXJMaXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KSB8fCBk
b3duY2FzdDxSZW5kZXJMaXN0TWFya2VyPigqbV9sYXN0T2JqZWN0KS5pc0luc2lkZSgpKSkKLSAg
ICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX25leHRPYmplY3QpOwot
ICAgIH0KLX0KLQotaW5saW5lIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlT3JO
b3QgY2hlY2tNaWRwb2ludHMoTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlLCBj
b25zdCBJbmxpbmVJdGVyYXRvciYgbEJyZWFrKQotewotICAgIC8vIENoZWNrIHRvIHNlZSBpZiBv
dXIgbGFzdCBtaWRwb2ludCBpcyBhIHN0YXJ0IHBvaW50IGJleW9uZCB0aGUgbGluZSBicmVhay4g
SWYgc28sCi0gICAgLy8gc2hhdmUgaXQgb2ZmIHRoZSBsaXN0LCBhbmQgc2hhdmUgb2ZmIGEgdHJh
aWxpbmcgc3BhY2UgaWYgdGhlIHByZXZpb3VzIGVuZCBwb2ludCBkb2Vzbid0Ci0gICAgLy8gcHJl
c2VydmUgd2hpdGVzcGFjZS4KLSAgICBpZiAobEJyZWFrLnJlbmRlcmVyKCkgJiYgbGluZU1pZHBv
aW50U3RhdGUubnVtTWlkcG9pbnRzKCkgJiYgIShsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2lu
dHMoKSAlIDIpKSB7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yKiBtaWRwb2ludHMgPSBsaW5lTWlk
cG9pbnRTdGF0ZS5taWRwb2ludHMoKS5kYXRhKCk7Ci0gICAgICAgIElubGluZUl0ZXJhdG9yJiBl
bmRwb2ludCA9IG1pZHBvaW50c1tsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMoKSAtIDJd
OwotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgc3RhcnRwb2ludCA9IG1pZHBvaW50c1ts
aW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMoKSAtIDFdOwotICAgICAgICBJbmxpbmVJdGVy
YXRvciBjdXJycG9pbnQgPSBlbmRwb2ludDsKLSAgICAgICAgd2hpbGUgKCFjdXJycG9pbnQuYXRF
bmQoKSAmJiBjdXJycG9pbnQgIT0gc3RhcnRwb2ludCAmJiBjdXJycG9pbnQgIT0gbEJyZWFrKQot
ICAgICAgICAgICAgY3VycnBvaW50LmluY3JlbWVudCgpOwotICAgICAgICBpZiAoY3VycnBvaW50
ID09IGxCcmVhaykgewotICAgICAgICAgICAgLy8gV2UgaGl0IHRoZSBsaW5lIGJyZWFrIGJlZm9y
ZSB0aGUgc3RhcnQgcG9pbnQuIFNoYXZlIG9mZiB0aGUgc3RhcnQgcG9pbnQuCi0gICAgICAgICAg
ICBsaW5lTWlkcG9pbnRTdGF0ZS5kZWNyZWFzZU51bU1pZHBvaW50cygpOwotICAgICAgICAgICAg
aWYgKGVuZHBvaW50LnJlbmRlcmVyKCktPnN0eWxlKCkuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYg
ZW5kcG9pbnQucmVuZGVyZXIoKS0+aXNUZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBlbmRwb2lu
dC5mYXN0RGVjcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWlsaW5nT2JqZWN0
czo6RG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgcmV0dXJuIFRyYWlsaW5nT2JqZWN0czo6Q29sbGFwc2VGaXJzdFNwYWNlOwotfQot
Ci1pbmxpbmUgSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUo
KQotewotICAgIGlmIChtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpID09IG1fcmVzb2x2ZXIu
cG9zaXRpb24oKSkgewotICAgICAgICBpZiAoIW1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigp
IHx8ICFtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKS0+aXNCUigpKSB7Ci0gICAgICAgICAg
ICAvLyB3ZSBqdXN0IGFkZCBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgICAgICAgICBpZiAobV9i
bG9ja1N0eWxlLndoaXRlU3BhY2UoKSA9PSBQUkUgJiYgIW1fY3VycmVudC5vZmZzZXQoKSkKLSAg
ICAgICAgICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9sYXN0T2JqZWN0
LCBtX2xhc3RPYmplY3QtPmlzVGV4dCgpID8gbV9sYXN0T2JqZWN0LT5sZW5ndGgoKSA6IDApOwot
ICAgICAgICAgICAgZWxzZSBpZiAobV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkpIHsKLSAg
ICAgICAgICAgICAgICAvLyBEb24ndCBldmVyIGJyZWFrIGluIHRoZSBtaWRkbGUgb2YgYSB3b3Jk
IGlmIHdlIGNhbiBoZWxwIGl0LgotICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcm9vbSBh
dCBhbGwuIFdlIGp1c3QgaGF2ZSB0byBiZSBvbiB0aGlzIGxpbmUsCi0gICAgICAgICAgICAgICAg
Ly8gZXZlbiB0aG91Z2ggd2UnbGwgc3BpbGwgb3V0LgotICAgICAgICAgICAgICAgIGNvbW1pdExp
bmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9m
ZnNldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBtYWtlIHN1cmUg
d2UgY29uc3VtZSBhdCBsZWFzdCBvbmUgY2hhci9vYmplY3QuCi0gICAgICAgIGlmIChtX2xpbmVC
cmVha0hpc3RvcnkuY3VycmVudCgpID09IG1fcmVzb2x2ZXIucG9zaXRpb24oKSkKLSAgICAgICAg
ICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1lbnQoKTsKLSAgICB9IGVsc2UgaWYgKCFtX2N1
cnJlbnQub2Zmc2V0KCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX3dpZHRoLnVu
Y29tbWl0dGVkV2lkdGgoKSAmJiAhbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCkg
ewotICAgICAgICAvLyBEbyBub3QgcHVzaCB0aGUgY3VycmVudCBvYmplY3QgdG8gdGhlIG5leHQg
bGluZSwgd2hlbiB0aGlzIGxpbmUgaGFzIHNvbWUgY29udGVudCwgYnV0IGl0IGlzIHN0aWxsIGNv
bnNpZGVyZWQgZW1wdHkuCi0gICAgICAgIC8vIEVtcHR5IGlubGluZSBlbGVtZW50cyBsaWtlIDxz
cGFuPjwvc3Bhbj4gY2FuIHByb2R1Y2Ugc3VjaCBsaW5lcyBhbmQgbm93IHdlIGp1c3QgaWdub3Jl
IHRoZXNlIGJyZWFrIG9wcG9ydHVuaXRpZXMKLSAgICAgICAgLy8gYXQgdGhlIHN0YXJ0IG9mIGEg
bGluZSwgaWYgbm8gd2lkdGggaGFzIGJlZW4gY29tbWl0dGVkIHlldC4KLSAgICAgICAgLy8gQmVo
YXZlIGFzIGlmIGl0IHdhcyBhY3R1YWxseSBlbXB0eSBhbmQgY29uc3VtZSBhdCBsZWFzdCBvbmUg
b2JqZWN0LgotICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7Ci0gICAgfQot
Ci0gICAgLy8gU2FuaXR5IGNoZWNrIG91ciBtaWRwb2ludHMuCi0gICAgVHJhaWxpbmdPYmplY3Rz
OjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjb2xsYXBzZWQgPSBjaGVja01pZHBvaW50cyhtX2xp
bmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpKTsKLQotICAgIG1f
dHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSwgY29sbGFwc2VkKTsKLQot
ICAgIC8vIFdlIG1pZ2h0IGhhdmUgbWFkZSBsaW5lQnJlYWsgYW4gaXRlcmF0b3IgdGhhdCBwb2lu
dHMgcGFzdCB0aGUgZW5kCi0gICAgLy8gb2YgdGhlIG9iamVjdC4gRG8gdGhpcyBhZGp1c3RtZW50
IHRvIG1ha2UgaXQgcG9pbnQgdG8gdGhlIHN0YXJ0Ci0gICAgLy8gb2YgdGhlIG5leHQgb2JqZWN0
IGluc3RlYWQgdG8gYXZvaWQgY29uZnVzaW5nIHRoZSByZXN0IG9mIHRoZQotICAgIC8vIGNvZGUu
Ci0gICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSkgewotICAgICAgICBtX2xpbmVC
cmVha0hpc3RvcnkudXBkYXRlKFtdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewotICAgICAg
ICAgICAgbW9kaWZ5TWUuc2V0T2Zmc2V0KG1vZGlmeU1lLm9mZnNldCgpIC0gMSk7Ci0gICAgICAg
ICAgICBtb2RpZnlNZS5pbmNyZW1lbnQoKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0jaWYgRU5B
QkxFKENTU19UUkFJTElOR19XT1JEKQotICAgIGlmIChtX2Jsb2NrU3R5bGUudHJhaWxpbmdXb3Jk
KCkgPT0gVHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNlZCkKLSAgICAgICAgcmV0dXJuIG9w
dGltYWxMaW5lQnJlYWtMb2NhdGlvbkZvclRyYWlsaW5nV29yZCgpOwotI2VuZGlmCi0gICAgcmV0
dXJuIG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7Ci19Ci0KLSNpZiBFTkFCTEUoQ1NTX1RS
QUlMSU5HX1dPUkQpCi1pbmxpbmUgSW5saW5lSXRlcmF0b3IgQnJlYWtpbmdDb250ZXh0OjpvcHRp
bWFsTGluZUJyZWFrTG9jYXRpb25Gb3JUcmFpbGluZ1dvcmQoKQotewotICAgIGNvbnN0IHVuc2ln
bmVkIGxvbmdUcmFpbGluZ1dvcmRMZW5ndGggPSAyMDsKLSAgICBjb25zdCBmbG9hdCBvcHRpbWFs
VHJhaWxpbmdMaW5lUmF0aW8gPSAwLjE7Ci0gICAgSW5saW5lSXRlcmF0b3IgbGluZUJyZWFrID0g
bV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKTsKLSAgICBpZiAoIWxpbmVCcmVhay5yZW5kZXJl
cigpIHx8ICFtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkgfHwgYmlkaU5leHRTa2lwcGluZ0VtcHR5
SW5saW5lcygqbGluZUJyZWFrLnJvb3QoKSwgbGluZUJyZWFrLnJlbmRlcmVyKCkpIHx8ICFpczxS
ZW5kZXJUZXh0PihsaW5lQnJlYWsucmVuZGVyZXIoKSkpCi0gICAgICAgIHJldHVybiBsaW5lQnJl
YWs7Ci0gICAgUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCA9IGRvd25jYXN0PFJlbmRlclRleHQ+KCps
aW5lQnJlYWsucmVuZGVyZXIoKSk7Ci0gICAgLy8gRG9uJ3QgZXZlbiBib3RoZXIgbWVhc3VyaW5n
IGlmIG91ciByZW1haW5pbmcgbGluZSBoYXMgbWFueSBjaGFyYWN0ZXJzCi0gICAgaWYgKHJlbmRl
clRleHQudGV4dExlbmd0aCgpID09IGxpbmVCcmVhay5vZmZzZXQoKSB8fCByZW5kZXJUZXh0LnRl
eHRMZW5ndGgoKSAtIGxpbmVCcmVhay5vZmZzZXQoKSA+IGxvbmdUcmFpbGluZ1dvcmRMZW5ndGgp
Ci0gICAgICAgIHJldHVybiBsaW5lQnJlYWs7Ci0gICAgYm9vbCBpc0xvb3NlQ0pLTW9kZSA9IG1f
cmVuZGVyVGV4dEluZm8ubV90ZXh0ICE9ICZyZW5kZXJUZXh0ICYmIG1fcmVuZGVyVGV4dEluZm8u
bV9saW5lQnJlYWtJdGVyYXRvci5pc0xvb3NlQ0pLTW9kZSgpOwotICAgIGJvb2wgYnJlYWtOQlNQ
ID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHlsZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKLSAg
ICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gbGluZUJyZWFrLm5leHRCcmVha2FibGVQb3Np
dGlvbigpOwotICAgIGlzQnJlYWthYmxlKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVy
YXRvciwgbGluZUJyZWFrLm9mZnNldCgpICsgMSwgbmV4dEJyZWFrYWJsZVBvc2l0aW9uLCBicmVh
a05CU1AsIGlzTG9vc2VDSktNb2RlKTsKLSAgICBpZiAobmV4dEJyZWFrYWJsZVBvc2l0aW9uIDwg
MCB8fCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obmV4dEJyZWFrYWJsZVBvc2l0aW9uKSAhPSByZW5k
ZXJUZXh0LnRleHRMZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGxpbmVCcmVhazsKLSAgICBjb25z
dCBSZW5kZXJTdHlsZSYgc3R5bGUgPSBsaW5lU3R5bGUocmVuZGVyVGV4dCwgbV9saW5lSW5mbyk7
Ci0gICAgY29uc3QgRm9udENhc2NhZGUmIGZvbnQgPSBzdHlsZS5mb250Q2FzY2FkZSgpOwotICAg
IEhhc2hTZXQ8Y29uc3QgRm9udCo+IGR1bW15Rm9udHM7Ci0gICAgSW5saW5lSXRlcmF0b3IgYmVz
dCA9IGxpbmVCcmVhazsKLSAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1fbGluZUJyZWFrSGlz
dG9yeS5oaXN0b3J5TGVuZ3RoKCk7ICsraSkgewotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRv
ciYgY2FuZGlkYXRlID0gbV9saW5lQnJlYWtIaXN0b3J5LmdldChpKTsKLSAgICAgICAgaWYgKGNh
bmRpZGF0ZS5yZW5kZXJlcigpICE9IGxpbmVCcmVhay5yZW5kZXJlcigpKQotICAgICAgICAgICAg
cmV0dXJuIGJlc3Q7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQs
IGNhbmRpZGF0ZS5vZmZzZXQoKSwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgLSBjYW5kaWRhdGUu
b2Zmc2V0KCksIGZvbnQsIDAsIGZvbnQuaXNGaXhlZFBpdGNoKCksIG1fY29sbGFwc2VXaGl0ZVNw
YWNlLCBkdW1teUZvbnRzKTsKLSAgICAgICAgaWYgKHdpZHRoID4gbV93aWR0aC5hdmFpbGFibGVX
aWR0aCgpKQotICAgICAgICAgICAgcmV0dXJuIGJlc3Q7Ci0gICAgICAgIGlmICh3aWR0aCAvIG1f
d2lkdGguYXZhaWxhYmxlV2lkdGgoKSA+IG9wdGltYWxUcmFpbGluZ0xpbmVSYXRpbykgLy8gU3Vi
c2VxdWVudCBsaW5lIGlzIGxvbmcgZW5vdWdoCi0gICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRl
OwotICAgICAgICBiZXN0ID0gY2FuZGlkYXRlOwotICAgIH0KLSAgICByZXR1cm4gYmVzdDsKLX0K
LSNlbmRpZgotCi19Ci0KLSNlbmRpZiAvLyBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNwcAppbmRleCA5
YjJiMzA2YWJlZjAzYWQ5MGQ1YjVmMDI4MzM1MDc1ODhiZjczY2Q5Li42ZTMzY2QzMTA5ZjUxYzkz
N2MxNmE0YTI3NDNmNWZiOWNhZTlhZDkxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5n
L2xpbmUvTGluZUJyZWFrZXIuY3BwCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAiY29uZmln
LmgiCiAjaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKIAotI2luY2x1ZGUgIkJyZWFraW5nQ29udGV4
dElubGluZUhlYWRlcnMuaCIKKyNpbmNsdWRlICJCcmVha2luZ0NvbnRleHQuaCIKICNpbmNsdWRl
ICJSZW5kZXJDb21iaW5lVGV4dC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>248078</attachid>
            <date>2015-03-06 10:45:23 -0800</date>
            <delta_ts>2015-03-06 10:57:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142404-20150306104502.patch</filename>
            <type>text/plain</type>
            <size>127382</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTgxMTY3CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDdjMmQ1ZjRlOWE1MTdh
MjFmZTg2NDYwYTFkOTliMjVlODg0NjI2Yi4uZDdjYzA0MzkyN2ZmYjcxYjBiNWFkNDM4MzMyZTA3
M2RmYzM2MmIxNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDcyIEBACiAyMDE1LTAzLTA2ICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKKyAgICAgICAgUmVuYW1lIEJy
ZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaCB0byBCcmVha2luZ0NvbnRleHQuaAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNDA0CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgTm8gcG9pbnQgbmFtaW5n
IGl0ICJJbmxpbmVIZWFkZXJzIiB3aGVuIHRoZXJlIGFyZSBubyBub24taW5saW5lLWhlYWRlcnMg
ZmlsZXMuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzIGJlY2F1c2UgdGhpcyBpcyBqdXN0IGEgcmVu
YW1lIG9mIGEgZmlsZS4KKworICAgICAgICAqIFdlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHBy
b2o6CisgICAgICAgICogV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0ZXJzOgor
ICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNwcDoKKyAgICAgICAgKiByZW5kZXJpbmcv
bGluZS9CcmVha2luZ0NvbnRleHQuaDogUmVuYW1lZCBmcm9tIFNvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9saW5lL0JyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaC4KKyAgICAgICAgKFdlYkNv
cmU6OldvcmRNZWFzdXJlbWVudDo6V29yZE1lYXN1cmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkJyZWFraW5nQ29udGV4dDo6QnJlYWtpbmdDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkJy
ZWFraW5nQ29udGV4dDo6Y3VycmVudE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2lu
Z0NvbnRleHQ6OmxpbmVCcmVhayk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6
OmxpbmVXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OmF0RW5kKToK
KyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y2xlYXJMaW5lQnJlYWtJZkZpdHNP
bkxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0Ojpjb21taXRMaW5lQnJl
YWtBdEN1cnJlbnRXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Oklu
bGluZUl0ZXJhdG9ySGlzdG9yeTo6SW5saW5lSXRlcmF0b3JIaXN0b3J5KToKKyAgICAgICAgKFdl
YkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpwdXNoKToKKyAg
ICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5Ojp1
cGRhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRv
ckhpc3Rvcnk6OnJlbmRlcmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6
SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpvZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtp
bmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OmF0VGV4dFBhcmFncmFwaFNlcGFyYXRv
cik6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6OklubGluZUl0ZXJhdG9ySGlz
dG9yeTo6cHJldmlvdXNJblNhbWVOb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29u
dGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6QnJl
YWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6OmN1cnJlbnQpOgorICAgICAgICAo
V2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRvckhpc3Rvcnk6Omhpc3RvcnlM
ZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpJbmxpbmVJdGVyYXRv
ckhpc3Rvcnk6Om1vdmVUbyk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0NvbnRleHQ6Oklu
bGluZUl0ZXJhdG9ySGlzdG9yeTo6aW5jcmVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFr
aW5nQ29udGV4dDo6SW5saW5lSXRlcmF0b3JIaXN0b3J5OjpjbGVhcik6CisgICAgICAgIChXZWJD
b3JlOjpCcmVha2luZ0NvbnRleHQ6OmluaXRpYWxpemVGb3JDdXJyZW50T2JqZWN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KToKKyAgICAgICAgKFdlYkNv
cmU6OkJyZWFraW5nQ29udGV4dDo6aGFuZGxlQlIpOgorICAgICAgICAoV2ViQ29yZTo6Ym9yZGVy
UGFkZGluZ01hcmdpblN0YXJ0KToKKyAgICAgICAgKFdlYkNvcmU6OmJvcmRlclBhZGRpbmdNYXJn
aW5FbmQpOgorICAgICAgICAoV2ViQ29yZTo6c2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbik6
CisgICAgICAgIChXZWJDb3JlOjpwcmV2aW91c0luRmxvd1NpYmxpbmcpOgorICAgICAgICAoV2Vi
Q29yZTo6aW5saW5lTG9naWNhbFdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29u
dGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVh
a2luZ0NvbnRleHQ6OmhhbmRsZUZsb2F0KToKKyAgICAgICAgKFdlYkNvcmU6OnNob3VsZFNraXBX
aGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUVtcHR5SW5saW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29u
dGV4dDo6aGFuZGxlUmVwbGFjZWQpOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RQb3NpdGl2ZVdp
ZHRoKToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJp
bmVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6Om5leHRDaGFyYWN0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6dXBkYXRlQ291bnRlcklmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Om1lYXN1cmVI
eXBoZW5XaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjp0ZXh0V2lkdGgpOgorICAgICAgICAoV2Vi
Q29yZTo6ZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gpOgorICAgICAgICAoV2ViQ29yZTo6dHJ5
SHlwaGVuYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVU
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OnRleHRCZWdpbnNXaXRoQnJlYWthYmxlUG9zaXRpb24p
OgorICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bvc2l0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkJyZWFraW5nQ29udGV4dDo6Y29tbWl0QW5kVXBkYXRl
TGluZUJyZWFrSWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Y2hlY2tNaWRwb2ludHMpOgor
ICAgICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbmRPZkxpbmUpOgorICAg
ICAgICAoV2ViQ29yZTo6QnJlYWtpbmdDb250ZXh0OjpvcHRpbWFsTGluZUJyZWFrTG9jYXRpb25G
b3JUcmFpbGluZ1dvcmQpOgorICAgICAgICAqIHJlbmRlcmluZy9saW5lL0xpbmVCcmVha2VyLmNw
cDoKKworMjAxNS0wMy0wNiAgTXlsZXMgQy4gTWF4ZmllbGQgIDxtbWF4ZmllbGRAYXBwbGUuY29t
PgorCiAgICAgICAgIFRlc3QgaG9yaXotb3JpZ2luLXggYW5kIGhvcml6LW9yaWdpbi15IGluIFNW
RyBmb250cwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTQyNDAzCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJD
b3JlLnZjeHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29yZS52Y3hw
cm9qCmluZGV4IDMxMGRiYjc3MjcwNmI1MTBmZDcxNWU4MDJmNjNlMmE0MTRhNzIzMzMuLjQ4MzBm
MGQ3NmMzOGUyNzNlNzVlNzJkYmJlZTRhNWM1MDk4MTMxNGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKKysrIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagpAQCAtMjAzNDUsNyArMjAzNDUsNyBA
QAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXFJlbmRlclNlbGVjdGlvbklu
Zm8uaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xSZW5kZXJTbGlk
ZXIuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xSZW5kZXJTbmFw
c2hvdHRlZFBsdWdJbi5oIiAvPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5n
XGxpbmVcQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIiAvPgorICAgIDxDbEluY2x1ZGUg
SW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcQnJlYWtpbmdDb250ZXh0LmgiIC8+CiAgICAgPENs
SW5jbHVkZSBJbmNsdWRlPSIuLlxyZW5kZXJpbmdcbGluZVxMaW5lQnJlYWtlci5oIiAvPgogICAg
IDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVyaW5nXGxpbmVcTGluZUluZm8uaCIgLz4KICAg
ICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXExpbmVJbmxpbmVIZWFkZXJz
LmgiIC8+CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29y
ZS52Y3hwcm9qLmZpbHRlcnMgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnZjeHByb2ovV2ViQ29y
ZS52Y3hwcm9qLmZpbHRlcnMKaW5kZXggYjkxZjA4Zjk1MWM4ZWNjMWRkYTUwMzc1MTdkMTgzMWRk
YjUzNjQ2Mi4uYWY0M2E2ZDc3ZWUwYTNhZGFjOGFlYmU1MjgzNjlhMGQ2N2Y5MjYyMyAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvai5maWx0
ZXJzCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2ou
ZmlsdGVycwpAQCAtMTQ0MDgsNyArMTQ0MDgsNyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0i
Li5ccmVuZGVyaW5nXEJvcmRlckVkZ2UuaCI+CiAgICAgICA8RmlsdGVyPnJlbmRlcmluZzwvRmls
dGVyPgogICAgIDwvQ2xJbmNsdWRlPgotICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5ccmVuZGVy
aW5nXGxpbmVcQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIj4KKyAgICA8Q2xJbmNsdWRl
IEluY2x1ZGU9Ii4uXHJlbmRlcmluZ1xsaW5lXEJyZWFraW5nQ29udGV4dC5oIj4KICAgICAgIDxG
aWx0ZXI+cmVuZGVyaW5nXGxpbmU8L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJ
bmNsdWRlIEluY2x1ZGU9Ii4uXHBhZ2VcQ29udGV4dE1lbnVDb250ZXh0LmgiPgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291
cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDFjM2U5
OWUyZjZiMmU2ZDgxNTgzOTIyZDhjNzgxNGQxNzhmZjVmMTkuLmNmZGU5ZjFkNzVmYzhjNjkxZWY1
NmZlYTdlMWU3OWQzNzhkNzllZTEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTE0MzYwLDcgKzE0MzYwLDcgQEAKIAkJRkY5NDVF
Q0ExNjFGN0YzNjAwOTcxQkM4IC8qIFBzZXVkb0VsZW1lbnQuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gUHNldWRvRWxlbWVudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlGRkFDMzBGQzE4NEZCMTQ1MDA4QzRGMUUgLyogVHJhaWxpbmdPYmplY3RzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRyYWlsaW5nT2JqZWN0cy5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlGRkFDMzBGRDE4NEZCMTQ1MDA4QzRGMUUgLyogVHJhaWxpbmdP
YmplY3RzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFRyYWlsaW5n
T2JqZWN0cy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUZGQjY5OEM5MTgzMkYx
MEIwMDE1OEEzMSAvKiBCcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnMuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkZCNjk4QzkxODMyRjEwQjAwMTU4QTMxIC8qIEJy
ZWFraW5nQ29udGV4dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBCcmVha2lu
Z0NvbnRleHQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkZCNjk4Q0ExODMzRUMz
ODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IExpbmVCcmVha2VyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RkZCNjk4Q0IxODMzRUMzODAwMTU4QTMxIC8qIExpbmVCcmVha2VyLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IExpbmVCcmVha2VyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUZGQjY5OENEMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBMaW5lSW5mby5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CkBAIC0yMzQ0OSw3ICsyMzQ0OSw3IEBACiAJCUZGQjY5OEM4MTgzMkYxMEIw
MDE1OEEzMSAvKiBsaW5lICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9
ICgKLQkJCQlGRkI2OThDOTE4MzJGMTBCMDAxNThBMzEgLyogQnJlYWtpbmdDb250ZXh0SW5saW5l
SGVhZGVycy5oICovLAorCQkJCUZGQjY5OEM5MTgzMkYxMEIwMDE1OEEzMSAvKiBCcmVha2luZ0Nv
bnRleHQuaCAqLywKIAkJCQlGRkI2OThDQTE4MzNFQzM4MDAxNThBMzEgLyogTGluZUJyZWFrZXIu
Y3BwICovLAogCQkJCUZGQjY5OENCMTgzM0VDMzgwMDE1OEEzMSAvKiBMaW5lQnJlYWtlci5oICov
LAogCQkJCUZGQjY5OENEMTgzM0YxNzYwMDE1OEEzMSAvKiBMaW5lSW5mby5jcHAgKi8sCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tMaW5lTGF5b3V0LmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCmlu
ZGV4IGE3YTc4ODgxNmUwYmRiZWVkNDZjZWVhN2Y5OWQ0YWQ3NThlMjIwM2MuLmU4ZWU2YjBkNjg2
ZjAxMTczMGFlZTIxYzQ3ZTc1ZTc4OGY2Yzc2NWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0xpbmVMYXlvdXQuY3BwCkBAIC0yNiw3ICsyNiw3IEBACiAK
ICNpbmNsdWRlICJBWE9iamVjdENhY2hlLmgiCiAjaW5jbHVkZSAiQmlkaVJlc29sdmVyLmgiCi0j
aW5jbHVkZSAiQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oIgorI2luY2x1ZGUgIkJyZWFr
aW5nQ29udGV4dC5oIgogI2luY2x1ZGUgIkZsb2F0aW5nT2JqZWN0cy5oIgogI2luY2x1ZGUgIklu
bGluZUVsZW1lbnRCb3guaCIKICNpbmNsdWRlICJJbmxpbmVJdGVyYXRvci5oIgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0LmggYi9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVha2luZ0NvbnRleHQuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4x
NjA1N2FjMDEyNTM5NGQzNWIxMzk5NmMyMDllZWU3ZTk0Mzk5ODhhCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0LmgKQEAgLTAs
MCArMSwxMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwgKGtub2xs
QGtkZS5vcmcpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcsIDIwMDgs
IDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly
aWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgorICogQ29w
eXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLwor
CisjaWZuZGVmIEJyZWFraW5nQ29udGV4dF9oCisjZGVmaW5lIEJyZWFraW5nQ29udGV4dF9oCisK
KyNpbmNsdWRlICJIeXBoZW5hdGlvbi5oIgorI2luY2x1ZGUgIkxpbmVCcmVha2VyLmgiCisjaW5j
bHVkZSAiTGluZUluZm8uaCIKKyNpbmNsdWRlICJMaW5lV2lkdGguaCIKKyNpbmNsdWRlICJSZW5k
ZXJDb21iaW5lVGV4dC5oIgorI2luY2x1ZGUgIlJlbmRlckNvdW50ZXIuaCIKKyNpbmNsdWRlICJS
ZW5kZXJJbmxpbmUuaCIKKyNpbmNsdWRlICJSZW5kZXJMaW5lQnJlYWsuaCIKKyNpbmNsdWRlICJS
ZW5kZXJMaXN0TWFya2VyLmgiCisjaW5jbHVkZSAiUmVuZGVyUnVieVJ1bi5oIgorI2luY2x1ZGUg
IlJlbmRlclNWR0lubGluZVRleHQuaCIKKyNpbmNsdWRlICJUcmFpbGluZ09iamVjdHMuaCIKKyNp
bmNsdWRlICJicmVha19saW5lcy5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ1ZpZXcuaD4K
KyNpbmNsdWRlIDx3dGYvdW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKKy8vIFdlIGRvbid0IGxldCBvdXIgbGluZSBib3ggdHJlZSBmb3IgYSBzaW5nbGUg
bGluZSBnZXQgYW55IGRlZXBlciB0aGFuIHRoaXMuCitjb25zdCB1bnNpZ25lZCBjTWF4TGluZURl
cHRoID0gMjAwOworCitzdHJ1Y3QgV29yZE1lYXN1cmVtZW50IHsKKyAgICBXb3JkTWVhc3VyZW1l
bnQoKQorICAgICAgICA6IHJlbmRlcmVyKDApCisgICAgICAgICwgd2lkdGgoMCkKKyAgICAgICAg
LCBzdGFydE9mZnNldCgwKQorICAgICAgICAsIGVuZE9mZnNldCgwKQorICAgIHsKKyAgICB9CisK
KyAgICBSZW5kZXJUZXh0KiByZW5kZXJlcjsKKyAgICBmbG9hdCB3aWR0aDsKKyAgICBpbnQgc3Rh
cnRPZmZzZXQ7CisgICAgaW50IGVuZE9mZnNldDsKKyAgICBIYXNoU2V0PGNvbnN0IEZvbnQqPiBm
YWxsYmFja0ZvbnRzOworfTsKKworY2xhc3MgQnJlYWtpbmdDb250ZXh0IHsKK3B1YmxpYzoKKyAg
ICBCcmVha2luZ0NvbnRleHQoTGluZUJyZWFrZXImIGxpbmVCcmVha2VyLCBJbmxpbmVCaWRpUmVz
b2x2ZXImIHJlc29sdmVyLCBMaW5lSW5mbyYgaW5MaW5lSW5mbywgTGluZVdpZHRoJiBsaW5lV2lk
dGgsIFJlbmRlclRleHRJbmZvJiBpblJlbmRlclRleHRJbmZvLCBGbG9hdGluZ09iamVjdCogaW5M
YXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lLCBib29sIGFwcGxpZWRTdGFydFdpZHRoLCBSZW5kZXJC
bG9ja0Zsb3cmIGJsb2NrKQorICAgICAgICA6IG1fbGluZUJyZWFrZXIobGluZUJyZWFrZXIpCisg
ICAgICAgICwgbV9yZXNvbHZlcihyZXNvbHZlcikKKyAgICAgICAgLCBtX2N1cnJlbnQocmVzb2x2
ZXIucG9zaXRpb24oKSkKKyNpZiBFTkFCTEUoQ1NTX1RSQUlMSU5HX1dPUkQpCisgICAgICAgICwg
bV9saW5lQnJlYWtIaXN0b3J5KElubGluZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkpLCBi
bG9jay5zdHlsZSgpLnRyYWlsaW5nV29yZCgpID09IFRyYWlsaW5nV29yZDo6UGFydGlhbGx5QmFs
YW5jZWQgPyA1IDogMSkKKyNlbHNlCisgICAgICAgICwgbV9saW5lQnJlYWtIaXN0b3J5KElubGlu
ZUl0ZXJhdG9yKHJlc29sdmVyLnBvc2l0aW9uKCkpLCAxKQorI2VuZGlmCisgICAgICAgICwgbV9i
bG9jayhibG9jaykKKyAgICAgICAgLCBtX2xhc3RPYmplY3QobV9jdXJyZW50LnJlbmRlcmVyKCkp
CisgICAgICAgICwgbV9uZXh0T2JqZWN0KG51bGxwdHIpCisgICAgICAgICwgbV9jdXJyZW50U3R5
bGUobnVsbHB0cikKKyAgICAgICAgLCBtX2Jsb2NrU3R5bGUoYmxvY2suc3R5bGUoKSkKKyAgICAg
ICAgLCBtX2xpbmVJbmZvKGluTGluZUluZm8pCisgICAgICAgICwgbV9yZW5kZXJUZXh0SW5mbyhp
blJlbmRlclRleHRJbmZvKQorICAgICAgICAsIG1fbGFzdEZsb2F0RnJvbVByZXZpb3VzTGluZShp
bkxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUpCisgICAgICAgICwgbV93aWR0aChsaW5lV2lkdGgp
CisgICAgICAgICwgbV9jdXJyV1MoTk9STUFMKQorICAgICAgICAsIG1fbGFzdFdTKE5PUk1BTCkK
KyAgICAgICAgLCBtX3ByZXNlcnZlc05ld2xpbmUoZmFsc2UpCisgICAgICAgICwgbV9hdFN0YXJ0
KHRydWUpCisgICAgICAgICwgbV9pZ25vcmluZ1NwYWNlcyhmYWxzZSkKKyAgICAgICAgLCBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKGZhbHNlKQorICAgICAgICAsIG1fY3VycmVudENoYXJhY3Rl
cklzV1MoZmFsc2UpCisgICAgICAgICwgbV9hcHBsaWVkU3RhcnRXaWR0aChhcHBsaWVkU3RhcnRX
aWR0aCkKKyAgICAgICAgLCBtX2luY2x1ZGVFbmRXaWR0aCh0cnVlKQorICAgICAgICAsIG1fYXV0
b1dyYXAoZmFsc2UpCisgICAgICAgICwgbV9hdXRvV3JhcFdhc0V2ZXJUcnVlT25MaW5lKGZhbHNl
KQorICAgICAgICAsIG1fZmxvYXRzRml0T25MaW5lKHRydWUpCisgICAgICAgICwgbV9jb2xsYXBz
ZVdoaXRlU3BhY2UoZmFsc2UpCisgICAgICAgICwgbV9zdGFydGluZ05ld1BhcmFncmFwaChtX2xp
bmVJbmZvLnByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSgpKQorICAgICAgICAsIG1fYWxsb3dJbWFn
ZXNUb0JyZWFrKCFibG9jay5kb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFibG9jay5pc1Rh
YmxlQ2VsbCgpIHx8ICFtX2Jsb2NrU3R5bGUubG9naWNhbFdpZHRoKCkuaXNJbnRyaW5zaWNPckF1
dG8oKSkKKyAgICAgICAgLCBtX2F0RW5kKGZhbHNlKQorICAgICAgICAsIG1faGFkVW5jb21taXR0
ZWRXaWR0aEJlZm9yZUN1cnJlbnQoZmFsc2UpCisgICAgICAgICwgbV9saW5lTWlkcG9pbnRTdGF0
ZShyZXNvbHZlci5taWRwb2ludFN0YXRlKCkpCisgICAgeworICAgICAgICBtX2xpbmVJbmZvLnNl
dFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seShmYWxzZSk7CisgICAgfQorCisgICAgUmVuZGVyT2Jq
ZWN0KiBjdXJyZW50T2JqZWN0KCkgeyByZXR1cm4gbV9jdXJyZW50LnJlbmRlcmVyKCk7IH0KKyAg
ICBJbmxpbmVJdGVyYXRvciBsaW5lQnJlYWsoKSB7IHJldHVybiBtX2xpbmVCcmVha0hpc3Rvcnku
Y3VycmVudCgpOyB9CisgICAgTGluZVdpZHRoJiBsaW5lV2lkdGgoKSB7IHJldHVybiBtX3dpZHRo
OyB9CisgICAgYm9vbCBhdEVuZCgpIHsgcmV0dXJuIG1fYXRFbmQ7IH0KKworICAgIHZvaWQgaW5p
dGlhbGl6ZUZvckN1cnJlbnRPYmplY3QoKTsKKworICAgIHZvaWQgaW5jcmVtZW50KCk7CisKKyAg
ICB2b2lkIGhhbmRsZUJSKEVDbGVhciYpOworICAgIHZvaWQgaGFuZGxlT3V0T2ZGbG93UG9zaXRp
b25lZChWZWN0b3I8UmVuZGVyQm94Kj4mIHBvc2l0aW9uZWRPYmplY3RzKTsKKyAgICB2b2lkIGhh
bmRsZUZsb2F0KCk7CisgICAgdm9pZCBoYW5kbGVFbXB0eUlubGluZSgpOworICAgIHZvaWQgaGFu
ZGxlUmVwbGFjZWQoKTsKKyAgICBib29sIGhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYsIGJv
b2wmIGh5cGhlbmF0ZWQsIHVuc2lnbmVkJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcyk7Cisg
ICAgYm9vbCBjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCk7CisgICAgdm9pZCBjb21taXRBbmRVcGRh
dGVMaW5lQnJlYWtJZk5lZWRlZCgpOworICAgIElubGluZUl0ZXJhdG9yIGhhbmRsZUVuZE9mTGlu
ZSgpOworI2lmIEVOQUJMRShDU1NfVFJBSUxJTkdfV09SRCkKKyAgICBJbmxpbmVJdGVyYXRvciBv
cHRpbWFsTGluZUJyZWFrTG9jYXRpb25Gb3JUcmFpbGluZ1dvcmQoKTsKKyNlbmRpZgorCisgICAg
dm9pZCBjbGVhckxpbmVCcmVha0lmRml0c09uTGluZShib29sIGlnbm9yaW5nVHJhaWxpbmdTcGFj
ZSA9IGZhbHNlKQorICAgIHsKKyAgICAgICAgaWYgKG1fd2lkdGguZml0c09uTGluZShpZ25vcmlu
Z1RyYWlsaW5nU3BhY2UpIHx8IG1fbGFzdFdTID09IE5PV1JBUCkKKyAgICAgICAgICAgIG1fbGlu
ZUJyZWFrSGlzdG9yeS5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgY29tbWl0TGluZUJyZWFr
QXRDdXJyZW50V2lkdGgoUmVuZGVyT2JqZWN0JiBvYmplY3QsIHVuc2lnbmVkIG9mZnNldCA9IDAs
IGludCBuZXh0QnJlYWsgPSAtMSkKKyAgICB7CisgICAgICAgIG1fd2lkdGguY29tbWl0KCk7Cisg
ICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5tb3ZlVG8oJm9iamVjdCwgb2Zmc2V0LCBuZXh0QnJl
YWspOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBUaGlzIGNsYXNzIGtlZXBzIGEgc2xpZGlu
ZyB3aW5kb3cgb2YgdGhlIHBhc3QgbiBsb2NhdGlvbnMgZm9yIGFuIElubGluZUl0ZXJhdG9yLgor
ICAgIGNsYXNzIElubGluZUl0ZXJhdG9ySGlzdG9yeSA6IHByaXZhdGUgVmVjdG9yPElubGluZUl0
ZXJhdG9yLCAxPiB7CisgICAgcHVibGljOgorICAgICAgICBJbmxpbmVJdGVyYXRvckhpc3Rvcnko
KSA9IGRlbGV0ZTsKKyAgICAgICAgSW5saW5lSXRlcmF0b3JIaXN0b3J5KGNvbnN0IElubGluZUl0
ZXJhdG9yJiBpbml0aWFsLCBzaXplX3QgY2FwYWNpdHkpCisgICAgICAgICAgICA6IG1fY2FwYWNp
dHkoY2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVChjYXBhY2l0eSA+IDAp
OworICAgICAgICAgICAgdGhpcy0+YXBwZW5kKGluaXRpYWwpOworICAgICAgICB9CisKKyAgICAg
ICAgdm9pZCBwdXNoKHN0ZDo6ZnVuY3Rpb248dm9pZChJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUp
PiB1cGRhdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoIXRoaXMtPmlzRW1wdHko
KSk7CisgICAgICAgICAgICBpZiAobV9jYXBhY2l0eSAhPSAxKQorICAgICAgICAgICAgICAgIHRo
aXMtPmluc2VydCgwLCBJbmxpbmVJdGVyYXRvcih0aGlzLT5hdCgwKSkpOworICAgICAgICAgICAg
dXBkYXRlcih0aGlzLT5hdCgwKSk7CisgICAgICAgICAgICBpZiAobV9jYXBhY2l0eSAhPSAxKQor
ICAgICAgICAgICAgICAgIHRoaXMtPnJlc2l6ZShtX2NhcGFjaXR5KTsKKyAgICAgICAgfQorCisg
ICAgICAgIHZvaWQgdXBkYXRlKHN0ZDo6ZnVuY3Rpb248dm9pZChJbmxpbmVJdGVyYXRvciYgbW9k
aWZ5TWUpPiB1cGRhdGVyKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoIXRoaXMtPmlz
RW1wdHkoKSk7CisgICAgICAgICAgICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKKyAgICAgICAgfQor
CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiB0aGlzLT5h
dCgwKS5yZW5kZXJlcigpOyB9CisgICAgICAgIHVuc2lnbmVkIG9mZnNldCgpIGNvbnN0IHsgcmV0
dXJuIHRoaXMtPmF0KDApLm9mZnNldCgpOyB9CisgICAgICAgIGJvb2wgYXRUZXh0UGFyYWdyYXBo
U2VwYXJhdG9yKCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkuYXRUZXh0UGFyYWdyYXBoU2Vw
YXJhdG9yKCk7IH0KKyAgICAgICAgVUNoYXIgcHJldmlvdXNJblNhbWVOb2RlKCkgY29uc3QgeyBy
ZXR1cm4gdGhpcy0+YXQoMCkucHJldmlvdXNJblNhbWVOb2RlKCk7IH0KKyAgICAgICAgY29uc3Qg
SW5saW5lSXRlcmF0b3ImIGdldChzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoaSk7
IH07CisgICAgICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjdXJyZW50KCkgY29uc3QgeyByZXR1
cm4gZ2V0KDApOyB9CisgICAgICAgIHNpemVfdCBoaXN0b3J5TGVuZ3RoKCkgY29uc3QgeyByZXR1
cm4gdGhpcy0+c2l6ZSgpOyB9CisKKyAgICAgICAgdm9pZCBtb3ZlVG8oUmVuZGVyT2JqZWN0KiBv
YmplY3QsIHVuc2lnbmVkIG9mZnNldCwgaW50IG5leHRCcmVhayA9IC0xKQorICAgICAgICB7Cisg
ICAgICAgICAgICBwdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAg
ICAgICAgICBtb2RpZnlNZS5tb3ZlVG8ob2JqZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7CisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW5jcmVtZW50KCkKKyAgICAg
ICAgeworICAgICAgICAgICAgdXBkYXRlKFtdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewor
ICAgICAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVudCgpOworICAgICAgICAgICAgfSk7Cisg
ICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyKCkKKyAgICAgICAgeworICAgICAgICAgICAg
cHVzaChbXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAgICAgICAgICBtb2Rp
ZnlNZS5jbGVhcigpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIGNvbnN0IHNpemVfdCBtX2NhcGFjaXR5OworICAgIH07CisKKyAgICBMaW5lQnJl
YWtlciYgbV9saW5lQnJlYWtlcjsKKyAgICBJbmxpbmVCaWRpUmVzb2x2ZXImIG1fcmVzb2x2ZXI7
CisKKyAgICBJbmxpbmVJdGVyYXRvciBtX2N1cnJlbnQ7CisgICAgSW5saW5lSXRlcmF0b3JIaXN0
b3J5IG1fbGluZUJyZWFrSGlzdG9yeTsKKyAgICBJbmxpbmVJdGVyYXRvciBtX3N0YXJ0T2ZJZ25v
cmVkU3BhY2VzOworCisgICAgUmVuZGVyQmxvY2tGbG93JiBtX2Jsb2NrOworICAgIFJlbmRlck9i
amVjdCogbV9sYXN0T2JqZWN0OworICAgIFJlbmRlck9iamVjdCogbV9uZXh0T2JqZWN0OworCisg
ICAgY29uc3QgUmVuZGVyU3R5bGUqIG1fY3VycmVudFN0eWxlOworCisgICAgLy8gRmlyZWZveCBh
bmQgT3BlcmEgd2lsbCBhbGxvdyBhIHRhYmxlIGNlbGwgdG8gZ3JvdyB0byBmaXQgYW4gaW1hZ2Ug
aW5zaWRlIGl0IHVuZGVyCisgICAgLy8gdmVyeSBzcGVjaWZpYyBjaXJjdW1zdGFuY2VzIChpbiBv
cmRlciB0byBtYXRjaCBjb21tb24gV2luSUUgcmVuZGVyaW5ncykuCisgICAgLy8gTm90IHN1cHBv
cnRpbmcgdGhlIHF1aXJrIGhhcyBjYXVzZWQgdXMgdG8gbWlzLXJlbmRlciBzb21lIHJlYWwgc2l0
ZXMuIChTZWUgQnVnemlsbGEgMTA1MTcuKQorICAgIFJlbmRlclN0eWxlJiBtX2Jsb2NrU3R5bGU7
CisKKyAgICBMaW5lSW5mbyYgbV9saW5lSW5mbzsKKworICAgIFJlbmRlclRleHRJbmZvJiBtX3Jl
bmRlclRleHRJbmZvOworCisgICAgRmxvYXRpbmdPYmplY3QqIG1fbGFzdEZsb2F0RnJvbVByZXZp
b3VzTGluZTsKKworICAgIExpbmVXaWR0aCBtX3dpZHRoOworCisgICAgRVdoaXRlU3BhY2UgbV9j
dXJyV1M7CisgICAgRVdoaXRlU3BhY2UgbV9sYXN0V1M7CisKKyAgICBib29sIG1fcHJlc2VydmVz
TmV3bGluZTsKKyAgICBib29sIG1fYXRTdGFydDsKKworICAgIC8vIFRoaXMgdmFyaWFibGUgaXMg
dXNlZCBvbmx5IGlmIHdoaXRlc3BhY2UgaXNuJ3Qgc2V0IHRvIFBSRSwgYW5kIGl0IHRlbGxzIHVz
IHdoZXRoZXIKKyAgICAvLyBvciBub3Qgd2UgYXJlIGN1cnJlbnRseSBpZ25vcmluZyB3aGl0ZXNw
YWNlLgorICAgIGJvb2wgbV9pZ25vcmluZ1NwYWNlczsKKworICAgIC8vIFRoaXMgdmFyaWFibGUg
dHJhY2tzIHdoZXRoZXIgdGhlIHZlcnkgbGFzdCBjaGFyYWN0ZXIgd2Ugc2F3IHdhcyBhIHNwYWNl
LiBXZSB1c2UKKyAgICAvLyB0aGlzIHRvIGRldGVjdCB3aGVuIHdlIGVuY291bnRlciBhIHNlY29u
ZCBzcGFjZSBzbyB3ZSBrbm93IHdlIGhhdmUgdG8gdGVybWluYXRlCisgICAgLy8gYSBydW4uCisg
ICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOworICAgIGJvb2wgbV9jdXJyZW50Q2hh
cmFjdGVySXNXUzsKKyAgICBib29sIG1fYXBwbGllZFN0YXJ0V2lkdGg7CisgICAgYm9vbCBtX2lu
Y2x1ZGVFbmRXaWR0aDsKKyAgICBib29sIG1fYXV0b1dyYXA7CisgICAgYm9vbCBtX2F1dG9XcmFw
V2FzRXZlclRydWVPbkxpbmU7CisgICAgYm9vbCBtX2Zsb2F0c0ZpdE9uTGluZTsKKyAgICBib29s
IG1fY29sbGFwc2VXaGl0ZVNwYWNlOworICAgIGJvb2wgbV9zdGFydGluZ05ld1BhcmFncmFwaDsK
KyAgICBib29sIG1fYWxsb3dJbWFnZXNUb0JyZWFrOworICAgIGJvb2wgbV9hdEVuZDsKKyAgICBi
b29sIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQ7CisKKyAgICBMaW5lTWlkcG9p
bnRTdGF0ZSYgbV9saW5lTWlkcG9pbnRTdGF0ZTsKKworICAgIFRyYWlsaW5nT2JqZWN0cyBtX3Ry
YWlsaW5nT2JqZWN0czsKK307CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6aW5pdGlh
bGl6ZUZvckN1cnJlbnRPYmplY3QoKQoreworICAgIG1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9y
ZUN1cnJlbnQgPSAhIW1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpOworCisgICAgbV9jdXJyZW50
U3R5bGUgPSAmbV9jdXJyZW50LnJlbmRlcmVyKCktPnN0eWxlKCk7IC8vIEZJWE1FOiBTaG91bGQg
dGhpcyBiZSAmbGluZVN0eWxlKCptX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9saW5lSW5mbyk7ID8K
KworICAgIEFTU0VSVChtX2N1cnJlbnRTdHlsZSk7CisKKyAgICBtX25leHRPYmplY3QgPSBiaWRp
TmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKG1fYmxvY2ssIG1fY3VycmVudC5yZW5kZXJlcigpKTsK
KyAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+cGFyZW50KCkgJiYgIW1fbmV4
dE9iamVjdC0+cGFyZW50KCktPmlzRGVzY2VuZGFudE9mKG1fY3VycmVudC5yZW5kZXJlcigpLT5w
YXJlbnQoKSkpCisgICAgICAgIG1faW5jbHVkZUVuZFdpZHRoID0gdHJ1ZTsKKworICAgIG1fY3Vy
cldTID0gbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUmVwbGFjZWQoKSA/IG1fY3VycmVudC5yZW5k
ZXJlcigpLT5wYXJlbnQoKS0+c3R5bGUoKS53aGl0ZVNwYWNlKCkgOiBtX2N1cnJlbnRTdHlsZS0+
d2hpdGVTcGFjZSgpOworICAgIG1fbGFzdFdTID0gbV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkg
PyBtX2xhc3RPYmplY3QtPnBhcmVudCgpLT5zdHlsZSgpLndoaXRlU3BhY2UoKSA6IG1fbGFzdE9i
amVjdC0+c3R5bGUoKS53aGl0ZVNwYWNlKCk7CisKKyAgICBtX2F1dG9XcmFwID0gUmVuZGVyU3R5
bGU6OmF1dG9XcmFwKG1fY3VycldTKTsKKyAgICBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUg
PSBtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUgfHwgbV9hdXRvV3JhcDsKKworICAgIG1fcHJl
c2VydmVzTmV3bGluZSA9IG1fY3VycmVudC5yZW5kZXJlcigpLT5pc1NWR0lubGluZVRleHQoKSA/
IGZhbHNlIDogUmVuZGVyU3R5bGU6OnByZXNlcnZlTmV3bGluZShtX2N1cnJXUyk7CisKKyAgICBt
X2NvbGxhcHNlV2hpdGVTcGFjZSA9IFJlbmRlclN0eWxlOjpjb2xsYXBzZVdoaXRlU3BhY2UobV9j
dXJyV1MpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmluY3JlbWVudCgpCit7
CisgICAgLy8gQ2xlYXIgb3V0IG91ciBjaGFyYWN0ZXIgc3BhY2UgYm9vbCwgc2luY2UgaW5saW5l
IDxwcmU+cyBkb24ndCBjb2xsYXBzZSB3aGl0ZXNwYWNlCisgICAgLy8gd2l0aCBhZGphY2VudCBp
bmxpbmUgbm9ybWFsL25vd3JhcCBzcGFucy4KKyAgICBpZiAoIW1fY29sbGFwc2VXaGl0ZVNwYWNl
KQorICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlID0gZmFsc2U7CisKKyAgICBtX2N1
cnJlbnQubW92ZVRvU3RhcnRPZihtX25leHRPYmplY3QpOworICAgIG1fYXRTdGFydCA9IGZhbHNl
OworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZUJSKEVDbGVhciYgY2xl
YXIpCit7CisgICAgaWYgKG1fd2lkdGguZml0c09uTGluZSgpKSB7CisgICAgICAgIFJlbmRlck9i
amVjdCogYnIgPSBtX2N1cnJlbnQucmVuZGVyZXIoKTsKKyAgICAgICAgbV9saW5lQnJlYWtIaXN0
b3J5LnB1c2goWyZdKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgbW9k
aWZ5TWUubW92ZVRvU3RhcnRPZihicik7CisgICAgICAgICAgICBtb2RpZnlNZS5pbmNyZW1lbnQo
KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gQSA8YnI+IGFsd2F5cyBicmVha3MgYSBsaW5l
LCBzbyBkb24ndCBsZXQgdGhlIGxpbmUgYmUgY29sbGFwc2VkCisgICAgICAgIC8vIGF3YXkuIEFs
c28sIHRoZSBzcGFjZSBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoIGEgPGJyPiBkb2VzIG5vdAor
ICAgICAgICAvLyBnZXQgY29sbGFwc2VkIGF3YXkuIEl0IG9ubHkgZG9lcyB0aGlzIGlmIHRoZSBw
cmV2aW91cyBsaW5lIGJyb2tlCisgICAgICAgIC8vIGNsZWFubHkuIE90aGVyd2lzZSB0aGUgPGJy
PiBoYXMgbm8gZWZmZWN0IG9uIHdoZXRoZXIgdGhlIGxpbmUgaXMKKyAgICAgICAgLy8gZW1wdHkg
b3Igbm90LgorICAgICAgICBpZiAobV9zdGFydGluZ05ld1BhcmFncmFwaCkKKyAgICAgICAgICAg
IG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7CisgICAgICAg
IG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisgICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlv
dXNMaW5lQnJva2VDbGVhbmx5KHRydWUpOworCisgICAgICAgIC8vIEEgPGJyPiB3aXRoIGNsZWFy
YW5jZSBhbHdheXMgbmVlZHMgYSBsaW5lYm94IGluIGNhc2UgdGhlIGxpbmVzIGJlbG93IGl0IGdl
dCBkaXJ0aWVkIGxhdGVyIGFuZAorICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGZvciBmbG9hdHMg
dG8gY2xlYXIgLSBzbyBpZiB3ZSdyZSBpZ25vcmluZyBzcGFjZXMsIHN0b3AgaWdub3JpbmcgdGhl
bSBhbmQgYWRkIGEKKyAgICAgICAgLy8gcnVuIGZvciB0aGlzIG9iamVjdC4KKyAgICAgICAgaWYg
KG1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNsZWFyKCkgIT0gQ05PTkUpCisg
ICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLmVuc3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVk
U3BhY2VzKGJyKTsKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBwcmVjZWRlZCBieSBjb2xsYXBzaW5n
IHNwYWNlIGFuZCBhcmUgaW4gYSByaWdodC1hbGlnbmVkIGNvbnRhaW5lciB3ZSBuZWVkIHRvIGVu
c3VyZSB0aGUgc3BhY2UgZ2V0cworICAgICAgICAvLyBjb2xsYXBzZWQgYXdheSBzbyB0aGF0IGl0
IGRvZXNuJ3QgcHVzaCB0aGUgdGV4dCBvdXQgZnJvbSB0aGUgY29udGFpbmVyJ3MgcmlnaHQtaGFu
ZCBlZGdlLgorICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRsZXNzIG9mIHRoZSBjb250
YWluZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGluaW5nIGEgbG90IG9mIHRl
c3QgcmVzdWx0cy4KKyAgICAgICAgZWxzZSBpZiAobV9pZ25vcmluZ1NwYWNlcyAmJiAobV9ibG9j
a1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1fYmxvY2tTdHlsZS50ZXh0QWxpZ24oKSA9
PSBXRUJLSVRfUklHSFQpKQorICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdG9wSWdu
b3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3Vy
cmVudC5vZmZzZXQoKSkpOworCisgICAgICAgIGlmICghbV9saW5lSW5mby5pc0VtcHR5KCkpCisg
ICAgICAgICAgICBjbGVhciA9IG1fY3VycmVudFN0eWxlLT5jbGVhcigpOworICAgIH0KKyAgICBt
X2F0RW5kID0gdHJ1ZTsKK30KKworaW5saW5lIExheW91dFVuaXQgYm9yZGVyUGFkZGluZ01hcmdp
blN0YXJ0KGNvbnN0IFJlbmRlcklubGluZSYgY2hpbGQpCit7CisgICAgcmV0dXJuIGNoaWxkLm1h
cmdpblN0YXJ0KCkgKyBjaGlsZC5wYWRkaW5nU3RhcnQoKSArIGNoaWxkLmJvcmRlclN0YXJ0KCk7
Cit9CisKK2lubGluZSBMYXlvdXRVbml0IGJvcmRlclBhZGRpbmdNYXJnaW5FbmQoY29uc3QgUmVu
ZGVySW5saW5lJiBjaGlsZCkKK3sKKyAgICByZXR1cm4gY2hpbGQubWFyZ2luRW5kKCkgKyBjaGls
ZC5wYWRkaW5nRW5kKCkgKyBjaGlsZC5ib3JkZXJFbmQoKTsKK30KKworaW5saW5lIGJvb2wgc2hv
dWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihSZW5kZXJPYmplY3QqIGNoaWxkKQoreworICAgIGlm
ICghY2hpbGQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIFdoZW4gZGVjaWRpbmcgd2hl
dGhlciB3ZSdyZSBhdCB0aGUgZWRnZSBvZiBhbiBpbmxpbmUsIGFkamFjZW50IGNvbGxhcHNlZCB3
aGl0ZXNwYWNlIGlzIHRoZSBzYW1lIGFzIG5vIHNpYmxpbmcgYXQgYWxsLgorICAgIGlmIChpczxS
ZW5kZXJUZXh0PigqY2hpbGQpICYmICFkb3duY2FzdDxSZW5kZXJUZXh0PigqY2hpbGQpLnRleHRM
ZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisjaWYgRU5BQkxFKENTU19CT1hfREVDT1JB
VElPTl9CUkVBSykKKyAgICBpZiAoaXM8UmVuZGVyTGluZUJyZWFrPigqY2hpbGQpICYmIGNoaWxk
LT5wYXJlbnQoKS0+c3R5bGUoKS5ib3hEZWNvcmF0aW9uQnJlYWsoKSA9PSBEQ0xPTkUpCisgICAg
ICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUg
UmVuZGVyT2JqZWN0KiBwcmV2aW91c0luRmxvd1NpYmxpbmcoUmVuZGVyT2JqZWN0KiBjaGlsZCkK
K3sKKyAgICBkbyB7CisgICAgICAgIGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOwor
ICAgIH0gd2hpbGUgKGNoaWxkICYmIGNoaWxkLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKSk7Cisg
ICAgcmV0dXJuIGNoaWxkOworfQorCitpbmxpbmUgTGF5b3V0VW5pdCBpbmxpbmVMb2dpY2FsV2lk
dGgoUmVuZGVyT2JqZWN0KiBjaGlsZCwgYm9vbCBjaGVja1N0YXJ0RWRnZSA9IHRydWUsIGJvb2wg
Y2hlY2tFbmRFZGdlID0gdHJ1ZSkKK3sKKyAgICB1bnNpZ25lZCBsaW5lRGVwdGggPSAxOworICAg
IExheW91dFVuaXQgZXh0cmFXaWR0aCA9IDA7CisgICAgUmVuZGVyRWxlbWVudCogcGFyZW50ID0g
Y2hpbGQtPnBhcmVudCgpOworICAgIHdoaWxlIChpczxSZW5kZXJJbmxpbmU+KCpwYXJlbnQpICYm
IGxpbmVEZXB0aCsrIDwgY01heExpbmVEZXB0aCkgeworICAgICAgICBjb25zdCBhdXRvJiBwYXJl
bnRBc1JlbmRlcklubGluZSA9IGRvd25jYXN0PFJlbmRlcklubGluZT4oKnBhcmVudCk7CisgICAg
ICAgIGlmICghaXNFbXB0eUlubGluZShwYXJlbnRBc1JlbmRlcklubGluZSkpIHsKKyAgICAgICAg
ICAgIGNoZWNrU3RhcnRFZGdlID0gY2hlY2tTdGFydEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFk
ZGluZ01hcmdpbihwcmV2aW91c0luRmxvd1NpYmxpbmcoY2hpbGQpKTsKKyAgICAgICAgICAgIGlm
IChjaGVja1N0YXJ0RWRnZSkKKyAgICAgICAgICAgICAgICBleHRyYVdpZHRoICs9IGJvcmRlclBh
ZGRpbmdNYXJnaW5TdGFydChwYXJlbnRBc1JlbmRlcklubGluZSk7CisgICAgICAgICAgICBjaGVj
a0VuZEVkZ2UgPSBjaGVja0VuZEVkZ2UgJiYgc2hvdWxkQWRkQm9yZGVyUGFkZGluZ01hcmdpbihj
aGlsZC0+bmV4dFNpYmxpbmcoKSk7CisgICAgICAgICAgICBpZiAoY2hlY2tFbmRFZGdlKQorICAg
ICAgICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpbkVuZChwYXJlbnRB
c1JlbmRlcklubGluZSk7CisgICAgICAgICAgICBpZiAoIWNoZWNrU3RhcnRFZGdlICYmICFjaGVj
a0VuZEVkZ2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhV2lkdGg7CisgICAgICAgIH0K
KyAgICAgICAgY2hpbGQgPSBwYXJlbnQ7CisgICAgICAgIHBhcmVudCA9IGNoaWxkLT5wYXJlbnQo
KTsKKyAgICB9CisgICAgcmV0dXJuIGV4dHJhV2lkdGg7Cit9CisKK2lubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlT3V0T2ZGbG93UG9zaXRpb25lZChWZWN0b3I8UmVuZGVyQm94Kj4m
IHBvc2l0aW9uZWRPYmplY3RzKQoreworICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdh
c24ndCBhbiBpbmxpbmUgdHlwZSwgdGhlbiB3ZSBjYW4KKyAgICAvLyBnbyBhaGVhZCBhbmQgZGV0
ZXJtaW5lIG91ciBzdGF0aWMgaW5saW5lIHBvc2l0aW9uIG5vdy4KKyAgICBhdXRvJiBib3ggPSBk
b3duY2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgYm9vbCBpc0lu
bGluZVR5cGUgPSBib3guc3R5bGUoKS5pc09yaWdpbmFsRGlzcGxheUlubGluZVR5cGUoKTsKKyAg
ICBpZiAoIWlzSW5saW5lVHlwZSkKKyAgICAgICAgbV9ibG9jay5zZXRTdGF0aWNJbmxpbmVQb3Np
dGlvbkZvckNoaWxkKGJveCwgbV9ibG9jay5sb2dpY2FsSGVpZ2h0KCksIG1fYmxvY2suc3RhcnRP
ZmZzZXRGb3JDb250ZW50KG1fYmxvY2subG9naWNhbEhlaWdodCgpKSk7CisgICAgZWxzZSB7Cisg
ICAgICAgIC8vIElmIG91ciBvcmlnaW5hbCBkaXNwbGF5IHdhcyBhbiBJTkxJTkUgdHlwZSwgdGhl
biB3ZSBjYW4gZ28gYWhlYWQKKyAgICAgICAgLy8gYW5kIGRldGVybWluZSBvdXIgc3RhdGljIHkg
cG9zaXRpb24gbm93LgorICAgICAgICBib3gubGF5ZXIoKS0+c2V0U3RhdGljQmxvY2tQb3NpdGlv
bihtX2Jsb2NrLmxvZ2ljYWxIZWlnaHQoKSk7CisgICAgfQorCisgICAgLy8gSWYgd2UncmUgaWdu
b3Jpbmcgc3BhY2VzLCB3ZSBoYXZlIHRvIHN0b3AgYW5kIGluY2x1ZGUgdGhpcyBvYmplY3QgYW5k
CisgICAgLy8gdGhlbiBzdGFydCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCisgICAgaWYgKGlzSW5s
aW5lVHlwZSB8fCBib3guY29udGFpbmVyKCktPmlzUmVuZGVySW5saW5lKCkpIHsKKyAgICAgICAg
aWYgKG1faWdub3JpbmdTcGFjZXMpCisgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLmVu
c3VyZUxpbmVCb3hJbnNpZGVJZ25vcmVkU3BhY2VzKCZib3gpOworICAgICAgICBtX3RyYWlsaW5n
T2JqZWN0cy5hcHBlbmRCb3hJZk5lZWRlZCgmYm94KTsKKyAgICB9IGVsc2UKKyAgICAgICAgcG9z
aXRpb25lZE9iamVjdHMuYXBwZW5kKCZib3gpOworCisgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRl
ZFdpZHRoKGlubGluZUxvZ2ljYWxXaWR0aCgmYm94KSk7CisgICAgLy8gUmVzZXQgcHJpb3IgbGlu
ZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMuCisgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVC
cmVha0l0ZXJhdG9yLnJlc2V0UHJpb3JDb250ZXh0KCk7Cit9CisKK2lubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlRmxvYXQoKQoreworICAgIGF1dG8mIGZsb2F0Qm94ID0gZG93bmNh
c3Q8UmVuZGVyQm94PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOworICAgIEZsb2F0aW5nT2JqZWN0
KiBmbG9hdGluZ09iamVjdCA9IG1fbGluZUJyZWFrZXIuaW5zZXJ0RmxvYXRpbmdPYmplY3QoZmxv
YXRCb3gpOworICAgIC8vIGNoZWNrIGlmIGl0IGZpdHMgaW4gdGhlIGN1cnJlbnQgbGluZS4KKyAg
ICAvLyBJZiBpdCBkb2VzLCBwb3NpdGlvbiBpdCBub3csIG90aGVyd2lzZSwgcG9zaXRpb24KKyAg
ICAvLyBpdCBhZnRlciBtb3ZpbmcgdG8gbmV4dCBsaW5lIChpbiBjbGVhckZsb2F0cygpIGZ1bmMp
CisgICAgaWYgKG1fZmxvYXRzRml0T25MaW5lICYmIG1fd2lkdGguZml0c09uTGluZUV4Y2x1ZGlu
Z1RyYWlsaW5nV2hpdGVzcGFjZShtX2Jsb2NrLmxvZ2ljYWxXaWR0aEZvckZsb2F0KGZsb2F0aW5n
T2JqZWN0KSkpIHsKKyAgICAgICAgbV9saW5lQnJlYWtlci5wb3NpdGlvbk5ld0Zsb2F0T25MaW5l
KGZsb2F0aW5nT2JqZWN0LCBtX2xhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUsIG1fbGluZUluZm8s
IG1fd2lkdGgpOworICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkgPT0g
bV9jdXJyZW50LnJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV9saW5lQnJlYWtI
aXN0b3J5Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1l
bnQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBtX2Zsb2F0c0ZpdE9uTGluZSA9
IGZhbHNlOworICAgIC8vIFVwZGF0ZSBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVy
cywgdXNpbmcgVStGRkZEIChPQkpFQ1QgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSKSBmb3IgZmxvYXRp
bmcgZWxlbWVudC4KKyAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IudXBk
YXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKK30KKworLy8gVGhpcyBpcyBj
dXJyZW50bHkganVzdCB1c2VkIGZvciBsaXN0IG1hcmtlcnMgYW5kIGlubGluZSBmbG93cyB0aGF0
IGhhdmUgbGluZSBib3hlcy4gTmVpdGhlciBzaG91bGQKKy8vIGhhdmUgYW4gZWZmZWN0IG9uIHdo
aXRlc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgoraW5saW5lIGJvb2wgc2hvdWxkU2tp
cFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KFJlbmRlckJsb2NrRmxvdyYgYmxvY2ssIFJlbmRl
ck9iamVjdCogbywgTGluZU1pZHBvaW50U3RhdGUmIGxpbmVNaWRwb2ludFN0YXRlKQoreworICAg
IFJlbmRlck9iamVjdCogbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxvY2ss
IG8pOworICAgIHdoaWxlIChuZXh0ICYmIG5leHQtPmlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0
aW9uZWQoKSkKKyAgICAgICAgbmV4dCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMoYmxv
Y2ssIG5leHQpOworCisgICAgaWYgKGlzPFJlbmRlclRleHQ+KG5leHQpICYmIGRvd25jYXN0PFJl
bmRlclRleHQ+KCpuZXh0KS50ZXh0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIFJlbmRlclRleHQm
IG5leHRUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm5leHQpOworICAgICAgICBVQ2hhciBu
ZXh0Q2hhciA9IG5leHRUZXh0LmNoYXJhY3RlckF0KDApOworICAgICAgICBpZiAobmV4dFRleHQu
c3R5bGUoKS5pc0NvbGxhcHNpYmxlV2hpdGVTcGFjZShuZXh0Q2hhcikpIHsKKyAgICAgICAgICAg
IGxpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IobnVs
bHB0ciwgbywgMCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6
aGFuZGxlRW1wdHlJbmxpbmUoKQoreworICAgIFJlbmRlcklubGluZSYgZmxvd0JveCA9IGRvd25j
YXN0PFJlbmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigpKTsKKworICAgIC8vIFRoaXMg
c2hvdWxkIG9ubHkgZW5kIHVwIGJlaW5nIGNhbGxlZCBvbiBlbXB0eSBpbmxpbmVzCisgICAgQVNT
RVJUKGlzRW1wdHlJbmxpbmUoZmxvd0JveCkpOworCisgICAgLy8gTm93IHRoYXQgc29tZSBpbmxp
bmUgZmxvd3MgaGF2ZSBsaW5lIGJveGVzLCBpZiB3ZSBhcmUgYWxyZWFkeSBpZ25vcmluZyBzcGFj
ZXMsIHdlIG5lZWQKKyAgICAvLyB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzdG9wIHRvIGluY2x1ZGUg
dGhpcyBvYmplY3QgYW5kIHRoZW4gc3RhcnQgaWdub3Jpbmcgc3BhY2VzIGFnYWluLgorICAgIC8v
IElmIHRoaXMgb2JqZWN0IGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZSwgd2UgbmVlZCB0byBi
ZWhhdmUgbGlrZSBsaXN0IG1hcmtlcnMgYW5kCisgICAgLy8gc3RhcnQgaWdub3Jpbmcgc3BhY2Vz
LgorICAgIGJvb2wgcmVxdWlyZXNMaW5lQm94ID0gYWx3YXlzUmVxdWlyZXNMaW5lQm94KGZsb3dC
b3gpOworICAgIGlmIChyZXF1aXJlc0xpbmVCb3ggfHwgcmVxdWlyZXNMaW5lQm94Rm9yQ29udGVu
dChmbG93Qm94LCBtX2xpbmVJbmZvKSkgeworICAgICAgICAvLyBBbiBlbXB0eSBpbmxpbmUgdGhh
dCBvbmx5IGhhcyBsaW5lLWhlaWdodCwgdmVydGljYWwtYWxpZ24gb3IgZm9udC1tZXRyaWNzIHdp
bGwgb25seSBnZXQgYQorICAgICAgICAvLyBsaW5lIGJveCB0byBhZmZlY3QgdGhlIGhlaWdodCBv
ZiB0aGUgbGluZSBpZiB0aGUgcmVzdCBvZiB0aGUgbGluZSBpcyBub3QgZW1wdHkuCisgICAgICAg
IGlmIChyZXF1aXJlc0xpbmVCb3gpCisgICAgICAgICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZh
bHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOworICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykg
eworICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1f
bGluZU1pZHBvaW50U3RhdGUuZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMobV9jdXJy
ZW50LnJlbmRlcmVyKCkpOworICAgICAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5jb2xsYXBz
ZVdoaXRlU3BhY2UoKSAmJiBtX3Jlc29sdmVyLnBvc2l0aW9uKCkucmVuZGVyZXIoKSA9PSBtX2N1
cnJlbnQucmVuZGVyZXIoKQorICAgICAgICAgICAgJiYgc2hvdWxkU2tpcFdoaXRlc3BhY2VBZnRl
clN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2xpbmVNaWRwb2lu
dFN0YXRlKSkgeworICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGxpc3QgbWFya2Vycywgd2Ugc3Rh
cnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQorICAgICAgICAgICAgLy8g
YWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAgICAgICAg
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7CisgICAgICAgICAgICBtX2N1cnJlbnRD
aGFyYWN0ZXJJc1dTID0gdHJ1ZTsKKyAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSB0cnVl
OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFwcGVuZEJv
eElmTmVlZGVkKCZmbG93Qm94KTsKKyAgICB9CisKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVk
V2lkdGgoaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5kZXJlcigpKSArIGJvcmRlclBh
ZGRpbmdNYXJnaW5TdGFydChmbG93Qm94KSArIGJvcmRlclBhZGRpbmdNYXJnaW5FbmQoZmxvd0Jv
eCkpOworfQorCitpbmxpbmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmhhbmRsZVJlcGxhY2VkKCkK
K3sKKyAgICBhdXRvJiByZXBsYWNlZEJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fY3VycmVu
dC5yZW5kZXJlcigpKTsKKworICAgIGlmIChtX2F0U3RhcnQpCisgICAgICAgIG1fd2lkdGgudXBk
YXRlQXZhaWxhYmxlV2lkdGgocmVwbGFjZWRCb3gubG9naWNhbEhlaWdodCgpKTsKKworICAgIC8v
IEJyZWFrIG9uIHJlcGxhY2VkIGVsZW1lbnRzIGlmIGVpdGhlciBoYXMgbm9ybWFsIHdoaXRlLXNw
YWNlLgorICAgIGlmICgobV9hdXRvV3JhcCB8fCBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0
V1MpKSAmJiAoIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdl
c1RvQnJlYWspCisgICAgICAgICYmICghbV9jdXJyZW50LnJlbmRlcmVyKCktPmlzUnVieVJ1bigp
IHx8IGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG1fY3VycmVudC5yZW5kZXJlcigpKS0+Y2FuQnJl
YWtCZWZvcmUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yKSkpIHsKKyAgICAg
ICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJlcigpKTsK
KyAgICB9CisKKyAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgbV9saW5lTWlkcG9p
bnRTdGF0ZS5zdG9wSWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgbV9jdXJyZW50LnJl
bmRlcmVyKCksIDApKTsKKworICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2Nr
LCAmbV93aWR0aCk7CisgICAgbV9pZ25vcmluZ1NwYWNlcyA9IGZhbHNlOworICAgIG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2UgPSBmYWxzZTsKKyAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0g
ZmFsc2U7CisgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgIC8vIE9wdGltaXpl
IGZvciBhIGNvbW1vbiBjYXNlLiBJZiB3ZSBjYW4ndCBmaW5kIHdoaXRlc3BhY2UgYWZ0ZXIgdGhl
IGxpc3QKKyAgICAvLyBpdGVtLCB0aGVuIHRoaXMgaXMgYWxsIG1vb3QuCisgICAgTGF5b3V0VW5p
dCByZXBsYWNlZExvZ2ljYWxXaWR0aCA9IG1fYmxvY2subG9naWNhbFdpZHRoRm9yQ2hpbGQocmVw
bGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5TdGFydEZvckNoaWxkKHJlcGxhY2VkQm94KSArIG1f
YmxvY2subWFyZ2luRW5kRm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgaW5saW5lTG9naWNhbFdpZHRo
KG1fY3VycmVudC5yZW5kZXJlcigpKTsKKyAgICBpZiAoaXM8UmVuZGVyTGlzdE1hcmtlcj4oKm1f
Y3VycmVudC5yZW5kZXJlcigpKSkgeworICAgICAgICBpZiAobV9ibG9ja1N0eWxlLmNvbGxhcHNl
V2hpdGVTcGFjZSgpICYmIHNob3VsZFNraXBXaGl0ZXNwYWNlQWZ0ZXJTdGFydE9iamVjdChtX2Js
b2NrLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9saW5lTWlkcG9pbnRTdGF0ZSkpIHsKKyAgICAg
ICAgICAgIC8vIExpa2Ugd2l0aCBpbmxpbmUgZmxvd3MsIHdlIHN0YXJ0IGlnbm9yaW5nIHNwYWNl
cyB0byBtYWtlIHN1cmUgdGhhdCBhbnkKKyAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgc3BhY2Vz
IHdlIHNlZSB3aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2UgPSB0cnVlOworICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IGZh
bHNlOworICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKGRvd25jYXN0PFJlbmRlckxpc3RNYXJrZXI+KCptX2N1cnJlbnQucmVuZGVyZXIo
KSkuaXNJbnNpZGUoKSkKKyAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChy
ZXBsYWNlZExvZ2ljYWxXaWR0aCk7CisgICAgfSBlbHNlCisgICAgICAgIG1fd2lkdGguYWRkVW5j
b21taXR0ZWRXaWR0aChyZXBsYWNlZExvZ2ljYWxXaWR0aCk7CisgICAgaWYgKGlzPFJlbmRlclJ1
YnlSdW4+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkpIHsKKyAgICAgICAgbV93aWR0aC5hcHBseU92
ZXJoYW5nKGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG1fY3VycmVudC5yZW5kZXJlcigpKSwgbV9s
YXN0T2JqZWN0LCBtX25leHRPYmplY3QpOworICAgICAgICBkb3duY2FzdDxSZW5kZXJSdWJ5UnVu
PihtX2N1cnJlbnQucmVuZGVyZXIoKSktPnVwZGF0ZVByaW9yQ29udGV4dEZyb21DYWNoZWRCcmVh
a0l0ZXJhdG9yKG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvcik7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgLy8gVXBkYXRlIHByaW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0
ZXJzLCB1c2luZyBVK0ZGRkQgKE9CSkVDVCBSRVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciByZXBs
YWNlZCBlbGVtZW50LgorICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0
b3IudXBkYXRlUHJpb3JDb250ZXh0KHJlcGxhY2VtZW50Q2hhcmFjdGVyKTsKKyAgICB9Cit9CisK
K2lubGluZSBmbG9hdCBmaXJzdFBvc2l0aXZlV2lkdGgoY29uc3QgV29yZE1lYXN1cmVtZW50cyYg
d29yZE1lYXN1cmVtZW50cykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdvcmRNZWFz
dXJlbWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHdvcmRNZWFzdXJlbWVudHNbaV0u
d2lkdGggPiAwKQorICAgICAgICAgICAgcmV0dXJuIHdvcmRNZWFzdXJlbWVudHNbaV0ud2lkdGg7
CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbmxpbmUgYm9vbCBpdGVyYXRvcklzQmV5b25k
RW5kT2ZSZW5kZXJDb21iaW5lVGV4dChjb25zdCBJbmxpbmVJdGVyYXRvciYgaXRlciwgUmVuZGVy
Q29tYmluZVRleHQmIHJlbmRlcmVyKQoreworICAgIHJldHVybiBpdGVyLnJlbmRlcmVyKCkgPT0g
JnJlbmRlcmVyICYmIGl0ZXIub2Zmc2V0KCkgPj0gcmVuZGVyZXIudGV4dExlbmd0aCgpOworfQor
CitpbmxpbmUgdm9pZCBuZXh0Q2hhcmFjdGVyKFVDaGFyJiBjdXJyZW50Q2hhcmFjdGVyLCBVQ2hh
ciYgbGFzdENoYXJhY3RlciwgVUNoYXImIHNlY29uZFRvTGFzdENoYXJhY3RlcikKK3sKKyAgICBz
ZWNvbmRUb0xhc3RDaGFyYWN0ZXIgPSBsYXN0Q2hhcmFjdGVyOworICAgIGxhc3RDaGFyYWN0ZXIg
PSBjdXJyZW50Q2hhcmFjdGVyOworfQorCisvLyBGSVhNRTogRG9uJ3QgbGV0IGNvdW50ZXJzIG1h
cmsgdGhlbXNlbHZlcyBhcyBuZWVkaW5nIHByZWYgd2lkdGggcmVjYWxjcyBkdXJpbmcgbGF5b3V0
CisvLyBzbyB3ZSBkb24ndCBuZWVkIHRoaXMgaGFjay4KK2lubGluZSB2b2lkIHVwZGF0ZUNvdW50
ZXJJZk5lZWRlZChSZW5kZXJUZXh0JiByZW5kZXJUZXh0KQoreworICAgIGlmICghcmVuZGVyVGV4
dC5wcmVmZXJyZWRMb2dpY2FsV2lkdGhzRGlydHkoKSB8fCAhaXM8UmVuZGVyQ291bnRlcj4ocmVu
ZGVyVGV4dCkpCisgICAgICAgIHJldHVybjsKKyAgICBkb3duY2FzdDxSZW5kZXJDb3VudGVyPihy
ZW5kZXJUZXh0KS51cGRhdGVDb3VudGVyKCk7Cit9CisKK2lubGluZSBmbG9hdCBtZWFzdXJlSHlw
aGVuV2lkdGgoUmVuZGVyVGV4dCYgcmVuZGVyZXIsIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250LCBI
YXNoU2V0PGNvbnN0IEZvbnQqPiogZmFsbGJhY2tGb250cyA9IDApCit7CisgICAgY29uc3QgUmVu
ZGVyU3R5bGUmIHN0eWxlID0gcmVuZGVyZXIuc3R5bGUoKTsKKyAgICByZXR1cm4gZm9udC53aWR0
aChSZW5kZXJCbG9jazo6Y29uc3RydWN0VGV4dFJ1bigmcmVuZGVyZXIsIGZvbnQsIHN0eWxlLmh5
cGhlblN0cmluZygpLnN0cmluZygpLCBzdHlsZSksIGZhbGxiYWNrRm9udHMpOworfQorCitBTFdB
WVNfSU5MSU5FIGZsb2F0IHRleHRXaWR0aChSZW5kZXJUZXh0JiB0ZXh0LCB1bnNpZ25lZCBmcm9t
LCB1bnNpZ25lZCBsZW4sIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250LCBmbG9hdCB4UG9zLCBib29s
IGlzRml4ZWRQaXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIEhhc2hTZXQ8Y29uc3QgRm9u
dCo+JiBmYWxsYmFja0ZvbnRzLCBUZXh0TGF5b3V0KiBsYXlvdXQgPSBudWxscHRyKQoreworICAg
IGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQuc3R5bGUoKTsKKworICAgIEdseXBoT3Zl
cmZsb3cgZ2x5cGhPdmVyZmxvdzsKKyAgICBpZiAoaXNGaXhlZFBpdGNoIHx8ICghZnJvbSAmJiBs
ZW4gPT0gdGV4dC50ZXh0TGVuZ3RoKCkpIHx8IHN0eWxlLmhhc1RleHRDb21iaW5lKCkpCisgICAg
ICAgIHJldHVybiB0ZXh0LndpZHRoKGZyb20sIGxlbiwgZm9udCwgeFBvcywgJmZhbGxiYWNrRm9u
dHMsICZnbHlwaE92ZXJmbG93KTsKKworICAgIGlmIChsYXlvdXQpCisgICAgICAgIHJldHVybiBG
b250Q2FzY2FkZTo6d2lkdGgoKmxheW91dCwgZnJvbSwgbGVuLCAmZmFsbGJhY2tGb250cyk7CisK
KyAgICBUZXh0UnVuIHJ1biA9IFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZ0ZXh0LCBm
b250LCAmdGV4dCwgZnJvbSwgbGVuLCBzdHlsZSk7CisgICAgcnVuLnNldENoYXJhY3RlcnNMZW5n
dGgodGV4dC50ZXh0TGVuZ3RoKCkgLSBmcm9tKTsKKyAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNM
ZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkpOworCisgICAgcnVuLnNldENoYXJhY3RlclNjYW5Gb3JD
b2RlUGF0aCghdGV4dC5jYW5Vc2VTaW1wbGVGb250Q29kZVBhdGgoKSk7CisgICAgcnVuLnNldFRh
YlNpemUoIWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6ZSgpKTsKKyAgICBydW4uc2V0
WFBvcyh4UG9zKTsKKyAgICByZXR1cm4gZm9udC53aWR0aChydW4sICZmYWxsYmFja0ZvbnRzLCAm
Z2x5cGhPdmVyZmxvdyk7Cit9CisKKy8vIEFkZGluZyBhIHBhaXIgb2YgbWlkcG9pbnRzIGJlZm9y
ZSBhIGNoYXJhY3RlciB3aWxsIHNwbGl0IGl0IG91dCBpbnRvIGEgbmV3IGxpbmUgYm94LgoraW5s
aW5lIHZvaWQgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3goTGluZU1pZHBvaW50U3RhdGUmIGxp
bmVNaWRwb2ludFN0YXRlLCBJbmxpbmVJdGVyYXRvciYgdGV4dFBhcmFncmFwaFNlcGFyYXRvcikK
K3sKKyAgICBJbmxpbmVJdGVyYXRvciBtaWRwb2ludCgwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9y
LnJlbmRlcmVyKCksIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3Iub2Zmc2V0KCkpOworICAgIGxpbmVN
aWRwb2ludFN0YXRlLnN0YXJ0SWdub3JpbmdTcGFjZXMoSW5saW5lSXRlcmF0b3IoMCwgdGV4dFBh
cmFncmFwaFNlcGFyYXRvci5yZW5kZXJlcigpLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLm9mZnNl
dCgpIC0gMSkpOworICAgIGxpbmVNaWRwb2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNlcyhJbmxp
bmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLnJlbmRlcmVyKCksIHRleHRQYXJh
Z3JhcGhTZXBhcmF0b3Iub2Zmc2V0KCkpKTsKK30KKworaW5saW5lIHZvaWQgdHJ5SHlwaGVuYXRp
bmcoUmVuZGVyVGV4dCYgdGV4dCwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIGNvbnN0IEF0b21p
Y1N0cmluZyYgbG9jYWxlSWRlbnRpZmllciwgdW5zaWduZWQgY29uc2VjdXRpdmVIeXBoZW5hdGVk
TGluZXMsIGludCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0LCBpbnQgbWluaW11bVBy
ZWZpeExpbWl0LCBpbnQgbWluaW11bVN1ZmZpeExpbWl0LCB1bnNpZ25lZCBsYXN0U3BhY2UsIHVu
c2lnbmVkIHBvcywgZmxvYXQgeFBvcywgaW50IGF2YWlsYWJsZVdpZHRoLCBib29sIGlzRml4ZWRQ
aXRjaCwgYm9vbCBjb2xsYXBzZVdoaXRlU3BhY2UsIGludCBsYXN0U3BhY2VXb3JkU3BhY2luZywg
SW5saW5lSXRlcmF0b3ImIGxpbmVCcmVhaywgaW50IG5leHRCcmVha2FibGUsIGJvb2wmIGh5cGhl
bmF0ZWQpCit7CisgICAgLy8gTWFwICdoeXBoZW5hdGUtbGltaXQte2JlZm9yZSxhZnRlcn06IGF1
dG87JyB0byAyLgorICAgIHVuc2lnbmVkIG1pbmltdW1QcmVmaXhMZW5ndGg7CisgICAgdW5zaWdu
ZWQgbWluaW11bVN1ZmZpeExlbmd0aDsKKworICAgIGlmIChtaW5pbXVtUHJlZml4TGltaXQgPCAw
KQorICAgICAgICBtaW5pbXVtUHJlZml4TGVuZ3RoID0gMjsKKyAgICBlbHNlCisgICAgICAgIG1p
bmltdW1QcmVmaXhMZW5ndGggPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVByZWZpeExp
bWl0KTsKKworICAgIGlmIChtaW5pbXVtU3VmZml4TGltaXQgPCAwKQorICAgICAgICBtaW5pbXVt
U3VmZml4TGVuZ3RoID0gMjsKKyAgICBlbHNlCisgICAgICAgIG1pbmltdW1TdWZmaXhMZW5ndGgg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obWluaW11bVN1ZmZpeExpbWl0KTsKKworICAgIGlmIChw
b3MgLSBsYXN0U3BhY2UgPD0gbWluaW11bVN1ZmZpeExlbmd0aCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzTGltaXQgPj0gMCAmJiBjb25zZWN1
dGl2ZUh5cGhlbmF0ZWRMaW5lcyA+PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29uc2VjdXRpdmVI
eXBoZW5hdGVkTGluZXNMaW1pdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGludCBoeXBoZW5X
aWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aCh0ZXh0LCBmb250KTsKKworICAgIGZsb2F0IG1heFBy
ZWZpeFdpZHRoID0gYXZhaWxhYmxlV2lkdGggLSB4UG9zIC0gaHlwaGVuV2lkdGggLSBsYXN0U3Bh
Y2VXb3JkU3BhY2luZzsKKyAgICAvLyBJZiB0aGUgbWF4aW11bSB3aWR0aCBhdmFpbGFibGUgZm9y
IHRoZSBwcmVmaXggYmVmb3JlIHRoZSBoeXBoZW4gaXMgc21hbGwsIHRoZW4gaXQgaXMgdmVyeSB1
bmxpa2VseQorICAgIC8vIHRoYXQgYW4gaHlwaGVuYXRpb24gb3Bwb3J0dW5pdHkgZXhpc3RzLCBz
byBkbyBub3QgYm90aGVyIHRvIGxvb2sgZm9yIGl0LgorICAgIGlmIChtYXhQcmVmaXhXaWR0aCA8
PSBmb250LnBpeGVsU2l6ZSgpICogNSAvIDQpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0
IFJlbmRlclN0eWxlJiBzdHlsZSA9IHRleHQuc3R5bGUoKTsKKyAgICBUZXh0UnVuIHJ1biA9IFJl
bmRlckJsb2NrOjpjb25zdHJ1Y3RUZXh0UnVuKCZ0ZXh0LCBmb250LCAmdGV4dCwgbGFzdFNwYWNl
LCBwb3MgLSBsYXN0U3BhY2UsIHN0eWxlKTsKKyAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0
ZXh0LnRleHRMZW5ndGgoKSAtIGxhc3RTcGFjZSk7CisgICAgQVNTRVJUKHJ1bi5jaGFyYWN0ZXJz
TGVuZ3RoKCkgPj0gcnVuLmxlbmd0aCgpKTsKKworICAgIHJ1bi5zZXRUYWJTaXplKCFjb2xsYXBz
ZVdoaXRlU3BhY2UsIHN0eWxlLnRhYlNpemUoKSk7CisgICAgcnVuLnNldFhQb3MoeFBvcyArIGxh
c3RTcGFjZVdvcmRTcGFjaW5nKTsKKworICAgIHVuc2lnbmVkIHByZWZpeExlbmd0aCA9IGZvbnQu
b2Zmc2V0Rm9yUG9zaXRpb24ocnVuLCBtYXhQcmVmaXhXaWR0aCwgZmFsc2UpOworICAgIGlmIChw
cmVmaXhMZW5ndGggPCBtaW5pbXVtUHJlZml4TGVuZ3RoKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwcmVmaXhMZW5ndGggPSBsYXN0SHlwaGVuTG9jYXRpb24oU3RyaW5nVmlldyh0ZXh0LnRleHQo
KSkuc3Vic3RyaW5nKGxhc3RTcGFjZSwgcG9zIC0gbGFzdFNwYWNlKSwgc3RkOjptaW4ocHJlZml4
TGVuZ3RoLCBwb3MgLSBsYXN0U3BhY2UgLSBtaW5pbXVtU3VmZml4TGVuZ3RoKSArIDEsIGxvY2Fs
ZUlkZW50aWZpZXIpOworICAgIGlmICghcHJlZml4TGVuZ3RoIHx8IHByZWZpeExlbmd0aCA8IG1p
bmltdW1QcmVmaXhMZW5ndGgpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdoZW4gbGFzdFNw
YWNlIGlzIGEgc3BhY2UsIHdoaWNoIGl0IGFsd2F5cyBpcyBleGNlcHQgc29tZXRpbWVzIGF0IHRo
ZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9yIGFmdGVyIGNvbGxhcHNlZAorICAgIC8vIHNwYWNlLCBp
dCBzaG91bGQgbm90IGNvdW50IHRvd2FyZHMgaHlwaGVuYXRlLWxpbWl0LWJlZm9yZS4KKyAgICBp
ZiAocHJlZml4TGVuZ3RoID09IG1pbmltdW1QcmVmaXhMZW5ndGgpIHsKKyAgICAgICAgVUNoYXIg
Y2hhcmFjdGVyQXRMYXN0U3BhY2UgPSB0ZXh0LmNoYXJhY3RlckF0KGxhc3RTcGFjZSk7CisgICAg
ICAgIGlmIChjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnICcgfHwgY2hhcmFjdGVyQXRMYXN0U3Bh
Y2UgPT0gJ1xuJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXHQnIHx8IGNoYXJhY3RlckF0
TGFzdFNwYWNlID09IG5vQnJlYWtTcGFjZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBBU1NFUlQocG9zIC0gbGFzdFNwYWNlIC0gcHJlZml4TGVuZ3RoID49IG1pbmltdW1TdWZm
aXhMZW5ndGgpOworCisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgIEhhc2hTZXQ8Y29uc3QgRm9u
dCo+IGZhbGxiYWNrRm9udHM7CisgICAgZmxvYXQgcHJlZml4V2lkdGggPSBoeXBoZW5XaWR0aCAr
IHRleHRXaWR0aCh0ZXh0LCBsYXN0U3BhY2UsIHByZWZpeExlbmd0aCwgZm9udCwgeFBvcywgaXNG
aXhlZFBpdGNoLCBjb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9udHMpICsgbGFzdFNwYWNl
V29yZFNwYWNpbmc7CisgICAgQVNTRVJUKHhQb3MgKyBwcmVmaXhXaWR0aCA8PSBhdmFpbGFibGVX
aWR0aCk7CisjZWxzZQorICAgIFVOVVNFRF9QQVJBTShpc0ZpeGVkUGl0Y2gpOworI2VuZGlmCisK
KyAgICBsaW5lQnJlYWsubW92ZVRvKCZ0ZXh0LCBsYXN0U3BhY2UgKyBwcmVmaXhMZW5ndGgsIG5l
eHRCcmVha2FibGUpOworICAgIGh5cGhlbmF0ZWQgPSB0cnVlOworfQorCitpbmxpbmUgYm9vbCBC
cmVha2luZ0NvbnRleHQ6OmhhbmRsZVRleHQoV29yZE1lYXN1cmVtZW50cyYgd29yZE1lYXN1cmVt
ZW50cywgYm9vbCYgaHlwaGVuYXRlZCwgIHVuc2lnbmVkJiBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRM
aW5lcykKK3sKKyAgICBpZiAoIW1fY3VycmVudC5vZmZzZXQoKSkKKyAgICAgICAgbV9hcHBsaWVk
U3RhcnRXaWR0aCA9IGZhbHNlOworCisgICAgUmVuZGVyVGV4dCYgcmVuZGVyVGV4dCA9IGRvd25j
YXN0PFJlbmRlclRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSk7CisKKyAgICBib29sIGlzU1ZH
VGV4dCA9IHJlbmRlclRleHQuaXNTVkdJbmxpbmVUZXh0KCk7CisKKyAgICAvLyBJZiB3ZSBoYXZl
IGxlZnQgYSBuby13cmFwIGlubGluZSBhbmQgZW50ZXJlZCBhbiBhdXRvd3JhcCBpbmxpbmUgd2hp
bGUgaWdub3Jpbmcgc3BhY2VzCisgICAgLy8gdGhlbiB3ZSBuZWVkIHRvIG1hcmsgdGhlIHN0YXJ0
IG9mIHRoZSBhdXRvd3JhcCBpbmxpbmUgYXMgYSBwb3RlbnRpYWwgbGluZWJyZWFrIG5vdy4KKyAg
ICBpZiAobV9hdXRvV3JhcCAmJiAhUmVuZGVyU3R5bGU6OmF1dG9XcmFwKG1fbGFzdFdTKSAmJiBt
X2lnbm9yaW5nU3BhY2VzKQorICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChy
ZW5kZXJUZXh0KTsKKworICAgIGlmIChyZW5kZXJUZXh0LnN0eWxlKCkuaGFzVGV4dENvbWJpbmUo
KSAmJiBpczxSZW5kZXJDb21iaW5lVGV4dD4oKm1fY3VycmVudC5yZW5kZXJlcigpKSAmJiAhZG93
bmNhc3Q8UmVuZGVyQ29tYmluZVRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkuaXNDb21iaW5l
ZCgpKSB7CisgICAgICAgIGF1dG8mIGNvbWJpbmVSZW5kZXJlciA9IGRvd25jYXN0PFJlbmRlckNv
bWJpbmVUZXh0PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOworICAgICAgICBjb21iaW5lUmVuZGVy
ZXIuY29tYmluZVRleHQoKTsKKyAgICAgICAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgcmVuZGVyZXIn
cyB0ZXh0IG1heSBoYXZlIGNoYW5nZWQuIEluY3JlbWVudCBzdGFsZSBpdGVyYXRvciBwb3NpdGlv
bnMKKyAgICAgICAgaWYgKGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1f
bGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCksIGNvbWJpbmVSZW5kZXJlcikpIHsKKyAgICAgICAg
ICAgIEFTU0VSVChpdGVyYXRvcklzQmV5b25kRW5kT2ZSZW5kZXJDb21iaW5lVGV4dChtX3Jlc29s
dmVyLnBvc2l0aW9uKCksIGNvbWJpbmVSZW5kZXJlcikpOworICAgICAgICAgICAgbV9saW5lQnJl
YWtIaXN0b3J5LmluY3JlbWVudCgpOworICAgICAgICAgICAgbV9yZXNvbHZlci5pbmNyZW1lbnQo
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxp
bmVTdHlsZShyZW5kZXJUZXh0LCBtX2xpbmVJbmZvKTsKKyAgICBjb25zdCBGb250Q2FzY2FkZSYg
Zm9udCA9IHN0eWxlLmZvbnRDYXNjYWRlKCk7CisgICAgYm9vbCBpc0ZpeGVkUGl0Y2ggPSBmb250
LmlzRml4ZWRQaXRjaCgpOworICAgIGJvb2wgY2FuSHlwaGVuYXRlID0gc3R5bGUuaHlwaGVucygp
ID09IEh5cGhlbnNBdXRvICYmIFdlYkNvcmU6OmNhbkh5cGhlbmF0ZShzdHlsZS5sb2NhbGUoKSk7
CisKKyAgICB1bnNpZ25lZCBsYXN0U3BhY2UgPSBtX2N1cnJlbnQub2Zmc2V0KCk7CisgICAgZmxv
YXQgd29yZFNwYWNpbmcgPSBtX2N1cnJlbnRTdHlsZS0+Zm9udENhc2NhZGUoKS53b3JkU3BhY2lu
ZygpOworICAgIGZsb2F0IGxhc3RTcGFjZVdvcmRTcGFjaW5nID0gMDsKKyAgICBmbG9hdCB3b3Jk
U3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9IDA7CisKKyAgICBmbG9hdCB3cmFwVyA9IG1fd2lk
dGgudW5jb21taXR0ZWRXaWR0aCgpICsgaW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5k
ZXJlcigpLCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgdHJ1ZSk7CisgICAgZmxvYXQgY2hhcldpZHRo
ID0gMDsKKyAgICBib29sIGJyZWFrTkJTUCA9IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUt
Pm5ic3BNb2RlKCkgPT0gU1BBQ0U7CisgICAgLy8gQXV0by13cmFwcGluZyB0ZXh0IHNob3VsZCB3
cmFwIGluIHRoZSBtaWRkbGUgb2YgYSB3b3JkIG9ubHkgaWYgaXQgY291bGQgbm90IHdyYXAgYmVm
b3JlIHRoZSB3b3JkLAorICAgIC8vIHdoaWNoIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHdvcmQg
aXMgdGhlIGZpcnN0IHRoaW5nIG9uIHRoZSBsaW5lLCB0aGF0IGlzLCBpZiB8d3wgaXMgemVyby4K
KyAgICBib29sIGJyZWFrV29yZHMgPSBtX2N1cnJlbnRTdHlsZS0+YnJlYWtXb3JkcygpICYmICgo
bV9hdXRvV3JhcCAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB8fCBtX2N1cnJXUyA9PSBQ
UkUpOworICAgIGJvb2wgbWlkV29yZEJyZWFrID0gZmFsc2U7CisgICAgYm9vbCBicmVha0FsbCA9
IG1fY3VycmVudFN0eWxlLT53b3JkQnJlYWsoKSA9PSBCcmVha0FsbFdvcmRCcmVhayAmJiBtX2F1
dG9XcmFwOworICAgIGZsb2F0IGh5cGhlbldpZHRoID0gMDsKKyAgICBib29sIGlzTG9vc2VDSktN
b2RlID0gZmFsc2U7CisKKyAgICBpZiAoaXNTVkdUZXh0KSB7CisgICAgICAgIGJyZWFrV29yZHMg
PSBmYWxzZTsKKyAgICAgICAgYnJlYWtBbGwgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9y
ZW5kZXJUZXh0SW5mby5tX3RleHQgIT0gJnJlbmRlclRleHQpIHsKKyAgICAgICAgdXBkYXRlQ291
bnRlcklmTmVlZGVkKHJlbmRlclRleHQpOworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fdGV4
dCA9ICZyZW5kZXJUZXh0OworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fZm9udCA9ICZmb250
OworICAgICAgICBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0ID0gZm9udC5jcmVhdGVMYXlvdXQo
JnJlbmRlclRleHQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIG1fY29sbGFwc2VXaGl0ZVNwYWNl
KTsKKyAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnJlc2V0U3Ry
aW5nQW5kUmVsZWFzZUl0ZXJhdG9yKHJlbmRlclRleHQudGV4dCgpLCBzdHlsZS5sb2NhbGUoKSwg
bWFwTGluZUJyZWFrVG9JdGVyYXRvck1vZGUobV9ibG9ja1N0eWxlLmxpbmVCcmVhaygpKSk7Cisg
ICAgICAgIGlzTG9vc2VDSktNb2RlID0gbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJh
dG9yLmlzTG9vc2VDSktNb2RlKCk7CisgICAgfSBlbHNlIGlmIChtX3JlbmRlclRleHRJbmZvLm1f
bGF5b3V0ICYmIG1fcmVuZGVyVGV4dEluZm8ubV9mb250ICE9ICZmb250KSB7CisgICAgICAgIG1f
cmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7CisgICAgICAgIG1fcmVuZGVyVGV4dEluZm8u
bV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dCgmcmVuZGVyVGV4dCwgbV93aWR0aC5jdXJyZW50
V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOworICAgIH0KKworICAgIFRleHRMYXlvdXQq
IHRleHRMYXlvdXQgPSBtX3JlbmRlclRleHRJbmZvLm1fbGF5b3V0LmdldCgpOworCisgICAgLy8g
Tm9uLXplcm8gb25seSB3aGVuIGtlcm5pbmcgaXMgZW5hYmxlZCBhbmQgVGV4dExheW91dCBpc24n
dCB1c2VkLCBpbiB3aGljaCBjYXNlIHdlIG1lYXN1cmUKKyAgICAvLyB3b3JkcyB3aXRoIHRoZWly
IHRyYWlsaW5nIHNwYWNlLCB0aGVuIHN1YnRyYWN0IGl0cyB3aWR0aC4KKyAgICBIYXNoU2V0PGNv
bnN0IEZvbnQqPiBmYWxsYmFja0ZvbnRzOworICAgIGZsb2F0IHdvcmRUcmFpbGluZ1NwYWNlV2lk
dGggPSAoZm9udC50eXBlc2V0dGluZ0ZlYXR1cmVzKCkgJiBLZXJuaW5nKSAmJiAhdGV4dExheW91
dCA/IGZvbnQud2lkdGgoUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnJlbmRlclRleHQs
IGZvbnQsICZzcGFjZSwgMSwgc3R5bGUpLCAmZmFsbGJhY2tGb250cykgKyB3b3JkU3BhY2luZyA6
IDA7CisKKyAgICBVQ2hhciBsYXN0Q2hhcmFjdGVyID0gbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVC
cmVha0l0ZXJhdG9yLmxhc3RDaGFyYWN0ZXIoKTsKKyAgICBVQ2hhciBzZWNvbmRUb0xhc3RDaGFy
YWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3Iuc2Vjb25kVG9MYXN0
Q2hhcmFjdGVyKCk7CisgICAgZm9yICg7IG1fY3VycmVudC5vZmZzZXQoKSA8IHJlbmRlclRleHQu
dGV4dExlbmd0aCgpOyBtX2N1cnJlbnQuZmFzdEluY3JlbWVudEluVGV4dE5vZGUoKSkgeworICAg
ICAgICBib29sIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSA9IG1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2U7CisgICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0ZXJJc1dTID0gbV9jdXJyZW50Q2hh
cmFjdGVySXNXUzsKKyAgICAgICAgVUNoYXIgYyA9IG1fY3VycmVudC5jdXJyZW50KCk7CisgICAg
ICAgIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgPSBjID09ICcgJyB8fCBjID09ICdcdCcgfHwg
KCFtX3ByZXNlcnZlc05ld2xpbmUgJiYgKGMgPT0gJ1xuJykpOworCisgICAgICAgIGlmICghbV9j
b2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpCisgICAgICAg
ICAgICBtX2xpbmVJbmZvLnNldEVtcHR5KGZhbHNlLCAmbV9ibG9jaywgJm1fd2lkdGgpOworCisg
ICAgICAgIGlmIChjID09IHNvZnRIeXBoZW4gJiYgbV9hdXRvV3JhcCAmJiAhaHlwaGVuV2lkdGgg
JiYgc3R5bGUuaHlwaGVucygpICE9IEh5cGhlbnNOb25lKSB7CisgICAgICAgICAgICBoeXBoZW5X
aWR0aCA9IG1lYXN1cmVIeXBoZW5XaWR0aChyZW5kZXJUZXh0LCBmb250LCAmZmFsbGJhY2tGb250
cyk7CisgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaHlwaGVuV2lkdGgp
OworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBhcHBseVdvcmRTcGFjaW5nID0gZmFsc2U7CisK
KyAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyA9IG1fY3VycmVudENoYXJhY3RlcklzU3Bh
Y2UgfHwgKGJyZWFrTkJTUCAmJiBjID09IG5vQnJlYWtTcGFjZSk7CisKKyAgICAgICAgaWYgKChi
cmVha0FsbCB8fCBicmVha1dvcmRzKSAmJiAhbWlkV29yZEJyZWFrICYmICghbV9jdXJyZW50Q2hh
cmFjdGVySXNTcGFjZSB8fCBzdHlsZS53aGl0ZVNwYWNlKCkgIT0gUFJFX1dSQVApKSB7CisgICAg
ICAgICAgICB3cmFwVyArPSBjaGFyV2lkdGg7CisgICAgICAgICAgICBib29sIG1pZFdvcmRCcmVh
a0lzQmVmb3JlU3Vycm9nYXRlUGFpciA9IFUxNl9JU19MRUFEKGMpICYmIG1fY3VycmVudC5vZmZz
ZXQoKSArIDEgPCByZW5kZXJUZXh0LnRleHRMZW5ndGgoKSAmJiBVMTZfSVNfVFJBSUwocmVuZGVy
VGV4dFttX2N1cnJlbnQub2Zmc2V0KCkgKyAxXSk7CisgICAgICAgICAgICBjaGFyV2lkdGggPSB0
ZXh0V2lkdGgocmVuZGVyVGV4dCwgbV9jdXJyZW50Lm9mZnNldCgpLCBtaWRXb3JkQnJlYWtJc0Jl
Zm9yZVN1cnJvZ2F0ZVBhaXIgPyAyIDogMSwgZm9udCwgbV93aWR0aC5jb21taXR0ZWRXaWR0aCgp
ICsgd3JhcFcsIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGZhbGxiYWNrRm9u
dHMsIHRleHRMYXlvdXQpOworICAgICAgICAgICAgbWlkV29yZEJyZWFrID0gbV93aWR0aC5jb21t
aXR0ZWRXaWR0aCgpICsgd3JhcFcgKyBjaGFyV2lkdGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRo
KCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbmV4dEJyZWFrYWJsZVBvc2l0aW9uID0gbV9j
dXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpOworICAgICAgICBib29sIGJldHdlZW5Xb3Jk
cyA9IGMgPT0gJ1xuJyB8fCAobV9jdXJyV1MgIT0gUFJFICYmICFtX2F0U3RhcnQgJiYgaXNCcmVh
a2FibGUobV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBtX2N1cnJlbnQub2Zm
c2V0KCksIG5leHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtOQlNQLCBpc0xvb3NlQ0pLTW9kZSkK
KyAgICAgICAgICAgICYmIChzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUgfHwgKG1fY3Vy
cmVudC5wcmV2aW91c0luU2FtZU5vZGUoKSAhPSBzb2Z0SHlwaGVuKSkpOworICAgICAgICBtX2N1
cnJlbnQuc2V0TmV4dEJyZWFrYWJsZVBvc2l0aW9uKG5leHRCcmVha2FibGVQb3NpdGlvbik7CisK
KyAgICAgICAgaWYgKGJldHdlZW5Xb3JkcyB8fCBtaWRXb3JkQnJlYWspIHsKKyAgICAgICAgICAg
IGJvb2wgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICBpZiAobV9p
Z25vcmluZ1NwYWNlcykgeworICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFjaW5nID0g
MDsKKyAgICAgICAgICAgICAgICBpZiAoIW1fY3VycmVudENoYXJhY3RlcklzU3BhY2UpIHsKKyAg
ICAgICAgICAgICAgICAgICAgLy8gU3RvcCBpZ25vcmluZyBzcGFjZXMgYW5kIGJlZ2luIGF0IHRo
aXMKKyAgICAgICAgICAgICAgICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgICAgICAg
ICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHdvcmRTcGFj
aW5nRm9yV29yZE1lYXN1cmVtZW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFNwYWNl
ID0gbV9jdXJyZW50Lm9mZnNldCgpOyAvLyBlLmcuLCAiRm9vICAgIGdvbyIsIGRvbid0IGFkZCBp
biBhbnkgb2YgdGhlIGlnbm9yZWQgc3BhY2VzLgorICAgICAgICAgICAgICAgICAgICBtX2xpbmVN
aWRwb2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJl
bnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpKSk7CisgICAgICAgICAgICAgICAgICAg
IHN0b3BwZWRJZ25vcmluZ1NwYWNlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCBrZWVwIGlnbm9yaW5nIHRoZXNlIHNwYWNlcy4K
KyAgICAgICAgICAgICAgICAgICAgbmV4dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNv
bmRUb0xhc3RDaGFyYWN0ZXIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVu
dHMuZ3Jvdyh3b3JkTWVhc3VyZW1lbnRzLnNpemUoKSArIDEpOworICAgICAgICAgICAgV29yZE1l
YXN1cmVtZW50JiB3b3JkTWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKTsKKwor
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LnJlbmRlcmVyID0gJnJlbmRlclRleHQ7CisgICAg
ICAgICAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50Lm9mZnNldCgpOwor
ICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50LnN0YXJ0T2Zmc2V0ID0gbGFzdFNwYWNlOworCisg
ICAgICAgICAgICBmbG9hdCBhZGRpdGlvbmFsVGVtcFdpZHRoOworICAgICAgICAgICAgaWYgKHdv
cmRUcmFpbGluZ1NwYWNlV2lkdGggJiYgYyA9PSAnICcpCisgICAgICAgICAgICAgICAgYWRkaXRp
b25hbFRlbXBXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVu
dC5vZmZzZXQoKSArIDEgLSBsYXN0U3BhY2UsIGZvbnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCks
IGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxs
YmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSAtIHdvcmRUcmFpbGluZ1NwYWNlV2lkdGg7CisgICAgICAg
ICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbFRlbXBXaWR0aCA9IHRleHRXaWR0
aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1fY3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwg
Zm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hp
dGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOworCisg
ICAgICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuaXNFbXB0eSgpICYm
ICFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1l
bnQuZmFsbGJhY2tGb250cy5zd2FwKGZhbGxiYWNrRm9udHMpOworICAgICAgICAgICAgZmFsbGJh
Y2tGb250cy5jbGVhcigpOworCisgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGggPSBh
ZGRpdGlvbmFsVGVtcFdpZHRoICsgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQ7CisgICAg
ICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxhc3RTcGFjZVdvcmRTcGFjaW5nOworICAg
ICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgp
OworCisgICAgICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgcHJldmlvdXNDaGFy
YWN0ZXJJc1NwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRkaXRpb25hbFRl
bXBXaWR0aCkKKyAgICAgICAgICAgICAgICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdp
ZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgpOworCisgICAgICAgICAgICBpZiAoIW1fYXBwbGllZFN0
YXJ0V2lkdGgpIHsKKyAgICAgICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgo
aW5saW5lTG9naWNhbFdpZHRoKG1fY3VycmVudC5yZW5kZXJlcigpLCB0cnVlLCBmYWxzZSkpOwor
ICAgICAgICAgICAgICAgIG1fYXBwbGllZFN0YXJ0V2lkdGggPSB0cnVlOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBhcHBseVdvcmRTcGFjaW5nID0gd29yZFNwYWNpbmcgJiYgbV9jdXJy
ZW50Q2hhcmFjdGVySXNTcGFjZTsKKworICAgICAgICAgICAgaWYgKCFtX3dpZHRoLmNvbW1pdHRl
ZFdpZHRoKCkgJiYgbV9hdXRvV3JhcCAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkpCisgICAgICAg
ICAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RMaW5lKCkp
OworCisgICAgICAgICAgICBpZiAobV9hdXRvV3JhcCB8fCBicmVha1dvcmRzKSB7CisgICAgICAg
ICAgICAgICAgLy8gSWYgd2UgYnJlYWsgb25seSBhZnRlciB3aGl0ZS1zcGFjZSwgY29uc2lkZXIg
dGhlIGN1cnJlbnQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgLy8gYXMgY2FuZGlkYXRlIHdp
ZHRoIGZvciB0aGlzIGxpbmUuCisgICAgICAgICAgICAgICAgYm9vbCBsaW5lV2FzVG9vV2lkZSA9
IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChtX3dpZHRoLmZpdHNPbkxpbmUoKSAmJiBtX2N1
cnJlbnRDaGFyYWN0ZXJJc1dTICYmIG1fY3VycmVudFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRl
U3BhY2UoKSAmJiAhbWlkV29yZEJyZWFrKSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNo
YXJXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1cnJlbnQub2Zmc2V0KCksIDEsIGZv
bnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KSArIChhcHBs
eVdvcmRTcGFjaW5nID8gd29yZFNwYWNpbmcgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgbGluZSBpcyB0b28gYmlnIGV2ZW4gd2l0aG91dCB0aGUgZXh0cmEgc3BhY2UKKyAg
ICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSWYgaXQgaXMgbm90
LCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGluZSBuZWVkcyB0
aGUgZXh0cmEgd2hpdGVzcGFjZSB0byBiZSB0b28gbG9uZywKKyAgICAgICAgICAgICAgICAgICAg
Ly8gdGhlbiBtb3ZlIHRoZSBsaW5lIGJyZWFrIHRvIHRoZSBzcGFjZSBhbmQgc2tpcCBhbGwKKyAg
ICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCB3aGl0ZXNwYWNlLgorICAgICAgICAgICAg
ICAgICAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZUluY2x1ZGluZ0V4dHJhV2lkdGgoY2hhcldp
ZHRoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVdhc1Rvb1dpZGUgPSB0cnVlOwor
ICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGlu
ZUl0ZXJhdG9yJiBtb2RpZnlNZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlm
eU1lLm1vdmVUbyhtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1
cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1fbGluZUJyZWFrZXIuc2tpcFRyYWlsaW5nV2hpdGVzcGFjZShtb2RpZnlNZSwgbV9saW5l
SW5mbyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGluZVdhc1Rvb1dpZGUg
fHwgIW1fd2lkdGguZml0c09uTGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjYW5I
eXBoZW5hdGUgJiYgIW1fd2lkdGguZml0c09uTGluZSgpKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICBtX2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1l
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5SHlwaGVuYXRpbmcocmVuZGVyVGV4
dCwgZm9udCwgc3R5bGUubG9jYWxlKCksIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzLCBtX2Js
b2NrU3R5bGUuaHlwaGVuYXRpb25MaW1pdExpbmVzKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRC
ZWZvcmUoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEFmdGVyKCksIGxhc3RTcGFjZSwgbV9jdXJy
ZW50Lm9mZnNldCgpLCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpIC0gYWRkaXRpb25hbFRlbXBXaWR0
aCwgbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0
ZVNwYWNlLCBsYXN0U3BhY2VXb3JkU3BhY2luZywgbW9kaWZ5TWUsIG1fY3VycmVudC5uZXh0QnJl
YWthYmxlUG9zaXRpb24oKSwgbV9saW5lQnJlYWtlci5tX2h5cGhlbmF0ZWQpOworICAgICAgICAg
ICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJl
YWtlci5tX2h5cGhlbmF0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5k
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3Io
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdub3JpbmdTcGFjZXMg
JiYgbV9jdXJyZW50Lm9mZnNldCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQp
OworICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgp
OworICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9r
ZUNsZWFubHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQu
ZW5kT2Zmc2V0ID0gbV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0
KCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4obV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkp
ICYmIGRvd25jYXN0PFJlbmRlclRleHQ+KCptX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSku
dGV4dExlbmd0aCgpICYmIGRvd25jYXN0PFJlbmRlclRleHQ+KCptX2xpbmVCcmVha0hpc3Rvcnku
cmVuZGVyZXIoKSkuY2hhcmFjdGVyQXQobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNldCgpIC0gMSkg
PT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpCisgICAgICAg
ICAgICAgICAgICAgICAgICBoeXBoZW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAmJiBtX2xpbmVCcmVha0hpc3Rvcnkub2Zm
c2V0KCkgIT0gKHVuc2lnbmVkKXdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgJiYgIXdvcmRNZWFz
dXJlbWVudC53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJXaWR0aCkg
eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQg
PSBtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgd29yZE1lYXN1cmVtZW50LndpZHRoID0gY2hhcldpZHRoOworICAgICAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIERp
ZG4ndCBmaXQuIEp1bXAgdG8gdGhlIGVuZCB1bmxlc3MgdGhlcmUncyBzdGlsbCBhbiBvcHBvcnR1
bml0eSB0byBjb2xsYXBzZSB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgICAgICAgICBpZiAobV9p
Z25vcmluZ1NwYWNlcyB8fCAhbV9jb2xsYXBzZVdoaXRlU3BhY2UgfHwgIW1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgfHwgIXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgeworICAgICAgICAgICAg
ICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICBpZiAoIWJldHdlZW5Xb3JkcyB8fCAobWlkV29yZEJyZWFr
ICYmICFtX2F1dG9XcmFwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5j
b21taXR0ZWRXaWR0aCgtYWRkaXRpb25hbFRlbXBXaWR0aCk7CisgICAgICAgICAgICAgICAgICAg
IGlmIChoeXBoZW5XaWR0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3Qg
dGhlIHdpZHRoIG9mIHRoZSBzb2Z0IGh5cGhlbiBvdXQgc2luY2Ugd2UgZml0IG9uIGEgbGluZS4K
KyAgICAgICAgICAgICAgICAgICAgICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aCgtaHlw
aGVuV2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaHlwaGVuV2lkdGggPSAwOworICAg
ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAoYyA9PSAnXG4nICYmIG1fcHJlc2VydmVzTmV3bGluZSkgeworICAgICAg
ICAgICAgICAgIGlmICghc3RvcHBlZElnbm9yaW5nU3BhY2VzICYmIG1fY3VycmVudC5vZmZzZXQo
KSkKKyAgICAgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFjdGVyR2V0c0xpbmVCb3gobV9saW5l
TWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAgICAgICAgICBjb21taXRMaW5lQnJl
YWtBdEN1cnJlbnRXaWR0aCgqbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQo
KSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBt
X2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgbV9saW5lSW5m
by5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYm
IGJldHdlZW5Xb3JkcykgeworICAgICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVu
dFdpZHRoKCptX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJl
bnQubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIHdyYXBXID0gMDsK
KyAgICAgICAgICAgICAgICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxkIG5vdCB3cmFwIGlu
IHRoZSBtaWRkbGUgb2YgYSB3b3JkIG9uY2UgaXQgaGFzIGhhZCBhbgorICAgICAgICAgICAgICAg
IC8vIG9wcG9ydHVuaXR5IHRvIGJyZWFrIGFmdGVyIGEgd29yZC4KKyAgICAgICAgICAgICAgICBi
cmVha1dvcmRzID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaWRX
b3JkQnJlYWsgJiYgIVUxNl9JU19UUkFJTChjKSAmJiAhKFVfR0VUX0dDX01BU0soYykgJiBVX0dD
X01fTUFTSykpIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGlzIGFzIGEgYnJlYWth
YmxlIHBvc2l0aW9uIGluIGNhc2UKKyAgICAgICAgICAgICAgICAvLyBhZGRpbmcgdGhlIGVuZCB3
aWR0aCBmb3JjZXMgYSBicmVhay4KKyAgICAgICAgICAgICAgICBtX2xpbmVCcmVha0hpc3Rvcnku
bW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVu
dC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgbWlkV29yZEJyZWFr
ICY9IChicmVha1dvcmRzIHx8IGJyZWFrQWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgaWYgKGJldHdlZW5Xb3JkcykgeworICAgICAgICAgICAgICAgIGxhc3RTcGFjZVdvcmRTcGFj
aW5nID0gYXBwbHlXb3JkU3BhY2luZyA/IHdvcmRTcGFjaW5nIDogMDsKKyAgICAgICAgICAgICAg
ICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFjaW5nICYmIHdv
cmRNZWFzdXJlbWVudC53aWR0aCkgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICAgICAg
bGFzdFNwYWNlID0gbV9jdXJyZW50Lm9mZnNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAoIW1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hp
dGVTcGFjZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgZW5jb3VudGVyIGEgbmV3bGlu
ZSwgb3IgaWYgd2UgZW5jb3VudGVyIGEKKyAgICAgICAgICAgICAgICAvLyBzZWNvbmQgc3BhY2Us
IHdlIG5lZWQgdG8gZ28gYWhlYWQgYW5kIGJyZWFrIHVwIHRoaXMKKyAgICAgICAgICAgICAgICAv
LyBydW4gYW5kIGVudGVyIGEgbW9kZSB3aGVyZSB3ZSBzdGFydCBjb2xsYXBzaW5nIHNwYWNlcy4K
KyAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBwcmV2aW91
c0NoYXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNl
cyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UganVzdCBlbnRlcmVkIGEgbW9k
ZSB3aGVyZSB3ZSBhcmUgaWdub3JpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BhY2VzLiBD
cmVhdGUgYSBtaWRwb2ludCB0byB0ZXJtaW5hdGUgdGhlIHJ1bgorICAgICAgICAgICAgICAgICAg
ICAvLyBiZWZvcmUgdGhlIHNlY29uZCBzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgbV9saW5l
TWlkcG9pbnRTdGF0ZS5zdGFydElnbm9yaW5nU3BhY2VzKG1fc3RhcnRPZklnbm9yZWRTcGFjZXMp
OworICAgICAgICAgICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2ludHNG
b3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0ZXJhdG9yKCksIFRy
YWlsaW5nT2JqZWN0czo6RG9Ob3RDb2xsYXBzZUZpcnN0U3BhY2UpOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7
CisgICAgICAgICAgICAvLyBTdG9wIGlnbm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcwor
ICAgICAgICAgICAgLy8gbmV3IHBvaW50LgorICAgICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9
IGZhbHNlOworICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFj
aW5nID8gd29yZFNwYWNpbmcgOiAwOworICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVh
c3VyZW1lbnQgPSAoYXBwbHlXb3JkU3BhY2luZyAmJiB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKS53
aWR0aCkgPyB3b3JkU3BhY2luZyA6IDA7CisgICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJl
bnQub2Zmc2V0KCk7IC8vIGUuZy4sICJGb28gICAgZ29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0
aGUgaWdub3JlZCBzcGFjZXMuCisgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0b3BJ
Z25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9j
dXJyZW50Lm9mZnNldCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTVkdUZXh0ICYm
IG1fY3VycmVudC5vZmZzZXQoKSkgeworICAgICAgICAgICAgLy8gRm9yY2UgY3JlYXRpb24gb2Yg
bmV3IElubGluZUJveGVzIGZvciBlYWNoIGFic29sdXRlIHBvc2l0aW9uZWQgY2hhcmFjdGVyICh0
aG9zZSB0aGF0IHN0YXJ0IG5ldyB0ZXh0IGNodW5rcykuCisgICAgICAgICAgICBpZiAoZG93bmNh
c3Q8UmVuZGVyU1ZHSW5saW5lVGV4dD4ocmVuZGVyVGV4dCkuY2hhcmFjdGVyU3RhcnRzTmV3VGV4
dENodW5rKG1fY3VycmVudC5vZmZzZXQoKSkpCisgICAgICAgICAgICAgICAgZW5zdXJlQ2hhcmFj
dGVyR2V0c0xpbmVCb3gobV9saW5lTWlkcG9pbnRTdGF0ZSwgbV9jdXJyZW50KTsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFwcmV2aW91c0No
YXJhY3RlcklzU3BhY2UpIHsKKyAgICAgICAgICAgIG1fc3RhcnRPZklnbm9yZWRTcGFjZXMuc2V0
UmVuZGVyZXIobV9jdXJyZW50LnJlbmRlcmVyKCkpOworICAgICAgICAgICAgbV9zdGFydE9mSWdu
b3JlZFNwYWNlcy5zZXRPZmZzZXQobV9jdXJyZW50Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIC8v
IFNwYWNlcyBhZnRlciByaWdodC1hbGlnbmVkIHRleHQgYW5kIGJlZm9yZSBhIGxpbmUtYnJlYWsg
Z2V0IGNvbGxhcHNlZCBhd2F5IGNvbXBsZXRlbHkgc28gdGhhdCB0aGUgdHJhaWxpbmcKKyAgICAg
ICAgICAgIC8vIHNwYWNlIGRvZXNuJ3Qgc2VlbSB0byBwdXNoIHRoZSB0ZXh0IG91dCBmcm9tIHRo
ZSByaWdodC1oYW5kIGVkZ2UuCisgICAgICAgICAgICAvLyBGSVhNRTogRG8gdGhpcyByZWdhcmRs
ZXNzIG9mIHRoZSBjb250YWluZXIncyBhbGlnbm1lbnQgLSB3aWxsIHJlcXVpcmUgcmViYXNlbGlu
aW5nIGEgbG90IG9mIHRlc3QgcmVzdWx0cy4KKyAgICAgICAgICAgIGlmIChtX25leHRPYmplY3Qg
JiYgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5vZmZzZXQoKSAmJiBtX25leHRPYmplY3QtPmlzQlIo
KSAmJiAobV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFJJR0hUIHx8IG1fYmxvY2tTdHlsZS50
ZXh0QWxpZ24oKSA9PSBXRUJLSVRfUklHSFQpKSB7CisgICAgICAgICAgICAgICAgbV9zdGFydE9m
SWdub3JlZFNwYWNlcy5zZXRPZmZzZXQobV9zdGFydE9mSWdub3JlZFNwYWNlcy5vZmZzZXQoKSAt
IDEpOworICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSB0cmFpbGlu
ZyBzcGFjZSBzdGFydCBpZ25vcmluZyBpdCBub3cgc28gaXQgY29sbGFwc2VzIGF3YXkuCisgICAg
ICAgICAgICAgICAgaWYgKG1fY3VycmVudC5vZmZzZXQoKSA9PSByZW5kZXJUZXh0LnRleHRMZW5n
dGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RhcnRJ
Z25vcmluZ1NwYWNlcyhtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorCisgICAgICAgIGlmICghbV9jdXJyZW50Q2hhcmFjdGVySXNXUyAmJiBwcmV2aW91
c0NoYXJhY3RlcklzV1MpIHsKKyAgICAgICAgICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVu
dFN0eWxlLT5icmVha09ubHlBZnRlcldoaXRlU3BhY2UoKSkKKyAgICAgICAgICAgICAgICBtX2xp
bmVCcmVha0hpc3RvcnkubW92ZVRvKG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zm
c2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24oKSk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSAmJiAhbV9pZ25vcmluZ1NwYWNlcykKKyAgICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3Rz
LnNldFRyYWlsaW5nV2hpdGVzcGFjZShkb3duY2FzdDxSZW5kZXJUZXh0PihtX2N1cnJlbnQucmVu
ZGVyZXIoKSkpOworICAgICAgICBlbHNlIGlmICghbV9jdXJyZW50U3R5bGUtPmNvbGxhcHNlV2hp
dGVTcGFjZSgpIHx8ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlKQorICAgICAgICAgICAgbV90
cmFpbGluZ09iamVjdHMuY2xlYXIoKTsKKworICAgICAgICBtX2F0U3RhcnQgPSBmYWxzZTsKKyAg
ICAgICAgbmV4dENoYXJhY3RlcihjLCBsYXN0Q2hhcmFjdGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0
ZXIpOworICAgIH0KKworICAgIG1fcmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci5z
ZXRQcmlvckNvbnRleHQobGFzdENoYXJhY3Rlciwgc2Vjb25kVG9MYXN0Q2hhcmFjdGVyKTsKKwor
ICAgIHdvcmRNZWFzdXJlbWVudHMuZ3Jvdyh3b3JkTWVhc3VyZW1lbnRzLnNpemUoKSArIDEpOwor
ICAgIFdvcmRNZWFzdXJlbWVudCYgd29yZE1lYXN1cmVtZW50ID0gd29yZE1lYXN1cmVtZW50cy5s
YXN0KCk7CisgICAgd29yZE1lYXN1cmVtZW50LnJlbmRlcmVyID0gJnJlbmRlclRleHQ7CisKKyAg
ICAvLyBJTVBPUlRBTlQ6IGN1cnJlbnQubV9wb3MgaXMgPiBsZW5ndGggaGVyZSEKKyAgICBmbG9h
dCBhZGRpdGlvbmFsVGVtcFdpZHRoID0gbV9pZ25vcmluZ1NwYWNlcyA/IDAgOiB0ZXh0V2lkdGgo
cmVuZGVyVGV4dCwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCkgLSBsYXN0U3BhY2UsIGZv
bnQsIG1fd2lkdGguY3VycmVudFdpZHRoKCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRl
U3BhY2UsIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLCB0ZXh0TGF5b3V0KTsKKyAgICB3
b3JkTWVhc3VyZW1lbnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7CisgICAgd29yZE1lYXN1cmVt
ZW50LmVuZE9mZnNldCA9IG1fY3VycmVudC5vZmZzZXQoKTsKKyAgICB3b3JkTWVhc3VyZW1lbnQu
d2lkdGggPSBtX2lnbm9yaW5nU3BhY2VzID8gMCA6IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3Jk
U3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKKyAgICBhZGRpdGlvbmFsVGVtcFdpZHRoICs9IGxh
c3RTcGFjZVdvcmRTcGFjaW5nOworCisgICAgZmxvYXQgaW5saW5lTG9naWNhbFRlbXBXaWR0aCA9
IGlubGluZUxvZ2ljYWxXaWR0aChtX2N1cnJlbnQucmVuZGVyZXIoKSwgIW1fYXBwbGllZFN0YXJ0
V2lkdGgsIG1faW5jbHVkZUVuZFdpZHRoKTsKKyAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lk
dGgoYWRkaXRpb25hbFRlbXBXaWR0aCArIGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOworCisgICAg
aWYgKHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSAmJiAhZmFsbGJhY2tG
b250cy5pc0VtcHR5KCkpCisgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3
YXAoZmFsbGJhY2tGb250cyk7CisgICAgZmFsbGJhY2tGb250cy5jbGVhcigpOworCisgICAgaWYg
KG1fY29sbGFwc2VXaGl0ZVNwYWNlICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgYWRk
aXRpb25hbFRlbXBXaWR0aCkKKyAgICAgICAgbV93aWR0aC5zZXRUcmFpbGluZ1doaXRlc3BhY2VX
aWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoLCBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoKTsKKworICAg
IG1faW5jbHVkZUVuZFdpZHRoID0gZmFsc2U7CisKKyAgICBpZiAoIW1fd2lkdGguZml0c09uTGlu
ZSgpKSB7CisgICAgICAgIGlmIChjYW5IeXBoZW5hdGUpIHsKKyAgICAgICAgICAgIG1fbGluZUJy
ZWFrSGlzdG9yeS5wdXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKKyAgICAgICAg
ICAgICAgICB0cnlIeXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwg
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0
TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlv
bkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3Vy
cmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFj
aW5nLCBtb2RpZnlNZSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVC
cmVha2VyLm1faHlwaGVuYXRlZCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAg
ICAgIGlmICghaHlwaGVuYXRlZCAmJiBtX2xpbmVCcmVha0hpc3RvcnkucHJldmlvdXNJblNhbWVO
b2RlKCkgPT0gc29mdEh5cGhlbiAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlwaGVuc05vbmUpIHsK
KyAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgbV9hdEVuZCA9IHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgYm9v
bCB0ZXh0QmVnaW5zV2l0aEJyZWFrYWJsZVBvc2l0aW9uKFJlbmRlclRleHQmIG5leHRUZXh0KQor
eworICAgIFVDaGFyIGMgPSBuZXh0VGV4dC5jaGFyYWN0ZXJBdCgwKTsKKyAgICByZXR1cm4gYyA9
PSAnICcgfHwgYyA9PSAnXHQnIHx8IChjID09ICdcbicgJiYgIW5leHRUZXh0LnByZXNlcnZlc05l
d2xpbmUoKSk7Cit9CisKK2lubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6Y2FuQnJlYWtBdFRo
aXNQb3NpdGlvbigpCit7CisgICAgLy8gSWYgd2UgYXJlIG5vLXdyYXAgYW5kIGhhdmUgZm91bmQg
YSBsaW5lLWJyZWFraW5nIG9wcG9ydHVuaXR5IGFscmVhZHkgdGhlbiB3ZSBzaG91bGQgdGFrZSBp
dC4KKyAgICBpZiAobV93aWR0aC5jb21taXR0ZWRXaWR0aCgpICYmICFtX3dpZHRoLmZpdHNPbkxp
bmUobV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkgJiYgbV9jdXJyV1MgPT0gTk9XUkFQKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIEF2b2lkIGJyZWFraW5nIG9uIGVtcHR5IGlubGlu
ZXMuCisgICAgaWYgKGlzPFJlbmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigpKSAmJiBp
c0VtcHR5SW5saW5lKGRvd25jYXN0PFJlbmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigp
KSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEF2b2lkIGJyZWFraW5nIGJlZm9y
ZSBlbXB0eSBpbmxpbmVzIChhcyBsb25nIGFzIHRoZSBjdXJyZW50IG9iamVjdCBpc24ndCByZXBs
YWNlZCkuCisgICAgaWYgKCFtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNSZXBsYWNlZCgpICYmIGlz
PFJlbmRlcklubGluZT4obV9uZXh0T2JqZWN0KSAmJiBpc0VtcHR5SW5saW5lKGRvd25jYXN0PFJl
bmRlcklubGluZT4oKm1fbmV4dE9iamVjdCkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBSZXR1cm4gZWFybHkgaWYgd2UgYXV0b3dyYXAgYW5kIHRoZSBjdXJyZW50IGNoYXJhY3Rl
ciBpcyBhIHNwYWNlIGFzIHdlIHdpbGwgYWx3YXlzIHdhbnQgdG8gYnJlYWsgYXQgc3VjaCBhIHBv
c2l0aW9uLgorICAgIGlmIChtX2F1dG9XcmFwICYmIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2Up
CisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX25leHRP
YmplY3QtPmlzTGluZUJyZWFrT3Bwb3J0dW5pdHkoKSkKKyAgICAgICAgcmV0dXJuIG1fYXV0b1dy
YXA7CisKKyAgICBib29sIG5leHRJc0F1dG9XcmFwcGluZ1RleHQgPSBpczxSZW5kZXJUZXh0Piht
X25leHRPYmplY3QpICYmIChtX2F1dG9XcmFwIHx8IG1fbmV4dE9iamVjdC0+c3R5bGUoKS5hdXRv
V3JhcCgpKTsKKyAgICBpZiAoIW5leHRJc0F1dG9XcmFwcGluZ1RleHQpCisgICAgICAgIHJldHVy
biBtX2F1dG9XcmFwOworICAgIFJlbmRlclRleHQmIG5leHRSZW5kZXJUZXh0ID0gZG93bmNhc3Q8
UmVuZGVyVGV4dD4oKm1fbmV4dE9iamVjdCk7CisgICAgYm9vbCBjdXJyZW50SXNUZXh0T3JFbXB0
eUlubGluZSA9IGlzPFJlbmRlclRleHQ+KCptX2N1cnJlbnQucmVuZGVyZXIoKSkgfHwgKGlzPFJl
bmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigpKSAmJiBpc0VtcHR5SW5saW5lKGRvd25j
YXN0PFJlbmRlcklubGluZT4oKm1fY3VycmVudC5yZW5kZXJlcigpKSkpOworICAgIGlmICghY3Vy
cmVudElzVGV4dE9yRW1wdHlJbmxpbmUpCisgICAgICAgIHJldHVybiBtX2F1dG9XcmFwICYmICFt
X2N1cnJlbnQucmVuZGVyZXIoKS0+aXNSdWJ5UnVuKCk7CisKKyAgICBib29sIGNhbkJyZWFrSGVy
ZSA9ICFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHRleHRCZWdpbnNXaXRoQnJlYWthYmxl
UG9zaXRpb24obmV4dFJlbmRlclRleHQpOworCisgICAgLy8gU2VlIGlmIGF0dGVtcHRpbmcgdG8g
Zml0IGJlbG93IGZsb2F0cyBjcmVhdGVzIG1vcmUgYXZhaWxhYmxlIHdpZHRoIG9uIHRoZSBsaW5l
LgorICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKCkgJiYgIW1fd2lkdGguY29tbWl0dGVkV2lk
dGgoKSkKKyAgICAgICAgbV93aWR0aC5maXRCZWxvd0Zsb2F0cyhtX2xpbmVJbmZvLmlzRmlyc3RM
aW5lKCkpOworCisgICAgYm9vbCBjYW5QbGFjZU9uTGluZSA9IG1fd2lkdGguZml0c09uTGluZSgp
IHx8ICFtX2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmU7CisKKyAgICBpZiAoY2FuUGxhY2VPbkxp
bmUgJiYgY2FuQnJlYWtIZXJlKQorICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0
aChuZXh0UmVuZGVyVGV4dCk7CisKKyAgICByZXR1cm4gY2FuQnJlYWtIZXJlOworfQorCitpbmxp
bmUgdm9pZCBCcmVha2luZ0NvbnRleHQ6OmNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVlZGVk
KCkKK3sKKyAgICBib29sIGNoZWNrRm9yQnJlYWsgPSBjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCk7
CisKKyAgICBpZiAoY2hlY2tGb3JCcmVhayAmJiAhbV93aWR0aC5maXRzT25MaW5lKG1faWdub3Jp
bmdTcGFjZXMpKSB7CisgICAgICAgIC8vIGlmIHdlIGhhdmUgZmxvYXRzLCB0cnkgdG8gZ2V0IGJl
bG93IHRoZW0uCisgICAgICAgIGlmIChtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2ln
bm9yaW5nU3BhY2VzICYmIG1fY3VycmVudFN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSkKKyAg
ICAgICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1fd2lk
dGguY29tbWl0dGVkV2lkdGgoKSkgeworICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtX3dpZHRoLmZpdEJlbG93Rmxv
YXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7CisKKyAgICAgICAgLy8gfHdpZHRofCBtYXkg
aGF2ZSBiZWVuIGFkanVzdGVkIGJlY2F1c2Ugd2UgZ290IHNob3ZlZCBkb3duIHBhc3QgYSBmbG9h
dCAodGh1cworICAgICAgICAvLyBnaXZpbmcgdXMgbW9yZSByb29tKSwgc28gd2UgbmVlZCB0byBy
ZXRlc3QsIGFuZCBvbmx5IGp1bXAgdG8KKyAgICAgICAgLy8gdGhlIGVuZCBsYWJlbCBpZiB3ZSBz
dGlsbCBkb24ndCBmaXQgb24gdGhlIGxpbmUuIC1kd2gKKyAgICAgICAgaWYgKCFtX3dpZHRoLmZp
dHNPbkxpbmUobV9pZ25vcmluZ1NwYWNlcykpIHsKKyAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVl
OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2Jsb2Nr
U3R5bGUuYXV0b1dyYXAoKSAmJiAhbV93aWR0aC5maXRzT25MaW5lKCkgJiYgIW1fd2lkdGguY29t
bWl0dGVkV2lkdGgoKSkgeworICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVyIGF1dG93cmFwcyBi
dXQgdGhlIGN1cnJlbnQgY2hpbGQgZG9lcyBub3QgdGhlbiB3ZSBzdGlsbCBuZWVkIHRvIGVuc3Vy
ZSB0aGF0IGl0CisgICAgICAgIC8vIHdyYXBzIGFuZCBtb3ZlcyBiZWxvdyBhbnkgZmxvYXRzLgor
ICAgICAgICBtX3dpZHRoLmZpdEJlbG93RmxvYXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7
CisgICAgfQorCisgICAgaWYgKCFtX2N1cnJlbnQucmVuZGVyZXIoKS0+aXNGbG9hdGluZ09yT3V0
T2ZGbG93UG9zaXRpb25lZCgpKSB7CisgICAgICAgIG1fbGFzdE9iamVjdCA9IG1fY3VycmVudC5y
ZW5kZXJlcigpOworICAgICAgICBpZiAobV9sYXN0T2JqZWN0LT5pc1JlcGxhY2VkKCkgJiYgbV9h
dXRvV3JhcCAmJiAhbV9sYXN0T2JqZWN0LT5pc1J1YnlSdW4oKSAmJiAoIW1fbGFzdE9iamVjdC0+
aXNJbWFnZSgpIHx8IG1fYWxsb3dJbWFnZXNUb0JyZWFrKSAmJiAoIWlzPFJlbmRlckxpc3RNYXJr
ZXI+KCptX2xhc3RPYmplY3QpIHx8IGRvd25jYXN0PFJlbmRlckxpc3RNYXJrZXI+KCptX2xhc3RP
YmplY3QpLmlzSW5zaWRlKCkpKQorICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50
V2lkdGgoKm1fbmV4dE9iamVjdCk7CisgICAgfQorfQorCitpbmxpbmUgVHJhaWxpbmdPYmplY3Rz
OjpDb2xsYXBzZUZpcnN0U3BhY2VPck5vdCBjaGVja01pZHBvaW50cyhMaW5lTWlkcG9pbnRTdGF0
ZSYgbGluZU1pZHBvaW50U3RhdGUsIGNvbnN0IElubGluZUl0ZXJhdG9yJiBsQnJlYWspCit7Cisg
ICAgLy8gQ2hlY2sgdG8gc2VlIGlmIG91ciBsYXN0IG1pZHBvaW50IGlzIGEgc3RhcnQgcG9pbnQg
YmV5b25kIHRoZSBsaW5lIGJyZWFrLiBJZiBzbywKKyAgICAvLyBzaGF2ZSBpdCBvZmYgdGhlIGxp
c3QsIGFuZCBzaGF2ZSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpZiB0aGUgcHJldmlvdXMgZW5kIHBv
aW50IGRvZXNuJ3QKKyAgICAvLyBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgorICAgIGlmIChsQnJlYWsu
cmVuZGVyZXIoKSAmJiBsaW5lTWlkcG9pbnRTdGF0ZS5udW1NaWRwb2ludHMoKSAmJiAhKGxpbmVN
aWRwb2ludFN0YXRlLm51bU1pZHBvaW50cygpICUgMikpIHsKKyAgICAgICAgSW5saW5lSXRlcmF0
b3IqIG1pZHBvaW50cyA9IGxpbmVNaWRwb2ludFN0YXRlLm1pZHBvaW50cygpLmRhdGEoKTsKKyAg
ICAgICAgSW5saW5lSXRlcmF0b3ImIGVuZHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0
YXRlLm51bU1pZHBvaW50cygpIC0gMl07CisgICAgICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBz
dGFydHBvaW50ID0gbWlkcG9pbnRzW2xpbmVNaWRwb2ludFN0YXRlLm51bU1pZHBvaW50cygpIC0g
MV07CisgICAgICAgIElubGluZUl0ZXJhdG9yIGN1cnJwb2ludCA9IGVuZHBvaW50OworICAgICAg
ICB3aGlsZSAoIWN1cnJwb2ludC5hdEVuZCgpICYmIGN1cnJwb2ludCAhPSBzdGFydHBvaW50ICYm
IGN1cnJwb2ludCAhPSBsQnJlYWspCisgICAgICAgICAgICBjdXJycG9pbnQuaW5jcmVtZW50KCk7
CisgICAgICAgIGlmIChjdXJycG9pbnQgPT0gbEJyZWFrKSB7CisgICAgICAgICAgICAvLyBXZSBo
aXQgdGhlIGxpbmUgYnJlYWsgYmVmb3JlIHRoZSBzdGFydCBwb2ludC4gU2hhdmUgb2ZmIHRoZSBz
dGFydCBwb2ludC4KKyAgICAgICAgICAgIGxpbmVNaWRwb2ludFN0YXRlLmRlY3JlYXNlTnVtTWlk
cG9pbnRzKCk7CisgICAgICAgICAgICBpZiAoZW5kcG9pbnQucmVuZGVyZXIoKS0+c3R5bGUoKS5j
b2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBlbmRwb2ludC5yZW5kZXJlcigpLT5pc1RleHQoKSkgewor
ICAgICAgICAgICAgICAgIGVuZHBvaW50LmZhc3REZWNyZW1lbnQoKTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxhcHNlRmlyc3RTcGFjZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVHJhaWxpbmdPYmplY3RzOjpD
b2xsYXBzZUZpcnN0U3BhY2U7Cit9CisKK2lubGluZSBJbmxpbmVJdGVyYXRvciBCcmVha2luZ0Nv
bnRleHQ6OmhhbmRsZUVuZE9mTGluZSgpCit7CisgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5j
dXJyZW50KCkgPT0gbV9yZXNvbHZlci5wb3NpdGlvbigpKSB7CisgICAgICAgIGlmICghbV9saW5l
QnJlYWtIaXN0b3J5LnJlbmRlcmVyKCkgfHwgIW1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigp
LT5pc0JSKCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGp1c3QgYWRkIGFzIG11Y2ggYXMgcG9zc2li
bGUKKyAgICAgICAgICAgIGlmIChtX2Jsb2NrU3R5bGUud2hpdGVTcGFjZSgpID09IFBSRSAmJiAh
bV9jdXJyZW50Lm9mZnNldCgpKQorICAgICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3Vy
cmVudFdpZHRoKCptX2xhc3RPYmplY3QsIG1fbGFzdE9iamVjdC0+aXNUZXh0KCkgPyBtX2xhc3RP
YmplY3QtPmxlbmd0aCgpIDogMCk7CisgICAgICAgICAgICBlbHNlIGlmIChtX2xpbmVCcmVha0hp
c3RvcnkucmVuZGVyZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IGV2ZXIgYnJlYWsg
aW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgaWYgd2UgY2FuIGhlbHAgaXQuCisgICAgICAgICAgICAg
ICAgLy8gVGhlcmUncyBubyByb29tIGF0IGFsbC4gV2UganVzdCBoYXZlIHRvIGJlIG9uIHRoaXMg
bGluZSwKKyAgICAgICAgICAgICAgICAvLyBldmVuIHRob3VnaCB3ZSdsbCBzcGlsbCBvdXQuCisg
ICAgICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5y
ZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBjb25zdW1lIGF0IGxlYXN0IG9uZSBjaGFyL29iamVj
dC4KKyAgICAgICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCkgPT0gbV9yZXNvbHZl
ci5wb3NpdGlvbigpKQorICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgp
OworICAgIH0gZWxzZSBpZiAoIW1fY3VycmVudC5vZmZzZXQoKSAmJiAhbV93aWR0aC5jb21taXR0
ZWRXaWR0aCgpICYmIG1fd2lkdGgudW5jb21taXR0ZWRXaWR0aCgpICYmICFtX2hhZFVuY29tbWl0
dGVkV2lkdGhCZWZvcmVDdXJyZW50KSB7CisgICAgICAgIC8vIERvIG5vdCBwdXNoIHRoZSBjdXJy
ZW50IG9iamVjdCB0byB0aGUgbmV4dCBsaW5lLCB3aGVuIHRoaXMgbGluZSBoYXMgc29tZSBjb250
ZW50LCBidXQgaXQgaXMgc3RpbGwgY29uc2lkZXJlZCBlbXB0eS4KKyAgICAgICAgLy8gRW1wdHkg
aW5saW5lIGVsZW1lbnRzIGxpa2UgPHNwYW4+PC9zcGFuPiBjYW4gcHJvZHVjZSBzdWNoIGxpbmVz
IGFuZCBub3cgd2UganVzdCBpZ25vcmUgdGhlc2UgYnJlYWsgb3Bwb3J0dW5pdGllcworICAgICAg
ICAvLyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLCBpZiBubyB3aWR0aCBoYXMgYmVlbiBjb21taXR0
ZWQgeWV0LgorICAgICAgICAvLyBCZWhhdmUgYXMgaWYgaXQgd2FzIGFjdHVhbGx5IGVtcHR5IGFu
ZCBjb25zdW1lIGF0IGxlYXN0IG9uZSBvYmplY3QuCisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9y
eS5pbmNyZW1lbnQoKTsKKyAgICB9CisKKyAgICAvLyBTYW5pdHkgY2hlY2sgb3VyIG1pZHBvaW50
cy4KKyAgICBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZU9yTm90IGNvbGxhcHNl
ZCA9IGNoZWNrTWlkcG9pbnRzKG1fbGluZU1pZHBvaW50U3RhdGUsIG1fbGluZUJyZWFrSGlzdG9y
eS5jdXJyZW50KCkpOworCisgICAgbV90cmFpbGluZ09iamVjdHMudXBkYXRlTWlkcG9pbnRzRm9y
VHJhaWxpbmdCb3hlcyhtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2xpbmVCcmVha0hpc3RvcnkuY3Vy
cmVudCgpLCBjb2xsYXBzZWQpOworCisgICAgLy8gV2UgbWlnaHQgaGF2ZSBtYWRlIGxpbmVCcmVh
ayBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBwYXN0IHRoZSBlbmQKKyAgICAvLyBvZiB0aGUgb2Jq
ZWN0LiBEbyB0aGlzIGFkanVzdG1lbnQgdG8gbWFrZSBpdCBwb2ludCB0byB0aGUgc3RhcnQKKyAg
ICAvLyBvZiB0aGUgbmV4dCBvYmplY3QgaW5zdGVhZCB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHJl
c3Qgb2YgdGhlCisgICAgLy8gY29kZS4KKyAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9mZnNl
dCgpKSB7CisgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS51cGRhdGUoW10oSW5saW5lSXRlcmF0
b3ImIG1vZGlmeU1lKSB7CisgICAgICAgICAgICBtb2RpZnlNZS5zZXRPZmZzZXQobW9kaWZ5TWUu
b2Zmc2V0KCkgLSAxKTsKKyAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVudCgpOworICAgICAg
ICB9KTsKKyAgICB9CisKKyNpZiBFTkFCTEUoQ1NTX1RSQUlMSU5HX1dPUkQpCisgICAgaWYgKG1f
YmxvY2tTdHlsZS50cmFpbGluZ1dvcmQoKSA9PSBUcmFpbGluZ1dvcmQ6OlBhcnRpYWxseUJhbGFu
Y2VkKQorICAgICAgICByZXR1cm4gb3B0aW1hbExpbmVCcmVha0xvY2F0aW9uRm9yVHJhaWxpbmdX
b3JkKCk7CisjZW5kaWYKKyAgICByZXR1cm4gbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKTsK
K30KKworI2lmIEVOQUJMRShDU1NfVFJBSUxJTkdfV09SRCkKK2lubGluZSBJbmxpbmVJdGVyYXRv
ciBCcmVha2luZ0NvbnRleHQ6Om9wdGltYWxMaW5lQnJlYWtMb2NhdGlvbkZvclRyYWlsaW5nV29y
ZCgpCit7CisgICAgY29uc3QgdW5zaWduZWQgbG9uZ1RyYWlsaW5nV29yZExlbmd0aCA9IDIwOwor
ICAgIGNvbnN0IGZsb2F0IG9wdGltYWxUcmFpbGluZ0xpbmVSYXRpbyA9IDAuMTsKKyAgICBJbmxp
bmVJdGVyYXRvciBsaW5lQnJlYWsgPSBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOworICAg
IGlmICghbGluZUJyZWFrLnJlbmRlcmVyKCkgfHwgIW1fbGluZUluZm8uaXNGaXJzdExpbmUoKSB8
fCBiaWRpTmV4dFNraXBwaW5nRW1wdHlJbmxpbmVzKCpsaW5lQnJlYWsucm9vdCgpLCBsaW5lQnJl
YWsucmVuZGVyZXIoKSkgfHwgIWlzPFJlbmRlclRleHQ+KGxpbmVCcmVhay5yZW5kZXJlcigpKSkK
KyAgICAgICAgcmV0dXJuIGxpbmVCcmVhazsKKyAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0g
ZG93bmNhc3Q8UmVuZGVyVGV4dD4oKmxpbmVCcmVhay5yZW5kZXJlcigpKTsKKyAgICAvLyBEb24n
dCBldmVuIGJvdGhlciBtZWFzdXJpbmcgaWYgb3VyIHJlbWFpbmluZyBsaW5lIGhhcyBtYW55IGNo
YXJhY3RlcnMKKyAgICBpZiAocmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCkgPT0gbGluZUJyZWFrLm9m
ZnNldCgpIHx8IHJlbmRlclRleHQudGV4dExlbmd0aCgpIC0gbGluZUJyZWFrLm9mZnNldCgpID4g
bG9uZ1RyYWlsaW5nV29yZExlbmd0aCkKKyAgICAgICAgcmV0dXJuIGxpbmVCcmVhazsKKyAgICBi
b29sIGlzTG9vc2VDSktNb2RlID0gbV9yZW5kZXJUZXh0SW5mby5tX3RleHQgIT0gJnJlbmRlclRl
eHQgJiYgbV9yZW5kZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLmlzTG9vc2VDSktNb2Rl
KCk7CisgICAgYm9vbCBicmVha05CU1AgPSBtX2F1dG9XcmFwICYmIG1fY3VycmVudFN0eWxlLT5u
YnNwTW9kZSgpID09IFNQQUNFOworICAgIGludCBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSBsaW5l
QnJlYWsubmV4dEJyZWFrYWJsZVBvc2l0aW9uKCk7CisgICAgaXNCcmVha2FibGUobV9yZW5kZXJU
ZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLCBsaW5lQnJlYWsub2Zmc2V0KCkgKyAxLCBuZXh0
QnJlYWthYmxlUG9zaXRpb24sIGJyZWFrTkJTUCwgaXNMb29zZUNKS01vZGUpOworICAgIGlmIChu
ZXh0QnJlYWthYmxlUG9zaXRpb24gPCAwIHx8IHN0YXRpY19jYXN0PHVuc2lnbmVkPihuZXh0QnJl
YWthYmxlUG9zaXRpb24pICE9IHJlbmRlclRleHQudGV4dExlbmd0aCgpKQorICAgICAgICByZXR1
cm4gbGluZUJyZWFrOworICAgIGNvbnN0IFJlbmRlclN0eWxlJiBzdHlsZSA9IGxpbmVTdHlsZShy
ZW5kZXJUZXh0LCBtX2xpbmVJbmZvKTsKKyAgICBjb25zdCBGb250Q2FzY2FkZSYgZm9udCA9IHN0
eWxlLmZvbnRDYXNjYWRlKCk7CisgICAgSGFzaFNldDxjb25zdCBGb250Kj4gZHVtbXlGb250czsK
KyAgICBJbmxpbmVJdGVyYXRvciBiZXN0ID0gbGluZUJyZWFrOworICAgIGZvciAoc2l6ZV90IGkg
PSAxOyBpIDwgbV9saW5lQnJlYWtIaXN0b3J5Lmhpc3RvcnlMZW5ndGgoKTsgKytpKSB7CisgICAg
ICAgIGNvbnN0IElubGluZUl0ZXJhdG9yJiBjYW5kaWRhdGUgPSBtX2xpbmVCcmVha0hpc3Rvcnku
Z2V0KGkpOworICAgICAgICBpZiAoY2FuZGlkYXRlLnJlbmRlcmVyKCkgIT0gbGluZUJyZWFrLnJl
bmRlcmVyKCkpCisgICAgICAgICAgICByZXR1cm4gYmVzdDsKKyAgICAgICAgZmxvYXQgd2lkdGgg
PSB0ZXh0V2lkdGgocmVuZGVyVGV4dCwgY2FuZGlkYXRlLm9mZnNldCgpLCByZW5kZXJUZXh0LnRl
eHRMZW5ndGgoKSAtIGNhbmRpZGF0ZS5vZmZzZXQoKSwgZm9udCwgMCwgZm9udC5pc0ZpeGVkUGl0
Y2goKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGR1bW15Rm9udHMpOworICAgICAgICBpZiAod2lk
dGggPiBtX3dpZHRoLmF2YWlsYWJsZVdpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gYmVzdDsK
KyAgICAgICAgaWYgKHdpZHRoIC8gbV93aWR0aC5hdmFpbGFibGVXaWR0aCgpID4gb3B0aW1hbFRy
YWlsaW5nTGluZVJhdGlvKSAvLyBTdWJzZXF1ZW50IGxpbmUgaXMgbG9uZyBlbm91Z2gKKyAgICAg
ICAgICAgIHJldHVybiBjYW5kaWRhdGU7CisgICAgICAgIGJlc3QgPSBjYW5kaWRhdGU7CisgICAg
fQorICAgIHJldHVybiBiZXN0OworfQorI2VuZGlmCisKK30KKworI2VuZGlmIC8vIEJyZWFraW5n
Q29udGV4dF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9CcmVh
a2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGlu
ZS9CcmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGY0MDdiYWY1YzUxYzEyYmFhYjJkY2NmNWEzNTBkYjZlYTJmMmY5MWQuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL2xpbmUvQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVycy5oCisrKyAvZGV2L251bGwK
QEAgLTEsMTIwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIExhcnMgS25vbGwg
KGtub2xsQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDYsIDIwMDcs
IDIwMDgsIDIwMDksIDIwMTAsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2ZWQuCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAq
IENvcHlyaWdodCAoQykgMjAxMyBDaGFuZ1Nlb2sgT2ggPHNoaXZhbWlkb3dAZ21haWwuY29tPgot
ICogQ29weXJpZ2h0IChDKSAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jLiBBbGwgcmlnaHQgcmVzZXJ2
ZWQuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoK
LSAqLwotCi0jaWZuZGVmIEJyZWFraW5nQ29udGV4dElubGluZUhlYWRlcnNfaAotI2RlZmluZSBC
cmVha2luZ0NvbnRleHRJbmxpbmVIZWFkZXJzX2gKLQotI2luY2x1ZGUgIkh5cGhlbmF0aW9uLmgi
Ci0jaW5jbHVkZSAiTGluZUJyZWFrZXIuaCIKLSNpbmNsdWRlICJMaW5lSW5mby5oIgotI2luY2x1
ZGUgIkxpbmVXaWR0aC5oIgotI2luY2x1ZGUgIlJlbmRlckNvbWJpbmVUZXh0LmgiCi0jaW5jbHVk
ZSAiUmVuZGVyQ291bnRlci5oIgotI2luY2x1ZGUgIlJlbmRlcklubGluZS5oIgotI2luY2x1ZGUg
IlJlbmRlckxpbmVCcmVhay5oIgotI2luY2x1ZGUgIlJlbmRlckxpc3RNYXJrZXIuaCIKLSNpbmNs
dWRlICJSZW5kZXJSdWJ5UnVuLmgiCi0jaW5jbHVkZSAiUmVuZGVyU1ZHSW5saW5lVGV4dC5oIgot
I2luY2x1ZGUgIlRyYWlsaW5nT2JqZWN0cy5oIgotI2luY2x1ZGUgImJyZWFrX2xpbmVzLmgiCi0j
aW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nVmlldy5oPgotI2luY2x1ZGUgPHd0Zi91bmljb2RlL0No
YXJhY3Rlck5hbWVzLmg+Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotLy8gV2UgZG9uJ3QgbGV0
IG91ciBsaW5lIGJveCB0cmVlIGZvciBhIHNpbmdsZSBsaW5lIGdldCBhbnkgZGVlcGVyIHRoYW4g
dGhpcy4KLWNvbnN0IHVuc2lnbmVkIGNNYXhMaW5lRGVwdGggPSAyMDA7Ci0KLXN0cnVjdCBXb3Jk
TWVhc3VyZW1lbnQgewotICAgIFdvcmRNZWFzdXJlbWVudCgpCi0gICAgICAgIDogcmVuZGVyZXIo
MCkKLSAgICAgICAgLCB3aWR0aCgwKQotICAgICAgICAsIHN0YXJ0T2Zmc2V0KDApCi0gICAgICAg
ICwgZW5kT2Zmc2V0KDApCi0gICAgewotICAgIH0KLQotICAgIFJlbmRlclRleHQqIHJlbmRlcmVy
OwotICAgIGZsb2F0IHdpZHRoOwotICAgIGludCBzdGFydE9mZnNldDsKLSAgICBpbnQgZW5kT2Zm
c2V0OwotICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7Ci19OwotCi1jbGFz
cyBCcmVha2luZ0NvbnRleHQgewotcHVibGljOgotICAgIEJyZWFraW5nQ29udGV4dChMaW5lQnJl
YWtlciYgbGluZUJyZWFrZXIsIElubGluZUJpZGlSZXNvbHZlciYgcmVzb2x2ZXIsIExpbmVJbmZv
JiBpbkxpbmVJbmZvLCBMaW5lV2lkdGgmIGxpbmVXaWR0aCwgUmVuZGVyVGV4dEluZm8mIGluUmVu
ZGVyVGV4dEluZm8sIEZsb2F0aW5nT2JqZWN0KiBpbkxhc3RGbG9hdEZyb21QcmV2aW91c0xpbmUs
IGJvb2wgYXBwbGllZFN0YXJ0V2lkdGgsIFJlbmRlckJsb2NrRmxvdyYgYmxvY2spCi0gICAgICAg
IDogbV9saW5lQnJlYWtlcihsaW5lQnJlYWtlcikKLSAgICAgICAgLCBtX3Jlc29sdmVyKHJlc29s
dmVyKQotICAgICAgICAsIG1fY3VycmVudChyZXNvbHZlci5wb3NpdGlvbigpKQotI2lmIEVOQUJM
RShDU1NfVFJBSUxJTkdfV09SRCkKLSAgICAgICAgLCBtX2xpbmVCcmVha0hpc3RvcnkoSW5saW5l
SXRlcmF0b3IocmVzb2x2ZXIucG9zaXRpb24oKSksIGJsb2NrLnN0eWxlKCkudHJhaWxpbmdXb3Jk
KCkgPT0gVHJhaWxpbmdXb3JkOjpQYXJ0aWFsbHlCYWxhbmNlZCA/IDUgOiAxKQotI2Vsc2UKLSAg
ICAgICAgLCBtX2xpbmVCcmVha0hpc3RvcnkoSW5saW5lSXRlcmF0b3IocmVzb2x2ZXIucG9zaXRp
b24oKSksIDEpCi0jZW5kaWYKLSAgICAgICAgLCBtX2Jsb2NrKGJsb2NrKQotICAgICAgICAsIG1f
bGFzdE9iamVjdChtX2N1cnJlbnQucmVuZGVyZXIoKSkKLSAgICAgICAgLCBtX25leHRPYmplY3Qo
bnVsbHB0cikKLSAgICAgICAgLCBtX2N1cnJlbnRTdHlsZShudWxscHRyKQotICAgICAgICAsIG1f
YmxvY2tTdHlsZShibG9jay5zdHlsZSgpKQotICAgICAgICAsIG1fbGluZUluZm8oaW5MaW5lSW5m
bykKLSAgICAgICAgLCBtX3JlbmRlclRleHRJbmZvKGluUmVuZGVyVGV4dEluZm8pCi0gICAgICAg
ICwgbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lKGluTGFzdEZsb2F0RnJvbVByZXZpb3VzTGlu
ZSkKLSAgICAgICAgLCBtX3dpZHRoKGxpbmVXaWR0aCkKLSAgICAgICAgLCBtX2N1cnJXUyhOT1JN
QUwpCi0gICAgICAgICwgbV9sYXN0V1MoTk9STUFMKQotICAgICAgICAsIG1fcHJlc2VydmVzTmV3
bGluZShmYWxzZSkKLSAgICAgICAgLCBtX2F0U3RhcnQodHJ1ZSkKLSAgICAgICAgLCBtX2lnbm9y
aW5nU3BhY2VzKGZhbHNlKQotICAgICAgICAsIG1fY3VycmVudENoYXJhY3RlcklzU3BhY2UoZmFs
c2UpCi0gICAgICAgICwgbV9jdXJyZW50Q2hhcmFjdGVySXNXUyhmYWxzZSkKLSAgICAgICAgLCBt
X2FwcGxpZWRTdGFydFdpZHRoKGFwcGxpZWRTdGFydFdpZHRoKQotICAgICAgICAsIG1faW5jbHVk
ZUVuZFdpZHRoKHRydWUpCi0gICAgICAgICwgbV9hdXRvV3JhcChmYWxzZSkKLSAgICAgICAgLCBt
X2F1dG9XcmFwV2FzRXZlclRydWVPbkxpbmUoZmFsc2UpCi0gICAgICAgICwgbV9mbG9hdHNGaXRP
bkxpbmUodHJ1ZSkKLSAgICAgICAgLCBtX2NvbGxhcHNlV2hpdGVTcGFjZShmYWxzZSkKLSAgICAg
ICAgLCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoKG1fbGluZUluZm8ucHJldmlvdXNMaW5lQnJva2VD
bGVhbmx5KCkpCi0gICAgICAgICwgbV9hbGxvd0ltYWdlc1RvQnJlYWsoIWJsb2NrLmRvY3VtZW50
KCkuaW5RdWlya3NNb2RlKCkgfHwgIWJsb2NrLmlzVGFibGVDZWxsKCkgfHwgIW1fYmxvY2tTdHls
ZS5sb2dpY2FsV2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQotICAgICAgICAsIG1fYXRFbmQo
ZmFsc2UpCi0gICAgICAgICwgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudChmYWxz
ZSkKLSAgICAgICAgLCBtX2xpbmVNaWRwb2ludFN0YXRlKHJlc29sdmVyLm1pZHBvaW50U3RhdGUo
KSkKLSAgICB7Ci0gICAgICAgIG1fbGluZUluZm8uc2V0UHJldmlvdXNMaW5lQnJva2VDbGVhbmx5
KGZhbHNlKTsKLSAgICB9Ci0KLSAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnRPYmplY3QoKSB7IHJl
dHVybiBtX2N1cnJlbnQucmVuZGVyZXIoKTsgfQotICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVh
aygpIHsgcmV0dXJuIG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7IH0KLSAgICBMaW5lV2lk
dGgmIGxpbmVXaWR0aCgpIHsgcmV0dXJuIG1fd2lkdGg7IH0KLSAgICBib29sIGF0RW5kKCkgeyBy
ZXR1cm4gbV9hdEVuZDsgfQotCi0gICAgdm9pZCBpbml0aWFsaXplRm9yQ3VycmVudE9iamVjdCgp
OwotCi0gICAgdm9pZCBpbmNyZW1lbnQoKTsKLQotICAgIHZvaWQgaGFuZGxlQlIoRUNsZWFyJik7
Ci0gICAgdm9pZCBoYW5kbGVPdXRPZkZsb3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gqPiYg
cG9zaXRpb25lZE9iamVjdHMpOwotICAgIHZvaWQgaGFuZGxlRmxvYXQoKTsKLSAgICB2b2lkIGhh
bmRsZUVtcHR5SW5saW5lKCk7Ci0gICAgdm9pZCBoYW5kbGVSZXBsYWNlZCgpOwotICAgIGJvb2wg
aGFuZGxlVGV4dChXb3JkTWVhc3VyZW1lbnRzJiwgYm9vbCYgaHlwaGVuYXRlZCwgdW5zaWduZWQm
IGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKTsKLSAgICBib29sIGNhbkJyZWFrQXRUaGlzUG9z
aXRpb24oKTsKLSAgICB2b2lkIGNvbW1pdEFuZFVwZGF0ZUxpbmVCcmVha0lmTmVlZGVkKCk7Ci0g
ICAgSW5saW5lSXRlcmF0b3IgaGFuZGxlRW5kT2ZMaW5lKCk7Ci0jaWYgRU5BQkxFKENTU19UUkFJ
TElOR19XT1JEKQotICAgIElubGluZUl0ZXJhdG9yIG9wdGltYWxMaW5lQnJlYWtMb2NhdGlvbkZv
clRyYWlsaW5nV29yZCgpOwotI2VuZGlmCi0KLSAgICB2b2lkIGNsZWFyTGluZUJyZWFrSWZGaXRz
T25MaW5lKGJvb2wgaWdub3JpbmdUcmFpbGluZ1NwYWNlID0gZmFsc2UpCi0gICAgewotICAgICAg
ICBpZiAobV93aWR0aC5maXRzT25MaW5lKGlnbm9yaW5nVHJhaWxpbmdTcGFjZSkgfHwgbV9sYXN0
V1MgPT0gTk9XUkFQKQotICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmNsZWFyKCk7Ci0g
ICAgfQotCi0gICAgdm9pZCBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aChSZW5kZXJPYmpl
Y3QmIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0ID0gMCwgaW50IG5leHRCcmVhayA9IC0xKQotICAg
IHsKLSAgICAgICAgbV93aWR0aC5jb21taXQoKTsKLSAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5
Lm1vdmVUbygmb2JqZWN0LCBvZmZzZXQsIG5leHRCcmVhayk7Ci0gICAgfQotCi1wcml2YXRlOgot
ICAgIC8vIFRoaXMgY2xhc3Mga2VlcHMgYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgcGFzdCBuIGxv
Y2F0aW9ucyBmb3IgYW4gSW5saW5lSXRlcmF0b3IuCi0gICAgY2xhc3MgSW5saW5lSXRlcmF0b3JI
aXN0b3J5IDogcHJpdmF0ZSBWZWN0b3I8SW5saW5lSXRlcmF0b3IsIDE+IHsKLSAgICBwdWJsaWM6
Ci0gICAgICAgIElubGluZUl0ZXJhdG9ySGlzdG9yeSgpID0gZGVsZXRlOwotICAgICAgICBJbmxp
bmVJdGVyYXRvckhpc3RvcnkoY29uc3QgSW5saW5lSXRlcmF0b3ImIGluaXRpYWwsIHNpemVfdCBj
YXBhY2l0eSkKLSAgICAgICAgICAgIDogbV9jYXBhY2l0eShjYXBhY2l0eSkKLSAgICAgICAgewot
ICAgICAgICAgICAgQVNTRVJUKGNhcGFjaXR5ID4gMCk7Ci0gICAgICAgICAgICB0aGlzLT5hcHBl
bmQoaW5pdGlhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1c2goc3RkOjpmdW5jdGlv
bjx2b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGlmIChtX2Nh
cGFjaXR5ICE9IDEpCi0gICAgICAgICAgICAgICAgdGhpcy0+aW5zZXJ0KDAsIElubGluZUl0ZXJh
dG9yKHRoaXMtPmF0KDApKSk7Ci0gICAgICAgICAgICB1cGRhdGVyKHRoaXMtPmF0KDApKTsKLSAg
ICAgICAgICAgIGlmIChtX2NhcGFjaXR5ICE9IDEpCi0gICAgICAgICAgICAgICAgdGhpcy0+cmVz
aXplKG1fY2FwYWNpdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGUoc3RkOjpm
dW5jdGlvbjx2b2lkKElubGluZUl0ZXJhdG9yJiBtb2RpZnlNZSk+IHVwZGF0ZXIpCi0gICAgICAg
IHsKLSAgICAgICAgICAgIEFTU0VSVCghdGhpcy0+aXNFbXB0eSgpKTsKLSAgICAgICAgICAgIHVw
ZGF0ZXIodGhpcy0+YXQoMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmF0KDApLnJlbmRlcmVyKCk7IH0KLSAgICAg
ICAgdW5zaWduZWQgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gdGhpcy0+YXQoMCkub2Zmc2V0KCk7
IH0KLSAgICAgICAgYm9vbCBhdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKSBjb25zdCB7IHJldHVy
biB0aGlzLT5hdCgwKS5hdFRleHRQYXJhZ3JhcGhTZXBhcmF0b3IoKTsgfQotICAgICAgICBVQ2hh
ciBwcmV2aW91c0luU2FtZU5vZGUoKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdCgwKS5wcmV2aW91
c0luU2FtZU5vZGUoKTsgfQotICAgICAgICBjb25zdCBJbmxpbmVJdGVyYXRvciYgZ2V0KHNpemVf
dCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5hdChpKTsgfTsKLSAgICAgICAgY29uc3QgSW5saW5l
SXRlcmF0b3ImIGN1cnJlbnQoKSBjb25zdCB7IHJldHVybiBnZXQoMCk7IH0KLSAgICAgICAgc2l6
ZV90IGhpc3RvcnlMZW5ndGgoKSBjb25zdCB7IHJldHVybiB0aGlzLT5zaXplKCk7IH0KLQotICAg
ICAgICB2b2lkIG1vdmVUbyhSZW5kZXJPYmplY3QqIG9iamVjdCwgdW5zaWduZWQgb2Zmc2V0LCBp
bnQgbmV4dEJyZWFrID0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1c2goWyZdKElubGlu
ZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewotICAgICAgICAgICAgICAgIG1vZGlmeU1lLm1vdmVUbyhv
YmplY3QsIG9mZnNldCwgbmV4dEJyZWFrKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0K
LSAgICAgICAgdm9pZCBpbmNyZW1lbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1cGRhdGUo
W10oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7Ci0gICAgICAgICAgICAgICAgbW9kaWZ5TWUu
aW5jcmVtZW50KCk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQg
Y2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdXNoKFtdKElubGluZUl0ZXJhdG9yJiBt
b2RpZnlNZSkgewotICAgICAgICAgICAgICAgIG1vZGlmeU1lLmNsZWFyKCk7Ci0gICAgICAgICAg
ICB9KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3Qgc2l6ZV90IG1f
Y2FwYWNpdHk7Ci0gICAgfTsKLQotICAgIExpbmVCcmVha2VyJiBtX2xpbmVCcmVha2VyOwotICAg
IElubGluZUJpZGlSZXNvbHZlciYgbV9yZXNvbHZlcjsKLQotICAgIElubGluZUl0ZXJhdG9yIG1f
Y3VycmVudDsKLSAgICBJbmxpbmVJdGVyYXRvckhpc3RvcnkgbV9saW5lQnJlYWtIaXN0b3J5Owot
ICAgIElubGluZUl0ZXJhdG9yIG1fc3RhcnRPZklnbm9yZWRTcGFjZXM7Ci0KLSAgICBSZW5kZXJC
bG9ja0Zsb3cmIG1fYmxvY2s7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX2xhc3RPYmplY3Q7Ci0gICAg
UmVuZGVyT2JqZWN0KiBtX25leHRPYmplY3Q7Ci0KLSAgICBjb25zdCBSZW5kZXJTdHlsZSogbV9j
dXJyZW50U3R5bGU7Ci0KLSAgICAvLyBGaXJlZm94IGFuZCBPcGVyYSB3aWxsIGFsbG93IGEgdGFi
bGUgY2VsbCB0byBncm93IHRvIGZpdCBhbiBpbWFnZSBpbnNpZGUgaXQgdW5kZXIKLSAgICAvLyB2
ZXJ5IHNwZWNpZmljIGNpcmN1bXN0YW5jZXMgKGluIG9yZGVyIHRvIG1hdGNoIGNvbW1vbiBXaW5J
RSByZW5kZXJpbmdzKS4KLSAgICAvLyBOb3Qgc3VwcG9ydGluZyB0aGUgcXVpcmsgaGFzIGNhdXNl
ZCB1cyB0byBtaXMtcmVuZGVyIHNvbWUgcmVhbCBzaXRlcy4gKFNlZSBCdWd6aWxsYSAxMDUxNy4p
Ci0gICAgUmVuZGVyU3R5bGUmIG1fYmxvY2tTdHlsZTsKLQotICAgIExpbmVJbmZvJiBtX2xpbmVJ
bmZvOwotCi0gICAgUmVuZGVyVGV4dEluZm8mIG1fcmVuZGVyVGV4dEluZm87Ci0KLSAgICBGbG9h
dGluZ09iamVjdCogbV9sYXN0RmxvYXRGcm9tUHJldmlvdXNMaW5lOwotCi0gICAgTGluZVdpZHRo
IG1fd2lkdGg7Ci0KLSAgICBFV2hpdGVTcGFjZSBtX2N1cnJXUzsKLSAgICBFV2hpdGVTcGFjZSBt
X2xhc3RXUzsKLQotICAgIGJvb2wgbV9wcmVzZXJ2ZXNOZXdsaW5lOwotICAgIGJvb2wgbV9hdFN0
YXJ0OwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIG9ubHkgaWYgd2hpdGVzcGFjZSBp
c24ndCBzZXQgdG8gUFJFLCBhbmQgaXQgdGVsbHMgdXMgd2hldGhlcgotICAgIC8vIG9yIG5vdCB3
ZSBhcmUgY3VycmVudGx5IGlnbm9yaW5nIHdoaXRlc3BhY2UuCi0gICAgYm9vbCBtX2lnbm9yaW5n
U3BhY2VzOwotCi0gICAgLy8gVGhpcyB2YXJpYWJsZSB0cmFja3Mgd2hldGhlciB0aGUgdmVyeSBs
YXN0IGNoYXJhY3RlciB3ZSBzYXcgd2FzIGEgc3BhY2UuIFdlIHVzZQotICAgIC8vIHRoaXMgdG8g
ZGV0ZWN0IHdoZW4gd2UgZW5jb3VudGVyIGEgc2Vjb25kIHNwYWNlIHNvIHdlIGtub3cgd2UgaGF2
ZSB0byB0ZXJtaW5hdGUKLSAgICAvLyBhIHJ1bi4KLSAgICBib29sIG1fY3VycmVudENoYXJhY3Rl
cklzU3BhY2U7Ci0gICAgYm9vbCBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAgIGJvb2wgbV9h
cHBsaWVkU3RhcnRXaWR0aDsKLSAgICBib29sIG1faW5jbHVkZUVuZFdpZHRoOwotICAgIGJvb2wg
bV9hdXRvV3JhcDsKLSAgICBib29sIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZTsKLSAgICBi
b29sIG1fZmxvYXRzRml0T25MaW5lOwotICAgIGJvb2wgbV9jb2xsYXBzZVdoaXRlU3BhY2U7Ci0g
ICAgYm9vbCBtX3N0YXJ0aW5nTmV3UGFyYWdyYXBoOwotICAgIGJvb2wgbV9hbGxvd0ltYWdlc1Rv
QnJlYWs7Ci0gICAgYm9vbCBtX2F0RW5kOwotICAgIGJvb2wgbV9oYWRVbmNvbW1pdHRlZFdpZHRo
QmVmb3JlQ3VycmVudDsKLQotICAgIExpbmVNaWRwb2ludFN0YXRlJiBtX2xpbmVNaWRwb2ludFN0
YXRlOwotCi0gICAgVHJhaWxpbmdPYmplY3RzIG1fdHJhaWxpbmdPYmplY3RzOwotfTsKLQotaW5s
aW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0Ojppbml0aWFsaXplRm9yQ3VycmVudE9iamVjdCgpCi17
Ci0gICAgbV9oYWRVbmNvbW1pdHRlZFdpZHRoQmVmb3JlQ3VycmVudCA9ICEhbV93aWR0aC51bmNv
bW1pdHRlZFdpZHRoKCk7Ci0KLSAgICBtX2N1cnJlbnRTdHlsZSA9ICZtX2N1cnJlbnQucmVuZGVy
ZXIoKS0+c3R5bGUoKTsgLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlICZsaW5lU3R5bGUoKm1fY3Vy
cmVudC5yZW5kZXJlcigpLCBtX2xpbmVJbmZvKTsgPwotCi0gICAgQVNTRVJUKG1fY3VycmVudFN0
eWxlKTsKLQotICAgIG1fbmV4dE9iamVjdCA9IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlubGluZXMo
bV9ibG9jaywgbV9jdXJyZW50LnJlbmRlcmVyKCkpOwotICAgIGlmIChtX25leHRPYmplY3QgJiYg
bV9uZXh0T2JqZWN0LT5wYXJlbnQoKSAmJiAhbV9uZXh0T2JqZWN0LT5wYXJlbnQoKS0+aXNEZXNj
ZW5kYW50T2YobV9jdXJyZW50LnJlbmRlcmVyKCktPnBhcmVudCgpKSkKLSAgICAgICAgbV9pbmNs
dWRlRW5kV2lkdGggPSB0cnVlOwotCi0gICAgbV9jdXJyV1MgPSBtX2N1cnJlbnQucmVuZGVyZXIo
KS0+aXNSZXBsYWNlZCgpID8gbV9jdXJyZW50LnJlbmRlcmVyKCktPnBhcmVudCgpLT5zdHlsZSgp
LndoaXRlU3BhY2UoKSA6IG1fY3VycmVudFN0eWxlLT53aGl0ZVNwYWNlKCk7Ci0gICAgbV9sYXN0
V1MgPSBtX2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSA/IG1fbGFzdE9iamVjdC0+cGFyZW50KCkt
PnN0eWxlKCkud2hpdGVTcGFjZSgpIDogbV9sYXN0T2JqZWN0LT5zdHlsZSgpLndoaXRlU3BhY2Uo
KTsKLQotICAgIG1fYXV0b1dyYXAgPSBSZW5kZXJTdHlsZTo6YXV0b1dyYXAobV9jdXJyV1MpOwot
ICAgIG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9uTGluZSA9IG1fYXV0b1dyYXBXYXNFdmVyVHJ1ZU9u
TGluZSB8fCBtX2F1dG9XcmFwOwotCi0gICAgbV9wcmVzZXJ2ZXNOZXdsaW5lID0gbV9jdXJyZW50
LnJlbmRlcmVyKCktPmlzU1ZHSW5saW5lVGV4dCgpID8gZmFsc2UgOiBSZW5kZXJTdHlsZTo6cHJl
c2VydmVOZXdsaW5lKG1fY3VycldTKTsKLQotICAgIG1fY29sbGFwc2VXaGl0ZVNwYWNlID0gUmVu
ZGVyU3R5bGU6OmNvbGxhcHNlV2hpdGVTcGFjZShtX2N1cnJXUyk7Ci19Ci0KLWlubGluZSB2b2lk
IEJyZWFraW5nQ29udGV4dDo6aW5jcmVtZW50KCkKLXsKLSAgICAvLyBDbGVhciBvdXQgb3VyIGNo
YXJhY3RlciBzcGFjZSBib29sLCBzaW5jZSBpbmxpbmUgPHByZT5zIGRvbid0IGNvbGxhcHNlIHdo
aXRlc3BhY2UKLSAgICAvLyB3aXRoIGFkamFjZW50IGlubGluZSBub3JtYWwvbm93cmFwIHNwYW5z
LgotICAgIGlmICghbV9jb2xsYXBzZVdoaXRlU3BhY2UpCi0gICAgICAgIG1fY3VycmVudENoYXJh
Y3RlcklzU3BhY2UgPSBmYWxzZTsKLQotICAgIG1fY3VycmVudC5tb3ZlVG9TdGFydE9mKG1fbmV4
dE9iamVjdCk7Ci0gICAgbV9hdFN0YXJ0ID0gZmFsc2U7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFr
aW5nQ29udGV4dDo6aGFuZGxlQlIoRUNsZWFyJiBjbGVhcikKLXsKLSAgICBpZiAobV93aWR0aC5m
aXRzT25MaW5lKCkpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiBiciA9IG1fY3VycmVudC5yZW5k
ZXJlcigpOwotICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0
b3ImIG1vZGlmeU1lKSB7Ci0gICAgICAgICAgICBtb2RpZnlNZS5tb3ZlVG9TdGFydE9mKGJyKTsK
LSAgICAgICAgICAgIG1vZGlmeU1lLmluY3JlbWVudCgpOwotICAgICAgICB9KTsKLQotICAgICAg
ICAvLyBBIDxicj4gYWx3YXlzIGJyZWFrcyBhIGxpbmUsIHNvIGRvbid0IGxldCB0aGUgbGluZSBi
ZSBjb2xsYXBzZWQKLSAgICAgICAgLy8gYXdheS4gQWxzbywgdGhlIHNwYWNlIGF0IHRoZSBlbmQg
b2YgYSBsaW5lIHdpdGggYSA8YnI+IGRvZXMgbm90Ci0gICAgICAgIC8vIGdldCBjb2xsYXBzZWQg
YXdheS4gSXQgb25seSBkb2VzIHRoaXMgaWYgdGhlIHByZXZpb3VzIGxpbmUgYnJva2UKLSAgICAg
ICAgLy8gY2xlYW5seS4gT3RoZXJ3aXNlIHRoZSA8YnI+IGhhcyBubyBlZmZlY3Qgb24gd2hldGhl
ciB0aGUgbGluZSBpcwotICAgICAgICAvLyBlbXB0eSBvciBub3QuCi0gICAgICAgIGlmIChtX3N0
YXJ0aW5nTmV3UGFyYWdyYXBoKQotICAgICAgICAgICAgbV9saW5lSW5mby5zZXRFbXB0eShmYWxz
ZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICAgICAgbV90cmFpbGluZ09iamVjdHMuY2xlYXIo
KTsKLSAgICAgICAgbV9saW5lSW5mby5zZXRQcmV2aW91c0xpbmVCcm9rZUNsZWFubHkodHJ1ZSk7
Ci0KLSAgICAgICAgLy8gQSA8YnI+IHdpdGggY2xlYXJhbmNlIGFsd2F5cyBuZWVkcyBhIGxpbmVi
b3ggaW4gY2FzZSB0aGUgbGluZXMgYmVsb3cgaXQgZ2V0IGRpcnRpZWQgbGF0ZXIgYW5kCi0gICAg
ICAgIC8vIG5lZWQgdG8gY2hlY2sgZm9yIGZsb2F0cyB0byBjbGVhciAtIHNvIGlmIHdlJ3JlIGln
bm9yaW5nIHNwYWNlcywgc3RvcCBpZ25vcmluZyB0aGVtIGFuZCBhZGQgYQotICAgICAgICAvLyBy
dW4gZm9yIHRoaXMgb2JqZWN0LgotICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcyAmJiBtX2N1
cnJlbnRTdHlsZS0+Y2xlYXIoKSAhPSBDTk9ORSkKLSAgICAgICAgICAgIG1fbGluZU1pZHBvaW50
U3RhdGUuZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRTcGFjZXMoYnIpOwotICAgICAgICAvLyBJ
ZiB3ZSB3ZXJlIHByZWNlZGVkIGJ5IGNvbGxhcHNpbmcgc3BhY2UgYW5kIGFyZSBpbiBhIHJpZ2h0
LWFsaWduZWQgY29udGFpbmVyIHdlIG5lZWQgdG8gZW5zdXJlIHRoZSBzcGFjZSBnZXRzCi0gICAg
ICAgIC8vIGNvbGxhcHNlZCBhd2F5IHNvIHRoYXQgaXQgZG9lc24ndCBwdXNoIHRoZSB0ZXh0IG91
dCBmcm9tIHRoZSBjb250YWluZXIncyByaWdodC1oYW5kIGVkZ2UuCi0gICAgICAgIC8vIEZJWE1F
OiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFsaWdubWVudCAtIHdpbGwg
cmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRzLgotICAgICAgICBlbHNl
IGlmIChtX2lnbm9yaW5nU3BhY2VzICYmIChtX2Jsb2NrU3R5bGUudGV4dEFsaWduKCkgPT0gUklH
SFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFdFQktJVF9SSUdIVCkpCi0gICAgICAg
ICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRv
cigwLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpKSk7Ci0KLSAgICAg
ICAgaWYgKCFtX2xpbmVJbmZvLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIGNsZWFyID0gbV9jdXJy
ZW50U3R5bGUtPmNsZWFyKCk7Ci0gICAgfQotICAgIG1fYXRFbmQgPSB0cnVlOwotfQotCi1pbmxp
bmUgTGF5b3V0VW5pdCBib3JkZXJQYWRkaW5nTWFyZ2luU3RhcnQoY29uc3QgUmVuZGVySW5saW5l
JiBjaGlsZCkKLXsKLSAgICByZXR1cm4gY2hpbGQubWFyZ2luU3RhcnQoKSArIGNoaWxkLnBhZGRp
bmdTdGFydCgpICsgY2hpbGQuYm9yZGVyU3RhcnQoKTsKLX0KLQotaW5saW5lIExheW91dFVuaXQg
Ym9yZGVyUGFkZGluZ01hcmdpbkVuZChjb25zdCBSZW5kZXJJbmxpbmUmIGNoaWxkKQotewotICAg
IHJldHVybiBjaGlsZC5tYXJnaW5FbmQoKSArIGNoaWxkLnBhZGRpbmdFbmQoKSArIGNoaWxkLmJv
cmRlckVuZCgpOwotfQotCi1pbmxpbmUgYm9vbCBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2lu
KFJlbmRlck9iamVjdCogY2hpbGQpCi17Ci0gICAgaWYgKCFjaGlsZCkKLSAgICAgICAgcmV0dXJu
IHRydWU7Ci0gICAgLy8gV2hlbiBkZWNpZGluZyB3aGV0aGVyIHdlJ3JlIGF0IHRoZSBlZGdlIG9m
IGFuIGlubGluZSwgYWRqYWNlbnQgY29sbGFwc2VkIHdoaXRlc3BhY2UgaXMgdGhlIHNhbWUgYXMg
bm8gc2libGluZyBhdCBhbGwuCi0gICAgaWYgKGlzPFJlbmRlclRleHQ+KCpjaGlsZCkgJiYgIWRv
d25jYXN0PFJlbmRlclRleHQ+KCpjaGlsZCkudGV4dExlbmd0aCgpKQotICAgICAgICByZXR1cm4g
dHJ1ZTsKLSNpZiBFTkFCTEUoQ1NTX0JPWF9ERUNPUkFUSU9OX0JSRUFLKQotICAgIGlmIChpczxS
ZW5kZXJMaW5lQnJlYWs+KCpjaGlsZCkgJiYgY2hpbGQtPnBhcmVudCgpLT5zdHlsZSgpLmJveERl
Y29yYXRpb25CcmVhaygpID09IERDTE9ORSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYK
LSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlubGluZSBSZW5kZXJPYmplY3QqIHByZXZpb3VzSW5G
bG93U2libGluZyhSZW5kZXJPYmplY3QqIGNoaWxkKQotewotICAgIGRvIHsKLSAgICAgICAgY2hp
bGQgPSBjaGlsZC0+cHJldmlvdXNTaWJsaW5nKCk7Ci0gICAgfSB3aGlsZSAoY2hpbGQgJiYgY2hp
bGQtPmlzT3V0T2ZGbG93UG9zaXRpb25lZCgpKTsKLSAgICByZXR1cm4gY2hpbGQ7Ci19Ci0KLWlu
bGluZSBMYXlvdXRVbml0IGlubGluZUxvZ2ljYWxXaWR0aChSZW5kZXJPYmplY3QqIGNoaWxkLCBi
b29sIGNoZWNrU3RhcnRFZGdlID0gdHJ1ZSwgYm9vbCBjaGVja0VuZEVkZ2UgPSB0cnVlKQotewot
ICAgIHVuc2lnbmVkIGxpbmVEZXB0aCA9IDE7Ci0gICAgTGF5b3V0VW5pdCBleHRyYVdpZHRoID0g
MDsKLSAgICBSZW5kZXJFbGVtZW50KiBwYXJlbnQgPSBjaGlsZC0+cGFyZW50KCk7Ci0gICAgd2hp
bGUgKGlzPFJlbmRlcklubGluZT4oKnBhcmVudCkgJiYgbGluZURlcHRoKysgPCBjTWF4TGluZURl
cHRoKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHBhcmVudEFzUmVuZGVySW5saW5lID0gZG93bmNh
c3Q8UmVuZGVySW5saW5lPigqcGFyZW50KTsKLSAgICAgICAgaWYgKCFpc0VtcHR5SW5saW5lKHBh
cmVudEFzUmVuZGVySW5saW5lKSkgewotICAgICAgICAgICAgY2hlY2tTdGFydEVkZ2UgPSBjaGVj
a1N0YXJ0RWRnZSAmJiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKHByZXZpb3VzSW5GbG93
U2libGluZyhjaGlsZCkpOwotICAgICAgICAgICAgaWYgKGNoZWNrU3RhcnRFZGdlKQotICAgICAg
ICAgICAgICAgIGV4dHJhV2lkdGggKz0gYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KHBhcmVudEFz
UmVuZGVySW5saW5lKTsKLSAgICAgICAgICAgIGNoZWNrRW5kRWRnZSA9IGNoZWNrRW5kRWRnZSAm
JiBzaG91bGRBZGRCb3JkZXJQYWRkaW5nTWFyZ2luKGNoaWxkLT5uZXh0U2libGluZygpKTsKLSAg
ICAgICAgICAgIGlmIChjaGVja0VuZEVkZ2UpCi0gICAgICAgICAgICAgICAgZXh0cmFXaWR0aCAr
PSBib3JkZXJQYWRkaW5nTWFyZ2luRW5kKHBhcmVudEFzUmVuZGVySW5saW5lKTsKLSAgICAgICAg
ICAgIGlmICghY2hlY2tTdGFydEVkZ2UgJiYgIWNoZWNrRW5kRWRnZSkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gZXh0cmFXaWR0aDsKLSAgICAgICAgfQotICAgICAgICBjaGlsZCA9IHBhcmVudDsK
LSAgICAgICAgcGFyZW50ID0gY2hpbGQtPnBhcmVudCgpOwotICAgIH0KLSAgICByZXR1cm4gZXh0
cmFXaWR0aDsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVPdXRPZkZs
b3dQb3NpdGlvbmVkKFZlY3RvcjxSZW5kZXJCb3gqPiYgcG9zaXRpb25lZE9iamVjdHMpCi17Ci0g
ICAgLy8gSWYgb3VyIG9yaWdpbmFsIGRpc3BsYXkgd2Fzbid0IGFuIGlubGluZSB0eXBlLCB0aGVu
IHdlIGNhbgotICAgIC8vIGdvIGFoZWFkIGFuZCBkZXRlcm1pbmUgb3VyIHN0YXRpYyBpbmxpbmUg
cG9zaXRpb24gbm93LgotICAgIGF1dG8mIGJveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fY3Vy
cmVudC5yZW5kZXJlcigpKTsKLSAgICBib29sIGlzSW5saW5lVHlwZSA9IGJveC5zdHlsZSgpLmlz
T3JpZ2luYWxEaXNwbGF5SW5saW5lVHlwZSgpOwotICAgIGlmICghaXNJbmxpbmVUeXBlKQotICAg
ICAgICBtX2Jsb2NrLnNldFN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hpbGQoYm94LCBtX2Jsb2Nr
LmxvZ2ljYWxIZWlnaHQoKSwgbV9ibG9jay5zdGFydE9mZnNldEZvckNvbnRlbnQobV9ibG9jay5s
b2dpY2FsSGVpZ2h0KCkpKTsKLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSWYgb3VyIG9yaWdpbmFs
IGRpc3BsYXkgd2FzIGFuIElOTElORSB0eXBlLCB0aGVuIHdlIGNhbiBnbyBhaGVhZAotICAgICAg
ICAvLyBhbmQgZGV0ZXJtaW5lIG91ciBzdGF0aWMgeSBwb3NpdGlvbiBub3cuCi0gICAgICAgIGJv
eC5sYXllcigpLT5zZXRTdGF0aWNCbG9ja1Bvc2l0aW9uKG1fYmxvY2subG9naWNhbEhlaWdodCgp
KTsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSdyZSBpZ25vcmluZyBzcGFjZXMsIHdlIGhhdmUgdG8g
c3RvcCBhbmQgaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQKLSAgICAvLyB0aGVuIHN0YXJ0IGlnbm9y
aW5nIHNwYWNlcyBhZ2Fpbi4KLSAgICBpZiAoaXNJbmxpbmVUeXBlIHx8IGJveC5jb250YWluZXIo
KS0+aXNSZW5kZXJJbmxpbmUoKSkgewotICAgICAgICBpZiAobV9pZ25vcmluZ1NwYWNlcykKLSAg
ICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuZW5zdXJlTGluZUJveEluc2lkZUlnbm9yZWRT
cGFjZXMoJmJveCk7Ci0gICAgICAgIG1fdHJhaWxpbmdPYmplY3RzLmFwcGVuZEJveElmTmVlZGVk
KCZib3gpOwotICAgIH0gZWxzZQotICAgICAgICBwb3NpdGlvbmVkT2JqZWN0cy5hcHBlbmQoJmJv
eCk7Ci0KLSAgICBtX3dpZHRoLmFkZFVuY29tbWl0dGVkV2lkdGgoaW5saW5lTG9naWNhbFdpZHRo
KCZib3gpKTsKLSAgICAvLyBSZXNldCBwcmlvciBsaW5lIGJyZWFrIGNvbnRleHQgY2hhcmFjdGVy
cy4KLSAgICBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRQcmlvckNv
bnRleHQoKTsKLX0KLQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVGbG9hdCgp
Ci17Ci0gICAgYXV0byYgZmxvYXRCb3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX2N1cnJlbnQu
cmVuZGVyZXIoKSk7Ci0gICAgRmxvYXRpbmdPYmplY3QqIGZsb2F0aW5nT2JqZWN0ID0gbV9saW5l
QnJlYWtlci5pbnNlcnRGbG9hdGluZ09iamVjdChmbG9hdEJveCk7Ci0gICAgLy8gY2hlY2sgaWYg
aXQgZml0cyBpbiB0aGUgY3VycmVudCBsaW5lLgotICAgIC8vIElmIGl0IGRvZXMsIHBvc2l0aW9u
IGl0IG5vdywgb3RoZXJ3aXNlLCBwb3NpdGlvbgotICAgIC8vIGl0IGFmdGVyIG1vdmluZyB0byBu
ZXh0IGxpbmUgKGluIGNsZWFyRmxvYXRzKCkgZnVuYykKLSAgICBpZiAobV9mbG9hdHNGaXRPbkxp
bmUgJiYgbV93aWR0aC5maXRzT25MaW5lRXhjbHVkaW5nVHJhaWxpbmdXaGl0ZXNwYWNlKG1fYmxv
Y2subG9naWNhbFdpZHRoRm9yRmxvYXQoZmxvYXRpbmdPYmplY3QpKSkgewotICAgICAgICBtX2xp
bmVCcmVha2VyLnBvc2l0aW9uTmV3RmxvYXRPbkxpbmUoZmxvYXRpbmdPYmplY3QsIG1fbGFzdEZs
b2F0RnJvbVByZXZpb3VzTGluZSwgbV9saW5lSW5mbywgbV93aWR0aCk7Ci0gICAgICAgIGlmICht
X2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSA9PSBtX2N1cnJlbnQucmVuZGVyZXIoKSkgewot
ICAgICAgICAgICAgQVNTRVJUKCFtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkpOwotICAgICAg
ICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwotICAgICAgICB9Ci0gICAgfSBl
bHNlCi0gICAgICAgIG1fZmxvYXRzRml0T25MaW5lID0gZmFsc2U7Ci0gICAgLy8gVXBkYXRlIHBy
aW9yIGxpbmUgYnJlYWsgY29udGV4dCBjaGFyYWN0ZXJzLCB1c2luZyBVK0ZGRkQgKE9CSkVDVCBS
RVBMQUNFTUVOVCBDSEFSQUNURVIpIGZvciBmbG9hdGluZyBlbGVtZW50LgotICAgIG1fcmVuZGVy
VGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51cGRhdGVQcmlvckNvbnRleHQocmVwbGFjZW1l
bnRDaGFyYWN0ZXIpOwotfQotCi0vLyBUaGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgZm9yIGxp
c3QgbWFya2VycyBhbmQgaW5saW5lIGZsb3dzIHRoYXQgaGF2ZSBsaW5lIGJveGVzLiBOZWl0aGVy
IHNob3VsZAotLy8gaGF2ZSBhbiBlZmZlY3Qgb24gd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQgb2Yg
dGhlIGxpbmUuCi1pbmxpbmUgYm9vbCBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmpl
Y3QoUmVuZGVyQmxvY2tGbG93JiBibG9jaywgUmVuZGVyT2JqZWN0KiBvLCBMaW5lTWlkcG9pbnRT
dGF0ZSYgbGluZU1pZHBvaW50U3RhdGUpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiBuZXh0ID0gYmlk
aU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhibG9jaywgbyk7Ci0gICAgd2hpbGUgKG5leHQgJiYg
bmV4dC0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAgICBuZXh0ID0g
YmlkaU5leHRTa2lwcGluZ0VtcHR5SW5saW5lcyhibG9jaywgbmV4dCk7Ci0KLSAgICBpZiAoaXM8
UmVuZGVyVGV4dD4obmV4dCkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm5leHQpLnRleHRMZW5n
dGgoKSA+IDApIHsKLSAgICAgICAgUmVuZGVyVGV4dCYgbmV4dFRleHQgPSBkb3duY2FzdDxSZW5k
ZXJUZXh0PigqbmV4dCk7Ci0gICAgICAgIFVDaGFyIG5leHRDaGFyID0gbmV4dFRleHQuY2hhcmFj
dGVyQXQoMCk7Ci0gICAgICAgIGlmIChuZXh0VGV4dC5zdHlsZSgpLmlzQ29sbGFwc2libGVXaGl0
ZVNwYWNlKG5leHRDaGFyKSkgewotICAgICAgICAgICAgbGluZU1pZHBvaW50U3RhdGUuc3RhcnRJ
Z25vcmluZ1NwYWNlcyhJbmxpbmVJdGVyYXRvcihudWxscHRyLCBvLCAwKSk7Ci0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotaW5saW5lIHZvaWQgQnJlYWtpbmdDb250ZXh0OjpoYW5kbGVFbXB0eUlubGluZSgpCi17Ci0g
ICAgUmVuZGVySW5saW5lJiBmbG93Qm94ID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPigqbV9jdXJy
ZW50LnJlbmRlcmVyKCkpOwotCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBlbmQgdXAgYmVpbmcg
Y2FsbGVkIG9uIGVtcHR5IGlubGluZXMKLSAgICBBU1NFUlQoaXNFbXB0eUlubGluZShmbG93Qm94
KSk7Ci0KLSAgICAvLyBOb3cgdGhhdCBzb21lIGlubGluZSBmbG93cyBoYXZlIGxpbmUgYm94ZXMs
IGlmIHdlIGFyZSBhbHJlYWR5IGlnbm9yaW5nIHNwYWNlcywgd2UgbmVlZAotICAgIC8vIHRvIG1h
a2Ugc3VyZSB0aGF0IHdlIHN0b3AgdG8gaW5jbHVkZSB0aGlzIG9iamVjdCBhbmQgdGhlbiBzdGFy
dCBpZ25vcmluZyBzcGFjZXMgYWdhaW4uCi0gICAgLy8gSWYgdGhpcyBvYmplY3QgaXMgYXQgdGhl
IHN0YXJ0IG9mIHRoZSBsaW5lLCB3ZSBuZWVkIHRvIGJlaGF2ZSBsaWtlIGxpc3QgbWFya2VycyBh
bmQKLSAgICAvLyBzdGFydCBpZ25vcmluZyBzcGFjZXMuCi0gICAgYm9vbCByZXF1aXJlc0xpbmVC
b3ggPSBhbHdheXNSZXF1aXJlc0xpbmVCb3goZmxvd0JveCk7Ci0gICAgaWYgKHJlcXVpcmVzTGlu
ZUJveCB8fCByZXF1aXJlc0xpbmVCb3hGb3JDb250ZW50KGZsb3dCb3gsIG1fbGluZUluZm8pKSB7
Ci0gICAgICAgIC8vIEFuIGVtcHR5IGlubGluZSB0aGF0IG9ubHkgaGFzIGxpbmUtaGVpZ2h0LCB2
ZXJ0aWNhbC1hbGlnbiBvciBmb250LW1ldHJpY3Mgd2lsbCBvbmx5IGdldCBhCi0gICAgICAgIC8v
IGxpbmUgYm94IHRvIGFmZmVjdCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIGlmIHRoZSByZXN0IG9m
IHRoZSBsaW5lIGlzIG5vdCBlbXB0eS4KLSAgICAgICAgaWYgKHJlcXVpcmVzTGluZUJveCkKLSAg
ICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHkoZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7
Ci0gICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7Ci0gICAgICAgICAgICBtX3RyYWlsaW5n
T2JqZWN0cy5jbGVhcigpOwotICAgICAgICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5lbnN1cmVM
aW5lQm94SW5zaWRlSWdub3JlZFNwYWNlcyhtX2N1cnJlbnQucmVuZGVyZXIoKSk7Ci0gICAgICAg
IH0gZWxzZSBpZiAobV9ibG9ja1N0eWxlLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIG1fcmVzb2x2
ZXIucG9zaXRpb24oKS5yZW5kZXJlcigpID09IG1fY3VycmVudC5yZW5kZXJlcigpCi0gICAgICAg
ICAgICAmJiBzaG91bGRTa2lwV2hpdGVzcGFjZUFmdGVyU3RhcnRPYmplY3QobV9ibG9jaywgbV9j
dXJyZW50LnJlbmRlcmVyKCksIG1fbGluZU1pZHBvaW50U3RhdGUpKSB7Ci0gICAgICAgICAgICAv
LyBMaWtlIHdpdGggbGlzdCBtYXJrZXJzLCB3ZSBzdGFydCBpZ25vcmluZyBzcGFjZXMgdG8gbWFr
ZSBzdXJlIHRoYXQgYW55Ci0gICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHNwYWNlcyB3ZSBzZWUg
d2lsbCBiZSBkaXNjYXJkZWQuCi0gICAgICAgICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNl
ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSB0cnVlOwotICAg
ICAgICAgICAgbV9pZ25vcmluZ1NwYWNlcyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAg
ICAgICAgbV90cmFpbGluZ09iamVjdHMuYXBwZW5kQm94SWZOZWVkZWQoJmZsb3dCb3gpOwotICAg
IH0KLQotICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgo
bV9jdXJyZW50LnJlbmRlcmVyKCkpICsgYm9yZGVyUGFkZGluZ01hcmdpblN0YXJ0KGZsb3dCb3gp
ICsgYm9yZGVyUGFkZGluZ01hcmdpbkVuZChmbG93Qm94KSk7Ci19Ci0KLWlubGluZSB2b2lkIEJy
ZWFraW5nQ29udGV4dDo6aGFuZGxlUmVwbGFjZWQoKQotewotICAgIGF1dG8mIHJlcGxhY2VkQm94
ID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpOwotCi0gICAgaWYg
KG1fYXRTdGFydCkKLSAgICAgICAgbV93aWR0aC51cGRhdGVBdmFpbGFibGVXaWR0aChyZXBsYWNl
ZEJveC5sb2dpY2FsSGVpZ2h0KCkpOwotCi0gICAgLy8gQnJlYWsgb24gcmVwbGFjZWQgZWxlbWVu
dHMgaWYgZWl0aGVyIGhhcyBub3JtYWwgd2hpdGUtc3BhY2UuCi0gICAgaWYgKChtX2F1dG9XcmFw
IHx8IFJlbmRlclN0eWxlOjphdXRvV3JhcChtX2xhc3RXUykpICYmICghbV9jdXJyZW50LnJlbmRl
cmVyKCktPmlzSW1hZ2UoKSB8fCBtX2FsbG93SW1hZ2VzVG9CcmVhaykKLSAgICAgICAgJiYgKCFt
X2N1cnJlbnQucmVuZGVyZXIoKS0+aXNSdWJ5UnVuKCkgfHwgZG93bmNhc3Q8UmVuZGVyUnVieVJ1
bj4obV9jdXJyZW50LnJlbmRlcmVyKCkpLT5jYW5CcmVha0JlZm9yZShtX3JlbmRlclRleHRJbmZv
Lm1fbGluZUJyZWFrSXRlcmF0b3IpKSkgewotICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJl
bnRXaWR0aCgqbV9jdXJyZW50LnJlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIGlmIChtX2lnbm9y
aW5nU3BhY2VzKQotICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0b3BJZ25vcmluZ1NwYWNl
cyhJbmxpbmVJdGVyYXRvcigwLCBtX2N1cnJlbnQucmVuZGVyZXIoKSwgMCkpOwotCi0gICAgbV9s
aW5lSW5mby5zZXRFbXB0eShmYWxzZSwgJm1fYmxvY2ssICZtX3dpZHRoKTsKLSAgICBtX2lnbm9y
aW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IGZhbHNl
OwotICAgIG1fY3VycmVudENoYXJhY3RlcklzV1MgPSBmYWxzZTsKLSAgICBtX3RyYWlsaW5nT2Jq
ZWN0cy5jbGVhcigpOwotCi0gICAgLy8gT3B0aW1pemUgZm9yIGEgY29tbW9uIGNhc2UuIElmIHdl
IGNhbid0IGZpbmQgd2hpdGVzcGFjZSBhZnRlciB0aGUgbGlzdAotICAgIC8vIGl0ZW0sIHRoZW4g
dGhpcyBpcyBhbGwgbW9vdC4KLSAgICBMYXlvdXRVbml0IHJlcGxhY2VkTG9naWNhbFdpZHRoID0g
bV9ibG9jay5sb2dpY2FsV2lkdGhGb3JDaGlsZChyZXBsYWNlZEJveCkgKyBtX2Jsb2NrLm1hcmdp
blN0YXJ0Rm9yQ2hpbGQocmVwbGFjZWRCb3gpICsgbV9ibG9jay5tYXJnaW5FbmRGb3JDaGlsZChy
ZXBsYWNlZEJveCkgKyBpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJlbmRlcmVyKCkpOwot
ICAgIGlmIChpczxSZW5kZXJMaXN0TWFya2VyPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpKSB7Ci0g
ICAgICAgIGlmIChtX2Jsb2NrU3R5bGUuY29sbGFwc2VXaGl0ZVNwYWNlKCkgJiYgc2hvdWxkU2tp
cFdoaXRlc3BhY2VBZnRlclN0YXJ0T2JqZWN0KG1fYmxvY2ssIG1fY3VycmVudC5yZW5kZXJlcigp
LCBtX2xpbmVNaWRwb2ludFN0YXRlKSkgewotICAgICAgICAgICAgLy8gTGlrZSB3aXRoIGlubGlu
ZSBmbG93cywgd2Ugc3RhcnQgaWdub3Jpbmcgc3BhY2VzIHRvIG1ha2Ugc3VyZSB0aGF0IGFueQot
ICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBzcGFjZXMgd2Ugc2VlIHdpbGwgYmUgZGlzY2FyZGVk
LgotICAgICAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSA9IHRydWU7Ci0gICAgICAg
ICAgICBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTID0gZmFsc2U7Ci0gICAgICAgICAgICBtX2lnbm9y
aW5nU3BhY2VzID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG93bmNhc3Q8UmVuZGVy
TGlzdE1hcmtlcj4oKm1fY3VycmVudC5yZW5kZXJlcigpKS5pc0luc2lkZSgpKQotICAgICAgICAg
ICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKHJlcGxhY2VkTG9naWNhbFdpZHRoKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKHJlcGxhY2VkTG9n
aWNhbFdpZHRoKTsKLSAgICBpZiAoaXM8UmVuZGVyUnVieVJ1bj4oKm1fY3VycmVudC5yZW5kZXJl
cigpKSkgewotICAgICAgICBtX3dpZHRoLmFwcGx5T3ZlcmhhbmcoZG93bmNhc3Q8UmVuZGVyUnVi
eVJ1bj4obV9jdXJyZW50LnJlbmRlcmVyKCkpLCBtX2xhc3RPYmplY3QsIG1fbmV4dE9iamVjdCk7
Ci0gICAgICAgIGRvd25jYXN0PFJlbmRlclJ1YnlSdW4+KG1fY3VycmVudC5yZW5kZXJlcigpKS0+
dXBkYXRlUHJpb3JDb250ZXh0RnJvbUNhY2hlZEJyZWFrSXRlcmF0b3IobV9yZW5kZXJUZXh0SW5m
by5tX2xpbmVCcmVha0l0ZXJhdG9yKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBVcGRhdGUg
cHJpb3IgbGluZSBicmVhayBjb250ZXh0IGNoYXJhY3RlcnMsIHVzaW5nIFUrRkZGRCAoT0JKRUNU
IFJFUExBQ0VNRU5UIENIQVJBQ1RFUikgZm9yIHJlcGxhY2VkIGVsZW1lbnQuCi0gICAgICAgIG1f
cmVuZGVyVGV4dEluZm8ubV9saW5lQnJlYWtJdGVyYXRvci51cGRhdGVQcmlvckNvbnRleHQocmVw
bGFjZW1lbnRDaGFyYWN0ZXIpOwotICAgIH0KLX0KLQotaW5saW5lIGZsb2F0IGZpcnN0UG9zaXRp
dmVXaWR0aChjb25zdCBXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzKQotewotICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd29yZE1lYXN1cmVtZW50cy5zaXplKCk7ICsraSkgewot
ICAgICAgICBpZiAod29yZE1lYXN1cmVtZW50c1tpXS53aWR0aCA+IDApCi0gICAgICAgICAgICBy
ZXR1cm4gd29yZE1lYXN1cmVtZW50c1tpXS53aWR0aDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLWlubGluZSBib29sIGl0ZXJhdG9ySXNCZXlvbmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KGNv
bnN0IElubGluZUl0ZXJhdG9yJiBpdGVyLCBSZW5kZXJDb21iaW5lVGV4dCYgcmVuZGVyZXIpCi17
Ci0gICAgcmV0dXJuIGl0ZXIucmVuZGVyZXIoKSA9PSAmcmVuZGVyZXIgJiYgaXRlci5vZmZzZXQo
KSA+PSByZW5kZXJlci50ZXh0TGVuZ3RoKCk7Ci19Ci0KLWlubGluZSB2b2lkIG5leHRDaGFyYWN0
ZXIoVUNoYXImIGN1cnJlbnRDaGFyYWN0ZXIsIFVDaGFyJiBsYXN0Q2hhcmFjdGVyLCBVQ2hhciYg
c2Vjb25kVG9MYXN0Q2hhcmFjdGVyKQotewotICAgIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IGxh
c3RDaGFyYWN0ZXI7Ci0gICAgbGFzdENoYXJhY3RlciA9IGN1cnJlbnRDaGFyYWN0ZXI7Ci19Ci0K
LS8vIEZJWE1FOiBEb24ndCBsZXQgY291bnRlcnMgbWFyayB0aGVtc2VsdmVzIGFzIG5lZWRpbmcg
cHJlZiB3aWR0aCByZWNhbGNzIGR1cmluZyBsYXlvdXQKLS8vIHNvIHdlIGRvbid0IG5lZWQgdGhp
cyBoYWNrLgotaW5saW5lIHZvaWQgdXBkYXRlQ291bnRlcklmTmVlZGVkKFJlbmRlclRleHQmIHJl
bmRlclRleHQpCi17Ci0gICAgaWYgKCFyZW5kZXJUZXh0LnByZWZlcnJlZExvZ2ljYWxXaWR0aHNE
aXJ0eSgpIHx8ICFpczxSZW5kZXJDb3VudGVyPihyZW5kZXJUZXh0KSkKLSAgICAgICAgcmV0dXJu
OwotICAgIGRvd25jYXN0PFJlbmRlckNvdW50ZXI+KHJlbmRlclRleHQpLnVwZGF0ZUNvdW50ZXIo
KTsKLX0KLQotaW5saW5lIGZsb2F0IG1lYXN1cmVIeXBoZW5XaWR0aChSZW5kZXJUZXh0JiByZW5k
ZXJlciwgY29uc3QgRm9udENhc2NhZGUmIGZvbnQsIEhhc2hTZXQ8Y29uc3QgRm9udCo+KiBmYWxs
YmFja0ZvbnRzID0gMCkKLXsKLSAgICBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUgPSByZW5kZXJl
ci5zdHlsZSgpOwotICAgIHJldHVybiBmb250LndpZHRoKFJlbmRlckJsb2NrOjpjb25zdHJ1Y3RU
ZXh0UnVuKCZyZW5kZXJlciwgZm9udCwgc3R5bGUuaHlwaGVuU3RyaW5nKCkuc3RyaW5nKCksIHN0
eWxlKSwgZmFsbGJhY2tGb250cyk7Ci19Ci0KLUFMV0FZU19JTkxJTkUgZmxvYXQgdGV4dFdpZHRo
KFJlbmRlclRleHQmIHRleHQsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIGxlbiwgY29uc3QgRm9u
dENhc2NhZGUmIGZvbnQsIGZsb2F0IHhQb3MsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxh
cHNlV2hpdGVTcGFjZSwgSGFzaFNldDxjb25zdCBGb250Kj4mIGZhbGxiYWNrRm9udHMsIFRleHRM
YXlvdXQqIGxheW91dCA9IG51bGxwdHIpCi17Ci0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxl
ID0gdGV4dC5zdHlsZSgpOwotCi0gICAgR2x5cGhPdmVyZmxvdyBnbHlwaE92ZXJmbG93OwotICAg
IGlmIChpc0ZpeGVkUGl0Y2ggfHwgKCFmcm9tICYmIGxlbiA9PSB0ZXh0LnRleHRMZW5ndGgoKSkg
fHwgc3R5bGUuaGFzVGV4dENvbWJpbmUoKSkKLSAgICAgICAgcmV0dXJuIHRleHQud2lkdGgoZnJv
bSwgbGVuLCBmb250LCB4UG9zLCAmZmFsbGJhY2tGb250cywgJmdseXBoT3ZlcmZsb3cpOwotCi0g
ICAgaWYgKGxheW91dCkKLSAgICAgICAgcmV0dXJuIEZvbnRDYXNjYWRlOjp3aWR0aCgqbGF5b3V0
LCBmcm9tLCBsZW4sICZmYWxsYmFja0ZvbnRzKTsKLQotICAgIFRleHRSdW4gcnVuID0gUmVuZGVy
QmxvY2s6OmNvbnN0cnVjdFRleHRSdW4oJnRleHQsIGZvbnQsICZ0ZXh0LCBmcm9tLCBsZW4sIHN0
eWxlKTsKLSAgICBydW4uc2V0Q2hhcmFjdGVyc0xlbmd0aCh0ZXh0LnRleHRMZW5ndGgoKSAtIGZy
b20pOwotICAgIEFTU0VSVChydW4uY2hhcmFjdGVyc0xlbmd0aCgpID49IHJ1bi5sZW5ndGgoKSk7
Ci0KLSAgICBydW4uc2V0Q2hhcmFjdGVyU2NhbkZvckNvZGVQYXRoKCF0ZXh0LmNhblVzZVNpbXBs
ZUZvbnRDb2RlUGF0aCgpKTsKLSAgICBydW4uc2V0VGFiU2l6ZSghY29sbGFwc2VXaGl0ZVNwYWNl
LCBzdHlsZS50YWJTaXplKCkpOwotICAgIHJ1bi5zZXRYUG9zKHhQb3MpOwotICAgIHJldHVybiBm
b250LndpZHRoKHJ1biwgJmZhbGxiYWNrRm9udHMsICZnbHlwaE92ZXJmbG93KTsKLX0KLQotLy8g
QWRkaW5nIGEgcGFpciBvZiBtaWRwb2ludHMgYmVmb3JlIGEgY2hhcmFjdGVyIHdpbGwgc3BsaXQg
aXQgb3V0IGludG8gYSBuZXcgbGluZSBib3guCi1pbmxpbmUgdm9pZCBlbnN1cmVDaGFyYWN0ZXJH
ZXRzTGluZUJveChMaW5lTWlkcG9pbnRTdGF0ZSYgbGluZU1pZHBvaW50U3RhdGUsIElubGluZUl0
ZXJhdG9yJiB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yKQotewotICAgIElubGluZUl0ZXJhdG9yIG1p
ZHBvaW50KDAsIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3IucmVuZGVyZXIoKSwgdGV4dFBhcmFncmFw
aFNlcGFyYXRvci5vZmZzZXQoKSk7Ci0gICAgbGluZU1pZHBvaW50U3RhdGUuc3RhcnRJZ25vcmlu
Z1NwYWNlcyhJbmxpbmVJdGVyYXRvcigwLCB0ZXh0UGFyYWdyYXBoU2VwYXJhdG9yLnJlbmRlcmVy
KCksIHRleHRQYXJhZ3JhcGhTZXBhcmF0b3Iub2Zmc2V0KCkgLSAxKSk7Ci0gICAgbGluZU1pZHBv
aW50U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIHRleHRQYXJhZ3Jh
cGhTZXBhcmF0b3IucmVuZGVyZXIoKSwgdGV4dFBhcmFncmFwaFNlcGFyYXRvci5vZmZzZXQoKSkp
OwotfQotCi1pbmxpbmUgdm9pZCB0cnlIeXBoZW5hdGluZyhSZW5kZXJUZXh0JiB0ZXh0LCBjb25z
dCBGb250Q2FzY2FkZSYgZm9udCwgY29uc3QgQXRvbWljU3RyaW5nJiBsb2NhbGVJZGVudGlmaWVy
LCB1bnNpZ25lZCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lcywgaW50IGNvbnNlY3V0aXZlSHlw
aGVuYXRlZExpbmVzTGltaXQsIGludCBtaW5pbXVtUHJlZml4TGltaXQsIGludCBtaW5pbXVtU3Vm
Zml4TGltaXQsIHVuc2lnbmVkIGxhc3RTcGFjZSwgdW5zaWduZWQgcG9zLCBmbG9hdCB4UG9zLCBp
bnQgYXZhaWxhYmxlV2lkdGgsIGJvb2wgaXNGaXhlZFBpdGNoLCBib29sIGNvbGxhcHNlV2hpdGVT
cGFjZSwgaW50IGxhc3RTcGFjZVdvcmRTcGFjaW5nLCBJbmxpbmVJdGVyYXRvciYgbGluZUJyZWFr
LCBpbnQgbmV4dEJyZWFrYWJsZSwgYm9vbCYgaHlwaGVuYXRlZCkKLXsKLSAgICAvLyBNYXAgJ2h5
cGhlbmF0ZS1saW1pdC17YmVmb3JlLGFmdGVyfTogYXV0bzsnIHRvIDIuCi0gICAgdW5zaWduZWQg
bWluaW11bVByZWZpeExlbmd0aDsKLSAgICB1bnNpZ25lZCBtaW5pbXVtU3VmZml4TGVuZ3RoOwot
Ci0gICAgaWYgKG1pbmltdW1QcmVmaXhMaW1pdCA8IDApCi0gICAgICAgIG1pbmltdW1QcmVmaXhM
ZW5ndGggPSAyOwotICAgIGVsc2UKLSAgICAgICAgbWluaW11bVByZWZpeExlbmd0aCA9IHN0YXRp
Y19jYXN0PHVuc2lnbmVkPihtaW5pbXVtUHJlZml4TGltaXQpOwotCi0gICAgaWYgKG1pbmltdW1T
dWZmaXhMaW1pdCA8IDApCi0gICAgICAgIG1pbmltdW1TdWZmaXhMZW5ndGggPSAyOwotICAgIGVs
c2UKLSAgICAgICAgbWluaW11bVN1ZmZpeExlbmd0aCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPiht
aW5pbXVtU3VmZml4TGltaXQpOwotCi0gICAgaWYgKHBvcyAtIGxhc3RTcGFjZSA8PSBtaW5pbXVt
U3VmZml4TGVuZ3RoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoY29uc2VjdXRpdmVIeXBo
ZW5hdGVkTGluZXNMaW1pdCA+PSAwICYmIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzID49IHN0
YXRpY19jYXN0PHVuc2lnbmVkPihjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5lc0xpbWl0KSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgaW50IGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRo
KHRleHQsIGZvbnQpOwotCi0gICAgZmxvYXQgbWF4UHJlZml4V2lkdGggPSBhdmFpbGFibGVXaWR0
aCAtIHhQb3MgLSBoeXBoZW5XaWR0aCAtIGxhc3RTcGFjZVdvcmRTcGFjaW5nOwotICAgIC8vIElm
IHRoZSBtYXhpbXVtIHdpZHRoIGF2YWlsYWJsZSBmb3IgdGhlIHByZWZpeCBiZWZvcmUgdGhlIGh5
cGhlbiBpcyBzbWFsbCwgdGhlbiBpdCBpcyB2ZXJ5IHVubGlrZWx5Ci0gICAgLy8gdGhhdCBhbiBo
eXBoZW5hdGlvbiBvcHBvcnR1bml0eSBleGlzdHMsIHNvIGRvIG5vdCBib3RoZXIgdG8gbG9vayBm
b3IgaXQuCi0gICAgaWYgKG1heFByZWZpeFdpZHRoIDw9IGZvbnQucGl4ZWxTaXplKCkgKiA1IC8g
NCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gdGV4
dC5zdHlsZSgpOwotICAgIFRleHRSdW4gcnVuID0gUmVuZGVyQmxvY2s6OmNvbnN0cnVjdFRleHRS
dW4oJnRleHQsIGZvbnQsICZ0ZXh0LCBsYXN0U3BhY2UsIHBvcyAtIGxhc3RTcGFjZSwgc3R5bGUp
OwotICAgIHJ1bi5zZXRDaGFyYWN0ZXJzTGVuZ3RoKHRleHQudGV4dExlbmd0aCgpIC0gbGFzdFNw
YWNlKTsKLSAgICBBU1NFUlQocnVuLmNoYXJhY3RlcnNMZW5ndGgoKSA+PSBydW4ubGVuZ3RoKCkp
OwotCi0gICAgcnVuLnNldFRhYlNpemUoIWNvbGxhcHNlV2hpdGVTcGFjZSwgc3R5bGUudGFiU2l6
ZSgpKTsKLSAgICBydW4uc2V0WFBvcyh4UG9zICsgbGFzdFNwYWNlV29yZFNwYWNpbmcpOwotCi0g
ICAgdW5zaWduZWQgcHJlZml4TGVuZ3RoID0gZm9udC5vZmZzZXRGb3JQb3NpdGlvbihydW4sIG1h
eFByZWZpeFdpZHRoLCBmYWxzZSk7Ci0gICAgaWYgKHByZWZpeExlbmd0aCA8IG1pbmltdW1QcmVm
aXhMZW5ndGgpCi0gICAgICAgIHJldHVybjsKLQotICAgIHByZWZpeExlbmd0aCA9IGxhc3RIeXBo
ZW5Mb2NhdGlvbihTdHJpbmdWaWV3KHRleHQudGV4dCgpKS5zdWJzdHJpbmcobGFzdFNwYWNlLCBw
b3MgLSBsYXN0U3BhY2UpLCBzdGQ6Om1pbihwcmVmaXhMZW5ndGgsIHBvcyAtIGxhc3RTcGFjZSAt
IG1pbmltdW1TdWZmaXhMZW5ndGgpICsgMSwgbG9jYWxlSWRlbnRpZmllcik7Ci0gICAgaWYgKCFw
cmVmaXhMZW5ndGggfHwgcHJlZml4TGVuZ3RoIDwgbWluaW11bVByZWZpeExlbmd0aCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgLy8gV2hlbiBsYXN0U3BhY2UgaXMgYSBzcGFjZSwgd2hpY2ggaXQg
YWx3YXlzIGlzIGV4Y2VwdCBzb21ldGltZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgb3Ig
YWZ0ZXIgY29sbGFwc2VkCi0gICAgLy8gc3BhY2UsIGl0IHNob3VsZCBub3QgY291bnQgdG93YXJk
cyBoeXBoZW5hdGUtbGltaXQtYmVmb3JlLgotICAgIGlmIChwcmVmaXhMZW5ndGggPT0gbWluaW11
bVByZWZpeExlbmd0aCkgewotICAgICAgICBVQ2hhciBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9IHRl
eHQuY2hhcmFjdGVyQXQobGFzdFNwYWNlKTsKLSAgICAgICAgaWYgKGNoYXJhY3RlckF0TGFzdFNw
YWNlID09ICcgJyB8fCBjaGFyYWN0ZXJBdExhc3RTcGFjZSA9PSAnXG4nIHx8IGNoYXJhY3RlckF0
TGFzdFNwYWNlID09ICdcdCcgfHwgY2hhcmFjdGVyQXRMYXN0U3BhY2UgPT0gbm9CcmVha1NwYWNl
KQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFTU0VSVChwb3MgLSBsYXN0U3Bh
Y2UgLSBwcmVmaXhMZW5ndGggPj0gbWluaW11bVN1ZmZpeExlbmd0aCk7Ci0KLSNpZiAhQVNTRVJU
X0RJU0FCTEVECi0gICAgSGFzaFNldDxjb25zdCBGb250Kj4gZmFsbGJhY2tGb250czsKLSAgICBm
bG9hdCBwcmVmaXhXaWR0aCA9IGh5cGhlbldpZHRoICsgdGV4dFdpZHRoKHRleHQsIGxhc3RTcGFj
ZSwgcHJlZml4TGVuZ3RoLCBmb250LCB4UG9zLCBpc0ZpeGVkUGl0Y2gsIGNvbGxhcHNlV2hpdGVT
cGFjZSwgZmFsbGJhY2tGb250cykgKyBsYXN0U3BhY2VXb3JkU3BhY2luZzsKLSAgICBBU1NFUlQo
eFBvcyArIHByZWZpeFdpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsKLSNlbHNlCi0gICAgVU5VU0VE
X1BBUkFNKGlzRml4ZWRQaXRjaCk7Ci0jZW5kaWYKLQotICAgIGxpbmVCcmVhay5tb3ZlVG8oJnRl
eHQsIGxhc3RTcGFjZSArIHByZWZpeExlbmd0aCwgbmV4dEJyZWFrYWJsZSk7Ci0gICAgaHlwaGVu
YXRlZCA9IHRydWU7Ci19Ci0KLWlubGluZSBib29sIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlVGV4
dChXb3JkTWVhc3VyZW1lbnRzJiB3b3JkTWVhc3VyZW1lbnRzLCBib29sJiBoeXBoZW5hdGVkLCAg
dW5zaWduZWQmIGNvbnNlY3V0aXZlSHlwaGVuYXRlZExpbmVzKQotewotICAgIGlmICghbV9jdXJy
ZW50Lm9mZnNldCgpKQotICAgICAgICBtX2FwcGxpZWRTdGFydFdpZHRoID0gZmFsc2U7Ci0KLSAg
ICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0ID0gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fY3VycmVu
dC5yZW5kZXJlcigpKTsKLQotICAgIGJvb2wgaXNTVkdUZXh0ID0gcmVuZGVyVGV4dC5pc1NWR0lu
bGluZVRleHQoKTsKLQotICAgIC8vIElmIHdlIGhhdmUgbGVmdCBhIG5vLXdyYXAgaW5saW5lIGFu
ZCBlbnRlcmVkIGFuIGF1dG93cmFwIGlubGluZSB3aGlsZSBpZ25vcmluZyBzcGFjZXMKLSAgICAv
LyB0aGVuIHdlIG5lZWQgdG8gbWFyayB0aGUgc3RhcnQgb2YgdGhlIGF1dG93cmFwIGlubGluZSBh
cyBhIHBvdGVudGlhbCBsaW5lYnJlYWsgbm93LgotICAgIGlmIChtX2F1dG9XcmFwICYmICFSZW5k
ZXJTdHlsZTo6YXV0b1dyYXAobV9sYXN0V1MpICYmIG1faWdub3JpbmdTcGFjZXMpCi0gICAgICAg
IGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKHJlbmRlclRleHQpOwotCi0gICAgaWYgKHJl
bmRlclRleHQuc3R5bGUoKS5oYXNUZXh0Q29tYmluZSgpICYmIGlzPFJlbmRlckNvbWJpbmVUZXh0
PigqbV9jdXJyZW50LnJlbmRlcmVyKCkpICYmICFkb3duY2FzdDxSZW5kZXJDb21iaW5lVGV4dD4o
Km1fY3VycmVudC5yZW5kZXJlcigpKS5pc0NvbWJpbmVkKCkpIHsKLSAgICAgICAgYXV0byYgY29t
YmluZVJlbmRlcmVyID0gZG93bmNhc3Q8UmVuZGVyQ29tYmluZVRleHQ+KCptX2N1cnJlbnQucmVu
ZGVyZXIoKSk7Ci0gICAgICAgIGNvbWJpbmVSZW5kZXJlci5jb21iaW5lVGV4dCgpOwotICAgICAg
ICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSByZW5kZXJlcidzIHRleHQgbWF5IGhhdmUgY2hhbmdlZC4g
SW5jcmVtZW50IHN0YWxlIGl0ZXJhdG9yIHBvc2l0aW9ucwotICAgICAgICBpZiAoaXRlcmF0b3JJ
c0JleW9uZEVuZE9mUmVuZGVyQ29tYmluZVRleHQobV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQo
KSwgY29tYmluZVJlbmRlcmVyKSkgewotICAgICAgICAgICAgQVNTRVJUKGl0ZXJhdG9ySXNCZXlv
bmRFbmRPZlJlbmRlckNvbWJpbmVUZXh0KG1fcmVzb2x2ZXIucG9zaXRpb24oKSwgY29tYmluZVJl
bmRlcmVyKSk7Ci0gICAgICAgICAgICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7Ci0g
ICAgICAgICAgICBtX3Jlc29sdmVyLmluY3JlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0g
ICAgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0eWxlKHJlbmRlclRleHQsIG1fbGlu
ZUluZm8pOwotICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUo
KTsKLSAgICBib29sIGlzRml4ZWRQaXRjaCA9IGZvbnQuaXNGaXhlZFBpdGNoKCk7Ci0gICAgYm9v
bCBjYW5IeXBoZW5hdGUgPSBzdHlsZS5oeXBoZW5zKCkgPT0gSHlwaGVuc0F1dG8gJiYgV2ViQ29y
ZTo6Y2FuSHlwaGVuYXRlKHN0eWxlLmxvY2FsZSgpKTsKLQotICAgIHVuc2lnbmVkIGxhc3RTcGFj
ZSA9IG1fY3VycmVudC5vZmZzZXQoKTsKLSAgICBmbG9hdCB3b3JkU3BhY2luZyA9IG1fY3VycmVu
dFN0eWxlLT5mb250Q2FzY2FkZSgpLndvcmRTcGFjaW5nKCk7Ci0gICAgZmxvYXQgbGFzdFNwYWNl
V29yZFNwYWNpbmcgPSAwOwotICAgIGZsb2F0IHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50
ID0gMDsKLQotICAgIGZsb2F0IHdyYXBXID0gbV93aWR0aC51bmNvbW1pdHRlZFdpZHRoKCkgKyBp
bmxpbmVMb2dpY2FsV2lkdGgobV9jdXJyZW50LnJlbmRlcmVyKCksICFtX2FwcGxpZWRTdGFydFdp
ZHRoLCB0cnVlKTsKLSAgICBmbG9hdCBjaGFyV2lkdGggPSAwOwotICAgIGJvb2wgYnJlYWtOQlNQ
ID0gbV9hdXRvV3JhcCAmJiBtX2N1cnJlbnRTdHlsZS0+bmJzcE1vZGUoKSA9PSBTUEFDRTsKLSAg
ICAvLyBBdXRvLXdyYXBwaW5nIHRleHQgc2hvdWxkIHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdv
cmQgb25seSBpZiBpdCBjb3VsZCBub3Qgd3JhcCBiZWZvcmUgdGhlIHdvcmQsCi0gICAgLy8gd2hp
Y2ggaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgd29yZCBpcyB0aGUgZmlyc3QgdGhpbmcgb24gdGhl
IGxpbmUsIHRoYXQgaXMsIGlmIHx3fCBpcyB6ZXJvLgotICAgIGJvb2wgYnJlYWtXb3JkcyA9IG1f
Y3VycmVudFN0eWxlLT5icmVha1dvcmRzKCkgJiYgKChtX2F1dG9XcmFwICYmICFtX3dpZHRoLmNv
bW1pdHRlZFdpZHRoKCkpIHx8IG1fY3VycldTID09IFBSRSk7Ci0gICAgYm9vbCBtaWRXb3JkQnJl
YWsgPSBmYWxzZTsKLSAgICBib29sIGJyZWFrQWxsID0gbV9jdXJyZW50U3R5bGUtPndvcmRCcmVh
aygpID09IEJyZWFrQWxsV29yZEJyZWFrICYmIG1fYXV0b1dyYXA7Ci0gICAgZmxvYXQgaHlwaGVu
V2lkdGggPSAwOwotICAgIGJvb2wgaXNMb29zZUNKS01vZGUgPSBmYWxzZTsKLQotICAgIGlmIChp
c1NWR1RleHQpIHsKLSAgICAgICAgYnJlYWtXb3JkcyA9IGZhbHNlOwotICAgICAgICBicmVha0Fs
bCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtX3JlbmRlclRleHRJbmZvLm1fdGV4dCAhPSAm
cmVuZGVyVGV4dCkgewotICAgICAgICB1cGRhdGVDb3VudGVySWZOZWVkZWQocmVuZGVyVGV4dCk7
Ci0gICAgICAgIG1fcmVuZGVyVGV4dEluZm8ubV90ZXh0ID0gJnJlbmRlclRleHQ7Ci0gICAgICAg
IG1fcmVuZGVyVGV4dEluZm8ubV9mb250ID0gJmZvbnQ7Ci0gICAgICAgIG1fcmVuZGVyVGV4dElu
Zm8ubV9sYXlvdXQgPSBmb250LmNyZWF0ZUxheW91dCgmcmVuZGVyVGV4dCwgbV93aWR0aC5jdXJy
ZW50V2lkdGgoKSwgbV9jb2xsYXBzZVdoaXRlU3BhY2UpOwotICAgICAgICBtX3JlbmRlclRleHRJ
bmZvLm1fbGluZUJyZWFrSXRlcmF0b3IucmVzZXRTdHJpbmdBbmRSZWxlYXNlSXRlcmF0b3IocmVu
ZGVyVGV4dC50ZXh0KCksIHN0eWxlLmxvY2FsZSgpLCBtYXBMaW5lQnJlYWtUb0l0ZXJhdG9yTW9k
ZShtX2Jsb2NrU3R5bGUubGluZUJyZWFrKCkpKTsKLSAgICAgICAgaXNMb29zZUNKS01vZGUgPSBt
X3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IuaXNMb29zZUNKS01vZGUoKTsKLSAg
ICB9IGVsc2UgaWYgKG1fcmVuZGVyVGV4dEluZm8ubV9sYXlvdXQgJiYgbV9yZW5kZXJUZXh0SW5m
by5tX2ZvbnQgIT0gJmZvbnQpIHsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2ZvbnQgPSAm
Zm9udDsKLSAgICAgICAgbV9yZW5kZXJUZXh0SW5mby5tX2xheW91dCA9IGZvbnQuY3JlYXRlTGF5
b3V0KCZyZW5kZXJUZXh0LCBtX3dpZHRoLmN1cnJlbnRXaWR0aCgpLCBtX2NvbGxhcHNlV2hpdGVT
cGFjZSk7Ci0gICAgfQotCi0gICAgVGV4dExheW91dCogdGV4dExheW91dCA9IG1fcmVuZGVyVGV4
dEluZm8ubV9sYXlvdXQuZ2V0KCk7Ci0KLSAgICAvLyBOb24temVybyBvbmx5IHdoZW4ga2Vybmlu
ZyBpcyBlbmFibGVkIGFuZCBUZXh0TGF5b3V0IGlzbid0IHVzZWQsIGluIHdoaWNoIGNhc2Ugd2Ug
bWVhc3VyZQotICAgIC8vIHdvcmRzIHdpdGggdGhlaXIgdHJhaWxpbmcgc3BhY2UsIHRoZW4gc3Vi
dHJhY3QgaXRzIHdpZHRoLgotICAgIEhhc2hTZXQ8Y29uc3QgRm9udCo+IGZhbGxiYWNrRm9udHM7
Ci0gICAgZmxvYXQgd29yZFRyYWlsaW5nU3BhY2VXaWR0aCA9IChmb250LnR5cGVzZXR0aW5nRmVh
dHVyZXMoKSAmIEtlcm5pbmcpICYmICF0ZXh0TGF5b3V0ID8gZm9udC53aWR0aChSZW5kZXJCbG9j
azo6Y29uc3RydWN0VGV4dFJ1bigmcmVuZGVyVGV4dCwgZm9udCwgJnNwYWNlLCAxLCBzdHlsZSks
ICZmYWxsYmFja0ZvbnRzKSArIHdvcmRTcGFjaW5nIDogMDsKLQotICAgIFVDaGFyIGxhc3RDaGFy
YWN0ZXIgPSBtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0b3IubGFzdENoYXJhY3Rl
cigpOwotICAgIFVDaGFyIHNlY29uZFRvTGFzdENoYXJhY3RlciA9IG1fcmVuZGVyVGV4dEluZm8u
bV9saW5lQnJlYWtJdGVyYXRvci5zZWNvbmRUb0xhc3RDaGFyYWN0ZXIoKTsKLSAgICBmb3IgKDsg
bV9jdXJyZW50Lm9mZnNldCgpIDwgcmVuZGVyVGV4dC50ZXh0TGVuZ3RoKCk7IG1fY3VycmVudC5m
YXN0SW5jcmVtZW50SW5UZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGJvb2wgcHJldmlvdXNDaGFyYWN0
ZXJJc1NwYWNlID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZTsKLSAgICAgICAgYm9vbCBwcmV2
aW91c0NoYXJhY3RlcklzV1MgPSBtX2N1cnJlbnRDaGFyYWN0ZXJJc1dTOwotICAgICAgICBVQ2hh
ciBjID0gbV9jdXJyZW50LmN1cnJlbnQoKTsKLSAgICAgICAgbV9jdXJyZW50Q2hhcmFjdGVySXNT
cGFjZSA9IGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCAoIW1fcHJlc2VydmVzTmV3bGluZSAmJiAo
YyA9PSAnXG4nKSk7Ci0KLSAgICAgICAgaWYgKCFtX2NvbGxhcHNlV2hpdGVTcGFjZSB8fCAhbV9j
dXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgICAgIG1fbGluZUluZm8uc2V0RW1wdHko
ZmFsc2UsICZtX2Jsb2NrLCAmbV93aWR0aCk7Ci0KLSAgICAgICAgaWYgKGMgPT0gc29mdEh5cGhl
biAmJiBtX2F1dG9XcmFwICYmICFoeXBoZW5XaWR0aCAmJiBzdHlsZS5oeXBoZW5zKCkgIT0gSHlw
aGVuc05vbmUpIHsKLSAgICAgICAgICAgIGh5cGhlbldpZHRoID0gbWVhc3VyZUh5cGhlbldpZHRo
KHJlbmRlclRleHQsIGZvbnQsICZmYWxsYmFja0ZvbnRzKTsKLSAgICAgICAgICAgIG1fd2lkdGgu
YWRkVW5jb21taXR0ZWRXaWR0aChoeXBoZW5XaWR0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBi
b29sIGFwcGx5V29yZFNwYWNpbmcgPSBmYWxzZTsKLQotICAgICAgICBtX2N1cnJlbnRDaGFyYWN0
ZXJJc1dTID0gbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAoYnJlYWtOQlNQICYmIGMgPT0g
bm9CcmVha1NwYWNlKTsKLQotICAgICAgICBpZiAoKGJyZWFrQWxsIHx8IGJyZWFrV29yZHMpICYm
ICFtaWRXb3JkQnJlYWsgJiYgKCFtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlIHx8IHN0eWxlLndo
aXRlU3BhY2UoKSAhPSBQUkVfV1JBUCkpIHsKLSAgICAgICAgICAgIHdyYXBXICs9IGNoYXJXaWR0
aDsKLSAgICAgICAgICAgIGJvb2wgbWlkV29yZEJyZWFrSXNCZWZvcmVTdXJyb2dhdGVQYWlyID0g
VTE2X0lTX0xFQUQoYykgJiYgbV9jdXJyZW50Lm9mZnNldCgpICsgMSA8IHJlbmRlclRleHQudGV4
dExlbmd0aCgpICYmIFUxNl9JU19UUkFJTChyZW5kZXJUZXh0W21fY3VycmVudC5vZmZzZXQoKSAr
IDFdKTsKLSAgICAgICAgICAgIGNoYXJXaWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBtX2N1
cnJlbnQub2Zmc2V0KCksIG1pZFdvcmRCcmVha0lzQmVmb3JlU3Vycm9nYXRlUGFpciA/IDIgOiAx
LCBmb250LCBtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVywgaXNGaXhlZFBpdGNoLCBt
X2NvbGxhcHNlV2hpdGVTcGFjZSwgZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7Ci0gICAgICAg
ICAgICBtaWRXb3JkQnJlYWsgPSBtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgKyB3cmFwVyArIGNo
YXJXaWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IGludCBuZXh0QnJlYWthYmxlUG9zaXRpb24gPSBtX2N1cnJlbnQubmV4dEJyZWFrYWJsZVBvc2l0
aW9uKCk7Ci0gICAgICAgIGJvb2wgYmV0d2VlbldvcmRzID0gYyA9PSAnXG4nIHx8IChtX2N1cnJX
UyAhPSBQUkUgJiYgIW1fYXRTdGFydCAmJiBpc0JyZWFrYWJsZShtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IsIG1fY3VycmVudC5vZmZzZXQoKSwgbmV4dEJyZWFrYWJsZVBvc2l0
aW9uLCBicmVha05CU1AsIGlzTG9vc2VDSktNb2RlKQotICAgICAgICAgICAgJiYgKHN0eWxlLmh5
cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSB8fCAobV9jdXJyZW50LnByZXZpb3VzSW5TYW1lTm9kZSgp
ICE9IHNvZnRIeXBoZW4pKSk7Ci0gICAgICAgIG1fY3VycmVudC5zZXROZXh0QnJlYWthYmxlUG9z
aXRpb24obmV4dEJyZWFrYWJsZVBvc2l0aW9uKTsKLQotICAgICAgICBpZiAoYmV0d2VlbldvcmRz
IHx8IG1pZFdvcmRCcmVhaykgewotICAgICAgICAgICAgYm9vbCBzdG9wcGVkSWdub3JpbmdTcGFj
ZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzKSB7Ci0gICAgICAg
ICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSAwOwotICAgICAgICAgICAgICAgIGlmICgh
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdG9w
IGlnbm9yaW5nIHNwYWNlcyBhbmQgYmVnaW4gYXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAv
LyBuZXcgcG9pbnQuCi0gICAgICAgICAgICAgICAgICAgIG1faWdub3JpbmdTcGFjZXMgPSBmYWxz
ZTsKLSAgICAgICAgICAgICAgICAgICAgd29yZFNwYWNpbmdGb3JXb3JkTWVhc3VyZW1lbnQgPSAw
OwotICAgICAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQub2Zmc2V0KCk7IC8v
IGUuZy4sICJGb28gICAgZ29vIiwgZG9uJ3QgYWRkIGluIGFueSBvZiB0aGUgaWdub3JlZCBzcGFj
ZXMuCi0gICAgICAgICAgICAgICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5n
U3BhY2VzKElubGluZUl0ZXJhdG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQu
b2Zmc2V0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcHBlZElnbm9yaW5nU3BhY2VzID0g
dHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBK
dXN0IGtlZXAgaWdub3JpbmcgdGhlc2Ugc3BhY2VzLgotICAgICAgICAgICAgICAgICAgICBuZXh0
Q2hhcmFjdGVyKGMsIGxhc3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7Ci0gICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgd29yZE1lYXN1cmVtZW50cy5ncm93KHdvcmRNZWFzdXJlbWVudHMu
c2l6ZSgpICsgMSk7Ci0gICAgICAgICAgICBXb3JkTWVhc3VyZW1lbnQmIHdvcmRNZWFzdXJlbWVu
dCA9IHdvcmRNZWFzdXJlbWVudHMubGFzdCgpOwotCi0gICAgICAgICAgICB3b3JkTWVhc3VyZW1l
bnQucmVuZGVyZXIgPSAmcmVuZGVyVGV4dDsKLSAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5l
bmRPZmZzZXQgPSBtX2N1cnJlbnQub2Zmc2V0KCk7Ci0gICAgICAgICAgICB3b3JkTWVhc3VyZW1l
bnQuc3RhcnRPZmZzZXQgPSBsYXN0U3BhY2U7Ci0KLSAgICAgICAgICAgIGZsb2F0IGFkZGl0aW9u
YWxUZW1wV2lkdGg7Ci0gICAgICAgICAgICBpZiAod29yZFRyYWlsaW5nU3BhY2VXaWR0aCAmJiBj
ID09ICcgJykKLSAgICAgICAgICAgICAgICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRo
KHJlbmRlclRleHQsIGxhc3RTcGFjZSwgbV9jdXJyZW50Lm9mZnNldCgpICsgMSAtIGxhc3RTcGFj
ZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNl
V2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMsIHRleHRMYXlvdXQpIC0g
d29yZFRyYWlsaW5nU3BhY2VXaWR0aDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICBhZGRpdGlvbmFsVGVtcFdpZHRoID0gdGV4dFdpZHRoKHJlbmRlclRleHQsIGxhc3RTcGFjZSwg
bV9jdXJyZW50Lm9mZnNldCgpIC0gbGFzdFNwYWNlLCBmb250LCBtX3dpZHRoLmN1cnJlbnRXaWR0
aCgpLCBpc0ZpeGVkUGl0Y2gsIG1fY29sbGFwc2VXaGl0ZVNwYWNlLCB3b3JkTWVhc3VyZW1lbnQu
ZmFsbGJhY2tGb250cywgdGV4dExheW91dCk7Ci0KLSAgICAgICAgICAgIGlmICh3b3JkTWVhc3Vy
ZW1lbnQuZmFsbGJhY2tGb250cy5pc0VtcHR5KCkgJiYgIWZhbGxiYWNrRm9udHMuaXNFbXB0eSgp
KQotICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5mYWxsYmFja0ZvbnRzLnN3YXAoZmFs
bGJhY2tGb250cyk7Ci0gICAgICAgICAgICBmYWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0KLSAgICAg
ICAgICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IGFkZGl0aW9uYWxUZW1wV2lkdGggKyB3b3Jk
U3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudDsKLSAgICAgICAgICAgIGFkZGl0aW9uYWxUZW1wV2lk
dGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0gICAgICAgICAgICBtX3dpZHRoLmFkZFVuY29t
bWl0dGVkV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7Ci0KLSAgICAgICAgICAgIGlmIChtX2Nv
bGxhcHNlV2hpdGVTcGFjZSAmJiBwcmV2aW91c0NoYXJhY3RlcklzU3BhY2UgJiYgbV9jdXJyZW50
Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRoKQotICAgICAgICAgICAgICAg
IG1fd2lkdGguc2V0VHJhaWxpbmdXaGl0ZXNwYWNlV2lkdGgoYWRkaXRpb25hbFRlbXBXaWR0aCk7
Ci0KLSAgICAgICAgICAgIGlmICghbV9hcHBsaWVkU3RhcnRXaWR0aCkgewotICAgICAgICAgICAg
ICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChpbmxpbmVMb2dpY2FsV2lkdGgobV9jdXJy
ZW50LnJlbmRlcmVyKCksIHRydWUsIGZhbHNlKSk7Ci0gICAgICAgICAgICAgICAgbV9hcHBsaWVk
U3RhcnRXaWR0aCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFwcGx5V29y
ZFNwYWNpbmcgPSB3b3JkU3BhY2luZyAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlOwotCi0g
ICAgICAgICAgICBpZiAoIW1fd2lkdGguY29tbWl0dGVkV2lkdGgoKSAmJiBtX2F1dG9XcmFwICYm
ICFtX3dpZHRoLmZpdHNPbkxpbmUoKSkKLSAgICAgICAgICAgICAgICBtX3dpZHRoLmZpdEJlbG93
RmxvYXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7Ci0KLSAgICAgICAgICAgIGlmIChtX2F1
dG9XcmFwIHx8IGJyZWFrV29yZHMpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBicmVhayBv
bmx5IGFmdGVyIHdoaXRlLXNwYWNlLCBjb25zaWRlciB0aGUgY3VycmVudCBjaGFyYWN0ZXIKLSAg
ICAgICAgICAgICAgICAvLyBhcyBjYW5kaWRhdGUgd2lkdGggZm9yIHRoaXMgbGluZS4KLSAgICAg
ICAgICAgICAgICBib29sIGxpbmVXYXNUb29XaWRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAg
aWYgKG1fd2lkdGguZml0c09uTGluZSgpICYmIG1fY3VycmVudENoYXJhY3RlcklzV1MgJiYgbV9j
dXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hpdGVTcGFjZSgpICYmICFtaWRXb3JkQnJlYWsp
IHsKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgY2hhcldpZHRoID0gdGV4dFdpZHRoKHJlbmRl
clRleHQsIG1fY3VycmVudC5vZmZzZXQoKSwgMSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZh
bGxiYWNrRm9udHMsIHRleHRMYXlvdXQpICsgKGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2lu
ZyA6IDApOwotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBsaW5lIGlzIHRvbyBiaWcg
ZXZlbiB3aXRob3V0IHRoZSBleHRyYSBzcGFjZQotICAgICAgICAgICAgICAgICAgICAvLyBhdCB0
aGUgZW5kIG9mIHRoZSBsaW5lLiBJZiBpdCBpcyBub3QsIGRvIG5vdGhpbmcuCi0gICAgICAgICAg
ICAgICAgICAgIC8vIElmIHRoZSBsaW5lIG5lZWRzIHRoZSBleHRyYSB3aGl0ZXNwYWNlIHRvIGJl
IHRvbyBsb25nLAotICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIG1vdmUgdGhlIGxpbmUgYnJl
YWsgdG8gdGhlIHNwYWNlIGFuZCBza2lwIGFsbAotICAgICAgICAgICAgICAgICAgICAvLyBhZGRp
dGlvbmFsIHdoaXRlc3BhY2UuCi0gICAgICAgICAgICAgICAgICAgIGlmICghbV93aWR0aC5maXRz
T25MaW5lSW5jbHVkaW5nRXh0cmFXaWR0aChjaGFyV2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBsaW5lV2FzVG9vV2lkZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBt
X2xpbmVCcmVha0hpc3RvcnkucHVzaChbJl0oSW5saW5lSXRlcmF0b3ImIG1vZGlmeU1lKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZ5TWUubW92ZVRvKG1fY3VycmVudC5yZW5k
ZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRp
b24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9saW5lQnJlYWtlci5za2lwVHJh
aWxpbmdXaGl0ZXNwYWNlKG1vZGlmeU1lLCBtX2xpbmVJbmZvKTsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAg
ICAgICAgICAgICAgIGlmIChsaW5lV2FzVG9vV2lkZSB8fCAhbV93aWR0aC5maXRzT25MaW5lKCkp
IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhbkh5cGhlbmF0ZSAmJiAhbV93aWR0aC5maXRz
T25MaW5lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5w
dXNoKFsmXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB0cnlIeXBoZW5hdGluZyhyZW5kZXJUZXh0LCBmb250LCBzdHlsZS5sb2NhbGUoKSwg
Y29uc2VjdXRpdmVIeXBoZW5hdGVkTGluZXMsIG1fYmxvY2tTdHlsZS5oeXBoZW5hdGlvbkxpbWl0
TGluZXMoKSwgc3R5bGUuaHlwaGVuYXRpb25MaW1pdEJlZm9yZSgpLCBzdHlsZS5oeXBoZW5hdGlv
bkxpbWl0QWZ0ZXIoKSwgbGFzdFNwYWNlLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fd2lkdGguY3Vy
cmVudFdpZHRoKCkgLSBhZGRpdGlvbmFsVGVtcFdpZHRoLCBtX3dpZHRoLmF2YWlsYWJsZVdpZHRo
KCksIGlzRml4ZWRQaXRjaCwgbV9jb2xsYXBzZVdoaXRlU3BhY2UsIGxhc3RTcGFjZVdvcmRTcGFj
aW5nLCBtb2RpZnlNZSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigpLCBtX2xpbmVC
cmVha2VyLm1faHlwaGVuYXRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAg
ICAgICAgICAgICAgICAgICAgIGlmIChtX2xpbmVCcmVha2VyLm1faHlwaGVuYXRlZCkgewotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fYXRFbmQgPSB0cnVlOwotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtI
aXN0b3J5LmF0VGV4dFBhcmFncmFwaFNlcGFyYXRvcigpKSB7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoIXN0b3BwZWRJZ25vcmluZ1NwYWNlcyAmJiBtX2N1cnJlbnQub2Zmc2V0KCkgPiAw
KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZUNoYXJhY3RlckdldHNMaW5lQm94
KG1fbGluZU1pZHBvaW50U3RhdGUsIG1fY3VycmVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xlYW5seSh0cnVlKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHdvcmRNZWFzdXJlbWVudC5lbmRPZmZzZXQgPSBtX2xpbmVCcmVha0hp
c3Rvcnkub2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAg
ICAgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAmJiBkb3duY2FzdDxSZW5kZXJUZXh0
PihtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyVGV4dD4o
Km1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS50ZXh0TGVuZ3RoKCkgJiYgZG93bmNhc3Q8
UmVuZGVyVGV4dD4oKm1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKS5jaGFyYWN0ZXJBdCht
X2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkgLSAxKSA9PSBzb2Z0SHlwaGVuICYmIHN0eWxlLmh5
cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGh5cGhlbmF0
ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5Lm9m
ZnNldCgpICYmIG1fbGluZUJyZWFrSGlzdG9yeS5vZmZzZXQoKSAhPSAodW5zaWduZWQpd29yZE1l
YXN1cmVtZW50LmVuZE9mZnNldCAmJiAhd29yZE1lYXN1cmVtZW50LndpZHRoKSB7Ci0gICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoY2hhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd29yZE1lYXN1cmVtZW50LmVuZE9mZnNldCA9IG1fbGluZUJyZWFrSGlzdG9yeS5vZmZz
ZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkTWVhc3VyZW1lbnQud2lkdGgg
PSBjaGFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRGlkbid0IGZpdC4gSnVtcCB0byB0aGUgZW5k
IHVubGVzcyB0aGVyZSdzIHN0aWxsIGFuIG9wcG9ydHVuaXR5IHRvIGNvbGxhcHNlIHdoaXRlc3Bh
Y2UuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtX2lnbm9yaW5nU3BhY2VzIHx8ICFtX2NvbGxh
cHNlV2hpdGVTcGFjZSB8fCAhbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSB8fCAhcHJldmlvdXND
aGFyYWN0ZXJJc1NwYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX2F0RW5kID0gdHJ1
ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAg
ICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlm
ICghYmV0d2VlbldvcmRzIHx8IChtaWRXb3JkQnJlYWsgJiYgIW1fYXV0b1dyYXApKQotICAgICAg
ICAgICAgICAgICAgICAgICAgbV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1hZGRpdGlvbmFs
VGVtcFdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGh5cGhlbldpZHRoKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgd2lkdGggb2YgdGhlIHNvZnQgaHlw
aGVuIG91dCBzaW5jZSB3ZSBmaXQgb24gYSBsaW5lLgotICAgICAgICAgICAgICAgICAgICAgICAg
bV93aWR0aC5hZGRVbmNvbW1pdHRlZFdpZHRoKC1oeXBoZW5XaWR0aCk7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBoeXBoZW5XaWR0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjID09ICdcbicg
JiYgbV9wcmVzZXJ2ZXNOZXdsaW5lKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdG9wcGVkSWdu
b3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50Lm9mZnNldCgpKQotICAgICAgICAgICAgICAgICAgICBl
bnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRwb2ludFN0YXRlLCBtX2N1cnJlbnQp
OwotICAgICAgICAgICAgICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKCptX2N1cnJl
bnQucmVuZGVyZXIoKSwgbV9jdXJyZW50Lm9mZnNldCgpLCBtX2N1cnJlbnQubmV4dEJyZWFrYWJs
ZVBvc2l0aW9uKCkpOwotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5pbmNyZW1l
bnQoKTsKLSAgICAgICAgICAgICAgICBtX2xpbmVJbmZvLnNldFByZXZpb3VzTGluZUJyb2tlQ2xl
YW5seSh0cnVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgYmV0d2VlbldvcmRzKSB7Ci0gICAgICAg
ICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fY3VycmVudC5yZW5kZXJl
cigpLCBtX2N1cnJlbnQub2Zmc2V0KCksIG1fY3VycmVudC5uZXh0QnJlYWthYmxlUG9zaXRpb24o
KSk7Ci0gICAgICAgICAgICAgICAgd3JhcFcgPSAwOwotICAgICAgICAgICAgICAgIC8vIEF1dG8t
d3JhcHBpbmcgdGV4dCBzaG91bGQgbm90IHdyYXAgaW4gdGhlIG1pZGRsZSBvZiBhIHdvcmQgb25j
ZSBpdCBoYXMgaGFkIGFuCi0gICAgICAgICAgICAgICAgLy8gb3Bwb3J0dW5pdHkgdG8gYnJlYWsg
YWZ0ZXIgYSB3b3JkLgotICAgICAgICAgICAgICAgIGJyZWFrV29yZHMgPSBmYWxzZTsKLSAgICAg
ICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1pZFdvcmRCcmVhayAmJiAhVTE2X0lTX1RSQUlM
KGMpICYmICEoVV9HRVRfR0NfTUFTSyhjKSAmIFVfR0NfTV9NQVNLKSkgewotICAgICAgICAgICAg
ICAgIC8vIFJlbWVtYmVyIHRoaXMgYXMgYSBicmVha2FibGUgcG9zaXRpb24gaW4gY2FzZQotICAg
ICAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgZW5kIHdpZHRoIGZvcmNlcyBhIGJyZWFrLgotICAg
ICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5tb3ZlVG8obV9jdXJyZW50LnJlbmRlcmVy
KCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVha2FibGVQb3NpdGlvbigp
KTsKLSAgICAgICAgICAgICAgICBtaWRXb3JkQnJlYWsgJj0gKGJyZWFrV29yZHMgfHwgYnJlYWtB
bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYmV0d2VlbldvcmRzKSB7Ci0g
ICAgICAgICAgICAgICAgbGFzdFNwYWNlV29yZFNwYWNpbmcgPSBhcHBseVdvcmRTcGFjaW5nID8g
d29yZFNwYWNpbmcgOiAwOwotICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1
cmVtZW50ID0gKGFwcGx5V29yZFNwYWNpbmcgJiYgd29yZE1lYXN1cmVtZW50LndpZHRoKSA/IHdv
cmRTcGFjaW5nIDogMDsKLSAgICAgICAgICAgICAgICBsYXN0U3BhY2UgPSBtX2N1cnJlbnQub2Zm
c2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghbV9pZ25vcmluZ1NwYWNl
cyAmJiBtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkpIHsKLSAgICAgICAgICAg
ICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBuZXdsaW5lLCBvciBpZiB3ZSBlbmNvdW50ZXIgYQot
ICAgICAgICAgICAgICAgIC8vIHNlY29uZCBzcGFjZSwgd2UgbmVlZCB0byBnbyBhaGVhZCBhbmQg
YnJlYWsgdXAgdGhpcwotICAgICAgICAgICAgICAgIC8vIHJ1biBhbmQgZW50ZXIgYSBtb2RlIHdo
ZXJlIHdlIHN0YXJ0IGNvbGxhcHNpbmcgc3BhY2VzLgotICAgICAgICAgICAgICAgIGlmIChtX2N1
cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmIHByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAg
ICAgICAgICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gdHJ1ZTsKLQotICAgICAgICAgICAg
ICAgICAgICAvLyBXZSBqdXN0IGVudGVyZWQgYSBtb2RlIHdoZXJlIHdlIGFyZSBpZ25vcmluZwot
ICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZXMuIENyZWF0ZSBhIG1pZHBvaW50IHRvIHRlcm1p
bmF0ZSB0aGUgcnVuCi0gICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIHNw
YWNlLgotICAgICAgICAgICAgICAgICAgICBtX2xpbmVNaWRwb2ludFN0YXRlLnN0YXJ0SWdub3Jp
bmdTcGFjZXMobV9zdGFydE9mSWdub3JlZFNwYWNlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1f
dHJhaWxpbmdPYmplY3RzLnVwZGF0ZU1pZHBvaW50c0ZvclRyYWlsaW5nQm94ZXMobV9saW5lTWlk
cG9pbnRTdGF0ZSwgSW5saW5lSXRlcmF0b3IoKSwgVHJhaWxpbmdPYmplY3RzOjpEb05vdENvbGxh
cHNlRmlyc3RTcGFjZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgaWYgKG1faWdub3JpbmdTcGFjZXMpIHsKLSAgICAgICAgICAgIC8vIFN0b3AgaWdu
b3Jpbmcgc3BhY2VzIGFuZCBiZWdpbiBhdCB0aGlzCi0gICAgICAgICAgICAvLyBuZXcgcG9pbnQu
Ci0gICAgICAgICAgICBtX2lnbm9yaW5nU3BhY2VzID0gZmFsc2U7Ci0gICAgICAgICAgICBsYXN0
U3BhY2VXb3JkU3BhY2luZyA9IGFwcGx5V29yZFNwYWNpbmcgPyB3b3JkU3BhY2luZyA6IDA7Ci0g
ICAgICAgICAgICB3b3JkU3BhY2luZ0ZvcldvcmRNZWFzdXJlbWVudCA9IChhcHBseVdvcmRTcGFj
aW5nICYmIHdvcmRNZWFzdXJlbWVudHMubGFzdCgpLndpZHRoKSA/IHdvcmRTcGFjaW5nIDogMDsK
LSAgICAgICAgICAgIGxhc3RTcGFjZSA9IG1fY3VycmVudC5vZmZzZXQoKTsgLy8gZS5nLiwgIkZv
byAgICBnb28iLCBkb24ndCBhZGQgaW4gYW55IG9mIHRoZSBpZ25vcmVkIHNwYWNlcy4KLSAgICAg
ICAgICAgIG1fbGluZU1pZHBvaW50U3RhdGUuc3RvcElnbm9yaW5nU3BhY2VzKElubGluZUl0ZXJh
dG9yKDAsIG1fY3VycmVudC5yZW5kZXJlcigpLCBtX2N1cnJlbnQub2Zmc2V0KCkpKTsKLSAgICAg
ICAgfQotCi0gICAgICAgIGlmIChpc1NWR1RleHQgJiYgbV9jdXJyZW50Lm9mZnNldCgpKSB7Ci0g
ICAgICAgICAgICAvLyBGb3JjZSBjcmVhdGlvbiBvZiBuZXcgSW5saW5lQm94ZXMgZm9yIGVhY2gg
YWJzb2x1dGUgcG9zaXRpb25lZCBjaGFyYWN0ZXIgKHRob3NlIHRoYXQgc3RhcnQgbmV3IHRleHQg
Y2h1bmtzKS4KLSAgICAgICAgICAgIGlmIChkb3duY2FzdDxSZW5kZXJTVkdJbmxpbmVUZXh0Pihy
ZW5kZXJUZXh0KS5jaGFyYWN0ZXJTdGFydHNOZXdUZXh0Q2h1bmsobV9jdXJyZW50Lm9mZnNldCgp
KSkKLSAgICAgICAgICAgICAgICBlbnN1cmVDaGFyYWN0ZXJHZXRzTGluZUJveChtX2xpbmVNaWRw
b2ludFN0YXRlLCBtX2N1cnJlbnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1fY3VycmVu
dENoYXJhY3RlcklzU3BhY2UgJiYgIXByZXZpb3VzQ2hhcmFjdGVySXNTcGFjZSkgewotICAgICAg
ICAgICAgbV9zdGFydE9mSWdub3JlZFNwYWNlcy5zZXRSZW5kZXJlcihtX2N1cnJlbnQucmVuZGVy
ZXIoKSk7Ci0gICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldE9mZnNldChtX2N1
cnJlbnQub2Zmc2V0KCkpOwotICAgICAgICAgICAgLy8gU3BhY2VzIGFmdGVyIHJpZ2h0LWFsaWdu
ZWQgdGV4dCBhbmQgYmVmb3JlIGEgbGluZS1icmVhayBnZXQgY29sbGFwc2VkIGF3YXkgY29tcGxl
dGVseSBzbyB0aGF0IHRoZSB0cmFpbGluZwotICAgICAgICAgICAgLy8gc3BhY2UgZG9lc24ndCBz
ZWVtIHRvIHB1c2ggdGhlIHRleHQgb3V0IGZyb20gdGhlIHJpZ2h0LWhhbmQgZWRnZS4KLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBEbyB0aGlzIHJlZ2FyZGxlc3Mgb2YgdGhlIGNvbnRhaW5lcidzIGFs
aWdubWVudCAtIHdpbGwgcmVxdWlyZSByZWJhc2VsaW5pbmcgYSBsb3Qgb2YgdGVzdCByZXN1bHRz
LgotICAgICAgICAgICAgaWYgKG1fbmV4dE9iamVjdCAmJiBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2Vz
Lm9mZnNldCgpICYmIG1fbmV4dE9iamVjdC0+aXNCUigpICYmIChtX2Jsb2NrU3R5bGUudGV4dEFs
aWduKCkgPT0gUklHSFQgfHwgbV9ibG9ja1N0eWxlLnRleHRBbGlnbigpID09IFdFQktJVF9SSUdI
VCkpIHsKLSAgICAgICAgICAgICAgICBtX3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLnNldE9mZnNldCht
X3N0YXJ0T2ZJZ25vcmVkU3BhY2VzLm9mZnNldCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgLy8g
SWYgdGhlcmUncyBqdXN0IGEgc2luZ2xlIHRyYWlsaW5nIHNwYWNlIHN0YXJ0IGlnbm9yaW5nIGl0
IG5vdyBzbyBpdCBjb2xsYXBzZXMgYXdheS4KLSAgICAgICAgICAgICAgICBpZiAobV9jdXJyZW50
Lm9mZnNldCgpID09IHJlbmRlclRleHQudGV4dExlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAg
ICAgICAgbV9saW5lTWlkcG9pbnRTdGF0ZS5zdGFydElnbm9yaW5nU3BhY2VzKG1fc3RhcnRPZkln
bm9yZWRTcGFjZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFt
X2N1cnJlbnRDaGFyYWN0ZXJJc1dTICYmIHByZXZpb3VzQ2hhcmFjdGVySXNXUykgewotICAgICAg
ICAgICAgaWYgKG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPmJyZWFrT25seUFmdGVyV2hp
dGVTcGFjZSgpKQotICAgICAgICAgICAgICAgIG1fbGluZUJyZWFrSGlzdG9yeS5tb3ZlVG8obV9j
dXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZzZXQoKSwgbV9jdXJyZW50Lm5leHRCcmVh
a2FibGVQb3NpdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtX2NvbGxhcHNlV2hp
dGVTcGFjZSAmJiBtX2N1cnJlbnRDaGFyYWN0ZXJJc1NwYWNlICYmICFtX2lnbm9yaW5nU3BhY2Vz
KQotICAgICAgICAgICAgbV90cmFpbGluZ09iamVjdHMuc2V0VHJhaWxpbmdXaGl0ZXNwYWNlKGRv
d25jYXN0PFJlbmRlclRleHQ+KG1fY3VycmVudC5yZW5kZXJlcigpKSk7Ci0gICAgICAgIGVsc2Ug
aWYgKCFtX2N1cnJlbnRTdHlsZS0+Y29sbGFwc2VXaGl0ZVNwYWNlKCkgfHwgIW1fY3VycmVudENo
YXJhY3RlcklzU3BhY2UpCi0gICAgICAgICAgICBtX3RyYWlsaW5nT2JqZWN0cy5jbGVhcigpOwot
Ci0gICAgICAgIG1fYXRTdGFydCA9IGZhbHNlOwotICAgICAgICBuZXh0Q2hhcmFjdGVyKGMsIGxh
c3RDaGFyYWN0ZXIsIHNlY29uZFRvTGFzdENoYXJhY3Rlcik7Ci0gICAgfQotCi0gICAgbV9yZW5k
ZXJUZXh0SW5mby5tX2xpbmVCcmVha0l0ZXJhdG9yLnNldFByaW9yQ29udGV4dChsYXN0Q2hhcmFj
dGVyLCBzZWNvbmRUb0xhc3RDaGFyYWN0ZXIpOwotCi0gICAgd29yZE1lYXN1cmVtZW50cy5ncm93
KHdvcmRNZWFzdXJlbWVudHMuc2l6ZSgpICsgMSk7Ci0gICAgV29yZE1lYXN1cmVtZW50JiB3b3Jk
TWVhc3VyZW1lbnQgPSB3b3JkTWVhc3VyZW1lbnRzLmxhc3QoKTsKLSAgICB3b3JkTWVhc3VyZW1l
bnQucmVuZGVyZXIgPSAmcmVuZGVyVGV4dDsKLQotICAgIC8vIElNUE9SVEFOVDogY3VycmVudC5t
X3BvcyBpcyA+IGxlbmd0aCBoZXJlIQotICAgIGZsb2F0IGFkZGl0aW9uYWxUZW1wV2lkdGggPSBt
X2lnbm9yaW5nU3BhY2VzID8gMCA6IHRleHRXaWR0aChyZW5kZXJUZXh0LCBsYXN0U3BhY2UsIG1f
Y3VycmVudC5vZmZzZXQoKSAtIGxhc3RTcGFjZSwgZm9udCwgbV93aWR0aC5jdXJyZW50V2lkdGgo
KSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxhcHNlV2hpdGVTcGFjZSwgd29yZE1lYXN1cmVtZW50LmZh
bGxiYWNrRm9udHMsIHRleHRMYXlvdXQpOwotICAgIHdvcmRNZWFzdXJlbWVudC5zdGFydE9mZnNl
dCA9IGxhc3RTcGFjZTsKLSAgICB3b3JkTWVhc3VyZW1lbnQuZW5kT2Zmc2V0ID0gbV9jdXJyZW50
Lm9mZnNldCgpOwotICAgIHdvcmRNZWFzdXJlbWVudC53aWR0aCA9IG1faWdub3JpbmdTcGFjZXMg
PyAwIDogYWRkaXRpb25hbFRlbXBXaWR0aCArIHdvcmRTcGFjaW5nRm9yV29yZE1lYXN1cmVtZW50
OwotICAgIGFkZGl0aW9uYWxUZW1wV2lkdGggKz0gbGFzdFNwYWNlV29yZFNwYWNpbmc7Ci0KLSAg
ICBmbG9hdCBpbmxpbmVMb2dpY2FsVGVtcFdpZHRoID0gaW5saW5lTG9naWNhbFdpZHRoKG1fY3Vy
cmVudC5yZW5kZXJlcigpLCAhbV9hcHBsaWVkU3RhcnRXaWR0aCwgbV9pbmNsdWRlRW5kV2lkdGgp
OwotICAgIG1fd2lkdGguYWRkVW5jb21taXR0ZWRXaWR0aChhZGRpdGlvbmFsVGVtcFdpZHRoICsg
aW5saW5lTG9naWNhbFRlbXBXaWR0aCk7Ci0KLSAgICBpZiAod29yZE1lYXN1cmVtZW50LmZhbGxi
YWNrRm9udHMuaXNFbXB0eSgpICYmICFmYWxsYmFja0ZvbnRzLmlzRW1wdHkoKSkKLSAgICAgICAg
d29yZE1lYXN1cmVtZW50LmZhbGxiYWNrRm9udHMuc3dhcChmYWxsYmFja0ZvbnRzKTsKLSAgICBm
YWxsYmFja0ZvbnRzLmNsZWFyKCk7Ci0KLSAgICBpZiAobV9jb2xsYXBzZVdoaXRlU3BhY2UgJiYg
bV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSAmJiBhZGRpdGlvbmFsVGVtcFdpZHRoKQotICAgICAg
ICBtX3dpZHRoLnNldFRyYWlsaW5nV2hpdGVzcGFjZVdpZHRoKGFkZGl0aW9uYWxUZW1wV2lkdGgs
IGlubGluZUxvZ2ljYWxUZW1wV2lkdGgpOwotCi0gICAgbV9pbmNsdWRlRW5kV2lkdGggPSBmYWxz
ZTsKLQotICAgIGlmICghbV93aWR0aC5maXRzT25MaW5lKCkpIHsKLSAgICAgICAgaWYgKGNhbkh5
cGhlbmF0ZSkgewotICAgICAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LnB1c2goWyZdKElubGlu
ZUl0ZXJhdG9yJiBtb2RpZnlNZSkgewotICAgICAgICAgICAgICAgIHRyeUh5cGhlbmF0aW5nKHJl
bmRlclRleHQsIGZvbnQsIHN0eWxlLmxvY2FsZSgpLCBjb25zZWN1dGl2ZUh5cGhlbmF0ZWRMaW5l
cywgbV9ibG9ja1N0eWxlLmh5cGhlbmF0aW9uTGltaXRMaW5lcygpLCBzdHlsZS5oeXBoZW5hdGlv
bkxpbWl0QmVmb3JlKCksIHN0eWxlLmh5cGhlbmF0aW9uTGltaXRBZnRlcigpLCBsYXN0U3BhY2Us
IG1fY3VycmVudC5vZmZzZXQoKSwgbV93aWR0aC5jdXJyZW50V2lkdGgoKSAtIGFkZGl0aW9uYWxU
ZW1wV2lkdGgsIG1fd2lkdGguYXZhaWxhYmxlV2lkdGgoKSwgaXNGaXhlZFBpdGNoLCBtX2NvbGxh
cHNlV2hpdGVTcGFjZSwgbGFzdFNwYWNlV29yZFNwYWNpbmcsIG1vZGlmeU1lLCBtX2N1cnJlbnQu
bmV4dEJyZWFrYWJsZVBvc2l0aW9uKCksIG1fbGluZUJyZWFrZXIubV9oeXBoZW5hdGVkKTsKLSAg
ICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoeXBoZW5hdGVkICYmIG1f
bGluZUJyZWFrSGlzdG9yeS5wcmV2aW91c0luU2FtZU5vZGUoKSA9PSBzb2Z0SHlwaGVuICYmIHN0
eWxlLmh5cGhlbnMoKSAhPSBIeXBoZW5zTm9uZSkgewotICAgICAgICAgICAgaHlwaGVuYXRlZCA9
IHRydWU7Ci0gICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlubGluZSBib29sIHRleHRCZWdpbnNXaXRoQnJlYWthYmxl
UG9zaXRpb24oUmVuZGVyVGV4dCYgbmV4dFRleHQpCi17Ci0gICAgVUNoYXIgYyA9IG5leHRUZXh0
LmNoYXJhY3RlckF0KDApOwotICAgIHJldHVybiBjID09ICcgJyB8fCBjID09ICdcdCcgfHwgKGMg
PT0gJ1xuJyAmJiAhbmV4dFRleHQucHJlc2VydmVzTmV3bGluZSgpKTsKLX0KLQotaW5saW5lIGJv
b2wgQnJlYWtpbmdDb250ZXh0OjpjYW5CcmVha0F0VGhpc1Bvc2l0aW9uKCkKLXsKLSAgICAvLyBJ
ZiB3ZSBhcmUgbm8td3JhcCBhbmQgaGF2ZSBmb3VuZCBhIGxpbmUtYnJlYWtpbmcgb3Bwb3J0dW5p
dHkgYWxyZWFkeSB0aGVuIHdlIHNob3VsZCB0YWtlIGl0LgotICAgIGlmIChtX3dpZHRoLmNvbW1p
dHRlZFdpZHRoKCkgJiYgIW1fd2lkdGguZml0c09uTGluZShtX2N1cnJlbnRDaGFyYWN0ZXJJc1Nw
YWNlKSAmJiBtX2N1cnJXUyA9PSBOT1dSQVApCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAg
Ly8gQXZvaWQgYnJlYWtpbmcgb24gZW1wdHkgaW5saW5lcy4KLSAgICBpZiAoaXM8UmVuZGVySW5s
aW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpICYmIGlzRW1wdHlJbmxpbmUoZG93bmNhc3Q8UmVu
ZGVySW5saW5lPigqbV9jdXJyZW50LnJlbmRlcmVyKCkpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgLy8gQXZvaWQgYnJlYWtpbmcgYmVmb3JlIGVtcHR5IGlubGluZXMgKGFzIGxvbmcg
YXMgdGhlIGN1cnJlbnQgb2JqZWN0IGlzbid0IHJlcGxhY2VkKS4KLSAgICBpZiAoIW1fY3VycmVu
dC5yZW5kZXJlcigpLT5pc1JlcGxhY2VkKCkgJiYgaXM8UmVuZGVySW5saW5lPihtX25leHRPYmpl
Y3QpICYmIGlzRW1wdHlJbmxpbmUoZG93bmNhc3Q8UmVuZGVySW5saW5lPigqbV9uZXh0T2JqZWN0
KSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIFJldHVybiBlYXJseSBpZiB3ZSBh
dXRvd3JhcCBhbmQgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIGEgc3BhY2UgYXMgd2Ugd2lsbCBh
bHdheXMgd2FudCB0byBicmVhayBhdCBzdWNoIGEgcG9zaXRpb24uCi0gICAgaWYgKG1fYXV0b1dy
YXAgJiYgbV9jdXJyZW50Q2hhcmFjdGVySXNTcGFjZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0K
LSAgICBpZiAobV9uZXh0T2JqZWN0ICYmIG1fbmV4dE9iamVjdC0+aXNMaW5lQnJlYWtPcHBvcnR1
bml0eSgpKQotICAgICAgICByZXR1cm4gbV9hdXRvV3JhcDsKLQotICAgIGJvb2wgbmV4dElzQXV0
b1dyYXBwaW5nVGV4dCA9IGlzPFJlbmRlclRleHQ+KG1fbmV4dE9iamVjdCkgJiYgKG1fYXV0b1dy
YXAgfHwgbV9uZXh0T2JqZWN0LT5zdHlsZSgpLmF1dG9XcmFwKCkpOwotICAgIGlmICghbmV4dElz
QXV0b1dyYXBwaW5nVGV4dCkKLSAgICAgICAgcmV0dXJuIG1fYXV0b1dyYXA7Ci0gICAgUmVuZGVy
VGV4dCYgbmV4dFJlbmRlclRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9uZXh0T2JqZWN0
KTsKLSAgICBib29sIGN1cnJlbnRJc1RleHRPckVtcHR5SW5saW5lID0gaXM8UmVuZGVyVGV4dD4o
Km1fY3VycmVudC5yZW5kZXJlcigpKSB8fCAoaXM8UmVuZGVySW5saW5lPigqbV9jdXJyZW50LnJl
bmRlcmVyKCkpICYmIGlzRW1wdHlJbmxpbmUoZG93bmNhc3Q8UmVuZGVySW5saW5lPigqbV9jdXJy
ZW50LnJlbmRlcmVyKCkpKSk7Ci0gICAgaWYgKCFjdXJyZW50SXNUZXh0T3JFbXB0eUlubGluZSkK
LSAgICAgICAgcmV0dXJuIG1fYXV0b1dyYXAgJiYgIW1fY3VycmVudC5yZW5kZXJlcigpLT5pc1J1
YnlSdW4oKTsKLQotICAgIGJvb2wgY2FuQnJlYWtIZXJlID0gIW1fY3VycmVudENoYXJhY3Rlcklz
U3BhY2UgJiYgdGV4dEJlZ2luc1dpdGhCcmVha2FibGVQb3NpdGlvbihuZXh0UmVuZGVyVGV4dCk7
Ci0KLSAgICAvLyBTZWUgaWYgYXR0ZW1wdGluZyB0byBmaXQgYmVsb3cgZmxvYXRzIGNyZWF0ZXMg
bW9yZSBhdmFpbGFibGUgd2lkdGggb24gdGhlIGxpbmUuCi0gICAgaWYgKCFtX3dpZHRoLmZpdHNP
bkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKQotICAgICAgICBtX3dpZHRoLmZp
dEJlbG93RmxvYXRzKG1fbGluZUluZm8uaXNGaXJzdExpbmUoKSk7Ci0KLSAgICBib29sIGNhblBs
YWNlT25MaW5lID0gbV93aWR0aC5maXRzT25MaW5lKCkgfHwgIW1fYXV0b1dyYXBXYXNFdmVyVHJ1
ZU9uTGluZTsKLQotICAgIGlmIChjYW5QbGFjZU9uTGluZSAmJiBjYW5CcmVha0hlcmUpCi0gICAg
ICAgIGNvbW1pdExpbmVCcmVha0F0Q3VycmVudFdpZHRoKG5leHRSZW5kZXJUZXh0KTsKLQotICAg
IHJldHVybiBjYW5CcmVha0hlcmU7Ci19Ci0KLWlubGluZSB2b2lkIEJyZWFraW5nQ29udGV4dDo6
Y29tbWl0QW5kVXBkYXRlTGluZUJyZWFrSWZOZWVkZWQoKQotewotICAgIGJvb2wgY2hlY2tGb3JC
cmVhayA9IGNhbkJyZWFrQXRUaGlzUG9zaXRpb24oKTsKLQotICAgIGlmIChjaGVja0ZvckJyZWFr
ICYmICFtX3dpZHRoLmZpdHNPbkxpbmUobV9pZ25vcmluZ1NwYWNlcykpIHsKLSAgICAgICAgLy8g
aWYgd2UgaGF2ZSBmbG9hdHMsIHRyeSB0byBnZXQgYmVsb3cgdGhlbS4KLSAgICAgICAgaWYgKG1f
Y3VycmVudENoYXJhY3RlcklzU3BhY2UgJiYgIW1faWdub3JpbmdTcGFjZXMgJiYgbV9jdXJyZW50
U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpKQotICAgICAgICAgICAgbV90cmFpbGluZ09iamVj
dHMuY2xlYXIoKTsKLQotICAgICAgICBpZiAobV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB7Ci0g
ICAgICAgICAgICBtX2F0RW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
fQotCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dGbG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGlu
ZSgpKTsKLQotICAgICAgICAvLyB8d2lkdGh8IG1heSBoYXZlIGJlZW4gYWRqdXN0ZWQgYmVjYXVz
ZSB3ZSBnb3Qgc2hvdmVkIGRvd24gcGFzdCBhIGZsb2F0ICh0aHVzCi0gICAgICAgIC8vIGdpdmlu
ZyB1cyBtb3JlIHJvb20pLCBzbyB3ZSBuZWVkIHRvIHJldGVzdCwgYW5kIG9ubHkganVtcCB0bwot
ICAgICAgICAvLyB0aGUgZW5kIGxhYmVsIGlmIHdlIHN0aWxsIGRvbid0IGZpdCBvbiB0aGUgbGlu
ZS4gLWR3aAotICAgICAgICBpZiAoIW1fd2lkdGguZml0c09uTGluZShtX2lnbm9yaW5nU3BhY2Vz
KSkgewotICAgICAgICAgICAgbV9hdEVuZCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fYmxvY2tTdHlsZS5hdXRvV3JhcCgpICYmICFtX3dp
ZHRoLmZpdHNPbkxpbmUoKSAmJiAhbV93aWR0aC5jb21taXR0ZWRXaWR0aCgpKSB7Ci0gICAgICAg
IC8vIElmIHRoZSBjb250YWluZXIgYXV0b3dyYXBzIGJ1dCB0aGUgY3VycmVudCBjaGlsZCBkb2Vz
IG5vdCB0aGVuIHdlIHN0aWxsIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQKLSAgICAgICAgLy8gd3Jh
cHMgYW5kIG1vdmVzIGJlbG93IGFueSBmbG9hdHMuCi0gICAgICAgIG1fd2lkdGguZml0QmVsb3dG
bG9hdHMobV9saW5lSW5mby5pc0ZpcnN0TGluZSgpKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1fY3Vy
cmVudC5yZW5kZXJlcigpLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKLSAg
ICAgICAgbV9sYXN0T2JqZWN0ID0gbV9jdXJyZW50LnJlbmRlcmVyKCk7Ci0gICAgICAgIGlmICht
X2xhc3RPYmplY3QtPmlzUmVwbGFjZWQoKSAmJiBtX2F1dG9XcmFwICYmICFtX2xhc3RPYmplY3Qt
PmlzUnVieVJ1bigpICYmICghbV9sYXN0T2JqZWN0LT5pc0ltYWdlKCkgfHwgbV9hbGxvd0ltYWdl
c1RvQnJlYWspICYmICghaXM8UmVuZGVyTGlzdE1hcmtlcj4oKm1fbGFzdE9iamVjdCkgfHwgZG93
bmNhc3Q8UmVuZGVyTGlzdE1hcmtlcj4oKm1fbGFzdE9iamVjdCkuaXNJbnNpZGUoKSkpCi0gICAg
ICAgICAgICBjb21taXRMaW5lQnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9uZXh0T2JqZWN0KTsKLSAg
ICB9Ci19Ci0KLWlubGluZSBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZU9yTm90
IGNoZWNrTWlkcG9pbnRzKExpbmVNaWRwb2ludFN0YXRlJiBsaW5lTWlkcG9pbnRTdGF0ZSwgY29u
c3QgSW5saW5lSXRlcmF0b3ImIGxCcmVhaykKLXsKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgb3Vy
IGxhc3QgbWlkcG9pbnQgaXMgYSBzdGFydCBwb2ludCBiZXlvbmQgdGhlIGxpbmUgYnJlYWsuIElm
IHNvLAotICAgIC8vIHNoYXZlIGl0IG9mZiB0aGUgbGlzdCwgYW5kIHNoYXZlIG9mZiBhIHRyYWls
aW5nIHNwYWNlIGlmIHRoZSBwcmV2aW91cyBlbmQgcG9pbnQgZG9lc24ndAotICAgIC8vIHByZXNl
cnZlIHdoaXRlc3BhY2UuCi0gICAgaWYgKGxCcmVhay5yZW5kZXJlcigpICYmIGxpbmVNaWRwb2lu
dFN0YXRlLm51bU1pZHBvaW50cygpICYmICEobGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRz
KCkgJSAyKSkgewotICAgICAgICBJbmxpbmVJdGVyYXRvciogbWlkcG9pbnRzID0gbGluZU1pZHBv
aW50U3RhdGUubWlkcG9pbnRzKCkuZGF0YSgpOwotICAgICAgICBJbmxpbmVJdGVyYXRvciYgZW5k
cG9pbnQgPSBtaWRwb2ludHNbbGluZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgLSAyXTsK
LSAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3ImIHN0YXJ0cG9pbnQgPSBtaWRwb2ludHNbbGlu
ZU1pZHBvaW50U3RhdGUubnVtTWlkcG9pbnRzKCkgLSAxXTsKLSAgICAgICAgSW5saW5lSXRlcmF0
b3IgY3VycnBvaW50ID0gZW5kcG9pbnQ7Ci0gICAgICAgIHdoaWxlICghY3VycnBvaW50LmF0RW5k
KCkgJiYgY3VycnBvaW50ICE9IHN0YXJ0cG9pbnQgJiYgY3VycnBvaW50ICE9IGxCcmVhaykKLSAg
ICAgICAgICAgIGN1cnJwb2ludC5pbmNyZW1lbnQoKTsKLSAgICAgICAgaWYgKGN1cnJwb2ludCA9
PSBsQnJlYWspIHsKLSAgICAgICAgICAgIC8vIFdlIGhpdCB0aGUgbGluZSBicmVhayBiZWZvcmUg
dGhlIHN0YXJ0IHBvaW50LiBTaGF2ZSBvZmYgdGhlIHN0YXJ0IHBvaW50LgotICAgICAgICAgICAg
bGluZU1pZHBvaW50U3RhdGUuZGVjcmVhc2VOdW1NaWRwb2ludHMoKTsKLSAgICAgICAgICAgIGlm
IChlbmRwb2ludC5yZW5kZXJlcigpLT5zdHlsZSgpLmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVu
ZHBvaW50LnJlbmRlcmVyKCktPmlzVGV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZW5kcG9pbnQu
ZmFzdERlY3JlbWVudCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBUcmFpbGluZ09iamVjdHM6
OkRvTm90Q29sbGFwc2VGaXJzdFNwYWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiBUcmFpbGluZ09iamVjdHM6OkNvbGxhcHNlRmlyc3RTcGFjZTsKLX0KLQot
aW5saW5lIElubGluZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6aGFuZGxlRW5kT2ZMaW5lKCkK
LXsKLSAgICBpZiAobV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSA9PSBtX3Jlc29sdmVyLnBv
c2l0aW9uKCkpIHsKLSAgICAgICAgaWYgKCFtX2xpbmVCcmVha0hpc3RvcnkucmVuZGVyZXIoKSB8
fCAhbV9saW5lQnJlYWtIaXN0b3J5LnJlbmRlcmVyKCktPmlzQlIoKSkgewotICAgICAgICAgICAg
Ly8gd2UganVzdCBhZGQgYXMgbXVjaCBhcyBwb3NzaWJsZQotICAgICAgICAgICAgaWYgKG1fYmxv
Y2tTdHlsZS53aGl0ZVNwYWNlKCkgPT0gUFJFICYmICFtX2N1cnJlbnQub2Zmc2V0KCkpCi0gICAg
ICAgICAgICAgICAgY29tbWl0TGluZUJyZWFrQXRDdXJyZW50V2lkdGgoKm1fbGFzdE9iamVjdCwg
bV9sYXN0T2JqZWN0LT5pc1RleHQoKSA/IG1fbGFzdE9iamVjdC0+bGVuZ3RoKCkgOiAwKTsKLSAg
ICAgICAgICAgIGVsc2UgaWYgKG1fbGluZUJyZWFrSGlzdG9yeS5yZW5kZXJlcigpKSB7Ci0gICAg
ICAgICAgICAgICAgLy8gRG9uJ3QgZXZlciBicmVhayBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZCBp
ZiB3ZSBjYW4gaGVscCBpdC4KLSAgICAgICAgICAgICAgICAvLyBUaGVyZSdzIG5vIHJvb20gYXQg
YWxsLiBXZSBqdXN0IGhhdmUgdG8gYmUgb24gdGhpcyBsaW5lLAotICAgICAgICAgICAgICAgIC8v
IGV2ZW4gdGhvdWdoIHdlJ2xsIHNwaWxsIG91dC4KLSAgICAgICAgICAgICAgICBjb21taXRMaW5l
QnJlYWtBdEN1cnJlbnRXaWR0aCgqbV9jdXJyZW50LnJlbmRlcmVyKCksIG1fY3VycmVudC5vZmZz
ZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbWFrZSBzdXJlIHdl
IGNvbnN1bWUgYXQgbGVhc3Qgb25lIGNoYXIvb2JqZWN0LgotICAgICAgICBpZiAobV9saW5lQnJl
YWtIaXN0b3J5LmN1cnJlbnQoKSA9PSBtX3Jlc29sdmVyLnBvc2l0aW9uKCkpCi0gICAgICAgICAg
ICBtX2xpbmVCcmVha0hpc3RvcnkuaW5jcmVtZW50KCk7Ci0gICAgfSBlbHNlIGlmICghbV9jdXJy
ZW50Lm9mZnNldCgpICYmICFtX3dpZHRoLmNvbW1pdHRlZFdpZHRoKCkgJiYgbV93aWR0aC51bmNv
bW1pdHRlZFdpZHRoKCkgJiYgIW1faGFkVW5jb21taXR0ZWRXaWR0aEJlZm9yZUN1cnJlbnQpIHsK
LSAgICAgICAgLy8gRG8gbm90IHB1c2ggdGhlIGN1cnJlbnQgb2JqZWN0IHRvIHRoZSBuZXh0IGxp
bmUsIHdoZW4gdGhpcyBsaW5lIGhhcyBzb21lIGNvbnRlbnQsIGJ1dCBpdCBpcyBzdGlsbCBjb25z
aWRlcmVkIGVtcHR5LgotICAgICAgICAvLyBFbXB0eSBpbmxpbmUgZWxlbWVudHMgbGlrZSA8c3Bh
bj48L3NwYW4+IGNhbiBwcm9kdWNlIHN1Y2ggbGluZXMgYW5kIG5vdyB3ZSBqdXN0IGlnbm9yZSB0
aGVzZSBicmVhayBvcHBvcnR1bml0aWVzCi0gICAgICAgIC8vIGF0IHRoZSBzdGFydCBvZiBhIGxp
bmUsIGlmIG5vIHdpZHRoIGhhcyBiZWVuIGNvbW1pdHRlZCB5ZXQuCi0gICAgICAgIC8vIEJlaGF2
ZSBhcyBpZiBpdCB3YXMgYWN0dWFsbHkgZW1wdHkgYW5kIGNvbnN1bWUgYXQgbGVhc3Qgb25lIG9i
amVjdC4KLSAgICAgICAgbV9saW5lQnJlYWtIaXN0b3J5LmluY3JlbWVudCgpOwotICAgIH0KLQot
ICAgIC8vIFNhbml0eSBjaGVjayBvdXIgbWlkcG9pbnRzLgotICAgIFRyYWlsaW5nT2JqZWN0czo6
Q29sbGFwc2VGaXJzdFNwYWNlT3JOb3QgY29sbGFwc2VkID0gY2hlY2tNaWRwb2ludHMobV9saW5l
TWlkcG9pbnRTdGF0ZSwgbV9saW5lQnJlYWtIaXN0b3J5LmN1cnJlbnQoKSk7Ci0KLSAgICBtX3Ry
YWlsaW5nT2JqZWN0cy51cGRhdGVNaWRwb2ludHNGb3JUcmFpbGluZ0JveGVzKG1fbGluZU1pZHBv
aW50U3RhdGUsIG1fbGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCksIGNvbGxhcHNlZCk7Ci0KLSAg
ICAvLyBXZSBtaWdodCBoYXZlIG1hZGUgbGluZUJyZWFrIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRz
IHBhc3QgdGhlIGVuZAotICAgIC8vIG9mIHRoZSBvYmplY3QuIERvIHRoaXMgYWRqdXN0bWVudCB0
byBtYWtlIGl0IHBvaW50IHRvIHRoZSBzdGFydAotICAgIC8vIG9mIHRoZSBuZXh0IG9iamVjdCBp
bnN0ZWFkIHRvIGF2b2lkIGNvbmZ1c2luZyB0aGUgcmVzdCBvZiB0aGUKLSAgICAvLyBjb2RlLgot
ICAgIGlmIChtX2xpbmVCcmVha0hpc3Rvcnkub2Zmc2V0KCkpIHsKLSAgICAgICAgbV9saW5lQnJl
YWtIaXN0b3J5LnVwZGF0ZShbXShJbmxpbmVJdGVyYXRvciYgbW9kaWZ5TWUpIHsKLSAgICAgICAg
ICAgIG1vZGlmeU1lLnNldE9mZnNldChtb2RpZnlNZS5vZmZzZXQoKSAtIDEpOwotICAgICAgICAg
ICAgbW9kaWZ5TWUuaW5jcmVtZW50KCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotI2lmIEVOQUJM
RShDU1NfVFJBSUxJTkdfV09SRCkKLSAgICBpZiAobV9ibG9ja1N0eWxlLnRyYWlsaW5nV29yZCgp
ID09IFRyYWlsaW5nV29yZDo6UGFydGlhbGx5QmFsYW5jZWQpCi0gICAgICAgIHJldHVybiBvcHRp
bWFsTGluZUJyZWFrTG9jYXRpb25Gb3JUcmFpbGluZ1dvcmQoKTsKLSNlbmRpZgotICAgIHJldHVy
biBtX2xpbmVCcmVha0hpc3RvcnkuY3VycmVudCgpOwotfQotCi0jaWYgRU5BQkxFKENTU19UUkFJ
TElOR19XT1JEKQotaW5saW5lIElubGluZUl0ZXJhdG9yIEJyZWFraW5nQ29udGV4dDo6b3B0aW1h
bExpbmVCcmVha0xvY2F0aW9uRm9yVHJhaWxpbmdXb3JkKCkKLXsKLSAgICBjb25zdCB1bnNpZ25l
ZCBsb25nVHJhaWxpbmdXb3JkTGVuZ3RoID0gMjA7Ci0gICAgY29uc3QgZmxvYXQgb3B0aW1hbFRy
YWlsaW5nTGluZVJhdGlvID0gMC4xOwotICAgIElubGluZUl0ZXJhdG9yIGxpbmVCcmVhayA9IG1f
bGluZUJyZWFrSGlzdG9yeS5jdXJyZW50KCk7Ci0gICAgaWYgKCFsaW5lQnJlYWsucmVuZGVyZXIo
KSB8fCAhbV9saW5lSW5mby5pc0ZpcnN0TGluZSgpIHx8IGJpZGlOZXh0U2tpcHBpbmdFbXB0eUlu
bGluZXMoKmxpbmVCcmVhay5yb290KCksIGxpbmVCcmVhay5yZW5kZXJlcigpKSB8fCAhaXM8UmVu
ZGVyVGV4dD4obGluZUJyZWFrLnJlbmRlcmVyKCkpKQotICAgICAgICByZXR1cm4gbGluZUJyZWFr
OwotICAgIFJlbmRlclRleHQmIHJlbmRlclRleHQgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbGlu
ZUJyZWFrLnJlbmRlcmVyKCkpOwotICAgIC8vIERvbid0IGV2ZW4gYm90aGVyIG1lYXN1cmluZyBp
ZiBvdXIgcmVtYWluaW5nIGxpbmUgaGFzIG1hbnkgY2hhcmFjdGVycwotICAgIGlmIChyZW5kZXJU
ZXh0LnRleHRMZW5ndGgoKSA9PSBsaW5lQnJlYWsub2Zmc2V0KCkgfHwgcmVuZGVyVGV4dC50ZXh0
TGVuZ3RoKCkgLSBsaW5lQnJlYWsub2Zmc2V0KCkgPiBsb25nVHJhaWxpbmdXb3JkTGVuZ3RoKQot
ICAgICAgICByZXR1cm4gbGluZUJyZWFrOwotICAgIGJvb2wgaXNMb29zZUNKS01vZGUgPSBtX3Jl
bmRlclRleHRJbmZvLm1fdGV4dCAhPSAmcmVuZGVyVGV4dCAmJiBtX3JlbmRlclRleHRJbmZvLm1f
bGluZUJyZWFrSXRlcmF0b3IuaXNMb29zZUNKS01vZGUoKTsKLSAgICBib29sIGJyZWFrTkJTUCA9
IG1fYXV0b1dyYXAgJiYgbV9jdXJyZW50U3R5bGUtPm5ic3BNb2RlKCkgPT0gU1BBQ0U7Ci0gICAg
aW50IG5leHRCcmVha2FibGVQb3NpdGlvbiA9IGxpbmVCcmVhay5uZXh0QnJlYWthYmxlUG9zaXRp
b24oKTsKLSAgICBpc0JyZWFrYWJsZShtX3JlbmRlclRleHRJbmZvLm1fbGluZUJyZWFrSXRlcmF0
b3IsIGxpbmVCcmVhay5vZmZzZXQoKSArIDEsIG5leHRCcmVha2FibGVQb3NpdGlvbiwgYnJlYWtO
QlNQLCBpc0xvb3NlQ0pLTW9kZSk7Ci0gICAgaWYgKG5leHRCcmVha2FibGVQb3NpdGlvbiA8IDAg
fHwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG5leHRCcmVha2FibGVQb3NpdGlvbikgIT0gcmVuZGVy
VGV4dC50ZXh0TGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBsaW5lQnJlYWs7Ci0gICAgY29uc3Qg
UmVuZGVyU3R5bGUmIHN0eWxlID0gbGluZVN0eWxlKHJlbmRlclRleHQsIG1fbGluZUluZm8pOwot
ICAgIGNvbnN0IEZvbnRDYXNjYWRlJiBmb250ID0gc3R5bGUuZm9udENhc2NhZGUoKTsKLSAgICBI
YXNoU2V0PGNvbnN0IEZvbnQqPiBkdW1teUZvbnRzOwotICAgIElubGluZUl0ZXJhdG9yIGJlc3Qg
PSBsaW5lQnJlYWs7Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtX2xpbmVCcmVha0hpc3Rv
cnkuaGlzdG9yeUxlbmd0aCgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgSW5saW5lSXRlcmF0b3Im
IGNhbmRpZGF0ZSA9IG1fbGluZUJyZWFrSGlzdG9yeS5nZXQoaSk7Ci0gICAgICAgIGlmIChjYW5k
aWRhdGUucmVuZGVyZXIoKSAhPSBsaW5lQnJlYWsucmVuZGVyZXIoKSkKLSAgICAgICAgICAgIHJl
dHVybiBiZXN0OwotICAgICAgICBmbG9hdCB3aWR0aCA9IHRleHRXaWR0aChyZW5kZXJUZXh0LCBj
YW5kaWRhdGUub2Zmc2V0KCksIHJlbmRlclRleHQudGV4dExlbmd0aCgpIC0gY2FuZGlkYXRlLm9m
ZnNldCgpLCBmb250LCAwLCBmb250LmlzRml4ZWRQaXRjaCgpLCBtX2NvbGxhcHNlV2hpdGVTcGFj
ZSwgZHVtbXlGb250cyk7Ci0gICAgICAgIGlmICh3aWR0aCA+IG1fd2lkdGguYXZhaWxhYmxlV2lk
dGgoKSkKLSAgICAgICAgICAgIHJldHVybiBiZXN0OwotICAgICAgICBpZiAod2lkdGggLyBtX3dp
ZHRoLmF2YWlsYWJsZVdpZHRoKCkgPiBvcHRpbWFsVHJhaWxpbmdMaW5lUmF0aW8pIC8vIFN1YnNl
cXVlbnQgbGluZSBpcyBsb25nIGVub3VnaAotICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZTsK
LSAgICAgICAgYmVzdCA9IGNhbmRpZGF0ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGJlc3Q7Ci19Ci0j
ZW5kaWYKLQotfQotCi0jZW5kaWYgLy8gQnJlYWtpbmdDb250ZXh0SW5saW5lSGVhZGVyc19oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvbGluZS9MaW5lQnJlYWtlci5jcHAKaW5kZXggOWIy
YjMwNmFiZWYwM2FkOTBkNWI1ZjAyODMzNTA3NTg4YmY3M2NkOS4uNmUzM2NkMzEwOWY1MWM5Mzdj
MTZhNGEyNzQzZjVmYjljYWU5YWQ5MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVy
aW5nL2xpbmUvTGluZUJyZWFrZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9s
aW5lL0xpbmVCcmVha2VyLmNwcApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2luY2x1ZGUgIkxpbmVCcmVha2VyLmgiCiAKLSNpbmNsdWRlICJCcmVha2luZ0NvbnRleHRJ
bmxpbmVIZWFkZXJzLmgiCisjaW5jbHVkZSAiQnJlYWtpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAi
UmVuZGVyQ29tYmluZVRleHQuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewo=
</data>
<flag name="review"
          id="273000"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>