<?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>32284</bug_id>
          
          <creation_ts>2009-12-08 12:58:53 -0800</creation_ts>
          <short_desc>move code generation portions of Nodes.cpp to bytecompiler directory</short_desc>
          <delta_ts>2009-12-08 19:42:15 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</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="Maciej Stachowiak">mjs</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>169759</commentid>
    <comment_count>0</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-12-08 12:58:53 -0800</bug_when>
    <thetext>Move code generation portions of Nodes.cpp to the bytecompiler directory. This is not really part of the parser.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169761</commentid>
    <comment_count>1</comment_count>
      <attachid>44479</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-12-08 13:01:17 -0800</bug_when>
    <thetext>Created attachment 44479
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169762</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2009-12-08 13:03:38 -0800</bug_when>
    <thetext>Attachment 44479 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
JavaScriptCore/bytecompiler/NodesCodegen.cpp:27:  You should add a blank line after implementation file&apos;s own header.  [build/include_order] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:30:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:270:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:538:  One line control clauses should not use braces.  [whitespace/braces] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:552:  One line control clauses should not use braces.  [whitespace/braces] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:575:  One line control clauses should not use braces.  [whitespace/braces] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:598:  One line control clauses should not use braces.  [whitespace/braces] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:1066:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:1121:  One line control clauses should not use braces.  [whitespace/braces] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:1269:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:1753:  min_num is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
JavaScriptCore/bytecompiler/NodesCodegen.cpp:1754:  max_num is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming] [4]
Total errors found: 12</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>169770</commentid>
    <comment_count>3</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2009-12-08 13:21:59 -0800</bug_when>
    <thetext>I did not fix the style issues identified by the bot, since this was pure code motion, but I will do that in a separate patch.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>44479</attachid>
            <date>2009-12-08 13:01:17 -0800</date>
            <delta_ts>2009-12-08 13:04:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-32284-20091208130115.patch</filename>
            <type>text/plain</type>
            <size>196876</size>
            <attacher name="Maciej Stachowiak">mjs</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDUxODY5KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjQgQEAKKzIwMDktMTItMDggIE1hY2llaiBT
dGFjaG93aWFrICA8bWpzQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBtb3ZlIGNvZGUgZ2VuZXJhdGlvbiBwb3J0aW9ucyBvZiBOb2Rl
cy5jcHAgdG8gYnl0ZWNvbXBpbGVyIGRpcmVjdG9yeQorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzIyODQKKworICAgICAgICAqIGJ5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwOiBDb3BpZWQgZnJvbSBwYXJzZXIvTm9kZXMuY3BwLiBSZW1vdmVkIHBh
cnRzIHRoYXQKKyAgICAgICAgYXJlIG5vdCBhYm91dCBjb2RlZ2VuLgorICAgICAgICAqIHBhcnNl
ci9Ob2Rlcy5jcHA6IFJlbW92ZWQgZXZlcnl0aGluZyB0aGF0IGlzIGFib3V0IGNvZGVnZW4uCisK
KyAgICAgICAgVXBkYXRlIGJ1aWxkIHN5c3RlbXM6CisgICAgICAgIAorICAgICAgICAqIEFuZHJv
aWQubWs6CisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogSmF2YVNjcmlwdENv
cmUuZ3lwaToKKyAgICAgICAgKiBKYXZhU2NyaXB0Q29yZS5wcmk6CisgICAgICAgICogSmF2YVNj
cmlwdENvcmUudmNwcm9qL0phdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvajoKKyAg
ICAgICAgKiBKYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAg
ICAqIEphdmFTY3JpcHRDb3JlU291cmNlcy5ia2w6CisKIDIwMDktMTItMDggIERtaXRyeSBUaXRv
diAgPGRpbWljaEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRs
ZXIuCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9BbmRyb2lkLm1rCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0FuZHJvaWQubWsJKHJldmlzaW9uIDUxODY0KQorKysgSmF2YVNjcmlwdENvcmUv
QW5kcm9pZC5tawkod29ya2luZyBjb3B5KQpAQCAtMzUsNiArMzUsNyBAQCBMT0NBTF9TUkNfRklM
RVMgOj0gXAogCWJ5dGVjb2RlL1N0cnVjdHVyZVN0dWJJbmZvLmNwcCBcCiAJXAogCWJ5dGVjb21w
aWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAgXAorCWJ5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4u
Y3BwIFwKIAlcCiAJZGVidWdnZXIvRGVidWdnZXIuY3BwIFwKIAlkZWJ1Z2dlci9EZWJ1Z2dlckFj
dGl2YXRpb24uY3BwIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxlLmFtCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxlLmFtCShyZXZpc2lvbiA1MTg2NCkK
KysrIEphdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0zNDIs
NiArMzQyLDcgQEAgamF2YXNjcmlwdGNvcmVfc291cmNlcyArPSBcCiAJSmF2YVNjcmlwdENvcmUv
aW50ZXJwcmV0ZXIvUmVnaXN0ZXJGaWxlLmggXAogCUphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxl
ci9CeXRlY29kZUdlbmVyYXRvci5jcHAgXAogCUphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9C
eXRlY29kZUdlbmVyYXRvci5oIFwKKwlKYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvTm9kZXND
b2RlZ2VuLmNwcCBcCiAJSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0xhYmVsU2NvcGUuaCBc
CiAJSmF2YVNjcmlwdENvcmUvZGVidWdnZXIvRGVidWdnZXIuY3BwIFwKIAlKYXZhU2NyaXB0Q29y
ZS9kZWJ1Z2dlci9EZWJ1Z2dlci5oIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRD
b3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUuZ3lw
aQkocmV2aXNpb24gNTE4NjQpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5neXBp
CSh3b3JraW5nIGNvcHkpCkBAIC02NCw2ICs2NCw3IEBACiAgICAgICAgICAgICAnYnl0ZWNvZGUv
U3RydWN0dXJlU3R1YkluZm8uaCcsCiAgICAgICAgICAgICAnYnl0ZWNvbXBpbGVyL0J5dGVjb2Rl
R2VuZXJhdG9yLmNwcCcsCiAgICAgICAgICAgICAnYnl0ZWNvbXBpbGVyL0J5dGVjb2RlR2VuZXJh
dG9yLmgnLAorICAgICAgICAgICAgJ2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwJywKICAg
ICAgICAgICAgICdieXRlY29tcGlsZXIvTGFiZWwuaCcsCiAgICAgICAgICAgICAnYnl0ZWNvbXBp
bGVyL0xhYmVsU2NvcGUuaCcsCiAgICAgICAgICAgICAnYnl0ZWNvbXBpbGVyL1JlZ2lzdGVySUQu
aCcsCkluZGV4OiBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5wcmkKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUucHJpCShyZXZpc2lvbiA1MTg2NCkKKysr
IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnByaQkod29ya2luZyBjb3B5KQpAQCAtMTA4
LDYgKzEwOCw3IEBAIFNPVVJDRVMgKz0gXAogICAgIGJ5dGVjb2RlL1NhbXBsaW5nVG9vbC5jcHAg
XAogICAgIGJ5dGVjb2RlL1N0cnVjdHVyZVN0dWJJbmZvLmNwcCBcCiAgICAgYnl0ZWNvbXBpbGVy
L0J5dGVjb2RlR2VuZXJhdG9yLmNwcCBcCisgICAgYnl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5j
cHAgXAogICAgIGRlYnVnZ2VyL0RlYnVnZ2VyQWN0aXZhdGlvbi5jcHAgXAogICAgIGRlYnVnZ2Vy
L0RlYnVnZ2VyQ2FsbEZyYW1lLmNwcCBcCiAgICAgZGVidWdnZXIvRGVidWdnZXIuY3BwIFwKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlU291cmNlcy5ia2wKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmVTb3VyY2VzLmJrbAkocmV2aXNpb24gNTE4
NjQpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZVNvdXJjZXMuYmtsCSh3b3JraW5n
IGNvcHkpCkBAIC00Myw2ICs0Myw3IEBAIFNvdXJjZSBmaWxlcyBmb3IgSlNDb3JlLgogICAgIDwv
c2V0PgogICAgIDxzZXQgYXBwZW5kPSIxIiB2YXI9IkpTQ09SRV9CWVRFQ09NUElMRVJfU09VUkNF
UyI+CiAgICAgICAgIGJ5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5jcHAKKyAgICAgICAg
Ynl0ZWNvbXBpbGVyL05vZGVzQ29kZWdlbi5jcHAKICAgICA8L3NldD4KICAgICA8c2V0IGFwcGVu
ZD0iMSIgdmFyPSJKU0NPUkVfREVCVUdHRVJfU09VUkNFUyI+CiAgICAgICAgIGRlYnVnZ2VyL0Rl
YnVnZ2VyLmNwcApJbmRleDogSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUudmNwcm9qL0ph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2Ny
aXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENv
cmUudmNwcm9qCShyZXZpc2lvbiA1MTg2NCkKKysrIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRD
b3JlLnZjcHJvai9KYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2oJKHdvcmtpbmcg
Y29weSkKQEAgLTE1NDksNiArMTU0OSwxMCBAQAogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZp
bGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlwuLlxieXRlY29tcGlsZXJcTm9kZXNDb2RlZ2VuLmNw
cCINCisJCQkJPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KIAkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XC4uXGJ5dGVjb21waWxlclxMYWJlbC5oIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KSW5kZXg6IEph
dmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkocmV2aXNpb24gNTE4NjQpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC0xODgsNiAr
MTg4LDcgQEAKIAkJNUQ2QTU2NkIwRjA1OTk1NTAwMjY2MTQ1IC8qIFRocmVhZGluZy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA1RDZBNTY2QTBGMDU5
OTU1MDAyNjYxNDUgLyogVGhyZWFkaW5nLmNwcCAqLzsgfTsKIAkJNURFNkU1QjMwRTE3MjhFQzAw
MTgwNDA3IC8qIGNyZWF0ZV9oYXNoX3RhYmxlIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRjY5MkE4NTQwMjU1NTk3RDAxRkY2MEY3IC8qIGNyZWF0ZV9oYXNo
X3RhYmxlICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKCk7IH07IH07CiAJCTY1MDdEMjlF
MEU4NzFFNUUwMEQ3RDg5NiAvKiBKU1R5cGVJbmZvLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA2NTA3RDI5NzBFODcxRTRBMDBEN0Q4OTYgLyogSlNUeXBl
SW5mby5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJ
CTY1NUVCMjlCMTBDRTI1ODEwMDFBOTkwRSAvKiBOb2Rlc0NvZGVnZW4uY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNjU1RUIyOUExMENFMjU4MTAwMUE5
OTBFIC8qIE5vZGVzQ29kZWdlbi5jcHAgKi87IH07CiAJCTY1REZDOTMzMDhFQTE3M0EwMEY3MzAw
QiAvKiBIYXNoVGFibGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gNjVERkM5MkQwOEVBMTczQTAwRjczMDBCIC8qIEhhc2hUYWJsZS5jcHAgKi87IH07
CiAJCTY1RkRFNDlDMEJERDFENEEwMEU4MDExMSAvKiBBc3NlcnRpb25zLmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDY1RTIxN0I4MDhFN0VFQ0MwMDIz
RTVGNiAvKiBBc3NlcnRpb25zLmNwcCAqLzsgc2V0dGluZ3MgPSB7Q09NUElMRVJfRkxBR1MgPSAi
LVduby1taXNzaW5nLWZvcm1hdC1hdHRyaWJ1dGUiOyB9OyB9OwogCQk3RTJBREQ4RTBFNzlBQUQ1
MDBENTBDNTEgLyogQ2hhcmFjdGVyQ2xhc3NDb25zdHJ1Y3Rvci5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gN0UyQUREOEQwRTc5QUFENTAwRDUwQzUxIC8q
IENoYXJhY3RlckNsYXNzQ29uc3RydWN0b3IuaCAqLzsgfTsKQEAgLTY4MSw2ICs2ODIsNyBAQAog
CQk2NTQxQkQ2RjA4RTgwQTE3MDAyQ0JFRTcgLyogVENTcGluTG9jay5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBUQ1NwaW5Mb2NrLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgfTsKIAkJNjU0MUJENzAwOEU4MEExNzAw
MkNCRUU3IC8qIFRDU3lzdGVtQWxsb2MuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gVENTeXN0ZW1BbGxvYy5jcHA7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgfTsKIAkJNjU0MUJENzEwOEU4MEExNzAwMkNCRUU3
IC8qIFRDU3lzdGVtQWxsb2MuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBwYXRoID0gVENTeXN0ZW1BbGxvYy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0
YWJXaWR0aCA9IDg7IH07CisJCTY1NUVCMjlBMTBDRTI1ODEwMDFBOTkwRSAvKiBOb2Rlc0NvZGVn
ZW4uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTm9kZXNDb2RlZ2Vu
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNjU2MEE0Q0YwNEIzQjNFNzAwOEFF
OTUyIC8qIENvcmVGb3VuZGF0aW9uLmZyYW1ld29yayAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IHdyYXBwZXIuZnJhbWV3b3JrOyBuYW1lID0gQ29yZUZv
dW5kYXRpb24uZnJhbWV3b3JrOyBwYXRoID0gL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvQ29y
ZUZvdW5kYXRpb24uZnJhbWV3b3JrOyBzb3VyY2VUcmVlID0gIjxhYnNvbHV0ZT4iOyB9OwogCQk2
NTYyMUU2QjA4OUU4NTk3MDA3NjBGMzUgLyogUHJvcGVydHlTbG90LmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFByb3BlcnR5U2xvdC5j
cHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgfTsKIAkJNjU2MjFFNkMw
ODlFODU5NzAwNzYwRjM1IC8qIFByb3BlcnR5U2xvdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQcm9wZXJ0eVNsb3QuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB9OwpAQCAtMTM5MCw2ICsxMzkyLDcgQEAKIAkJCWlz
YSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCiAJCQkJOTY5QTA3MjAwRUQxQ0UzMzAwRjFG
NjgxIC8qIEJ5dGVjb2RlR2VuZXJhdG9yLmNwcCAqLywKKwkJCQk2NTVFQjI5QTEwQ0UyNTgxMDAx
QTk5MEUgLyogTm9kZXNDb2RlZ2VuLmNwcCAqLywKIAkJCQk5NjlBMDcyMTBFRDFDRTMzMDBGMUY2
ODEgLyogQnl0ZWNvZGVHZW5lcmF0b3IuaCAqLywKIAkJCQk5NjlBMDcyNzBFRDFDRTY5MDBGMUY2
ODEgLyogTGFiZWwuaCAqLywKIAkJCQk5NjAwOTdBNTBFQkFCQjU4MDA3QTcyOTcgLyogTGFiZWxT
Y29wZS5oICovLApAQCAtMjQ1NCw2ICsyNDU3LDcgQEAKIAkJCQkxNDI5REFFMTBFRDI2NDVCMDBC
ODk2MTkgLyogV1JFQ0dlbmVyYXRvci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkxNDI5REFDMDBF
RDI2M0U3MDBCODk2MTkgLyogV1JFQ1BhcnNlci5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBN0My
MjE3ODEwQzc0Nzk0MDBGOTc5MTMgLyogSlNab21iaWUuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJ
NjU1RUIyOUIxMENFMjU4MTAwMUE5OTBFIC8qIE5vZGVzQ29kZWdlbi5jcHAgaW4gU291cmNlcyAq
LywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJ
fTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3Bw
CShyZXZpc2lvbiA1MTgxNikJKGZyb20gSmF2YVNjcmlwdENvcmUvcGFyc2VyL05vZGVzLmNwcDo1
MTgxNikKKysrIEphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjEzNSBAQAorLyoKKyogIENvcHlyaWdodCAoQykgMTk5
OS0yMDAyIEhhcnJpIFBvcnRlbiAocG9ydGVuQGtkZS5vcmcpCisqICBDb3B5cmlnaHQgKEMpIDIw
MDEgUGV0ZXIgS2VsbHkgKHBta0Bwb3N0LmNvbSkKKyogIENvcHlyaWdodCAoQykgMjAwMywgMjAw
NCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisqICBDb3B5cmlnaHQgKEMpIDIwMDcgQ2FtZXJvbiBad2FyaWNoIChjd3p3YXJpY2hA
dXdhdGVybG9vLmNhKQorKiAgQ29weXJpZ2h0IChDKSAyMDA3IE1ha3MgT3Jsb3ZpY2gKKyogIENv
cHlyaWdodCAoQykgMjAwNyBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorKgorKiAgVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorKgorKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyogIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyoKKyovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJOb2Rlcy5oIgorI2luY2x1ZGUgIk5vZGVDb25zdHJ1Y3RvcnMu
aCIKKworI2luY2x1ZGUgIkJ5dGVjb2RlR2VuZXJhdG9yLmgiCisjaW5jbHVkZSAiQ2FsbEZyYW1l
LmgiCisjaW5jbHVkZSAiRGVidWdnZXIuaCIKKyNpbmNsdWRlICJKSVQuaCIKKyNpbmNsdWRlICJK
U0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKKyNpbmNsdWRlICJKU1N0
YXRpY1Njb3BlT2JqZWN0LmgiCisjaW5jbHVkZSAiTGFiZWxTY29wZS5oIgorI2luY2x1ZGUgIkxl
eGVyLmgiCisjaW5jbHVkZSAiT3BlcmF0aW9ucy5oIgorI2luY2x1ZGUgIlBhcnNlci5oIgorI2lu
Y2x1ZGUgIlByb3BlcnR5TmFtZUFycmF5LmgiCisjaW5jbHVkZSAiUmVnRXhwT2JqZWN0LmgiCisj
aW5jbHVkZSAiU2FtcGxpbmdUb29sLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZExlYWtDb3VudGVyLmg+CisjaW5jbHVkZSA8d3RmL1RocmVh
ZGluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV1RGOworCituYW1lc3BhY2UgSlNDIHsKKworLyoK
KyAgICBEZXRhaWxzIG9mIHRoZSBlbWl0Qnl0ZWNvZGUgZnVuY3Rpb24uCisKKyAgICBSZXR1cm4g
dmFsdWU6IFRoZSByZWdpc3RlciBob2xkaW5nIHRoZSBwcm9kdWN0aW9uJ3MgdmFsdWUuCisgICAg
ICAgICAgICAgZHN0OiBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgbW9zdCBl
ZmZpY2llbnQgZGVzdGluYXRpb24gYXQKKyAgICAgICAgICAgICAgICAgIHdoaWNoIHRvIHN0b3Jl
IHRoZSBwcm9kdWN0aW9uJ3MgdmFsdWUuIFRoZSBjYWxsZWUgbXVzdCBob25vciBkc3QuCisKKyAg
ICBUaGUgZHN0IGFyZ3VtZW50IHByb3ZpZGVzIGZvciBhIGNydWRlIGZvcm0gb2YgY29weSBwcm9w
YWdhdGlvbi4gRm9yIGV4YW1wbGUsCisKKyAgICAgICAgeCA9IDEKKworICAgIGJlY29tZXMKKyAg
ICAKKyAgICAgICAgbG9hZCByW3hdLCAxCisgICAgCisgICAgaW5zdGVhZCBvZiAKKworICAgICAg
ICBsb2FkIHIwLCAxCisgICAgICAgIG1vdiByW3hdLCByMAorICAgIAorICAgIGJlY2F1c2UgdGhl
IGFzc2lnbm1lbnQgbm9kZSwgInggPSIsIHBhc3NlcyByW3hdIGFzIGRzdCB0byB0aGUgbnVtYmVy
IG5vZGUsICIxIi4KKyovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaHJv
d2FibGVFeHByZXNzaW9uRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitz
dGF0aWMgdm9pZCBzdWJzdGl0dXRlKFVTdHJpbmcmIHN0cmluZywgY29uc3QgVVN0cmluZyYgc3Vi
c3RyaW5nKQoreworICAgIGludCBwb3NpdGlvbiA9IHN0cmluZy5maW5kKCIlcyIpOworICAgIEFT
U0VSVChwb3NpdGlvbiAhPSAtMSk7CisgICAgVVN0cmluZyBuZXdTdHJpbmcgPSBzdHJpbmcuc3Vi
c3RyKDAsIHBvc2l0aW9uKTsKKyAgICBuZXdTdHJpbmcuYXBwZW5kKHN1YnN0cmluZyk7CisgICAg
bmV3U3RyaW5nLmFwcGVuZChzdHJpbmcuc3Vic3RyKHBvc2l0aW9uICsgMikpOworICAgIHN0cmlu
ZyA9IG5ld1N0cmluZzsKK30KKworUmVnaXN0ZXJJRCogVGhyb3dhYmxlRXhwcmVzc2lvbkRhdGE6
OmVtaXRUaHJvd0Vycm9yKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIEVycm9yVHlwZSB0
eXBlLCBjb25zdCBjaGFyKiBtZXNzYWdlKQoreworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lv
bkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIFJlZ2lzdGVy
SUQqIGV4Y2VwdGlvbiA9IGdlbmVyYXRvci5lbWl0TmV3RXJyb3IoZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpLCB0eXBlLCBqc1N0cmluZyhnZW5lcmF0b3IuZ2xvYmFsRGF0YSgpLCBtZXNzYWdlKSk7
CisgICAgZ2VuZXJhdG9yLmVtaXRUaHJvdyhleGNlcHRpb24pOworICAgIHJldHVybiBleGNlcHRp
b247Cit9CisKK1JlZ2lzdGVySUQqIFRocm93YWJsZUV4cHJlc3Npb25EYXRhOjplbWl0VGhyb3dF
cnJvcihCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBFcnJvclR5cGUgdHlwZSwgY29uc3Qg
Y2hhciogbWVzc2FnZVRlbXBsYXRlLCBjb25zdCBVU3RyaW5nJiBsYWJlbCkKK3sKKyAgICBVU3Ry
aW5nIG1lc3NhZ2UgPSBtZXNzYWdlVGVtcGxhdGU7CisgICAgc3Vic3RpdHV0ZShtZXNzYWdlLCBs
YWJlbCk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9m
ZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgUmVnaXN0ZXJJRCogZXhjZXB0aW9uID0gZ2VuZXJh
dG9yLmVtaXROZXdFcnJvcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHR5cGUsIGpzU3RyaW5n
KGdlbmVyYXRvci5nbG9iYWxEYXRhKCksIG1lc3NhZ2UpKTsKKyAgICBnZW5lcmF0b3IuZW1pdFRo
cm93KGV4Y2VwdGlvbik7CisgICAgcmV0dXJuIGV4Y2VwdGlvbjsKK30KKworaW5saW5lIFJlZ2lz
dGVySUQqIFRocm93YWJsZUV4cHJlc3Npb25EYXRhOjplbWl0VGhyb3dFcnJvcihCeXRlY29kZUdl
bmVyYXRvciYgZ2VuZXJhdG9yLCBFcnJvclR5cGUgdHlwZSwgY29uc3QgY2hhciogbWVzc2FnZVRl
bXBsYXRlLCBjb25zdCBJZGVudGlmaWVyJiBsYWJlbCkKK3sKKyAgICByZXR1cm4gZW1pdFRocm93
RXJyb3IoZ2VuZXJhdG9yLCB0eXBlLCBtZXNzYWdlVGVtcGxhdGUsIGxhYmVsLnVzdHJpbmcoKSk7
Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0ZW1lbnROb2RlIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgU3RhdGVtZW50Tm9kZTo6c2V0
TG9jKGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSkKK3sKKyAgICBtX2xpbmUgPSBmaXJzdExp
bmU7CisgICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gU291cmNlRWxlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KKwordm9pZCBTb3VyY2VFbGVtZW50czo6YXBwZW5kKFN0YXRlbWVudE5vZGUqIHN0YXRl
bWVudCkKK3sKKyAgICBpZiAoc3RhdGVtZW50LT5pc0VtcHR5U3RhdGVtZW50KCkpCisgICAgICAg
IHJldHVybjsKKyAgICBtX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCk7Cit9CisKK2lubGlu
ZSBTdGF0ZW1lbnROb2RlKiBTb3VyY2VFbGVtZW50czo6c2luZ2xlU3RhdGVtZW50KCkgY29uc3QK
K3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fc3RhdGVtZW50cy5zaXplKCk7CisgICAgcmV0dXJuIHNp
emUgPT0gMSA/IG1fc3RhdGVtZW50c1swXSA6IDA7Cit9CisKK2lubGluZSBTdGF0ZW1lbnROb2Rl
KiBTb3VyY2VFbGVtZW50czo6bGFzdFN0YXRlbWVudCgpIGNvbnN0Cit7CisgICAgc2l6ZV90IHNp
emUgPSBtX3N0YXRlbWVudHMuc2l6ZSgpOworICAgIHJldHVybiBzaXplID8gbV9zdGF0ZW1lbnRz
W3NpemUgLSAxXSA6IDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBO
dWxsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVy
SUQqIE51bGxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQoreworICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0TG9hZChk
c3QsIGpzTnVsbCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJv
b2xlYW5Ob2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJ
RCogQm9vbGVhbk5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJl
c3VsdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2Fk
KGRzdCwgbV92YWx1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBO
dW1iZXJOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVy
SUQqIE51bWJlck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJl
c3VsdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2Fk
KGRzdCwgbV92YWx1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBT
dHJpbmdOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVy
SUQqIFN0cmluZ05vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJl
c3VsdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2Fk
KGRzdCwgbV92YWx1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBS
ZWdFeHBOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVy
SUQqIFJlZ0V4cE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJlZ0V4cD4gcmVnRXhwID0gUmVnRXhw
OjpjcmVhdGUoZ2VuZXJhdG9yLmdsb2JhbERhdGEoKSwgbV9wYXR0ZXJuLnVzdHJpbmcoKSwgbV9m
bGFncy51c3RyaW5nKCkpOworICAgIGlmICghcmVnRXhwLT5pc1ZhbGlkKCkpCisgICAgICAgIHJl
dHVybiBlbWl0VGhyb3dFcnJvcihnZW5lcmF0b3IsIFN5bnRheEVycm9yLCAiSW52YWxpZCByZWd1
bGFyIGV4cHJlc3Npb246ICVzIiwgcmVnRXhwLT5lcnJvck1lc3NhZ2UoKSk7CisgICAgaWYgKGRz
dCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBy
ZXR1cm4gZ2VuZXJhdG9yLmVtaXROZXdSZWdFeHAoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24o
ZHN0KSwgcmVnRXhwLmdldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIFRoaXNOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVn
aXN0ZXJJRCogVGhpc05vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJh
dG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3Jl
ZFJlc3VsdCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVU
b0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBnZW5lcmF0b3IudGhpc1JlZ2lzdGVyKCkpOworfQor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzb2x2ZU5vZGUgLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitib29sIFJlc29sdmVOb2RlOjppc1B1cmUoQnl0
ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QKK3sKKyAgICByZXR1cm4gZ2VuZXJhdG9y
LmlzTG9jYWwobV9pZGVudCk7Cit9CisKK1JlZ2lzdGVySUQqIFJlc29sdmVOb2RlOjplbWl0Qnl0
ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQorewor
ICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50
KSkgeworICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5h
dGlvbklmTmVlZGVkKGRzdCwgbG9jYWwpOworICAgIH0KKyAgICAKKyAgICBnZW5lcmF0b3IuZW1p
dEV4cHJlc3Npb25JbmZvKG1fc3RhcnRPZmZzZXQgKyBtX2lkZW50LnNpemUoKSwgbV9pZGVudC5z
aXplKCksIDApOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJlc29sdmUoZ2VuZXJhdG9yLmZp
bmFsRGVzdGluYXRpb24oZHN0KSwgbV9pZGVudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLSBBcnJheU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCisKK1JlZ2lzdGVySUQqIEFycmF5Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICAvLyBGSVhNRTogU2hvdWxk
IHdlIHB1dCBhbGwgb2YgdGhpcyBjb2RlIGludG8gZW1pdE5ld0FycmF5PworCisgICAgdW5zaWdu
ZWQgbGVuZ3RoID0gMDsKKyAgICBFbGVtZW50Tm9kZSogZmlyc3RQdXRFbGVtZW50OworICAgIGZv
ciAoZmlyc3RQdXRFbGVtZW50ID0gbV9lbGVtZW50OyBmaXJzdFB1dEVsZW1lbnQ7IGZpcnN0UHV0
RWxlbWVudCA9IGZpcnN0UHV0RWxlbWVudC0+bmV4dCgpKSB7CisgICAgICAgIGlmIChmaXJzdFB1
dEVsZW1lbnQtPmVsaXNpb24oKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICArK2xlbmd0
aDsKKyAgICB9CisKKyAgICBpZiAoIWZpcnN0UHV0RWxlbWVudCAmJiAhbV9lbGlzaW9uKQorICAg
ICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXROZXdBcnJheShnZW5lcmF0b3IuZmluYWxEZXN0aW5h
dGlvbihkc3QpLCBtX2VsZW1lbnQpOworCisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGFycmF5ID0g
Z2VuZXJhdG9yLmVtaXROZXdBcnJheShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIG1f
ZWxlbWVudCk7CisKKyAgICBmb3IgKEVsZW1lbnROb2RlKiBuID0gZmlyc3RQdXRFbGVtZW50OyBu
OyBuID0gbi0+bmV4dCgpKSB7CisgICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9y
LmVtaXROb2RlKG4tPnZhbHVlKCkpOworICAgICAgICBsZW5ndGggKz0gbi0+ZWxpc2lvbigpOwor
ICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SW5kZXgoYXJyYXkuZ2V0KCksIGxlbmd0aCsrLCB2
YWx1ZSk7CisgICAgfQorCisgICAgaWYgKG1fZWxpc2lvbikgeworICAgICAgICBSZWdpc3RlcklE
KiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0TG9hZCgwLCBqc051bWJlcihnZW5lcmF0b3IuZ2xvYmFs
RGF0YSgpLCBtX2VsaXNpb24gKyBsZW5ndGgpKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRC
eUlkKGFycmF5LmdldCgpLCBnZW5lcmF0b3IucHJvcGVydHlOYW1lcygpLmxlbmd0aCwgdmFsdWUp
OworICAgIH0KKworICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRl
ZChkc3QsIGFycmF5LmdldCgpKTsKK30KKworYm9vbCBBcnJheU5vZGU6OmlzU2ltcGxlQXJyYXko
KSBjb25zdAoreworICAgIGlmIChtX2VsaXNpb24gfHwgbV9vcHRpb25hbCkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIGZvciAoRWxlbWVudE5vZGUqIHB0ciA9IG1fZWxlbWVudDsgcHRyOyBw
dHIgPSBwdHItPm5leHQoKSkgeworICAgICAgICBpZiAocHRyLT5lbGlzaW9uKCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitBcmd1bWVu
dExpc3ROb2RlKiBBcnJheU5vZGU6OnRvQXJndW1lbnRMaXN0KEpTR2xvYmFsRGF0YSogZ2xvYmFs
RGF0YSkgY29uc3QKK3sKKyAgICBBU1NFUlQoIW1fZWxpc2lvbiAmJiAhbV9vcHRpb25hbCk7Cisg
ICAgRWxlbWVudE5vZGUqIHB0ciA9IG1fZWxlbWVudDsKKyAgICBpZiAoIXB0cikKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgQXJndW1lbnRMaXN0Tm9kZSogaGVhZCA9IG5ldyAoZ2xvYmFsRGF0YSkg
QXJndW1lbnRMaXN0Tm9kZShnbG9iYWxEYXRhLCBwdHItPnZhbHVlKCkpOworICAgIEFyZ3VtZW50
TGlzdE5vZGUqIHRhaWwgPSBoZWFkOworICAgIHB0ciA9IHB0ci0+bmV4dCgpOworICAgIGZvciAo
OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCgpKSB7CisgICAgICAgIEFTU0VSVCghcHRyLT5lbGlzaW9u
KCkpOworICAgICAgICB0YWlsID0gbmV3IChnbG9iYWxEYXRhKSBBcmd1bWVudExpc3ROb2RlKGds
b2JhbERhdGEsIHRhaWwsIHB0ci0+dmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBoZWFkOwor
fQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT2JqZWN0TGl0ZXJhbE5vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBPYmplY3RMaXRlcmFs
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKK3sKKyAgICAgaWYgKCFtX2xpc3QpIHsKKyAgICAgICAgIGlmIChkc3QgPT0gZ2Vu
ZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
IHJldHVybiBnZW5lcmF0b3IuZW1pdE5ld09iamVjdChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlv
bihkc3QpKTsKKyAgICAgfQorICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9s
aXN0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb3BlcnR5TGlz
dE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogUHJvcGVy
dHlMaXN0Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJl
Z2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gbmV3T2JqID0gZ2VuZXJh
dG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpOworICAgIAorICAgIGdlbmVyYXRvci5lbWl0TmV3T2Jq
ZWN0KG5ld09iai5nZXQoKSk7CisgICAgCisgICAgZm9yIChQcm9wZXJ0eUxpc3ROb2RlKiBwID0g
dGhpczsgcDsgcCA9IHAtPm1fbmV4dCkgeworICAgICAgICBSZWdpc3RlcklEKiB2YWx1ZSA9IGdl
bmVyYXRvci5lbWl0Tm9kZShwLT5tX25vZGUtPm1fYXNzaWduKTsKKyAgICAgICAgCisgICAgICAg
IHN3aXRjaCAocC0+bV9ub2RlLT5tX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUHJvcGVydHlO
b2RlOjpDb25zdGFudDogeworICAgICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChu
ZXdPYmouZ2V0KCksIHAtPm1fbm9kZS0+bmFtZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFByb3BlcnR5Tm9kZTo6R2V0
dGVyOiB7CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRHZXR0ZXIobmV3T2JqLmdl
dCgpLCBwLT5tX25vZGUtPm5hbWUoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBQcm9wZXJ0eU5vZGU6OlNldHRlcjogewor
ICAgICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2V0dGVyKG5ld09iai5nZXQoKSwgcC0+
bV9ub2RlLT5uYW1lKCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGdlbmVyYXRvci5t
b3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbmV3T2JqLmdldCgpKTsKK30KKworLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJyYWNrZXRBY2Nlc3Nvck5vZGUgLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogQnJhY2tldEFjY2Vzc29yTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9k
ZUZvckxlZnRIYW5kU2lkZShtX2Jhc2UsIG1fc3Vic2NyaXB0SGFzQXNzaWdubWVudHMsIG1fc3Vi
c2NyaXB0LT5pc1B1cmUoZ2VuZXJhdG9yKSk7CisgICAgUmVnaXN0ZXJJRCogcHJvcGVydHkgPSBn
ZW5lcmF0b3IuZW1pdE5vZGUobV9zdWJzY3JpcHQpOworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVz
c2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIHJldHVy
biBnZW5lcmF0b3IuZW1pdEdldEJ5VmFsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCks
IGJhc2UuZ2V0KCksIHByb3BlcnR5KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIERvdEFjY2Vzc29yTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
CitSZWdpc3RlcklEKiBEb3RBY2Nlc3Nvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVnaXN0ZXJJRCogYmFz
ZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVz
c2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIHJldHVy
biBnZW5lcmF0b3IuZW1pdEdldEJ5SWQoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwg
YmFzZSwgbV9pZGVudCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBB
cmd1bWVudExpc3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVy
SUQqIEFyZ3VtZW50TGlzdE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgQVNTRVJUKG1fZXhwcik7CisgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fZXhwcik7Cit9CisKKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBOZXdFeHByTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIE5ld0V4cHJOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7CisgICAgcmV0dXJu
IGdlbmVyYXRvci5lbWl0Q29uc3RydWN0KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCks
IGZ1bmMuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkp
OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZhbEZ1bmN0aW9uQ2Fs
bE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBF
dmFsRnVuY3Rpb25DYWxsTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5l
cmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9
IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
dGhpc1JlZ2lzdGVyID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgIGdlbmVyYXRvci5l
bWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIHN0YXJ0T2Zmc2V0KCkgKyA0LCA0LCAwKTsKKyAg
ICBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZSh0aGlzUmVnaXN0ZXIuZ2V0KCksIGZ1bmMu
Z2V0KCksIGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkuZXZhbCk7CisgICAgcmV0dXJuIGdlbmVy
YXRvci5lbWl0Q2FsbEV2YWwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBmdW5jLmdl
dCgpKSwgZnVuYy5nZXQoKSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MsIGRpdm90KCksIHN0
YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tIEZ1bmN0aW9uQ2FsbFZhbHVlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIEZ1bmN0aW9uQ2FsbFZhbHVlTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOwor
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0b3IuZW1pdExvYWQo
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBqc051bGwoKSk7CisgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGZ1bmMuZ2V0KCkpLCBm
dW5jLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZz
ZXQoKSwgZW5kT2Zmc2V0KCkpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gRnVuY3Rpb25DYWxsUmVzb2x2ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorCitSZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2Rl
KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBp
ZiAoUmVmUHRyPFJlZ2lzdGVySUQ+IGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRl
bnQpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0
b3IuZW1pdExvYWQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBqc051bGwoKSk7CisgICAgICAg
IHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0
LCB0aGlzUmVnaXN0ZXIuZ2V0KCkpLCBsb2NhbC5nZXQoKSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBt
X2FyZ3MsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICB9CisKKyAg
ICBpbnQgaW5kZXggPSAwOworICAgIHNpemVfdCBkZXB0aCA9IDA7CisgICAgSlNPYmplY3QqIGds
b2JhbE9iamVjdCA9IDA7CisgICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVydHkobV9p
ZGVudCwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNz
aW5nU3ltYm9sTWFya2VyKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMgPSBn
ZW5lcmF0b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGRlcHRo
LCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRoaXNS
ZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TG9hZChnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGpz
TnVsbCgpKTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmlu
YWxEZXN0aW5hdGlvbihkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgpLCB0aGlzUmVnaXN0ZXIu
Z2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAg
IH0KKworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFy
eSgpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0b3IubmV3
VGVtcG9yYXJ5KCk7CisgICAgaW50IGlkZW50aWZpZXJTdGFydCA9IGRpdm90KCkgLSBzdGFydE9m
ZnNldCgpOworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oaWRlbnRpZmllclN0YXJ0
ICsgbV9pZGVudC5zaXplKCksIG1faWRlbnQuc2l6ZSgpLCAwKTsKKyAgICBnZW5lcmF0b3IuZW1p
dFJlc29sdmVXaXRoQmFzZSh0aGlzUmVnaXN0ZXIuZ2V0KCksIGZ1bmMuZ2V0KCksIG1faWRlbnQp
OworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0LCBmdW5jLmdldCgpKSwgZnVuYy5nZXQoKSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBtX2Fy
Z3MsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKK30KKworLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmN0aW9uQ2FsbEJyYWNrZXROb2RlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogRnVuY3Rpb25DYWxsQnJh
Y2tldE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdp
c3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3Iu
ZW1pdE5vZGUobV9iYXNlKTsKKyAgICBSZWdpc3RlcklEKiBwcm9wZXJ0eSA9IGdlbmVyYXRvci5l
bWl0Tm9kZShtX3N1YnNjcmlwdCk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhk
aXZvdCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIHN0YXJ0T2Zmc2V0KCkgLSBtX3N1
YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHByZXNzaW9uRW5kT2Zmc2V0KTsKKyAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gZnVuY3Rpb24gPSBnZW5lcmF0b3IuZW1pdEdldEJ5VmFsKGdlbmVy
YXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSwgcHJvcGVydHkpOworICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0b3IuZW1pdE1vdmUoZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpLCBiYXNlLmdldCgpKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVt
aXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgZnVuY3Rpb24uZ2V0KCkpLCBm
dW5jdGlvbi5nZXQoKSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MsIGRpdm90KCksIHN0YXJ0
T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIEZ1bmN0aW9uQ2FsbERvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorCitSZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxEb3ROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0
ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIFJlZlB0
cjxSZWdpc3RlcklEPiBmdW5jdGlvbiA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsK
KyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVyID0gZ2VuZXJhdG9yLm5ld1RlbXBv
cmFyeSgpOworICAgIGdlbmVyYXRvci5lbWl0Tm9kZSh0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYmFz
ZSk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gbV9zdWJleHBy
ZXNzaW9uRGl2b3RPZmZzZXQsIHN0YXJ0T2Zmc2V0KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9m
ZnNldCwgbV9zdWJleHByZXNzaW9uRW5kT2Zmc2V0KTsKKyAgICBnZW5lcmF0b3IuZW1pdE1ldGhv
ZENoZWNrKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGZ1bmN0aW9uLmdldCgpLCB0aGlz
UmVnaXN0ZXIuZ2V0KCksIG1faWRlbnQpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwo
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBmdW5jdGlvbi5nZXQoKSksIGZ1bmN0aW9u
LmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZzZXQo
KSwgZW5kT2Zmc2V0KCkpOworfQorCitSZWdpc3RlcklEKiBDYWxsRnVuY3Rpb25DYWxsRG90Tm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKK3sKKyAgICBSZWZQdHI8TGFiZWw+IHJlYWxDYWxsID0gZ2VuZXJhdG9yLm5ld0xhYmVs
KCk7CisgICAgUmVmUHRyPExhYmVsPiBlbmQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBS
ZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOworICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIG1fc3ViZXhwcmVzc2lvbkRp
dm90T2Zmc2V0LCBzdGFydE9mZnNldCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIG1f
c3ViZXhwcmVzc2lvbkVuZE9mZnNldCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmN0aW9u
ID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwg
YmFzZS5nZXQoKSwgbV9pZGVudCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZpbmFsRGVzdGlu
YXRpb24gPSBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGZ1bmN0aW9uLmdldCgpKTsK
KyAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZk5vdEZ1bmN0aW9uQ2FsbChmdW5jdGlvbi5nZXQoKSwg
cmVhbENhbGwuZ2V0KCkpOworICAgIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHJlYWxG
dW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRz
dCksIGJhc2UuZ2V0KCkpOworICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVy
ID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgICAgICBBcmd1bWVudExpc3ROb2RlKiBv
bGRMaXN0ID0gbV9hcmdzLT5tX2xpc3ROb2RlOworICAgICAgICBpZiAobV9hcmdzLT5tX2xpc3RO
b2RlICYmIG1fYXJncy0+bV9saXN0Tm9kZS0+bV9leHByKSB7CisgICAgICAgICAgICBnZW5lcmF0
b3IuZW1pdE5vZGUodGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MtPm1fbGlzdE5vZGUtPm1fZXhw
cik7CisgICAgICAgICAgICBtX2FyZ3MtPm1fbGlzdE5vZGUgPSBtX2FyZ3MtPm1fbGlzdE5vZGUt
Pm1fbmV4dDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdExvYWQo
dGhpc1JlZ2lzdGVyLmdldCgpLCBqc051bGwoKSk7CisKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRD
YWxsKGZpbmFsRGVzdGluYXRpb24uZ2V0KCksIHJlYWxGdW5jdGlvbi5nZXQoKSwgdGhpc1JlZ2lz
dGVyLmdldCgpLCBtX2FyZ3MsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsK
KyAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGVuZC5nZXQoKSk7CisgICAgICAgIG1fYXJncy0+
bV9saXN0Tm9kZSA9IG9sZExpc3Q7CisgICAgfQorICAgIGdlbmVyYXRvci5lbWl0TGFiZWwocmVh
bENhbGwuZ2V0KCkpOworICAgIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRoaXNSZWdp
c3RlciA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIGJhc2Uu
Z2V0KCkpOworICAgICAgICBnZW5lcmF0b3IuZW1pdENhbGwoZmluYWxEZXN0aW5hdGlvbi5nZXQo
KSwgZnVuY3Rpb24uZ2V0KCksIHRoaXNSZWdpc3Rlci5nZXQoKSwgbV9hcmdzLCBkaXZvdCgpLCBz
dGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgfQorICAgIGdlbmVyYXRvci5lbWl0TGFi
ZWwoZW5kLmdldCgpKTsKKyAgICByZXR1cm4gZmluYWxEZXN0aW5hdGlvbi5nZXQoKTsKK30KKyAg
ICAKK3N0YXRpYyBib29sIGFyZVRyaXZpYWxBcHBseUFyZ3VtZW50cyhBcmd1bWVudHNOb2RlKiBh
cmdzKQoreworICAgIHJldHVybiAhYXJncy0+bV9saXN0Tm9kZSB8fCAhYXJncy0+bV9saXN0Tm9k
ZS0+bV9leHByIHx8ICFhcmdzLT5tX2xpc3ROb2RlLT5tX25leHQKKyAgICAgICAgfHwgKCFhcmdz
LT5tX2xpc3ROb2RlLT5tX25leHQtPm1fbmV4dCAmJiBhcmdzLT5tX2xpc3ROb2RlLT5tX25leHQt
Pm1fZXhwci0+aXNTaW1wbGVBcnJheSgpKTsKK30KKworUmVnaXN0ZXJJRCogQXBwbHlGdW5jdGlv
bkNhbGxEb3ROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQoreworICAgIC8vIEEgZmV3IHNpbXBsZSBjYXNlcyBjYW4gYmUgdHJp
dmlhbGx5IGhhbmRsZWQgYXMgb3JkaW5hcnkgZnVuY3Rpb24gY2FsbHMuCisgICAgLy8gZnVuY3Rp
b24uYXBwbHkoKSwgZnVuY3Rpb24uYXBwbHkoYXJnKSAtPiBpZGVudGljYWwgdG8gZnVuY3Rpb24u
Y2FsbAorICAgIC8vIGZ1bmN0aW9uLmFwcGx5KHRoaXNBcmcsIFthcmcwLCBhcmcxLCAuLi5dKSAt
PiBjYW4gYmUgdHJpdmlhbGx5IGNvZXJjZWQgaW50byBmdW5jdGlvbi5jYWxsKHRoaXNBcmcsIGFy
ZzAsIGFyZzEsIC4uLikgYW5kIHNhdmVzIG9iamVjdCBhbGxvY2F0aW9uCisgICAgYm9vbCBtYXlC
ZUNhbGwgPSBhcmVUcml2aWFsQXBwbHlBcmd1bWVudHMobV9hcmdzKTsKKworICAgIFJlZlB0cjxM
YWJlbD4gcmVhbENhbGwgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBSZWZQdHI8TGFiZWw+
IGVuZCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNl
ID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fYmFzZSk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNz
aW9uSW5mbyhkaXZvdCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIHN0YXJ0T2Zmc2V0
KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHByZXNzaW9uRW5kT2Zmc2V0
KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuY3Rpb24gPSBnZW5lcmF0b3IuZW1pdEdldEJ5
SWQoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBiYXNlLmdldCgpLCBtX2lkZW50KTsK
KyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZmluYWxEZXN0aW5hdGlvbiA9IGdlbmVyYXRvci5maW5h
bERlc3RpbmF0aW9uKGRzdCwgZnVuY3Rpb24uZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0SnVt
cElmTm90RnVuY3Rpb25BcHBseShmdW5jdGlvbi5nZXQoKSwgcmVhbENhbGwuZ2V0KCkpOworICAg
IHsKKyAgICAgICAgaWYgKG1heUJlQ2FsbCkgeworICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVy
SUQ+IHJlYWxGdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IudGVtcERlc3Rp
bmF0aW9uKGRzdCksIGJhc2UuZ2V0KCkpOworICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKKyAgICAgICAgICAgIEFy
Z3VtZW50TGlzdE5vZGUqIG9sZExpc3QgPSBtX2FyZ3MtPm1fbGlzdE5vZGU7CisgICAgICAgICAg
ICBpZiAobV9hcmdzLT5tX2xpc3ROb2RlICYmIG1fYXJncy0+bV9saXN0Tm9kZS0+bV9leHByKSB7
CisgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKHRoaXNSZWdpc3Rlci5nZXQoKSwg
bV9hcmdzLT5tX2xpc3ROb2RlLT5tX2V4cHIpOworICAgICAgICAgICAgICAgIG1fYXJncy0+bV9s
aXN0Tm9kZSA9IG1fYXJncy0+bV9saXN0Tm9kZS0+bV9uZXh0OworICAgICAgICAgICAgICAgIGlm
IChtX2FyZ3MtPm1fbGlzdE5vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUKG1fYXJn
cy0+bV9saXN0Tm9kZS0+bV9leHByLT5pc1NpbXBsZUFycmF5KCkpOworICAgICAgICAgICAgICAg
ICAgICBBU1NFUlQoIW1fYXJncy0+bV9saXN0Tm9kZS0+bV9uZXh0KTsKKyAgICAgICAgICAgICAg
ICAgICAgbV9hcmdzLT5tX2xpc3ROb2RlID0gc3RhdGljX2Nhc3Q8QXJyYXlOb2RlKj4obV9hcmdz
LT5tX2xpc3ROb2RlLT5tX2V4cHIpLT50b0FyZ3VtZW50TGlzdChnZW5lcmF0b3IuZ2xvYmFsRGF0
YSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
ICAgICBnZW5lcmF0b3IuZW1pdExvYWQodGhpc1JlZ2lzdGVyLmdldCgpLCBqc051bGwoKSk7Cisg
ICAgICAgICAgICBnZW5lcmF0b3IuZW1pdENhbGwoZmluYWxEZXN0aW5hdGlvbi5nZXQoKSwgcmVh
bEZ1bmN0aW9uLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3Rh
cnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgICAgICAgICAgbV9hcmdzLT5tX2xpc3ROb2Rl
ID0gb2xkTGlzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVChtX2FyZ3Mt
Pm1fbGlzdE5vZGUgJiYgbV9hcmdzLT5tX2xpc3ROb2RlLT5tX25leHQpOworICAgICAgICAgICAg
UmVmUHRyPFJlZ2lzdGVySUQ+IHJlYWxGdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCksIGJhc2UuZ2V0KCkpOworICAgICAgICAgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGFyZ3NDb3VudFJlZ2lzdGVyID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwor
ICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5u
ZXdUZW1wb3JhcnkoKTsKKyAgICAgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBhcmdzUmVnaXN0
ZXIgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7CisgICAgICAgICAgICBnZW5lcmF0b3IuZW1p
dE5vZGUodGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MtPm1fbGlzdE5vZGUtPm1fZXhwcik7Cisg
ICAgICAgICAgICBBcmd1bWVudExpc3ROb2RlKiBhcmdzID0gbV9hcmdzLT5tX2xpc3ROb2RlLT5t
X25leHQ7CisgICAgICAgICAgICBib29sIGlzQXJndW1lbnRzQXBwbHkgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGlmIChhcmdzLT5tX2V4cHItPmlzUmVzb2x2ZU5vZGUoKSkgeworICAgICAgICAgICAg
ICAgIFJlc29sdmVOb2RlKiByZXNvbHZlTm9kZSA9IHN0YXRpY19jYXN0PFJlc29sdmVOb2RlKj4o
YXJncy0+bV9leHByKTsKKyAgICAgICAgICAgICAgICBpc0FyZ3VtZW50c0FwcGx5ID0gZ2VuZXJh
dG9yLndpbGxSZXNvbHZlVG9Bcmd1bWVudHMocmVzb2x2ZU5vZGUtPmlkZW50aWZpZXIoKSk7Cisg
ICAgICAgICAgICAgICAgaWYgKGlzQXJndW1lbnRzQXBwbHkpCisgICAgICAgICAgICAgICAgICAg
IGdlbmVyYXRvci5lbWl0TW92ZShhcmdzUmVnaXN0ZXIuZ2V0KCksIGdlbmVyYXRvci51bmNoZWNr
ZWRSZWdpc3RlckZvckFyZ3VtZW50cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICghaXNBcmd1bWVudHNBcHBseSkKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUo
YXJnc1JlZ2lzdGVyLmdldCgpLCBhcmdzLT5tX2V4cHIpOworICAgICAgICAgICAgd2hpbGUgKChh
cmdzID0gYXJncy0+bV9uZXh0KSkKKyAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUo
YXJncy0+bV9leHByKTsKKworICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRMb2FkVmFyYXJncyhh
cmdzQ291bnRSZWdpc3Rlci5nZXQoKSwgYXJnc1JlZ2lzdGVyLmdldCgpKTsKKyAgICAgICAgICAg
IGdlbmVyYXRvci5lbWl0Q2FsbFZhcmFyZ3MoZmluYWxEZXN0aW5hdGlvbi5nZXQoKSwgcmVhbEZ1
bmN0aW9uLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIGFyZ3NDb3VudFJlZ2lzdGVyLmdldCgp
LCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgICAgIH0KKyAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGVuZC5nZXQoKSk7CisgICAgfQorICAgIGdlbmVyYXRvci5l
bWl0TGFiZWwocmVhbENhbGwuZ2V0KCkpOworICAgIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVy
SUQ+IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IubmV3VGVtcG9y
YXJ5KCksIGJhc2UuZ2V0KCkpOworICAgICAgICBnZW5lcmF0b3IuZW1pdENhbGwoZmluYWxEZXN0
aW5hdGlvbi5nZXQoKSwgZnVuY3Rpb24uZ2V0KCksIHRoaXNSZWdpc3Rlci5nZXQoKSwgbV9hcmdz
LCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgfQorICAgIGdlbmVy
YXRvci5lbWl0TGFiZWwoZW5kLmdldCgpKTsKKyAgICByZXR1cm4gZmluYWxEZXN0aW5hdGlvbi5n
ZXQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBvc3RmaXhSZXNv
bHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBSZWdp
c3RlcklEKiBlbWl0UHJlSW5jT3JEZWMoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCogc3JjRHN0LCBPcGVyYXRvciBvcGVyKQoreworICAgIHJldHVybiAob3BlciA9PSBP
cFBsdXNQbHVzKSA/IGdlbmVyYXRvci5lbWl0UHJlSW5jKHNyY0RzdCkgOiBnZW5lcmF0b3IuZW1p
dFByZURlYyhzcmNEc3QpOworfQorCitzdGF0aWMgUmVnaXN0ZXJJRCogZW1pdFBvc3RJbmNPckRl
YyhCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVy
SUQqIHNyY0RzdCwgT3BlcmF0b3Igb3BlcikKK3sKKyAgICBpZiAoc3JjRHN0ID09IGRzdCkKKyAg
ICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VG9KU051bWJlcihkc3QsIHNyY0RzdCk7CisgICAg
cmV0dXJuIChvcGVyID09IE9wUGx1c1BsdXMpID8gZ2VuZXJhdG9yLmVtaXRQb3N0SW5jKGRzdCwg
c3JjRHN0KSA6IGdlbmVyYXRvci5lbWl0UG9zdERlYyhkc3QsIHNyY0RzdCk7Cit9CisKK1JlZ2lz
dGVySUQqIFBvc3RmaXhSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9y
JiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9j
YWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKKyAgICAgICAgaWYgKGdlbmVy
YXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkpIHsKKyAgICAgICAgICAgIGlmIChkc3QgPT0g
Z2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFRvSlNOdW1iZXIoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRzdCA9
PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQorICAgICAgICAgICAgcmV0dXJuIGVtaXRQcmVJ
bmNPckRlYyhnZW5lcmF0b3IsIGxvY2FsLCBtX29wZXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIGVt
aXRQb3N0SW5jT3JEZWMoZ2VuZXJhdG9yLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qp
LCBsb2NhbCwgbV9vcGVyYXRvcik7CisgICAgfQorCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBz
aXplX3QgZGVwdGggPSAwOworICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOworICAgIGlm
IChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1
ZSwgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkpIHsKKyAg
ICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRHZXRTY29wZWRW
YXIoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBkZXB0aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7
CisgICAgICAgIFJlZ2lzdGVySUQqIG9sZFZhbHVlOworICAgICAgICBpZiAoZHN0ID09IGdlbmVy
YXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKKyAgICAgICAgICAgIG9sZFZhbHVlID0gMDsKKyAgICAg
ICAgICAgIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIHZhbHVlLmdldCgpLCBtX29wZXJhdG9y
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9sZFZhbHVlID0gZW1pdFBvc3RJbmNP
ckRlYyhnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHZhbHVlLmdl
dCgpLCBtX29wZXJhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dFNj
b3BlZFZhcihkZXB0aCwgaW5kZXgsIHZhbHVlLmdldCgpLCBnbG9iYWxPYmplY3QpOworICAgICAg
ICByZXR1cm4gb2xkVmFsdWU7CisgICAgfQorCisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9u
SW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IHZhbHVlID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlV2l0aEJhc2UoZ2VuZXJhdG9y
Lm5ld1RlbXBvcmFyeSgpLCB2YWx1ZS5nZXQoKSwgbV9pZGVudCk7CisgICAgUmVnaXN0ZXJJRCog
b2xkVmFsdWU7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7Cisg
ICAgICAgIG9sZFZhbHVlID0gMDsKKyAgICAgICAgZW1pdFByZUluY09yRGVjKGdlbmVyYXRvciwg
dmFsdWUuZ2V0KCksIG1fb3BlcmF0b3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9sZFZhbHVl
ID0gZW1pdFBvc3RJbmNPckRlYyhnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9u
KGRzdCksIHZhbHVlLmdldCgpLCBtX29wZXJhdG9yKTsKKyAgICB9CisgICAgZ2VuZXJhdG9yLmVt
aXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHZhbHVlLmdldCgpKTsKKyAgICByZXR1cm4g
b2xkVmFsdWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3N0Zml4
QnJhY2tldE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3Rl
cklEKiBQb3N0Zml4QnJhY2tldE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJh
c2UgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9iYXNlKTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
cHJvcGVydHkgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9zdWJzY3JpcHQpOworCisgICAgZ2VuZXJh
dG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZz
ZXQsIHN0YXJ0T2Zmc2V0KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHBy
ZXNzaW9uRW5kT2Zmc2V0KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0
b3IuZW1pdEdldEJ5VmFsKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQoKSwgcHJv
cGVydHkuZ2V0KCkpOworICAgIFJlZ2lzdGVySUQqIG9sZFZhbHVlOworICAgIGlmIChkc3QgPT0g
Z2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkgeworICAgICAgICBvbGRWYWx1ZSA9IDA7CisgICAg
ICAgIGlmIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpCisgICAgICAgICAgICBnZW5lcmF0b3Iu
ZW1pdFByZUluYyh2YWx1ZS5nZXQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdlbmVy
YXRvci5lbWl0UHJlRGVjKHZhbHVlLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvbGRW
YWx1ZSA9IChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpID8gZ2VuZXJhdG9yLmVtaXRQb3N0SW5j
KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHZhbHVlLmdldCgpKSA6IGdlbmVyYXRv
ci5lbWl0UG9zdERlYyhnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCB2YWx1ZS5nZXQo
KSk7CisgICAgfQorICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3Rh
cnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0UHV0QnlWYWwoYmFz
ZS5nZXQoKSwgcHJvcGVydHkuZ2V0KCksIHZhbHVlLmdldCgpKTsKKyAgICByZXR1cm4gb2xkVmFs
dWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3N0Zml4RG90Tm9k
ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIFBvc3Rm
aXhEb3ROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCogZHN0KQoreworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9y
LmVtaXROb2RlKG1fYmFzZSk7CisKKyAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRp
dm90KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgc3RhcnRPZmZzZXQoKSAtIG1fc3Vi
ZXhwcmVzc2lvbkRpdm90T2Zmc2V0LCBtX3N1YmV4cHJlc3Npb25FbmRPZmZzZXQpOworICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChnZW5lcmF0b3Iu
bmV3VGVtcG9yYXJ5KCksIGJhc2UuZ2V0KCksIG1faWRlbnQpOworICAgIFJlZ2lzdGVySUQqIG9s
ZFZhbHVlOworICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkgeworICAg
ICAgICBvbGRWYWx1ZSA9IDA7CisgICAgICAgIGlmIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMp
CisgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdFByZUluYyh2YWx1ZS5nZXQoKSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHJlRGVjKHZhbHVlLmdldCgpKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBvbGRWYWx1ZSA9IChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMp
ID8gZ2VuZXJhdG9yLmVtaXRQb3N0SW5jKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCks
IHZhbHVlLmdldCgpKSA6IGdlbmVyYXRvci5lbWl0UG9zdERlYyhnZW5lcmF0b3IuZmluYWxEZXN0
aW5hdGlvbihkc3QpLCB2YWx1ZS5nZXQoKSk7CisgICAgfQorICAgIGdlbmVyYXRvci5lbWl0RXhw
cmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIGdl
bmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCB2YWx1ZS5nZXQoKSk7Cisg
ICAgcmV0dXJuIG9sZFZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0gUG9zdGZpeEVycm9yTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
CitSZWdpc3RlcklEKiBQb3N0Zml4RXJyb3JOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5l
cmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCopCit7CisgICAgcmV0dXJuIGVtaXRUaHJvd0Vy
cm9yKGdlbmVyYXRvciwgUmVmZXJlbmNlRXJyb3IsIG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cwor
ICAgICAgICA/ICJQb3N0Zml4ICsrIG9wZXJhdG9yIGFwcGxpZWQgdG8gdmFsdWUgdGhhdCBpcyBu
b3QgYSByZWZlcmVuY2UuIgorICAgICAgICA6ICJQb3N0Zml4IC0tIG9wZXJhdG9yIGFwcGxpZWQg
dG8gdmFsdWUgdGhhdCBpcyBub3QgYSByZWZlcmVuY2UuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBEZWxldGVSZXNvbHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBEZWxldGVSZXNvbHZlTm9kZTo6ZW1pdEJ5
dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sK
KyAgICBpZiAoZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKQorICAgICAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGZhbHNl
KTsKKworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZz
ZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIFJlZ2lzdGVySUQqIGJhc2UgPSBnZW5lcmF0b3IuZW1p
dFJlc29sdmVCYXNlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbV9pZGVudCk7Cisg
ICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0RGVsZXRlQnlJZChnZW5lcmF0b3IuZmluYWxEZXN0aW5h
dGlvbihkc3QsIGJhc2UpLCBiYXNlLCBtX2lkZW50KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tIERlbGV0ZUJyYWNrZXROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIERlbGV0ZUJyYWNrZXROb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAg
IFJlZlB0cjxSZWdpc3RlcklEPiByMCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOworICAg
IFJlZ2lzdGVySUQqIHIxID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fc3Vic2NyaXB0KTsKKworICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5k
T2Zmc2V0KCkpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdERlbGV0ZUJ5VmFsKGdlbmVyYXRv
ci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHIwLmdldCgpLCByMSk7Cit9CisKKy8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZWxldGVEb3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIERlbGV0ZURvdE5vZGU6OmVtaXRCeXRlY29k
ZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAg
UmVnaXN0ZXJJRCogcjAgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9iYXNlKTsKKworICAgIGdlbmVy
YXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0
KCkpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdERlbGV0ZUJ5SWQoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgcjAsIG1faWRlbnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gRGVsZXRlVmFsdWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIERlbGV0ZVZhbHVlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5
dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSwgbV9leHByKTsKKworICAg
IC8vIGRlbGV0ZSBvbiBhIG5vbi1sb2NhdGlvbiBleHByZXNzaW9uIGlnbm9yZXMgdGhlIHZhbHVl
IGFuZCByZXR1cm5zIHRydWUKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRv
ci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHRydWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gVm9pZE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQorCitSZWdpc3RlcklEKiBWb2lkTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBpZiAoZHN0ID09IGdlbmVy
YXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVy
YXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0K
KyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcjAgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByKTsK
KyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2FkKGRzdCwganNVbmRlZmluZWQoKSk7Cit9CisK
Ky8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUeXBlT2ZWYWx1ZU5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogVHlwZU9mUmVzb2x2
ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKiBkc3QpCit7CisgICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lz
dGVyRm9yKG1faWRlbnQpKSB7CisgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRS
ZXN1bHQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
LmVtaXRUeXBlT2YoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwpOworICAg
IH0KKworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzY3JhdGNoID0gZ2VuZXJhdG9yLmVtaXRSZXNv
bHZlQmFzZShnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIG1faWRlbnQpOworICAgIGdl
bmVyYXRvci5lbWl0R2V0QnlJZChzY3JhdGNoLmdldCgpLCBzY3JhdGNoLmdldCgpLCBtX2lkZW50
KTsKKyAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCisgICAgICAgIHJl
dHVybiAwOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFR5cGVPZihnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbihkc3QsIHNjcmF0Y2guZ2V0KCkpLCBzY3JhdGNoLmdldCgpKTsKK30KKworLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFR5cGVPZlZhbHVlTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBUeXBlT2ZWYWx1ZU5vZGU6
OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBk
c3QpCit7CisgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7CisgICAg
ICAgIGdlbmVyYXRvci5lbWl0Tm9kZShnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpLCBtX2V4cHIp
OworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYyA9
IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFR5
cGVPZihnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBzcmMuZ2V0KCkpOworfQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJlZml4UmVzb2x2ZU5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBQcmVmaXhSZXNvbHZl
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKK3sKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0
ZXJGb3IobV9pZGVudCkpIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQo
bV9pZGVudCkpIHsKKyAgICAgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIFJlZlB0cjxSZWdp
c3RlcklEPiByMCA9IGdlbmVyYXRvci5lbWl0TG9hZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlv
bihkc3QpLCAobV9vcGVyYXRvciA9PSBPcFBsdXNQbHVzKSA/IDEuMCA6IC0xLjApOworICAgICAg
ICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0QmluYXJ5T3Aob3BfYWRkLCByMC5nZXQoKSwgbG9j
YWwsIHIwLmdldCgpLCBPcGVyYW5kVHlwZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBlbWl0
UHJlSW5jT3JEZWMoZ2VuZXJhdG9yLCBsb2NhbCwgbV9vcGVyYXRvcik7CisgICAgICAgIHJldHVy
biBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRlZChkc3QsIGxvY2FsKTsKKyAgICB9
CisKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHNpemVfdCBkZXB0aCA9IDA7CisgICAgSlNPYmpl
Y3QqIGdsb2JhbE9iamVjdCA9IDA7CisgICAgaWYgKGdlbmVyYXRvci5maW5kU2NvcGVkUHJvcGVy
dHkobV9pZGVudCwgaW5kZXgsIGRlcHRoLCBmYWxzZSwgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAh
PSBtaXNzaW5nU3ltYm9sTWFya2VyKCkpIHsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHBy
b3BEc3QgPSBnZW5lcmF0b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCksIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgZW1pdFByZUlu
Y09yRGVjKGdlbmVyYXRvciwgcHJvcERzdC5nZXQoKSwgbV9vcGVyYXRvcik7CisgICAgICAgIGdl
bmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBpbmRleCwgcHJvcERzdC5nZXQoKSwgZ2xv
YmFsT2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklm
TmVlZGVkKGRzdCwgcHJvcERzdC5nZXQoKSk7CisgICAgfQorCisgICAgZ2VuZXJhdG9yLmVtaXRF
eHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAg
UmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRz
dCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVX
aXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHByb3BEc3QuZ2V0KCksIG1faWRlbnQp
OworICAgIGVtaXRQcmVJbmNPckRlYyhnZW5lcmF0b3IsIHByb3BEc3QuZ2V0KCksIG1fb3BlcmF0
b3IpOworICAgIGdlbmVyYXRvci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCBwcm9w
RHN0LmdldCgpKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVk
ZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIFByZWZpeEJyYWNrZXROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KKworUmVnaXN0ZXJJRCogUHJlZml4QnJhY2tldE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJl
Z2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9iYXNlKTsKKyAgICBSZWZQdHI8
UmVnaXN0ZXJJRD4gcHJvcGVydHkgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9zdWJzY3JpcHQpOwor
ICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wRHN0ID0gZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlv
bihkc3QpOworCisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpICsgbV9z
dWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIG1fc3ViZXhwcmVzc2lvblN0YXJ0T2Zmc2V0LCBlbmRP
ZmZzZXQoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90T2Zmc2V0KTsKKyAgICBSZWdpc3RlcklEKiB2
YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0QnlWYWwocHJvcERzdC5nZXQoKSwgYmFzZS5nZXQoKSwg
cHJvcGVydHkuZ2V0KCkpOworICAgIGlmIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpCisgICAg
ICAgIGdlbmVyYXRvci5lbWl0UHJlSW5jKHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIGdlbmVy
YXRvci5lbWl0UHJlRGVjKHZhbHVlKTsKKyAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZv
KGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1p
dFB1dEJ5VmFsKGJhc2UuZ2V0KCksIHByb3BlcnR5LmdldCgpLCB2YWx1ZSk7CisgICAgcmV0dXJu
IGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcHJvcERzdC5nZXQoKSk7
Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmVmaXhEb3ROb2RlIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogUHJlZml4RG90
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0
Tm9kZShtX2Jhc2UpOworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wRHN0ID0gZ2VuZXJhdG9y
LnRlbXBEZXN0aW5hdGlvbihkc3QpOworCisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5m
byhkaXZvdCgpICsgbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIG1fc3ViZXhwcmVzc2lvblN0
YXJ0T2Zmc2V0LCBlbmRPZmZzZXQoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90T2Zmc2V0KTsKKyAg
ICBSZWdpc3RlcklEKiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChwcm9wRHN0LmdldCgp
LCBiYXNlLmdldCgpLCBtX2lkZW50KTsKKyAgICBpZiAobV9vcGVyYXRvciA9PSBPcFBsdXNQbHVz
KQorICAgICAgICBnZW5lcmF0b3IuZW1pdFByZUluYyh2YWx1ZSk7CisgICAgZWxzZQorICAgICAg
ICBnZW5lcmF0b3IuZW1pdFByZURlYyh2YWx1ZSk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNz
aW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgZ2VuZXJh
dG9yLmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHZhbHVlKTsKKyAgICByZXR1cm4g
Z2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsK
K30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWZpeEVycm9yTm9kZSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBQcmVmaXhF
cnJvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdp
c3RlcklEKikKK3sKKyAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBSZWZlcmVu
Y2VFcnJvciwgbV9vcGVyYXRvciA9PSBPcFBsdXNQbHVzCisgICAgICAgID8gIlByZWZpeCArKyBv
cGVyYXRvciBhcHBsaWVkIHRvIHZhbHVlIHRoYXQgaXMgbm90IGEgcmVmZXJlbmNlLiIKKyAgICAg
ICAgOiAiUHJlZml4IC0tIG9wZXJhdG9yIGFwcGxpZWQgdG8gdmFsdWUgdGhhdCBpcyBub3QgYSBy
ZWZlcmVuY2UuIik7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbmFy
eSBPcGVyYXRpb24gTm9kZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor
UmVnaXN0ZXJJRCogVW5hcnlPcE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVnaXN0ZXJJRCogc3JjID0gZ2Vu
ZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VW5hcnlP
cChvcGNvZGVJRCgpLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBzcmMpOworfQor
CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2dpY2FsTm90Tm9kZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIExvZ2ljYWxOb3ROb2RlOjpl
bWl0Qnl0ZWNvZGVJbkNvbmRpdGlvbkNvbnRleHQoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgTGFiZWwqIHRydWVUYXJnZXQsIExhYmVsKiBmYWxzZVRhcmdldCwgYm9vbCBmYWxsVGhyb3Vn
aE1lYW5zVHJ1ZSkKK3sKKyAgICBBU1NFUlQoZXhwcigpLT5oYXNDb25kaXRpb25Db250ZXh0Q29k
ZWdlbigpKTsKKworICAgIC8vIHJldmVyc2UgdGhlIHRydWUgYW5kIGZhbHNlIHRhcmdldHMKKyAg
ICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRpdGlvbkNvbnRleHQoZXhwcigpLCBmYWxzZVRhcmdl
dCwgdHJ1ZVRhcmdldCwgIWZhbGxUaHJvdWdoTWVhbnNUcnVlKTsKK30KKworCisvLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmluYXJ5IE9wZXJhdGlvbiBOb2RlcyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBCaW5hcnlPcE5vZGU6OmVtaXRTdHJjYXQ6
CisvLworLy8gVGhpcyBub2RlIGdlbmVyYXRlcyBhbiBvcF9zdHJjYXQgb3BlcmF0aW9uLiAgVGhp
cyBvcGNvZGUgY2FuIGhhbmRsZSBjb25jYXRlbmF0aW9uIG9mIHRocmVlIG9yCisvLyBtb3JlIHZh
bHVlcywgd2hlcmUgd2UgY2FuIGRldGVybWluZSBhIHNldCBvZiBzZXBhcmF0ZSBvcF9hZGQgb3Bl
cmF0aW9ucyB3b3VsZCBiZSBvcGVyYXRpbmcgb24KKy8vIHN0cmluZyB2YWx1ZXMuCisvLworLy8g
VGhpcyBmdW5jdGlvbiBleHBlY3RzIHRvIGJlIG9wZXJhdGluZyBvbiBhIGdyYXBoIG9mIEFTVCBu
b2RlcyBsb29raW5nIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvLworLy8gICAgIChhKS4uLiAgICAg
KGIpCisvLyAgICAgICAgICBcICAgLworLy8gICAgICAgICAgICgrKSAgICAgKGMpCisvLyAgICAg
ICAgICAgICAgXCAgIC8KKy8vICAgICAgW2RdICAgICAoKCspKQorLy8gICAgICAgICBcICAgIC8K
Ky8vICAgICAgICAgIFsrPV0KKy8vCisvLyBUaGUgYXNzaWdubWVudCBvcGVyYXRpb24gaXMgb3B0
aW9uYWwsIGlmIGl0IGV4aXN0cyB0aGUgcmVnaXN0ZXIgaG9sZGluZyB0aGUgdmFsdWUgb24gdGhl
CisvLyBsZWZ0aGFuZCBzaWRlIG9mIHRoZSBhc3NpZ25tZW50IHNob3VsZCBiZSBwYXNzaW5nIGFz
IHRoZSBvcHRpb25hbCAnbGhzJyBhcmd1bWVudC4KKy8vCisvLyBUaGUgbWV0aG9kIHNob3VsZCBi
ZSBjYWxsZWQgb24gdGhlIG5vZGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb2YgcmVndWxhciBi
aW5hcnkgYWRkCisvLyBvcGVyYXRpb25zIChtYXJrZWQgaW4gdGhlIGRpYWdyYW0gd2l0aCBhIGRv
dWJsZSBzZXQgb2YgcGFyZW50aGVzZXMpLiAgVGhpcyBub2RlIG11c3QKKy8vIGJlIHBlcmZvcm1p
bmcgYSBzdHJpbmcgY29uY2F0ZW5hdGlvbiAoZGV0ZXJtaW5lZCBieSBzdGF0aWNhbGx5IGRldGVj
dGluZyB0aGF0IGF0IGxlYXN0CisvLyBvbmUgY2hpbGQgbXVzdCBiZSBhIHN0cmluZykuICAKKy8v
CisvLyBTaW5jZSB0aGUgbWluaW11bSBudW1iZXIgb2YgdmFsdWVzIGJlaW5nIGNvbmNhdGVuYXRl
ZCB0b2dldGhlciBpcyBleHBlY3RlZCB0byBiZSAzLCBpZgorLy8gYSBsaHMgdG8gYSBjb25jYXRl
bmF0aW5nIGFzc2lnbm1lbnQgaXMgbm90IHByb3ZpZGVkIHRoZW4gdGhlICByb290IGFkZCBzaG91
bGQgaGF2ZSBhdAorLy8gbGVhc3Qgb25lIGxlZnQgY2hpbGQgdGhhdCBpcyBhbHNvIGFuIGFkZCB0
aGF0IGNhbiBiZSBkZXRlcm1pbmVkIHRvIGJlIG9wZXJhdGluZyBvbiBzdHJpbmdzLgorLy8KK1Jl
Z2lzdGVySUQqIEJpbmFyeU9wTm9kZTo6ZW1pdFN0cmNhdChCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIGxocywgUmVhZE1vZGlmeVJlc29s
dmVOb2RlKiBlbWl0RXhwcmVzc2lvbkluZm9Gb3JNZSkKK3sKKyAgICBBU1NFUlQoaXNBZGQoKSk7
CisgICAgQVNTRVJUKHJlc3VsdERlc2NyaXB0b3IoKS5kZWZpbml0ZWx5SXNTdHJpbmcoKSk7CisK
KyAgICAvLyBDcmVhdGUgYSBsaXN0IG9mIGV4cHJlc3Npb25zIGZvciBhbGwgdGhlIGFkZHMgaW4g
dGhlIHRyZWUgb2Ygbm9kZXMgd2UgY2FuIGNvbnZlcnQgaW50bworICAgIC8vIGEgc3RyaW5nIGNv
bmNhdGVuYXRpb24uICBUaGUgcmlnaHRtb3N0IG5vZGUgKGMpIGlzIGFkZGVkIGZpcnN0LiAgVGhl
IHJpZ2h0bW9zdCBub2RlIGlzCisgICAgLy8gYWRkZWQgZmlyc3QsIGFuZCB0aGUgbGVmdG1vc3Qg
Y2hpbGQgaXMgbmV2ZXIgYWRkZWQsIHNvIHRoZSB2ZWN0b3IgcHJvZHVjZWQgZm9yIHRoZQorICAg
IC8vIGV4YW1wbGUgYWJvdmUgd2lsbCBiZSBbIGMsIGIgXS4KKyAgICBWZWN0b3I8RXhwcmVzc2lv
bk5vZGUqLCAxNj4gcmV2ZXJzZUV4cHJlc3Npb25MaXN0OworICAgIHJldmVyc2VFeHByZXNzaW9u
TGlzdC5hcHBlbmQobV9leHByMik7CisKKyAgICAvLyBFeGFtaW5lIHRoZSBsZWZ0IGNoaWxkIG9m
IHRoZSBhZGQuICBTbyBsb25nIGFzIHRoaXMgaXMgYSBzdHJpbmcgYWRkLCBhZGQgaXRzIHJpZ2h0
LWNoaWxkCisgICAgLy8gdG8gdGhlIGxpc3QsIGFuZCBrZWVwIHByb2Nlc3NpbmcgYWxvbmcgdGhl
IGxlZnQgZm9yay4KKyAgICBFeHByZXNzaW9uTm9kZSogbGVmdE1vc3RBZGRDaGlsZCA9IG1fZXhw
cjE7CisgICAgd2hpbGUgKGxlZnRNb3N0QWRkQ2hpbGQtPmlzQWRkKCkgJiYgbGVmdE1vc3RBZGRD
aGlsZC0+cmVzdWx0RGVzY3JpcHRvcigpLmRlZmluaXRlbHlJc1N0cmluZygpKSB7CisgICAgICAg
IHJldmVyc2VFeHByZXNzaW9uTGlzdC5hcHBlbmQoc3RhdGljX2Nhc3Q8QWRkTm9kZSo+KGxlZnRN
b3N0QWRkQ2hpbGQpLT5tX2V4cHIyKTsKKyAgICAgICAgbGVmdE1vc3RBZGRDaGlsZCA9IHN0YXRp
Y19jYXN0PEFkZE5vZGUqPihsZWZ0TW9zdEFkZENoaWxkKS0+bV9leHByMTsKKyAgICB9CisKKyAg
ICBWZWN0b3I8UmVmUHRyPFJlZ2lzdGVySUQ+LCAxNj4gdGVtcG9yYXJ5UmVnaXN0ZXJzOworCisg
ICAgLy8gSWYgdGhlcmUgaXMgYW4gYXNzaWdubWVudCwgYWxsb2NhdGUgYSB0ZW1wb3JhcnkgdG8g
aG9sZCB0aGUgbGhzIGFmdGVyIGNvbnZlcnNpb24uCisgICAgLy8gV2UgY291bGQgcG9zc2libHkg
YXZvaWQgdGhpcyAodGhlIGxocyBpcyBjb252ZXJ0ZWQgbGFzdCBhbnl3YXksIHdlIGNvdWxkIGxl
dCB0aGUKKyAgICAvLyBvcF9zdHJjYXQgbm9kZSBoYW5kbGUgaXRzIGNvbnZlcnNpb24gaWYgcmVx
dWlyZWQpLgorICAgIGlmIChsaHMpCisgICAgICAgIHRlbXBvcmFyeVJlZ2lzdGVycy5hcHBlbmQo
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpKTsKKworICAgIC8vIEVtaXQgY29kZSBmb3IgdGhlIGxl
ZnRtb3N0IG5vZGUgKChhKSBpbiB0aGUgZXhhbXBsZSkuCisgICAgdGVtcG9yYXJ5UmVnaXN0ZXJz
LmFwcGVuZChnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCkpOworICAgIFJlZ2lzdGVySUQqIGxlZnRN
b3N0QWRkQ2hpbGRUZW1wUmVnaXN0ZXIgPSB0ZW1wb3JhcnlSZWdpc3RlcnMubGFzdCgpLmdldCgp
OworICAgIGdlbmVyYXRvci5lbWl0Tm9kZShsZWZ0TW9zdEFkZENoaWxkVGVtcFJlZ2lzdGVyLCBs
ZWZ0TW9zdEFkZENoaWxkKTsKKworICAgIC8vIE5vdGUgb24gb3JkZXJpbmcgb2YgY29udmVyc2lv
bnM6CisgICAgLy8KKyAgICAvLyBXZSBtYWludGFpbiB0aGUgc2FtZSBvcmRlcmluZyBvZiBjb252
ZXJzaW9ucyBhcyB3ZSB3b3VsZCBzZWUgaWYgdGhlIGNvbmNhdGVuYXRpb25zCisgICAgLy8gd2Fz
IHBlcmZvcm1lZCBhcyBhIHNlcXVlbmNlIG9mIGFkZHMgKG90aGVyd2lzZSB0aGlzIG9wdGltaXph
dGlvbiBjb3VsZCBjaGFuZ2UKKyAgICAvLyBiZWhhdmlvdXIgc2hvdWxkIGFuIG9iamVjdCBoYXZl
IGJlZW4gcHJvdmlkZWQgYSB2YWx1ZU9mIG9yIHRvU3RyaW5nIG1ldGhvZCkuCisgICAgLy8KKyAg
ICAvLyBDb25zaWRlcmluZyB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIHNlcXVuY2Ugb2YgZXhlY3V0
aW9uIGlzOgorICAgIC8vICAgICAqIGV2YWx1YXRlIG9wZXJhbmQgKGEpCisgICAgLy8gICAgICog
ZXZhbHVhdGUgb3BlcmFuZCAoYikKKyAgICAvLyAgICAgKiBjb252ZXJ0IChhKSB0byBwcmltaXRp
dmUgICA8LSAgKHRoaXMgd291bGQgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBmaXJzdCBhZGQpCisgICAg
Ly8gICAgICogY29udmVydCAoYikgdG8gcHJpbWl0aXZlICAgPC0gIChkaXR0bykKKyAgICAvLyAg
ICAgKiBldmFsdWF0ZSBvcGVyYW5kIChjKQorICAgIC8vICAgICAqIGNvbnZlcnQgKGMpIHRvIHBy
aW1pdGl2ZSAgIDwtICAodGhpcyB3b3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIHNlY29uZCBhZGQp
CisgICAgLy8gQW5kIG9wdGlvbmFsbHksIGlmIHRoZXJlIGlzIGFuIGFzc2lnbm1lbnQ6CisgICAg
Ly8gICAgICogY29udmVydCAoZCkgdG8gcHJpbWl0aXZlICAgPC0gICh0aGlzIHdvdWxkIGJlIHRy
aWdnZXJlZCBieSB0aGUgYXNzaWduaW5nIGFkZGl0aW9uKQorICAgIC8vCisgICAgLy8gQXMgc3Vj
aCB3ZSBkbyBub3QgcGxhbnQgYW4gb3AgdG8gY29udmVydCB0aGUgbGVmdG1vc3QgY2hpbGQgbm93
LiAgSW5zdGVhZCwgdXNlCisgICAgLy8gJ2xlZnRNb3N0QWRkQ2hpbGRUZW1wUmVnaXN0ZXInIGFz
IGEgZmxhZyB0byB0cmlnZ2VyIGdlbmVyYXRpb24gb2YgdGhlIGNvbnZlcnNpb24KKyAgICAvLyBv
bmNlIHRoZSBzZWNvbmQgbm9kZSBoYXMgYmVlbiBnZW5lcmF0ZWQuICBIb3dldmVyLCBpZiB0aGUg
bGVmdG1vc3QgY2hpbGQgaXMgYW4KKyAgICAvLyBpbW1lZGlhdGUgd2UgY2FuIHRyaXZpYWxseSBk
ZXRlcm1pbmUgdGhhdCBubyBjb252ZXJzaW9uIHdpbGwgYmUgcmVxdWlyZWQuCisgICAgLy8gSWYg
dGhpcyBpcyB0aGUgY2FzZQorICAgIGlmIChsZWZ0TW9zdEFkZENoaWxkLT5pc1N0cmluZygpKQor
ICAgICAgICBsZWZ0TW9zdEFkZENoaWxkVGVtcFJlZ2lzdGVyID0gMDsKKworICAgIHdoaWxlIChy
ZXZlcnNlRXhwcmVzc2lvbkxpc3Quc2l6ZSgpKSB7CisgICAgICAgIEV4cHJlc3Npb25Ob2RlKiBu
b2RlID0gcmV2ZXJzZUV4cHJlc3Npb25MaXN0Lmxhc3QoKTsKKyAgICAgICAgcmV2ZXJzZUV4cHJl
c3Npb25MaXN0LnJlbW92ZUxhc3QoKTsKKworICAgICAgICAvLyBFbWl0IHRoZSBjb2RlIGZvciB0
aGUgY3VycmVudCBub2RlLgorICAgICAgICB0ZW1wb3JhcnlSZWdpc3RlcnMuYXBwZW5kKGdlbmVy
YXRvci5uZXdUZW1wb3JhcnkoKSk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZSh0ZW1wb3Jh
cnlSZWdpc3RlcnMubGFzdCgpLmdldCgpLCBub2RlKTsKKworICAgICAgICAvLyBPbiB0aGUgZmly
c3QgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcCwgd2hlbiB3ZSBmaXJzdCByZWFjaCB0aGlzIHBvaW50
IHdlIGhhdmUganVzdAorICAgICAgICAvLyBnZW5lcmF0ZWQgdGhlIHNlY29uZCBub2RlLCB3aGlj
aCBtZWFucyBpdCBpcyB0aW1lIHRvIGNvbnZlcnQgdGhlIGxlZnRtb3N0IG9wZXJhbmQuCisgICAg
ICAgIGlmIChsZWZ0TW9zdEFkZENoaWxkVGVtcFJlZ2lzdGVyKSB7CisgICAgICAgICAgICBnZW5l
cmF0b3IuZW1pdFRvUHJpbWl0aXZlKGxlZnRNb3N0QWRkQ2hpbGRUZW1wUmVnaXN0ZXIsIGxlZnRN
b3N0QWRkQ2hpbGRUZW1wUmVnaXN0ZXIpOworICAgICAgICAgICAgbGVmdE1vc3RBZGRDaGlsZFRl
bXBSZWdpc3RlciA9IDA7IC8vIE9ubHkgZG8gdGhpcyBvbmNlLgorICAgICAgICB9CisgICAgICAg
IC8vIFBsYW50IGEgY29udmVyc2lvbiBmb3IgdGhpcyBub2RlLCBpZiBuZWNlc3NhcnkuCisgICAg
ICAgIGlmICghbm9kZS0+aXNTdHJpbmcoKSkKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0VG9Q
cmltaXRpdmUodGVtcG9yYXJ5UmVnaXN0ZXJzLmxhc3QoKS5nZXQoKSwgdGVtcG9yYXJ5UmVnaXN0
ZXJzLmxhc3QoKS5nZXQoKSk7CisgICAgfQorICAgIEFTU0VSVCh0ZW1wb3JhcnlSZWdpc3RlcnMu
c2l6ZSgpID49IDMpOworCisgICAgLy8gQ2VydGFpbiByZWFkLW1vZGlmeSBub2RlcyByZXF1aXJl
IGV4cHJlc3Npb24gaW5mbyB0byBiZSBlbWl0dGVkICphZnRlciogbV9yaWdodCBoYXMgYmVlbiBn
ZW5lcmF0ZWQuCisgICAgLy8gSWYgdGhpcyBpcyByZXF1aXJlZCB0aGUgbm9kZSBpcyBwYXNzZWQg
YXMgJ2VtaXRFeHByZXNzaW9uSW5mb0Zvck1lJzsgZG8gc28gbm93LgorICAgIGlmIChlbWl0RXhw
cmVzc2lvbkluZm9Gb3JNZSkKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhl
bWl0RXhwcmVzc2lvbkluZm9Gb3JNZS0+ZGl2b3QoKSwgZW1pdEV4cHJlc3Npb25JbmZvRm9yTWUt
PnN0YXJ0T2Zmc2V0KCksIGVtaXRFeHByZXNzaW9uSW5mb0Zvck1lLT5lbmRPZmZzZXQoKSk7CisK
KyAgICAvLyBJZiB0aGVyZSBpcyBhbiBhc3NpZ25tZW50IGNvbnZlcnQgdGhlIGxocyBub3cuICBU
aGlzIHdpbGwgYWxzbyBjb3B5IGxocyB0bworICAgIC8vIHRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIg
d2UgYWxsb2NhdGVkIGZvciBpdC4KKyAgICBpZiAobGhzKQorICAgICAgICBnZW5lcmF0b3IuZW1p
dFRvUHJpbWl0aXZlKHRlbXBvcmFyeVJlZ2lzdGVyc1swXS5nZXQoKSwgbGhzKTsKKworICAgIHJl
dHVybiBnZW5lcmF0b3IuZW1pdFN0cmNhdChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qs
IHRlbXBvcmFyeVJlZ2lzdGVyc1swXS5nZXQoKSksIHRlbXBvcmFyeVJlZ2lzdGVyc1swXS5nZXQo
KSwgdGVtcG9yYXJ5UmVnaXN0ZXJzLnNpemUoKSk7Cit9CisKK1JlZ2lzdGVySUQqIEJpbmFyeU9w
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKK3sKKyAgICBPcGNvZGVJRCBvcGNvZGVJRCA9IHRoaXMtPm9wY29kZUlEKCk7CisK
KyAgICBpZiAob3Bjb2RlSUQgPT0gb3BfYWRkICYmIG1fZXhwcjEtPmlzQWRkKCkgJiYgbV9leHBy
MS0+cmVzdWx0RGVzY3JpcHRvcigpLmRlZmluaXRlbHlJc1N0cmluZygpKQorICAgICAgICByZXR1
cm4gZW1pdFN0cmNhdChnZW5lcmF0b3IsIGRzdCk7CisKKyAgICBpZiAob3Bjb2RlSUQgPT0gb3Bf
bmVxKSB7CisgICAgICAgIGlmIChtX2V4cHIxLT5pc051bGwoKSB8fCBtX2V4cHIyLT5pc051bGwo
KSkgeworICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYyA9IGdlbmVyYXRvci50ZW1w
RGVzdGluYXRpb24oZHN0KTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShzcmMuZ2V0
KCksIG1fZXhwcjEtPmlzTnVsbCgpID8gbV9leHByMiA6IG1fZXhwcjEpOworICAgICAgICAgICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0VW5hcnlPcChvcF9uZXFfbnVsbCwgZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0LCBzcmMuZ2V0KCkpLCBzcmMuZ2V0KCkpOworICAgICAgICB9CisgICAg
fQorCisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IuZW1pdE5vZGVGb3JM
ZWZ0SGFuZFNpZGUobV9leHByMSwgbV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBtX2V4cHIyLT5pc1B1
cmUoZ2VuZXJhdG9yKSk7CisgICAgUmVnaXN0ZXJJRCogc3JjMiA9IGdlbmVyYXRvci5lbWl0Tm9k
ZShtX2V4cHIyKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRCaW5hcnlPcChvcGNvZGVJRCwg
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwg
c3JjMiwgT3BlcmFuZFR5cGVzKG1fZXhwcjEtPnJlc3VsdERlc2NyaXB0b3IoKSwgbV9leHByMi0+
cmVzdWx0RGVzY3JpcHRvcigpKSk7Cit9CisKK1JlZ2lzdGVySUQqIEVxdWFsTm9kZTo6ZW1pdEJ5
dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sK
KyAgICBpZiAobV9leHByMS0+aXNOdWxsKCkgfHwgbV9leHByMi0+aXNOdWxsKCkpIHsKKyAgICAg
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYyA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0
KTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKHNyYy5nZXQoKSwgbV9leHByMS0+aXNOdWxs
KCkgPyBtX2V4cHIyIDogbV9leHByMSk7CisgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFVu
YXJ5T3Aob3BfZXFfbnVsbCwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMuZ2V0
KCkpLCBzcmMuZ2V0KCkpOworICAgIH0KKworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0g
Z2VuZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRlKG1fZXhwcjEsIG1fcmlnaHRIYXNBc3Np
Z25tZW50cywgbV9leHByMi0+aXNQdXJlKGdlbmVyYXRvcikpOworICAgIFJlZ2lzdGVySUQqIHNy
YzIgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByMik7CisgICAgcmV0dXJuIGdlbmVyYXRvci5l
bWl0RXF1YWxpdHlPcChvcF9lcSwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMx
LmdldCgpKSwgc3JjMS5nZXQoKSwgc3JjMik7Cit9CisKK1JlZ2lzdGVySUQqIFN0cmljdEVxdWFs
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci5lbWl0
Tm9kZUZvckxlZnRIYW5kU2lkZShtX2V4cHIxLCBtX3JpZ2h0SGFzQXNzaWdubWVudHMsIG1fZXhw
cjItPmlzUHVyZShnZW5lcmF0b3IpKTsKKyAgICBSZWdpc3RlcklEKiBzcmMyID0gZ2VuZXJhdG9y
LmVtaXROb2RlKG1fZXhwcjIpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdEVxdWFsaXR5T3Ao
b3Bfc3RyaWN0ZXEsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgc3JjMS5nZXQoKSks
IHNyYzEuZ2V0KCksIHNyYzIpOworfQorCitSZWdpc3RlcklEKiBSZXZlcnNlQmluYXJ5T3BOb2Rl
OjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCog
ZHN0KQoreworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJhdG9yLmVtaXROb2Rl
Rm9yTGVmdEhhbmRTaWRlKG1fZXhwcjEsIG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9leHByMi0+
aXNQdXJlKGdlbmVyYXRvcikpOworICAgIFJlZ2lzdGVySUQqIHNyYzIgPSBnZW5lcmF0b3IuZW1p
dE5vZGUobV9leHByMik7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0QmluYXJ5T3Aob3Bjb2Rl
SUQoKSwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMiwg
c3JjMS5nZXQoKSwgT3BlcmFuZFR5cGVzKG1fZXhwcjItPnJlc3VsdERlc2NyaXB0b3IoKSwgbV9l
eHByMS0+cmVzdWx0RGVzY3JpcHRvcigpKSk7Cit9CisKK1JlZ2lzdGVySUQqIFRocm93YWJsZUJp
bmFyeU9wTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJl
Z2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRv
ci5lbWl0Tm9kZUZvckxlZnRIYW5kU2lkZShtX2V4cHIxLCBtX3JpZ2h0SGFzQXNzaWdubWVudHMs
IG1fZXhwcjItPmlzUHVyZShnZW5lcmF0b3IpKTsKKyAgICBSZWdpc3RlcklEKiBzcmMyID0gZ2Vu
ZXJhdG9yLmVtaXROb2RlKG1fZXhwcjIpOworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbklu
Zm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIHJldHVybiBnZW5l
cmF0b3IuZW1pdEJpbmFyeU9wKG9wY29kZUlEKCksIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9u
KGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIHNyYzIsIE9wZXJhbmRUeXBlcyhtX2V4cHIx
LT5yZXN1bHREZXNjcmlwdG9yKCksIG1fZXhwcjItPnJlc3VsdERlc2NyaXB0b3IoKSkpOworfQor
CitSZWdpc3RlcklEKiBJbnN0YW5jZU9mTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJ
RD4gc3JjMSA9IGdlbmVyYXRvci5lbWl0Tm9kZUZvckxlZnRIYW5kU2lkZShtX2V4cHIxLCBtX3Jp
Z2h0SGFzQXNzaWdubWVudHMsIG1fZXhwcjItPmlzUHVyZShnZW5lcmF0b3IpKTsKKyAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gc3JjMiA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIyKTsKKworICAg
IGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5k
T2Zmc2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0R2V0QnlJZEV4Y2VwdGlvbkluZm8ob3BfaW5z
dGFuY2VvZik7CisgICAgUmVnaXN0ZXJJRCogc3JjMlByb3RvdHlwZSA9IGdlbmVyYXRvci5lbWl0
R2V0QnlJZChnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHNyYzIuZ2V0KCksIGdlbmVyYXRvci5n
bG9iYWxEYXRhKCktPnByb3BlcnR5TmFtZXMtPnByb3RvdHlwZSk7CisKKyAgICBnZW5lcmF0b3Iu
ZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsK
KyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRJbnN0YW5jZU9mKGdlbmVyYXRvci5maW5hbERlc3Rp
bmF0aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIHNyYzIuZ2V0KCksIHNyYzJQcm90
b3R5cGUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTG9naWNhbE9w
Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIExvZ2ljYWxP
cE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRlbXAgPSBnZW5lcmF0b3IudGVt
cERlc3RpbmF0aW9uKGRzdCk7CisgICAgUmVmUHRyPExhYmVsPiB0YXJnZXQgPSBnZW5lcmF0b3Iu
bmV3TGFiZWwoKTsKKyAgICAKKyAgICBnZW5lcmF0b3IuZW1pdE5vZGUodGVtcC5nZXQoKSwgbV9l
eHByMSk7CisgICAgaWYgKG1fb3BlcmF0b3IgPT0gT3BMb2dpY2FsQW5kKQorICAgICAgICBnZW5l
cmF0b3IuZW1pdEp1bXBJZkZhbHNlKHRlbXAuZ2V0KCksIHRhcmdldC5nZXQoKSk7CisgICAgZWxz
ZQorICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZlRydWUodGVtcC5nZXQoKSwgdGFyZ2V0Lmdl
dCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdE5vZGUodGVtcC5nZXQoKSwgbV9leHByMik7CisgICAg
Z2VuZXJhdG9yLmVtaXRMYWJlbCh0YXJnZXQuZ2V0KCkpOworCisgICAgcmV0dXJuIGdlbmVyYXRv
ci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgdGVtcC5nZXQoKSk7Cit9CisKK3ZvaWQg
TG9naWNhbE9wTm9kZTo6ZW1pdEJ5dGVjb2RlSW5Db25kaXRpb25Db250ZXh0KEJ5dGVjb2RlR2Vu
ZXJhdG9yJiBnZW5lcmF0b3IsIExhYmVsKiB0cnVlVGFyZ2V0LCBMYWJlbCogZmFsc2VUYXJnZXQs
IGJvb2wgZmFsbFRocm91Z2hNZWFuc1RydWUpCit7CisgICAgaWYgKG1fZXhwcjEtPmhhc0NvbmRp
dGlvbkNvbnRleHRDb2RlZ2VuKCkpIHsKKyAgICAgICAgUmVmUHRyPExhYmVsPiBhZnRlckV4cHIx
ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgICAgIGlmIChtX29wZXJhdG9yID09IE9wTG9n
aWNhbEFuZCkKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZUluQ29uZGl0aW9uQ29udGV4
dChtX2V4cHIxLCBhZnRlckV4cHIxLmdldCgpLCBmYWxzZVRhcmdldCwgdHJ1ZSk7CisgICAgICAg
IGVsc2UgCisgICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRpdGlvbkNvbnRleHQo
bV9leHByMSwgdHJ1ZVRhcmdldCwgYWZ0ZXJFeHByMS5nZXQoKSwgZmFsc2UpOworICAgICAgICBn
ZW5lcmF0b3IuZW1pdExhYmVsKGFmdGVyRXhwcjEuZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIFJlZ2lzdGVySUQqIHRlbXAgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByMSk7CisgICAg
ICAgIGlmIChtX29wZXJhdG9yID09IE9wTG9naWNhbEFuZCkKKyAgICAgICAgICAgIGdlbmVyYXRv
ci5lbWl0SnVtcElmRmFsc2UodGVtcCwgZmFsc2VUYXJnZXQpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZlRydWUodGVtcCwgdHJ1ZVRhcmdldCk7CisgICAg
fQorCisgICAgaWYgKG1fZXhwcjItPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkpCisgICAg
ICAgIGdlbmVyYXRvci5lbWl0Tm9kZUluQ29uZGl0aW9uQ29udGV4dChtX2V4cHIyLCB0cnVlVGFy
Z2V0LCBmYWxzZVRhcmdldCwgZmFsbFRocm91Z2hNZWFuc1RydWUpOworICAgIGVsc2UgeworICAg
ICAgICBSZWdpc3RlcklEKiB0ZW1wID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcjIpOworICAg
ICAgICBpZiAoZmFsbFRocm91Z2hNZWFuc1RydWUpCisgICAgICAgICAgICBnZW5lcmF0b3IuZW1p
dEp1bXBJZkZhbHNlKHRlbXAsIGZhbHNlVGFyZ2V0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZUcnVlKHRlbXAsIHRydWVUYXJnZXQpOworICAgIH0KK30K
KworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbmRpdGlvbmFsTm9kZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogQ29uZGl0aW9uYWxOb2Rl
OjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCog
ZHN0KQoreworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBuZXdEc3QgPSBnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbihkc3QpOworICAgIFJlZlB0cjxMYWJlbD4gYmVmb3JlRWxzZSA9IGdlbmVyYXRv
ci5uZXdMYWJlbCgpOworICAgIFJlZlB0cjxMYWJlbD4gYWZ0ZXJFbHNlID0gZ2VuZXJhdG9yLm5l
d0xhYmVsKCk7CisKKyAgICBpZiAobV9sb2dpY2FsLT5oYXNDb25kaXRpb25Db250ZXh0Q29kZWdl
bigpKSB7CisgICAgICAgIFJlZlB0cjxMYWJlbD4gYmVmb3JlVGhlbiA9IGdlbmVyYXRvci5uZXdM
YWJlbCgpOworICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRpdGlvbkNvbnRleHQobV9s
b2dpY2FsLCBiZWZvcmVUaGVuLmdldCgpLCBiZWZvcmVFbHNlLmdldCgpLCB0cnVlKTsKKyAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChiZWZvcmVUaGVuLmdldCgpKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBSZWdpc3RlcklEKiBjb25kID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fbG9naWNhbCk7
CisgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElmRmFsc2UoY29uZCwgYmVmb3JlRWxzZS5nZXQo
KSk7CisgICAgfQorCisgICAgZ2VuZXJhdG9yLmVtaXROb2RlKG5ld0RzdC5nZXQoKSwgbV9leHBy
MSk7CisgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGFmdGVyRWxzZS5nZXQoKSk7CisKKyAgICBnZW5l
cmF0b3IuZW1pdExhYmVsKGJlZm9yZUVsc2UuZ2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0Tm9k
ZShuZXdEc3QuZ2V0KCksIG1fZXhwcjIpOworCisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChhZnRl
ckVsc2UuZ2V0KCkpOworCisgICAgcmV0dXJuIG5ld0RzdC5nZXQoKTsKK30KKworLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlYWRNb2RpZnlSZXNvbHZlTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGSVhNRTogc2hvdWxkIHRoaXMgYmUgbW92
ZWQgdG8gYmUgYSBtZXRob2Qgb24gQnl0ZWNvZGVHZW5lcmF0b3I/CitzdGF0aWMgQUxXQVlTX0lO
TElORSBSZWdpc3RlcklEKiBlbWl0UmVhZE1vZGlmeUFzc2lnbm1lbnQoQnl0ZWNvZGVHZW5lcmF0
b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0LCBSZWdpc3RlcklEKiBzcmMxLCBFeHByZXNz
aW9uTm9kZSogbV9yaWdodCwgT3BlcmF0b3Igb3BlciwgT3BlcmFuZFR5cGVzIHR5cGVzLCBSZWFk
TW9kaWZ5UmVzb2x2ZU5vZGUqIGVtaXRFeHByZXNzaW9uSW5mb0Zvck1lID0gMCkKK3sKKyAgICBP
cGNvZGVJRCBvcGNvZGVJRDsKKyAgICBzd2l0Y2ggKG9wZXIpIHsKKyAgICAgICAgY2FzZSBPcE11
bHRFcToKKyAgICAgICAgICAgIG9wY29kZUlEID0gb3BfbXVsOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgT3BEaXZFcToKKyAgICAgICAgICAgIG9wY29kZUlEID0gb3BfZGl2Owor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT3BQbHVzRXE6CisgICAgICAgICAgICBp
ZiAobV9yaWdodC0+aXNBZGQoKSAmJiBtX3JpZ2h0LT5yZXN1bHREZXNjcmlwdG9yKCkuZGVmaW5p
dGVseUlzU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEFkZE5v
ZGUqPihtX3JpZ2h0KS0+ZW1pdFN0cmNhdChnZW5lcmF0b3IsIGRzdCwgc3JjMSwgZW1pdEV4cHJl
c3Npb25JbmZvRm9yTWUpOworICAgICAgICAgICAgb3Bjb2RlSUQgPSBvcF9hZGQ7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPcE1pbnVzRXE6CisgICAgICAgICAgICBvcGNvZGVJ
RCA9IG9wX3N1YjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9wTFNoaWZ0Ogor
ICAgICAgICAgICAgb3Bjb2RlSUQgPSBvcF9sc2hpZnQ7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBPcFJTaGlmdDoKKyAgICAgICAgICAgIG9wY29kZUlEID0gb3BfcnNoaWZ0Owor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT3BVUlNoaWZ0OgorICAgICAgICAgICAg
b3Bjb2RlSUQgPSBvcF91cnNoaWZ0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
T3BBbmRFcToKKyAgICAgICAgICAgIG9wY29kZUlEID0gb3BfYml0YW5kOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgT3BYT3JFcToKKyAgICAgICAgICAgIG9wY29kZUlEID0gb3Bf
Yml0eG9yOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT3BPckVxOgorICAgICAg
ICAgICAgb3Bjb2RlSUQgPSBvcF9iaXRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIE9wTW9kRXE6CisgICAgICAgICAgICBvcGNvZGVJRCA9IG9wX21vZDsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7CisgICAgICAgICAgICByZXR1cm4gZHN0OworICAgIH0KKworICAgIFJlZ2lzdGVySUQqIHNy
YzIgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9yaWdodCk7CisKKyAgICAvLyBDZXJ0YWluIHJlYWQt
bW9kaWZ5IG5vZGVzIHJlcXVpcmUgZXhwcmVzc2lvbiBpbmZvIHRvIGJlIGVtaXR0ZWQgKmFmdGVy
KiBtX3JpZ2h0IGhhcyBiZWVuIGdlbmVyYXRlZC4KKyAgICAvLyBJZiB0aGlzIGlzIHJlcXVpcmVk
IHRoZSBub2RlIGlzIHBhc3NlZCBhcyAnZW1pdEV4cHJlc3Npb25JbmZvRm9yTWUnOyBkbyBzbyBu
b3cuCisgICAgaWYgKGVtaXRFeHByZXNzaW9uSW5mb0Zvck1lKQorICAgICAgICBnZW5lcmF0b3Iu
ZW1pdEV4cHJlc3Npb25JbmZvKGVtaXRFeHByZXNzaW9uSW5mb0Zvck1lLT5kaXZvdCgpLCBlbWl0
RXhwcmVzc2lvbkluZm9Gb3JNZS0+c3RhcnRPZmZzZXQoKSwgZW1pdEV4cHJlc3Npb25JbmZvRm9y
TWUtPmVuZE9mZnNldCgpKTsKKworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdEJpbmFyeU9wKG9w
Y29kZUlELCBkc3QsIHNyYzEsIHNyYzIsIHR5cGVzKTsKK30KKworUmVnaXN0ZXJJRCogUmVhZE1v
ZGlmeVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVy
YXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgeworICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9j
YWxDb25zdGFudChtX2lkZW50KSkgeworICAgICAgICAgICAgcmV0dXJuIGVtaXRSZWFkTW9kaWZ5
QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxv
Y2FsLCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlwZXMoUmVzdWx0VHlwZTo6dW5rbm93
blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGlmIChnZW5lcmF0b3IubGVmdEhhbmRTaWRlTmVlZHNDb3B5KG1fcmlnaHRI
YXNBc3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpKSB7CisgICAgICAgICAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0ID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwor
ICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRNb3ZlKHJlc3VsdC5nZXQoKSwgbG9jYWwpOworICAg
ICAgICAgICAgZW1pdFJlYWRNb2RpZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgcmVzdWx0LmdldCgp
LCByZXN1bHQuZ2V0KCksIG1fcmlnaHQsIG1fb3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRU
eXBlOjp1bmtub3duVHlwZSgpLCBtX3JpZ2h0LT5yZXN1bHREZXNjcmlwdG9yKCkpKTsKKyAgICAg
ICAgICAgIGdlbmVyYXRvci5lbWl0TW92ZShsb2NhbCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAg
ICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRlZChkc3QsIHJlc3Vs
dC5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFJlZ2lzdGVySUQqIHJlc3Vs
dCA9IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGxvY2FsLCBsb2NhbCwgbV9y
aWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCks
IG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
Lm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCByZXN1bHQpOworICAgIH0KKworICAgIGlu
dCBpbmRleCA9IDA7CisgICAgc2l6ZV90IGRlcHRoID0gMDsKKyAgICBKU09iamVjdCogZ2xvYmFs
T2JqZWN0ID0gMDsKKyAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50
LCBpbmRleCwgZGVwdGgsIHRydWUsIGdsb2JhbE9iamVjdCkgJiYgaW5kZXggIT0gbWlzc2luZ1N5
bWJvbE1hcmtlcigpKSB7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJh
dG9yLmVtaXRHZXRTY29wZWRWYXIoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBkZXB0
aCwgaW5kZXgsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9IGVt
aXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0
aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIG1fcmlnaHQsIG1fb3BlcmF0b3IsIE9w
ZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBtX3JpZ2h0LT5yZXN1bHREZXNj
cmlwdG9yKCkpKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTY29wZWRWYXIoZGVwdGgsIGlu
ZGV4LCByZXN1bHQsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorCisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gc3Rh
cnRPZmZzZXQoKSArIG1faWRlbnQuc2l6ZSgpLCBtX2lkZW50LnNpemUoKSwgMCk7CisgICAgUmVm
UHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCksIHNyYzEuZ2V0KCksIG1faWRlbnQpOworICAgIFJlZ2lzdGVy
SUQqIHJlc3VsdCA9IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRv
ci5maW5hbERlc3RpbmF0aW9uKGRzdCwgc3JjMS5nZXQoKSksIHNyYzEuZ2V0KCksIG1fcmlnaHQs
IG1fb3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBtX3Jp
Z2h0LT5yZXN1bHREZXNjcmlwdG9yKCkpLCB0aGlzKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVt
aXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHJlc3VsdCk7Cit9CisKKy8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBc3NpZ25SZXNvbHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBBc3NpZ25SZXNvbHZlTm9kZTo6ZW1p
dEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkK
K3sKKyAgICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9p
ZGVudCkpIHsKKyAgICAgICAgaWYgKGdlbmVyYXRvci5pc0xvY2FsQ29uc3RhbnQobV9pZGVudCkp
CisgICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9yaWdodCk7Cisg
ICAgICAgIAorICAgICAgICBSZWdpc3RlcklEKiByZXN1bHQgPSBnZW5lcmF0b3IuZW1pdE5vZGUo
bG9jYWwsIG1fcmlnaHQpOworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0
aW9uSWZOZWVkZWQoZHN0LCByZXN1bHQpOworICAgIH0KKworICAgIGludCBpbmRleCA9IDA7Cisg
ICAgc2l6ZV90IGRlcHRoID0gMDsKKyAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsKKyAg
ICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVwdGgs
IHRydWUsIGdsb2JhbE9iamVjdCkgJiYgaW5kZXggIT0gbWlzc2luZ1N5bWJvbE1hcmtlcigpKSB7
CisgICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKKyAgICAgICAg
ICAgIGRzdCA9IDA7CisgICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRO
b2RlKGRzdCwgbV9yaWdodCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRl
cHRoLCBpbmRleCwgdmFsdWUsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICB9CisKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVz
b2x2ZUJhc2UoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBtX2lkZW50KTsKKyAgICBpZiAoZHN0
ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCisgICAgICAgIGRzdCA9IDA7CisgICAgUmVn
aXN0ZXJJRCogdmFsdWUgPSBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3JpZ2h0KTsKKyAgICBn
ZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9m
ZnNldCgpKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1f
aWRlbnQsIHZhbHVlKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFz
c2lnbkRvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0
ZXJJRCogQXNzaWduRG90Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5l
cmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9
IGdlbmVyYXRvci5lbWl0Tm9kZUZvckxlZnRIYW5kU2lkZShtX2Jhc2UsIG1fcmlnaHRIYXNBc3Np
Z25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpOworICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiB2YWx1ZSA9IGdlbmVyYXRvci5kZXN0aW5hdGlvbkZvckFzc2lnblJlc3VsdChkc3QpOwor
ICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9IGdlbmVyYXRvci5lbWl0Tm9kZSh2YWx1ZS5nZXQoKSwg
bV9yaWdodCk7CisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFy
dE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJhc2Uu
Z2V0KCksIG1faWRlbnQsIHJlc3VsdCk7CisgICAgcmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0
aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tIFJlYWRNb2RpZnlEb3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIFJlYWRNb2RpZnlEb3ROb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRl
KG1fYmFzZSwgbV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBtX3JpZ2h0LT5pc1B1cmUoZ2VuZXJhdG9y
KSk7CisKKyAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBtX3N1YmV4
cHJlc3Npb25EaXZvdE9mZnNldCwgc3RhcnRPZmZzZXQoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90
T2Zmc2V0LCBtX3N1YmV4cHJlc3Npb25FbmRPZmZzZXQpOworICAgIFJlZlB0cjxSZWdpc3RlcklE
PiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9u
KGRzdCksIGJhc2UuZ2V0KCksIG1faWRlbnQpOworICAgIFJlZ2lzdGVySUQqIHVwZGF0ZWRWYWx1
ZSA9IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERl
c3RpbmF0aW9uKGRzdCwgdmFsdWUuZ2V0KCkpLCB2YWx1ZS5nZXQoKSwgbV9yaWdodCwgbV9vcGVy
YXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJl
c3VsdERlc2NyaXB0b3IoKSkpOworCisgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhk
aXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0UHV0QnlJZChiYXNlLmdldCgpLCBtX2lkZW50LCB1cGRhdGVkVmFsdWUpOworfQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXNzaWduRXJyb3JOb2RlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIEFzc2lnbkVycm9yTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
KQoreworICAgIHJldHVybiBlbWl0VGhyb3dFcnJvcihnZW5lcmF0b3IsIFJlZmVyZW5jZUVycm9y
LCAiTGVmdCBzaWRlIG9mIGFzc2lnbm1lbnQgaXMgbm90IGEgcmVmZXJlbmNlLiIpOworfQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXNzaWduQnJhY2tldE5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogQXNzaWduQnJhY2tl
dE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKiBkc3QpCit7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1p
dE5vZGVGb3JMZWZ0SGFuZFNpZGUobV9iYXNlLCBtX3N1YnNjcmlwdEhhc0Fzc2lnbm1lbnRzIHx8
IG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9zdWJzY3JpcHQtPmlzUHVyZShnZW5lcmF0b3IpICYm
IG1fcmlnaHQtPmlzUHVyZShnZW5lcmF0b3IpKTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJv
cGVydHkgPSBnZW5lcmF0b3IuZW1pdE5vZGVGb3JMZWZ0SGFuZFNpZGUobV9zdWJzY3JpcHQsIG1f
cmlnaHRIYXNBc3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpOworICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5kZXN0aW5hdGlvbkZvckFzc2lnblJl
c3VsdChkc3QpOworICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9IGdlbmVyYXRvci5lbWl0Tm9kZSh2
YWx1ZS5nZXQoKSwgbV9yaWdodCk7CisKKyAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZv
KGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1p
dFB1dEJ5VmFsKGJhc2UuZ2V0KCksIHByb3BlcnR5LmdldCgpLCByZXN1bHQpOworICAgIHJldHVy
biBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRlZChkc3QsIHJlc3VsdCk7Cit9CisK
Ky8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWFkTW9kaWZ5QnJhY2tldE5vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogUmVhZE1v
ZGlmeUJyYWNrZXROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2Vu
ZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRlKG1fYmFzZSwgbV9zdWJzY3JpcHRIYXNBc3Np
Z25tZW50cyB8fCBtX3JpZ2h0SGFzQXNzaWdubWVudHMsIG1fc3Vic2NyaXB0LT5pc1B1cmUoZ2Vu
ZXJhdG9yKSAmJiBtX3JpZ2h0LT5pc1B1cmUoZ2VuZXJhdG9yKSk7CisgICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IHByb3BlcnR5ID0gZ2VuZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRlKG1fc3Vi
c2NyaXB0LCBtX3JpZ2h0SGFzQXNzaWdubWVudHMsIG1fcmlnaHQtPmlzUHVyZShnZW5lcmF0b3Ip
KTsKKworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIG1fc3ViZXhw
cmVzc2lvbkRpdm90T2Zmc2V0LCBzdGFydE9mZnNldCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RP
ZmZzZXQsIG1fc3ViZXhwcmVzc2lvbkVuZE9mZnNldCk7CisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRHZXRCeVZhbChnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9u
KGRzdCksIGJhc2UuZ2V0KCksIHByb3BlcnR5LmdldCgpKTsKKyAgICBSZWdpc3RlcklEKiB1cGRh
dGVkVmFsdWUgPSBlbWl0UmVhZE1vZGlmeUFzc2lnbm1lbnQoZ2VuZXJhdG9yLCBnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbihkc3QsIHZhbHVlLmdldCgpKSwgdmFsdWUuZ2V0KCksIG1fcmlnaHQs
IG1fb3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBtX3Jp
Z2h0LT5yZXN1bHREZXNjcmlwdG9yKCkpKTsKKworICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lv
bkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOworICAgIGdlbmVyYXRv
ci5lbWl0UHV0QnlWYWwoYmFzZS5nZXQoKSwgcHJvcGVydHkuZ2V0KCksIHVwZGF0ZWRWYWx1ZSk7
CisKKyAgICByZXR1cm4gdXBkYXRlZFZhbHVlOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gQ29tbWFOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQorCitSZWdpc3RlcklEKiBDb21tYU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRv
ciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgQVNTRVJUKG1fZXhwcmVzc2lv
bnMuc2l6ZSgpID4gMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2V4cHJlc3Npb25z
LnNpemUoKSAtIDE7IGkrKykKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVyYXRvci5p
Z25vcmVkUmVzdWx0KCksIG1fZXhwcmVzc2lvbnNbaV0pOworICAgIHJldHVybiBnZW5lcmF0b3Iu
ZW1pdE5vZGUoZHN0LCBtX2V4cHJlc3Npb25zLmxhc3QoKSk7Cit9CisKKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdERlY2xOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBDb25zdERlY2xOb2RlOjplbWl0Q29kZVNpbmds
ZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yKQoreworICAgIGlmIChSZWdpc3RlcklEKiBs
b2NhbCA9IGdlbmVyYXRvci5jb25zdFJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7CisgICAgICAgIGlm
ICghbV9pbml0KQorICAgICAgICAgICAgcmV0dXJuIGxvY2FsOworCisgICAgICAgIHJldHVybiBn
ZW5lcmF0b3IuZW1pdE5vZGUobG9jYWwsIG1faW5pdCk7CisgICAgfQorCisgICAgaWYgKGdlbmVy
YXRvci5jb2RlVHlwZSgpICE9IEV2YWxDb2RlKSB7CisgICAgICAgIGlmIChtX2luaXQpCisgICAg
ICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXROb2RlKG1faW5pdCk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJlc29sdmUoZ2VuZXJhdG9yLm5ld1Rl
bXBvcmFyeSgpLCBtX2lkZW50KTsKKyAgICB9CisgICAgLy8gRklYTUU6IFdoaWxlIHRoaXMgY29k
ZSBzaG91bGQgb25seSBiZSBoaXQgaW4gZXZhbCBjb2RlLCBpdCB3aWxsIHBvdGVudGlhbGx5Cisg
ICAgLy8gYXNzaWduIHRvIHRoZSB3cm9uZyBiYXNlIGlmIG1faWRlbnQgZXhpc3RzIGluIGFuIGlu
dGVydmVuaW5nIGR5bmFtaWMgc2NvcGUuCisgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBn
ZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgbV9pZGVu
dCk7CisgICAgUmVnaXN0ZXJJRCogdmFsdWUgPSBtX2luaXQgPyBnZW5lcmF0b3IuZW1pdE5vZGUo
bV9pbml0KSA6IGdlbmVyYXRvci5lbWl0TG9hZCgwLCBqc1VuZGVmaW5lZCgpKTsKKyAgICByZXR1
cm4gZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHZhbHVlKTsKK30K
KworUmVnaXN0ZXJJRCogQ29uc3REZWNsTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqKQoreworICAgIFJlZ2lzdGVySUQqIHJlc3VsdCA9
IDA7CisgICAgZm9yIChDb25zdERlY2xOb2RlKiBuID0gdGhpczsgbjsgbiA9IG4tPm1fbmV4dCkK
KyAgICAgICAgcmVzdWx0ID0gbi0+ZW1pdENvZGVTaW5nbGUoZ2VuZXJhdG9yKTsKKworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25z
dFN0YXRlbWVudE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJ
RCogQ29uc3RTdGF0ZW1lbnROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdl
bmVyYXRvciwgUmVnaXN0ZXJJRCopCit7CisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2ls
bEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKyAgICByZXR1cm4g
Z2VuZXJhdG9yLmVtaXROb2RlKG1fbmV4dCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSBTb3VyY2VFbGVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CisKK2lubGluZSB2b2lkIFNvdXJjZUVsZW1lbnRzOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5l
cmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIHNpemVfdCBzaXplID0g
bV9zdGF0ZW1lbnRzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsr
aSkKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnRzW2ldKTsKK30K
KworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJsb2NrTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIFN0YXRlbWVudE5vZGUqIEJsb2Nr
Tm9kZTo6bGFzdFN0YXRlbWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc3RhdGVtZW50cyA/
IG1fc3RhdGVtZW50cy0+bGFzdFN0YXRlbWVudCgpIDogMDsKK30KKworUmVnaXN0ZXJJRCogQmxv
Y2tOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0
ZXJJRCogZHN0KQoreworICAgIGlmIChtX3N0YXRlbWVudHMpCisgICAgICAgIG1fc3RhdGVtZW50
cy0+ZW1pdEJ5dGVjb2RlKGdlbmVyYXRvciwgZHN0KTsKKyAgICByZXR1cm4gMDsKK30KKworLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVtcHR5U3RhdGVtZW50Tm9kZSAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogRW1wdHlTdGF0ZW1lbnROb2RlOjpl
bWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0
KQoreworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBm
aXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAgcmV0dXJuIGRzdDsKK30KKworLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERlYnVnZ2VyU3RhdGVtZW50Tm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogRGVidWdnZXJTdGF0ZW1lbnROb2RlOjpl
bWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0
KQoreworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKERpZFJlYWNoQnJlYWtwb2ludCwgZmly
c3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAgIHJldHVybiBkc3Q7Cit9CisKKy8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFeHByU3RhdGVtZW50Tm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIEV4cHJTdGF0ZW1lbnROb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAg
IEFTU0VSVChtX2V4cHIpOworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRl
U3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7IAorICAgIHJldHVybiBnZW5lcmF0
b3IuZW1pdE5vZGUoZHN0LCBtX2V4cHIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gVmFyU3RhdGVtZW50Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisK
K1JlZ2lzdGVySUQqIFZhclN0YXRlbWVudE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKikKK3sKKyAgICBBU1NFUlQobV9leHByKTsKKyAg
ICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5l
KCksIGxhc3RMaW5lKCkpOworICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByKTsK
K30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElmTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogSWZOb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQor
eworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJz
dExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAgCisgICAgUmVmUHRyPExhYmVsPiBhZnRlclRoZW4g
PSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKworICAgIGlmIChtX2NvbmRpdGlvbi0+aGFzQ29uZGl0
aW9uQ29udGV4dENvZGVnZW4oKSkgeworICAgICAgICBSZWZQdHI8TGFiZWw+IGJlZm9yZVRoZW4g
PSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlSW5Db25k
aXRpb25Db250ZXh0KG1fY29uZGl0aW9uLCBiZWZvcmVUaGVuLmdldCgpLCBhZnRlclRoZW4uZ2V0
KCksIHRydWUpOworICAgICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGJlZm9yZVRoZW4uZ2V0KCkp
OworICAgIH0gZWxzZSB7CisgICAgICAgIFJlZ2lzdGVySUQqIGNvbmQgPSBnZW5lcmF0b3IuZW1p
dE5vZGUobV9jb25kaXRpb24pOworICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZkZhbHNlKGNv
bmQsIGFmdGVyVGhlbi5nZXQoKSk7CisgICAgfQorCisgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGRz
dCwgbV9pZkJsb2NrKTsKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGFmdGVyVGhlbi5nZXQoKSk7
CisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBsYXN0IHN0YXRlbWVudCBl
eGVjdXRlZCBzbyB0aGF0IGl0IGNhbiBiZSByZXR1cm5lZCBhcyBhIENvbXBsZXRpb24uCisgICAg
cmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJZkVsc2VO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklE
KiBJZkVsc2VOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQoreworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVj
dXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAgCisgICAgUmVmUHRy
PExhYmVsPiBiZWZvcmVFbHNlID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgUmVmUHRyPExh
YmVsPiBhZnRlckVsc2UgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKworICAgIGlmIChtX2NvbmRp
dGlvbi0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVnZW4oKSkgeworICAgICAgICBSZWZQdHI8TGFi
ZWw+IGJlZm9yZVRoZW4gPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICAgICAgZ2VuZXJhdG9y
LmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fY29uZGl0aW9uLCBiZWZvcmVUaGVuLmdldCgp
LCBiZWZvcmVFbHNlLmdldCgpLCB0cnVlKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChi
ZWZvcmVUaGVuLmdldCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZWdpc3RlcklEKiBjb25k
ID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fY29uZGl0aW9uKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVt
aXRKdW1wSWZGYWxzZShjb25kLCBiZWZvcmVFbHNlLmdldCgpKTsKKyAgICB9CisKKyAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZHN0LCBtX2lmQmxvY2spOworICAgIGdlbmVyYXRvci5lbWl0SnVtcChh
ZnRlckVsc2UuZ2V0KCkpOworCisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChiZWZvcmVFbHNlLmdl
dCgpKTsKKworICAgIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fZWxzZUJsb2NrKTsKKworICAg
IGdlbmVyYXRvci5lbWl0TGFiZWwoYWZ0ZXJFbHNlLmdldCgpKTsKKworICAgIC8vIEZJWE1FOiBU
aGlzIHNob3VsZCByZXR1cm4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkIHNvIHRoYXQgaXQg
Y2FuIGJlIHJldHVybmVkIGFzIGEgQ29tcGxldGlvbi4KKyAgICByZXR1cm4gMDsKK30KKworLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvV2hpbGVOb2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogRG9XaGlsZU5vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7Cisg
ICAgUmVmUHRyPExhYmVsU2NvcGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFi
ZWxTY29wZTo6TG9vcCk7CisKKyAgICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9vcCA9IGdlbmVyYXRv
ci5uZXdMYWJlbCgpOworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9wT2ZMb29wLmdldCgpKTsK
KworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJz
dExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVzdWx0
ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOworCisgICAgZ2VuZXJhdG9y
LmVtaXRMYWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRE
ZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIG1fZXhwci0+bGluZU5vKCksIG1fZXhwci0+
bGluZU5vKCkpOworICAgIGlmIChtX2V4cHItPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkp
CisgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZUluQ29uZGl0aW9uQ29udGV4dChtX2V4cHIsIHRv
cE9mTG9vcC5nZXQoKSwgc2NvcGUtPmJyZWFrVGFyZ2V0KCksIGZhbHNlKTsKKyAgICBlbHNlIHsK
KyAgICAgICAgUmVnaXN0ZXJJRCogY29uZCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOwor
ICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZlRydWUoY29uZCwgdG9wT2ZMb29wLmdldCgpKTsK
KyAgICB9CisKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5icmVha1RhcmdldCgpKTsK
KyAgICByZXR1cm4gcmVzdWx0LmdldCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gV2hpbGVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
CitSZWdpc3RlcklEKiBXaGlsZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPExhYmVsU2NvcGU+IHNj
b3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TG9vcCk7CisKKyAgICBn
ZW5lcmF0b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOworCisgICAgUmVmUHRy
PExhYmVsPiB0b3BPZkxvb3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0b3Iu
ZW1pdExhYmVsKHRvcE9mTG9vcC5nZXQoKSk7CisgICAgCisgICAgZ2VuZXJhdG9yLmVtaXROb2Rl
KGRzdCwgbV9zdGF0ZW1lbnQpOworCisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+Y29u
dGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVT
dGF0ZW1lbnQsIG1fZXhwci0+bGluZU5vKCksIG1fZXhwci0+bGluZU5vKCkpOworCisgICAgaWYg
KG1fZXhwci0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVnZW4oKSkKKyAgICAgICAgZ2VuZXJhdG9y
LmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwciwgdG9wT2ZMb29wLmdldCgpLCBzY29w
ZS0+YnJlYWtUYXJnZXQoKSwgZmFsc2UpOworICAgIGVsc2UgeworICAgICAgICBSZWdpc3RlcklE
KiBjb25kID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7CisgICAgICAgIGdlbmVyYXRvci5l
bWl0SnVtcElmVHJ1ZShjb25kLCB0b3BPZkxvb3AuZ2V0KCkpOworICAgIH0KKworICAgIGdlbmVy
YXRvci5lbWl0TGFiZWwoc2NvcGUtPmJyZWFrVGFyZ2V0KCkpOworICAgIAorICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkIHNvIHRoYXQg
aXQgY2FuIGJlIHJldHVybmVkIGFzIGEgQ29tcGxldGlvbgorICAgIHJldHVybiAwOworfQorCisv
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRm9yTm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBGb3JOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAg
IFJlZlB0cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVs
U2NvcGU6Okxvb3ApOworCisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVT
dGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKworICAgIGlmIChtX2V4cHIxKQor
ICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSwgbV9l
eHByMSk7CisKKyAgICBSZWZQdHI8TGFiZWw+IGNvbmRpdGlvbiA9IGdlbmVyYXRvci5uZXdMYWJl
bCgpOworICAgIGdlbmVyYXRvci5lbWl0SnVtcChjb25kaXRpb24uZ2V0KCkpOworCisgICAgUmVm
UHRyPExhYmVsPiB0b3BPZkxvb3AgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICBnZW5lcmF0
b3IuZW1pdExhYmVsKHRvcE9mTG9vcC5nZXQoKSk7CisKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
cmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9zdGF0ZW1lbnQpOworCisgICAgZ2Vu
ZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9y
LmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGlu
ZSgpKTsKKyAgICBpZiAobV9leHByMykKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVy
YXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcjMpOworCisgICAgZ2VuZXJhdG9yLmVtaXRMYWJl
bChjb25kaXRpb24uZ2V0KCkpOworICAgIGlmIChtX2V4cHIyKSB7CisgICAgICAgIGlmIChtX2V4
cHIyLT5oYXNDb25kaXRpb25Db250ZXh0Q29kZWdlbigpKQorICAgICAgICAgICAgZ2VuZXJhdG9y
LmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwcjIsIHRvcE9mTG9vcC5nZXQoKSwgc2Nv
cGUtPmJyZWFrVGFyZ2V0KCksIGZhbHNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBS
ZWdpc3RlcklEKiBjb25kID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcjIpOworICAgICAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZUcnVlKGNvbmQsIHRvcE9mTG9vcC5nZXQoKSk7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHRvcE9mTG9vcC5n
ZXQoKSk7CisKKyAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5icmVha1RhcmdldCgpKTsK
KyAgICByZXR1cm4gcmVzdWx0LmdldCgpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gRm9ySW5Ob2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor
CitSZWdpc3RlcklEKiBGb3JJbk5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgUmVmUHRyPExhYmVsU2NvcGU+IHNj
b3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TG9vcCk7CisKKyAgICBp
ZiAoIW1fbGV4cHItPmlzTG9jYXRpb24oKSkKKyAgICAgICAgcmV0dXJuIGVtaXRUaHJvd0Vycm9y
KGdlbmVyYXRvciwgUmVmZXJlbmNlRXJyb3IsICJMZWZ0IHNpZGUgb2YgZm9yLWluIHN0YXRlbWVu
dCBpcyBub3QgYSByZWZlcmVuY2UuIik7CisKKyAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhX
aWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworCisgICAgaWYg
KG1faW5pdCkKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGdlbmVyYXRvci5pZ25vcmVkUmVz
dWx0KCksIG1faW5pdCk7CisKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKTsKKyAgICBnZW5lcmF0b3IuZW1pdE5vZGUoYmFzZS5nZXQoKSwgbV9l
eHByKTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gaSA9IGdlbmVyYXRvci5uZXdUZW1wb3Jhcnko
KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc2l6ZSA9IGdlbmVyYXRvci5uZXdUZW1wb3Jhcnko
KTsKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZXhwZWN0ZWRTdWJzY3JpcHQ7CisgICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IGl0ZXIgPSBnZW5lcmF0b3IuZW1pdEdldFByb3BlcnR5TmFtZXMoZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpLCBiYXNlLmdldCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBzY29w
ZS0+YnJlYWtUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKHNjb3BlLT5jb250aW51
ZVRhcmdldCgpKTsKKworICAgIFJlZlB0cjxMYWJlbD4gbG9vcFN0YXJ0ID0gZ2VuZXJhdG9yLm5l
d0xhYmVsKCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsb29wU3RhcnQuZ2V0KCkpOworCisg
ICAgUmVnaXN0ZXJJRCogcHJvcGVydHlOYW1lOworICAgIGJvb2wgb3B0aW1pemVkRm9yaW5BY2Nl
c3MgPSBmYWxzZTsKKyAgICBpZiAobV9sZXhwci0+aXNSZXNvbHZlTm9kZSgpKSB7CisgICAgICAg
IGNvbnN0IElkZW50aWZpZXImIGlkZW50ID0gc3RhdGljX2Nhc3Q8UmVzb2x2ZU5vZGUqPihtX2xl
eHByKS0+aWRlbnRpZmllcigpOworICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3IucmVn
aXN0ZXJGb3IoaWRlbnQpOworICAgICAgICBpZiAoIXByb3BlcnR5TmFtZSkgeworICAgICAgICAg
ICAgcHJvcGVydHlOYW1lID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgICAgICAgICAg
UmVmUHRyPFJlZ2lzdGVySUQ+IHByb3RlY3QgPSBwcm9wZXJ0eU5hbWU7CisgICAgICAgICAgICBS
ZWdpc3RlcklEKiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0b3IubmV3
VGVtcG9yYXJ5KCksIGlkZW50KTsKKworICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNz
aW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7CisgICAgICAgICAg
ICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZSwgaWRlbnQsIHByb3BlcnR5TmFtZSk7CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHBlY3RlZFN1YnNjcmlwdCA9IGdlbmVyYXRvci5l
bWl0TW92ZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHByb3BlcnR5TmFtZSk7CisgICAgICAg
ICAgICBnZW5lcmF0b3IucHVzaE9wdGltaXNlZEZvckluKGV4cGVjdGVkU3Vic2NyaXB0LmdldCgp
LCBpdGVyLmdldCgpLCBpLmdldCgpLCBwcm9wZXJ0eU5hbWUpOworICAgICAgICAgICAgb3B0aW1p
emVkRm9yaW5BY2Nlc3MgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX2xleHBy
LT5pc0RvdEFjY2Vzc29yTm9kZSgpKSB7CisgICAgICAgIERvdEFjY2Vzc29yTm9kZSogYXNzaWdu
Tm9kZSA9IHN0YXRpY19jYXN0PERvdEFjY2Vzc29yTm9kZSo+KG1fbGV4cHIpOworICAgICAgICBj
b25zdCBJZGVudGlmaWVyJiBpZGVudCA9IGFzc2lnbk5vZGUtPmlkZW50aWZpZXIoKTsKKyAgICAg
ICAgcHJvcGVydHlOYW1lID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgICAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gcHJvdGVjdCA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgUmVnaXN0ZXJJ
RCogYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShhc3NpZ25Ob2RlLT5iYXNlKCkpOworCisgICAg
ICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oYXNzaWduTm9kZS0+ZGl2b3QoKSwgYXNz
aWduTm9kZS0+c3RhcnRPZmZzZXQoKSwgYXNzaWduTm9kZS0+ZW5kT2Zmc2V0KCkpOworICAgICAg
ICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZSwgaWRlbnQsIHByb3BlcnR5TmFtZSk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKG1fbGV4cHItPmlzQnJhY2tldEFjY2Vzc29yTm9kZSgp
KTsKKyAgICAgICAgQnJhY2tldEFjY2Vzc29yTm9kZSogYXNzaWduTm9kZSA9IHN0YXRpY19jYXN0
PEJyYWNrZXRBY2Nlc3Nvck5vZGUqPihtX2xleHByKTsKKyAgICAgICAgcHJvcGVydHlOYW1lID0g
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJv
dGVjdCA9IHByb3BlcnR5TmFtZTsKKyAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBn
ZW5lcmF0b3IuZW1pdE5vZGUoYXNzaWduTm9kZS0+YmFzZSgpKTsKKyAgICAgICAgUmVnaXN0ZXJJ
RCogc3Vic2NyaXB0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGFzc2lnbk5vZGUtPnN1YnNjcmlwdCgp
KTsKKyAgICAgICAgCisgICAgICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oYXNzaWdu
Tm9kZS0+ZGl2b3QoKSwgYXNzaWduTm9kZS0+c3RhcnRPZmZzZXQoKSwgYXNzaWduTm9kZS0+ZW5k
T2Zmc2V0KCkpOworICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5VmFsKGJhc2UuZ2V0KCksIHN1
YnNjcmlwdCwgcHJvcGVydHlOYW1lKTsKKyAgICB9ICAgCisKKyAgICBnZW5lcmF0b3IuZW1pdE5v
ZGUoZHN0LCBtX3N0YXRlbWVudCk7CisKKyAgICBpZiAob3B0aW1pemVkRm9yaW5BY2Nlc3MpCisg
ICAgICAgIGdlbmVyYXRvci5wb3BPcHRpbWlzZWRGb3JJbigpOworCisgICAgZ2VuZXJhdG9yLmVt
aXRMYWJlbChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXROZXh0
UHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSwgYmFzZS5nZXQoKSwgaS5nZXQoKSwgc2l6ZS5nZXQo
KSwgaXRlci5nZXQoKSwgbG9vcFN0YXJ0LmdldCgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdERlYnVn
SG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAg
IGdlbmVyYXRvci5lbWl0TGFiZWwoc2NvcGUtPmJyZWFrVGFyZ2V0KCkpOworICAgIHJldHVybiBk
c3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb250aW51ZU5vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVDTUEgMTIuNworUmVnaXN0
ZXJJRCogQ29udGludWVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVy
YXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdp
bGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAgCisgICAg
TGFiZWxTY29wZSogc2NvcGUgPSBnZW5lcmF0b3IuY29udGludWVUYXJnZXQobV9pZGVudCk7CisK
KyAgICBpZiAoIXNjb3BlKQorICAgICAgICByZXR1cm4gbV9pZGVudC5pc0VtcHR5KCkKKyAgICAg
ICAgICAgID8gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBTeW50YXhFcnJvciwgIkludmFsaWQg
Y29udGludWUgc3RhdGVtZW50LiIpCisgICAgICAgICAgICA6IGVtaXRUaHJvd0Vycm9yKGdlbmVy
YXRvciwgU3ludGF4RXJyb3IsICJVbmRlZmluZWQgbGFiZWw6ICclcycuIiwgbV9pZGVudCk7CisK
KyAgICBnZW5lcmF0b3IuZW1pdEp1bXBTY29wZXMoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCksIHNj
b3BlLT5zY29wZURlcHRoKCkpOworICAgIHJldHVybiBkc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBCcmVha05vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCisKKy8vIEVDTUEgMTIuOAorUmVnaXN0ZXJJRCogQnJlYWtOb2RlOjplbWl0Qnl0
ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQorewor
ICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExp
bmUoKSwgbGFzdExpbmUoKSk7CisgICAgCisgICAgTGFiZWxTY29wZSogc2NvcGUgPSBnZW5lcmF0
b3IuYnJlYWtUYXJnZXQobV9pZGVudCk7CisgICAgCisgICAgaWYgKCFzY29wZSkKKyAgICAgICAg
cmV0dXJuIG1faWRlbnQuaXNFbXB0eSgpCisgICAgICAgICAgICA/IGVtaXRUaHJvd0Vycm9yKGdl
bmVyYXRvciwgU3ludGF4RXJyb3IsICJJbnZhbGlkIGJyZWFrIHN0YXRlbWVudC4iKQorICAgICAg
ICAgICAgOiBlbWl0VGhyb3dFcnJvcihnZW5lcmF0b3IsIFN5bnRheEVycm9yLCAiVW5kZWZpbmVk
IGxhYmVsOiAnJXMnLiIsIG1faWRlbnQpOworCisgICAgZ2VuZXJhdG9yLmVtaXRKdW1wU2NvcGVz
KHNjb3BlLT5icmVha1RhcmdldCgpLCBzY29wZS0+c2NvcGVEZXB0aCgpKTsKKyAgICByZXR1cm4g
ZHN0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmV0dXJuTm9kZSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBSZXR1cm5O
b2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJ
RCogZHN0KQoreworICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVt
ZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CisgICAgaWYgKGdlbmVyYXRvci5jb2RlVHlw
ZSgpICE9IEZ1bmN0aW9uQ29kZSkKKyAgICAgICAgcmV0dXJuIGVtaXRUaHJvd0Vycm9yKGdlbmVy
YXRvciwgU3ludGF4RXJyb3IsICJJbnZhbGlkIHJldHVybiBzdGF0ZW1lbnQuIik7CisKKyAgICBp
ZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCisgICAgICAgIGRzdCA9IDA7Cisg
ICAgUmVnaXN0ZXJJRCogcjAgPSBtX3ZhbHVlID8gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV92
YWx1ZSkgOiBnZW5lcmF0b3IuZW1pdExvYWQoZHN0LCBqc1VuZGVmaW5lZCgpKTsKKyAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gcmV0dXJuUmVnaXN0ZXI7CisgICAgaWYgKGdlbmVyYXRvci5zY29wZURl
cHRoKCkpIHsKKyAgICAgICAgUmVmUHRyPExhYmVsPiBsMCA9IGdlbmVyYXRvci5uZXdMYWJlbCgp
OworICAgICAgICBpZiAoZ2VuZXJhdG9yLmhhc0ZpbmFsaXNlcigpICYmICFyMC0+aXNUZW1wb3Jh
cnkoKSkgeworICAgICAgICAgICAgcmV0dXJuUmVnaXN0ZXIgPSBnZW5lcmF0b3IuZW1pdE1vdmUo
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCByMCk7CisgICAgICAgICAgICByMCA9IHJldHVyblJl
Z2lzdGVyLmdldCgpOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcFNjb3Bl
cyhsMC5nZXQoKSwgMCk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobDAuZ2V0KCkpOwor
ICAgIH0KKyAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsTGVhdmVDYWxsRnJhbWUsIGZp
cnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKyAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRSZXR1cm4o
cjApOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2l0aE5vZGUgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklEKiBXaXRoTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKK3sKKyAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVu
dCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAgIAorICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBzY29wZSA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKKyAgICBnZW5lcmF0b3IuZW1pdE5v
ZGUoc2NvcGUuZ2V0KCksIG1fZXhwcik7IC8vIHNjb3BlIG11c3QgYmUgcHJvdGVjdGVkIHVudGls
IHBvcHBlZAorICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8obV9kaXZvdCwgbV9leHBy
ZXNzaW9uTGVuZ3RoLCAwKTsKKyAgICBnZW5lcmF0b3IuZW1pdFB1c2hTY29wZShzY29wZS5nZXQo
KSk7CisgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9z
dGF0ZW1lbnQpOworICAgIGdlbmVyYXRvci5lbWl0UG9wU2NvcGUoKTsKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ2FzZUNsYXVzZU5v
ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5saW5lIHZvaWQgQ2FzZUNs
YXVzZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdp
c3RlcklEKiBkc3QpCit7CisgICAgaWYgKG1fc3RhdGVtZW50cykKKyAgICAgICAgbV9zdGF0ZW1l
bnRzLT5lbWl0Qnl0ZWNvZGUoZ2VuZXJhdG9yLCBkc3QpOworfQorCisvLyAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0gQ2FzZUJsb2NrTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQorCitlbnVtIFN3aXRjaEtpbmQgeyAKKyAgICBTd2l0Y2hVbnNldCA9IDAsCisgICAg
U3dpdGNoTnVtYmVyID0gMSwgCisgICAgU3dpdGNoU3RyaW5nID0gMiwgCisgICAgU3dpdGNoTmVp
dGhlciA9IDMgCit9OworCitzdGF0aWMgdm9pZCBwcm9jZXNzQ2xhdXNlTGlzdChDbGF1c2VMaXN0
Tm9kZSogbGlzdCwgVmVjdG9yPEV4cHJlc3Npb25Ob2RlKiwgOD4mIGxpdGVyYWxWZWN0b3IsIFN3
aXRjaEtpbmQmIHR5cGVGb3JUYWJsZSwgYm9vbCYgc2luZ2xlQ2hhcmFjdGVyU3dpdGNoLCBpbnQz
Ml90JiBtaW5fbnVtLCBpbnQzMl90JiBtYXhfbnVtKQoreworICAgIGZvciAoOyBsaXN0OyBsaXN0
ID0gbGlzdC0+Z2V0TmV4dCgpKSB7CisgICAgICAgIEV4cHJlc3Npb25Ob2RlKiBjbGF1c2VFeHBy
ZXNzaW9uID0gbGlzdC0+Z2V0Q2xhdXNlKCktPmV4cHIoKTsKKyAgICAgICAgbGl0ZXJhbFZlY3Rv
ci5hcHBlbmQoY2xhdXNlRXhwcmVzc2lvbik7CisgICAgICAgIGlmIChjbGF1c2VFeHByZXNzaW9u
LT5pc051bWJlcigpKSB7CisgICAgICAgICAgICBkb3VibGUgdmFsdWUgPSBzdGF0aWNfY2FzdDxO
dW1iZXJOb2RlKj4oY2xhdXNlRXhwcmVzc2lvbiktPnZhbHVlKCk7CisgICAgICAgICAgICBpbnQz
Ml90IGludFZhbCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHZhbHVlKTsKKyAgICAgICAgICAgIGlm
ICgodHlwZUZvclRhYmxlICYgflN3aXRjaE51bWJlcikgfHwgKGludFZhbCAhPSB2YWx1ZSkpIHsK
KyAgICAgICAgICAgICAgICB0eXBlRm9yVGFibGUgPSBTd2l0Y2hOZWl0aGVyOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGludFZhbCA8IG1p
bl9udW0pCisgICAgICAgICAgICAgICAgbWluX251bSA9IGludFZhbDsKKyAgICAgICAgICAgIGlm
IChpbnRWYWwgPiBtYXhfbnVtKQorICAgICAgICAgICAgICAgIG1heF9udW0gPSBpbnRWYWw7Cisg
ICAgICAgICAgICB0eXBlRm9yVGFibGUgPSBTd2l0Y2hOdW1iZXI7CisgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhdXNlRXhwcmVzc2lvbi0+aXNTdHJpbmco
KSkgeworICAgICAgICAgICAgaWYgKHR5cGVGb3JUYWJsZSAmIH5Td2l0Y2hTdHJpbmcpIHsKKyAg
ICAgICAgICAgICAgICB0eXBlRm9yVGFibGUgPSBTd2l0Y2hOZWl0aGVyOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgVVN0cmluZyYgdmFs
dWUgPSBzdGF0aWNfY2FzdDxTdHJpbmdOb2RlKj4oY2xhdXNlRXhwcmVzc2lvbiktPnZhbHVlKCku
dXN0cmluZygpOworICAgICAgICAgICAgaWYgKHNpbmdsZUNoYXJhY3RlclN3aXRjaCAmPSB2YWx1
ZS5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgaW50VmFsID0gdmFsdWUu
cmVwKCktPmRhdGEoKVswXTsKKyAgICAgICAgICAgICAgICBpZiAoaW50VmFsIDwgbWluX251bSkK
KyAgICAgICAgICAgICAgICAgICAgbWluX251bSA9IGludFZhbDsKKyAgICAgICAgICAgICAgICBp
ZiAoaW50VmFsID4gbWF4X251bSkKKyAgICAgICAgICAgICAgICAgICAgbWF4X251bSA9IGludFZh
bDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGVGb3JUYWJsZSA9IFN3aXRjaFN0cmlu
ZzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHR5cGVGb3JUYWJs
ZSA9IFN3aXRjaE5laXRoZXI7CisgICAgICAgIGJyZWFrOyAgICAgICAgCisgICAgfQorfQorICAg
IAorU3dpdGNoSW5mbzo6U3dpdGNoVHlwZSBDYXNlQmxvY2tOb2RlOjp0cnlPcHRpbWl6ZWRTd2l0
Y2goVmVjdG9yPEV4cHJlc3Npb25Ob2RlKiwgOD4mIGxpdGVyYWxWZWN0b3IsIGludDMyX3QmIG1p
bl9udW0sIGludDMyX3QmIG1heF9udW0pCit7CisgICAgU3dpdGNoS2luZCB0eXBlRm9yVGFibGUg
PSBTd2l0Y2hVbnNldDsKKyAgICBib29sIHNpbmdsZUNoYXJhY3RlclN3aXRjaCA9IHRydWU7Cisg
ICAgCisgICAgcHJvY2Vzc0NsYXVzZUxpc3QobV9saXN0MSwgbGl0ZXJhbFZlY3RvciwgdHlwZUZv
clRhYmxlLCBzaW5nbGVDaGFyYWN0ZXJTd2l0Y2gsIG1pbl9udW0sIG1heF9udW0pOworICAgIHBy
b2Nlc3NDbGF1c2VMaXN0KG1fbGlzdDIsIGxpdGVyYWxWZWN0b3IsIHR5cGVGb3JUYWJsZSwgc2lu
Z2xlQ2hhcmFjdGVyU3dpdGNoLCBtaW5fbnVtLCBtYXhfbnVtKTsKKyAgICAKKyAgICBpZiAodHlw
ZUZvclRhYmxlID09IFN3aXRjaFVuc2V0IHx8IHR5cGVGb3JUYWJsZSA9PSBTd2l0Y2hOZWl0aGVy
KQorICAgICAgICByZXR1cm4gU3dpdGNoSW5mbzo6U3dpdGNoTm9uZTsKKyAgICAKKyAgICBpZiAo
dHlwZUZvclRhYmxlID09IFN3aXRjaE51bWJlcikgeworICAgICAgICBpbnQzMl90IHJhbmdlID0g
bWF4X251bSAtIG1pbl9udW07CisgICAgICAgIGlmIChtaW5fbnVtIDw9IG1heF9udW0gJiYgcmFu
Z2UgPD0gMTAwMCAmJiAocmFuZ2UgLyBsaXRlcmFsVmVjdG9yLnNpemUoKSkgPCAxMCkKKyAgICAg
ICAgICAgIHJldHVybiBTd2l0Y2hJbmZvOjpTd2l0Y2hJbW1lZGlhdGU7CisgICAgICAgIHJldHVy
biBTd2l0Y2hJbmZvOjpTd2l0Y2hOb25lOworICAgIH0gCisgICAgCisgICAgQVNTRVJUKHR5cGVG
b3JUYWJsZSA9PSBTd2l0Y2hTdHJpbmcpOworICAgIAorICAgIGlmIChzaW5nbGVDaGFyYWN0ZXJT
d2l0Y2gpIHsKKyAgICAgICAgaW50MzJfdCByYW5nZSA9IG1heF9udW0gLSBtaW5fbnVtOworICAg
ICAgICBpZiAobWluX251bSA8PSBtYXhfbnVtICYmIHJhbmdlIDw9IDEwMDAgJiYgKHJhbmdlIC8g
bGl0ZXJhbFZlY3Rvci5zaXplKCkpIDwgMTApCisgICAgICAgICAgICByZXR1cm4gU3dpdGNoSW5m
bzo6U3dpdGNoQ2hhcmFjdGVyOworICAgIH0KKworICAgIHJldHVybiBTd2l0Y2hJbmZvOjpTd2l0
Y2hTdHJpbmc7Cit9CisKK1JlZ2lzdGVySUQqIENhc2VCbG9ja05vZGU6OmVtaXRCeXRlY29kZUZv
ckJsb2NrKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIHN3aXRjaEV4
cHJlc3Npb24sIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBSZWZQdHI8TGFiZWw+IGRlZmF1bHRM
YWJlbDsKKyAgICBWZWN0b3I8UmVmUHRyPExhYmVsPiwgOD4gbGFiZWxWZWN0b3I7CisgICAgVmVj
dG9yPEV4cHJlc3Npb25Ob2RlKiwgOD4gbGl0ZXJhbFZlY3RvcjsKKyAgICBpbnQzMl90IG1pbl9u
dW0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKKyAgICBpbnQzMl90IG1h
eF9udW0gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKTsKKyAgICBTd2l0Y2hJ
bmZvOjpTd2l0Y2hUeXBlIHN3aXRjaFR5cGUgPSB0cnlPcHRpbWl6ZWRTd2l0Y2gobGl0ZXJhbFZl
Y3RvciwgbWluX251bSwgbWF4X251bSk7CisKKyAgICBpZiAoc3dpdGNoVHlwZSAhPSBTd2l0Y2hJ
bmZvOjpTd2l0Y2hOb25lKSB7CisgICAgICAgIC8vIFByZXBhcmUgdGhlIHZhcmlvdXMgbGFiZWxz
CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsaXRlcmFsVmVjdG9yLnNpemUoKTsg
aSsrKQorICAgICAgICAgICAgbGFiZWxWZWN0b3IuYXBwZW5kKGdlbmVyYXRvci5uZXdMYWJlbCgp
KTsKKyAgICAgICAgZGVmYXVsdExhYmVsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgICAg
IGdlbmVyYXRvci5iZWdpblN3aXRjaChzd2l0Y2hFeHByZXNzaW9uLCBzd2l0Y2hUeXBlKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBTZXR1cCBqdW1wcworICAgICAgICBmb3IgKENsYXVzZUxp
c3ROb2RlKiBsaXN0ID0gbV9saXN0MTsgbGlzdDsgbGlzdCA9IGxpc3QtPmdldE5leHQoKSkgewor
ICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGNsYXVzZVZhbCA9IGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKTsKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShjbGF1c2VWYWwuZ2V0
KCksIGxpc3QtPmdldENsYXVzZSgpLT5leHByKCkpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmVt
aXRCaW5hcnlPcChvcF9zdHJpY3RlcSwgY2xhdXNlVmFsLmdldCgpLCBjbGF1c2VWYWwuZ2V0KCks
IHN3aXRjaEV4cHJlc3Npb24sIE9wZXJhbmRUeXBlcygpKTsKKyAgICAgICAgICAgIGxhYmVsVmVj
dG9yLmFwcGVuZChnZW5lcmF0b3IubmV3TGFiZWwoKSk7CisgICAgICAgICAgICBnZW5lcmF0b3Iu
ZW1pdEp1bXBJZlRydWUoY2xhdXNlVmFsLmdldCgpLCBsYWJlbFZlY3RvcltsYWJlbFZlY3Rvci5z
aXplKCkgLSAxXS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoQ2xh
dXNlTGlzdE5vZGUqIGxpc3QgPSBtX2xpc3QyOyBsaXN0OyBsaXN0ID0gbGlzdC0+Z2V0TmV4dCgp
KSB7CisgICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gY2xhdXNlVmFsID0gZ2VuZXJhdG9y
Lm5ld1RlbXBvcmFyeSgpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGNsYXVzZVZh
bC5nZXQoKSwgbGlzdC0+Z2V0Q2xhdXNlKCktPmV4cHIoKSk7CisgICAgICAgICAgICBnZW5lcmF0
b3IuZW1pdEJpbmFyeU9wKG9wX3N0cmljdGVxLCBjbGF1c2VWYWwuZ2V0KCksIGNsYXVzZVZhbC5n
ZXQoKSwgc3dpdGNoRXhwcmVzc2lvbiwgT3BlcmFuZFR5cGVzKCkpOworICAgICAgICAgICAgbGFi
ZWxWZWN0b3IuYXBwZW5kKGdlbmVyYXRvci5uZXdMYWJlbCgpKTsKKyAgICAgICAgICAgIGdlbmVy
YXRvci5lbWl0SnVtcElmVHJ1ZShjbGF1c2VWYWwuZ2V0KCksIGxhYmVsVmVjdG9yW2xhYmVsVmVj
dG9yLnNpemUoKSAtIDFdLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0TGFiZWwg
PSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGRlZmF1
bHRMYWJlbC5nZXQoKSk7CisgICAgfQorCisgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gMDsKKwor
ICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKENsYXVzZUxpc3ROb2RlKiBsaXN0ID0gbV9saXN0
MTsgbGlzdDsgbGlzdCA9IGxpc3QtPmdldE5leHQoKSkgeworICAgICAgICBnZW5lcmF0b3IuZW1p
dExhYmVsKGxhYmVsVmVjdG9yW2krK10uZ2V0KCkpOworICAgICAgICBsaXN0LT5nZXRDbGF1c2Uo
KS0+ZW1pdEJ5dGVjb2RlKGdlbmVyYXRvciwgZHN0KTsKKyAgICB9CisKKyAgICBpZiAobV9kZWZh
dWx0Q2xhdXNlKSB7CisgICAgICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoZGVmYXVsdExhYmVsLmdl
dCgpKTsKKyAgICAgICAgbV9kZWZhdWx0Q2xhdXNlLT5lbWl0Qnl0ZWNvZGUoZ2VuZXJhdG9yLCBk
c3QpOworICAgIH0KKworICAgIGZvciAoQ2xhdXNlTGlzdE5vZGUqIGxpc3QgPSBtX2xpc3QyOyBs
aXN0OyBsaXN0ID0gbGlzdC0+Z2V0TmV4dCgpKSB7CisgICAgICAgIGdlbmVyYXRvci5lbWl0TGFi
ZWwobGFiZWxWZWN0b3JbaSsrXS5nZXQoKSk7CisgICAgICAgIGxpc3QtPmdldENsYXVzZSgpLT5l
bWl0Qnl0ZWNvZGUoZ2VuZXJhdG9yLCBkc3QpOworICAgIH0KKyAgICBpZiAoIW1fZGVmYXVsdENs
YXVzZSkKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChkZWZhdWx0TGFiZWwuZ2V0KCkpOwor
CisgICAgQVNTRVJUKGkgPT0gbGFiZWxWZWN0b3Iuc2l6ZSgpKTsKKyAgICBpZiAoc3dpdGNoVHlw
ZSAhPSBTd2l0Y2hJbmZvOjpTd2l0Y2hOb25lKSB7CisgICAgICAgIEFTU0VSVChsYWJlbFZlY3Rv
ci5zaXplKCkgPT0gbGl0ZXJhbFZlY3Rvci5zaXplKCkpOworICAgICAgICBnZW5lcmF0b3IuZW5k
U3dpdGNoKGxhYmVsVmVjdG9yLnNpemUoKSwgbGFiZWxWZWN0b3IuZGF0YSgpLCBsaXRlcmFsVmVj
dG9yLmRhdGEoKSwgZGVmYXVsdExhYmVsLmdldCgpLCBtaW5fbnVtLCBtYXhfbnVtKTsKKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIFN3aXRjaE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVn
aXN0ZXJJRCogU3dpdGNoTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5l
cmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhX
aWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAgIAorICAg
IFJlZlB0cjxMYWJlbFNjb3BlPiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVs
U2NvcGU6OlN3aXRjaCk7CisKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcjAgPSBnZW5lcmF0b3Iu
ZW1pdE5vZGUobV9leHByKTsKKyAgICBSZWdpc3RlcklEKiByMSA9IG1fYmxvY2stPmVtaXRCeXRl
Y29kZUZvckJsb2NrKGdlbmVyYXRvciwgcjAuZ2V0KCksIGRzdCk7CisKKyAgICBnZW5lcmF0b3Iu
ZW1pdExhYmVsKHNjb3BlLT5icmVha1RhcmdldCgpKTsKKyAgICByZXR1cm4gcjE7Cit9CisKKy8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMYWJlbE5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIExhYmVsTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKK3sKKyAg
ICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5l
KCksIGxhc3RMaW5lKCkpOworCisgICAgaWYgKGdlbmVyYXRvci5icmVha1RhcmdldChtX25hbWUp
KQorICAgICAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBTeW50YXhFcnJvciwg
IkR1cGxpY2F0ZSBsYWJlbDogJXMuIiwgbV9uYW1lKTsKKworICAgIFJlZlB0cjxMYWJlbFNjb3Bl
PiBzY29wZSA9IGdlbmVyYXRvci5uZXdMYWJlbFNjb3BlKExhYmVsU2NvcGU6Ok5hbWVkTGFiZWws
ICZtX25hbWUpOworICAgIFJlZ2lzdGVySUQqIHIwID0gZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwg
bV9zdGF0ZW1lbnQpOworCisgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChzY29wZS0+YnJlYWtUYXJn
ZXQoKSk7CisgICAgcmV0dXJuIHIwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0gVGhyb3dOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitS
ZWdpc3RlcklEKiBUaHJvd05vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2so
V2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKworICAgIGlm
IChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKKyAgICAgICAgZHN0ID0gMDsKKyAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gZXhwciA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOwor
ICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwg
ZW5kT2Zmc2V0KCkpOworICAgIGdlbmVyYXRvci5lbWl0VGhyb3coZXhwci5nZXQoKSk7CisgICAg
cmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUcnlOb2Rl
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZ2lzdGVySUQqIFRy
eU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKiBkc3QpCit7CisgICAgLy8gTk9URTogVGhlIGNhdGNoIGFuZCBmaW5hbGx5IGJsb2NrcyBt
dXN0IGJlIGxhYmVsZWQgZXhwbGljaXRseSwgc28gdGhlCisgICAgLy8gb3B0aW1pemVyIGtub3dz
IHRoZXkgbWF5IGJlIGp1bXBlZCB0byBmcm9tIGFueXdoZXJlLgorCisgICAgZ2VuZXJhdG9yLmVt
aXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgp
KTsKKworICAgIFJlZlB0cjxMYWJlbD4gdHJ5U3RhcnRMYWJlbCA9IGdlbmVyYXRvci5uZXdMYWJl
bCgpOworICAgIFJlZlB0cjxMYWJlbD4gZmluYWxseVN0YXJ0OworICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBmaW5hbGx5UmV0dXJuQWRkcjsKKyAgICBpZiAobV9maW5hbGx5QmxvY2spIHsKKyAgICAg
ICAgZmluYWxseVN0YXJ0ID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisgICAgICAgIGZpbmFsbHlS
ZXR1cm5BZGRyID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOworICAgICAgICBnZW5lcmF0b3Iu
cHVzaEZpbmFsbHlDb250ZXh0KGZpbmFsbHlTdGFydC5nZXQoKSwgZmluYWxseVJldHVybkFkZHIu
Z2V0KCkpOworICAgIH0KKworICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodHJ5U3RhcnRMYWJlbC5n
ZXQoKSk7CisgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGRzdCwgbV90cnlCbG9jayk7CisKKyAgICBp
ZiAobV9jYXRjaEJsb2NrKSB7CisgICAgICAgIFJlZlB0cjxMYWJlbD4gY2F0Y2hFbmRMYWJlbCA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOworICAgICAgICAKKyAgICAgICAgLy8gTm9ybWFsIHBhdGg6
IGp1bXAgb3ZlciB0aGUgY2F0Y2ggYmxvY2suCisgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcChj
YXRjaEVuZExhYmVsLmdldCgpKTsKKworICAgICAgICAvLyBVbmNhdWdodCBleGNlcHRpb24gcGF0
aDogdGhlIGNhdGNoIGJsb2NrLgorICAgICAgICBSZWZQdHI8TGFiZWw+IGhlcmUgPSBnZW5lcmF0
b3IuZW1pdExhYmVsKGdlbmVyYXRvci5uZXdMYWJlbCgpLmdldCgpKTsKKyAgICAgICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IGV4Y2VwdGlvblJlZ2lzdGVyID0gZ2VuZXJhdG9yLmVtaXRDYXRjaChnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCksIHRyeVN0YXJ0TGFiZWwuZ2V0KCksIGhlcmUuZ2V0KCkpOwor
ICAgICAgICBpZiAobV9jYXRjaEhhc0V2YWwpIHsKKyAgICAgICAgICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBkeW5hbWljU2NvcGVPYmplY3QgPSBnZW5lcmF0b3IuZW1pdE5ld09iamVjdChnZW5lcmF0
b3IubmV3VGVtcG9yYXJ5KCkpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGR5
bmFtaWNTY29wZU9iamVjdC5nZXQoKSwgbV9leGNlcHRpb25JZGVudCwgZXhjZXB0aW9uUmVnaXN0
ZXIuZ2V0KCkpOworICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRNb3ZlKGV4Y2VwdGlvblJlZ2lz
dGVyLmdldCgpLCBkeW5hbWljU2NvcGVPYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgZ2VuZXJh
dG9yLmVtaXRQdXNoU2NvcGUoZXhjZXB0aW9uUmVnaXN0ZXIuZ2V0KCkpOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHVzaE5ld1Njb3BlKGV4Y2VwdGlvblJlZ2lz
dGVyLmdldCgpLCBtX2V4Y2VwdGlvbklkZW50LCBleGNlcHRpb25SZWdpc3Rlci5nZXQoKSk7Cisg
ICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fY2F0Y2hCbG9jayk7CisgICAgICAgIGdl
bmVyYXRvci5lbWl0UG9wU2NvcGUoKTsKKyAgICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChjYXRj
aEVuZExhYmVsLmdldCgpKTsKKyAgICB9CisKKyAgICBpZiAobV9maW5hbGx5QmxvY2spIHsKKyAg
ICAgICAgZ2VuZXJhdG9yLnBvcEZpbmFsbHlDb250ZXh0KCk7CisgICAgICAgIC8vIHRoZXJlIG1h
eSBiZSBpbXBvcnRhbnQgcmVnaXN0ZXJzIGxpdmUgYXQgdGhlIHRpbWUgd2UganVtcAorICAgICAg
ICAvLyB0byBhIGZpbmFsbHkgYmxvY2sgKHN1Y2ggYXMgZm9yIGEgcmV0dXJuIG9yIHRocm93KSBz
byB3ZQorICAgICAgICAvLyByZWYgdGhlIGhpZ2hlc3QgcmVnaXN0ZXIgZXZlciB1c2VkIGFzIGEg
Y29uc2VydmF0aXZlCisgICAgICAgIC8vIGFwcHJvYWNoIHRvIG5vdCBjbG9iYmVyaW5nIGFueXRo
aW5nIGltcG9ydGFudAorICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gaGlnaGVzdFVzZWRSZWdp
c3RlciA9IGdlbmVyYXRvci5oaWdoZXN0VXNlZFJlZ2lzdGVyKCk7CisgICAgICAgIFJlZlB0cjxM
YWJlbD4gZmluYWxseUVuZExhYmVsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7CisKKyAgICAgICAg
Ly8gTm9ybWFsIHBhdGg6IGludm9rZSB0aGUgZmluYWxseSBibG9jaywgdGhlbiBqdW1wIG92ZXIg
aXQuCisgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcFN1YnJvdXRpbmUoZmluYWxseVJldHVybkFk
ZHIuZ2V0KCksIGZpbmFsbHlTdGFydC5nZXQoKSk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0SnVt
cChmaW5hbGx5RW5kTGFiZWwuZ2V0KCkpOworCisgICAgICAgIC8vIFVuY2F1Z2h0IGV4Y2VwdGlv
biBwYXRoOiBpbnZva2UgdGhlIGZpbmFsbHkgYmxvY2ssIHRoZW4gcmUtdGhyb3cgdGhlIGV4Y2Vw
dGlvbi4KKyAgICAgICAgUmVmUHRyPExhYmVsPiBoZXJlID0gZ2VuZXJhdG9yLmVtaXRMYWJlbChn
ZW5lcmF0b3IubmV3TGFiZWwoKS5nZXQoKSk7CisgICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0
ZW1wRXhjZXB0aW9uUmVnaXN0ZXIgPSBnZW5lcmF0b3IuZW1pdENhdGNoKGdlbmVyYXRvci5uZXdU
ZW1wb3JhcnkoKSwgdHJ5U3RhcnRMYWJlbC5nZXQoKSwgaGVyZS5nZXQoKSk7CisgICAgICAgIGdl
bmVyYXRvci5lbWl0SnVtcFN1YnJvdXRpbmUoZmluYWxseVJldHVybkFkZHIuZ2V0KCksIGZpbmFs
bHlTdGFydC5nZXQoKSk7CisgICAgICAgIGdlbmVyYXRvci5lbWl0VGhyb3codGVtcEV4Y2VwdGlv
blJlZ2lzdGVyLmdldCgpKTsKKworICAgICAgICAvLyBUaGUgZmluYWxseSBibG9jay4KKyAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChmaW5hbGx5U3RhcnQuZ2V0KCkpOworICAgICAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZHN0LCBtX2ZpbmFsbHlCbG9jayk7CisgICAgICAgIGdlbmVyYXRvci5l
bWl0U3Vicm91dGluZVJldHVybihmaW5hbGx5UmV0dXJuQWRkci5nZXQoKSk7CisKKyAgICAgICAg
Z2VuZXJhdG9yLmVtaXRMYWJlbChmaW5hbGx5RW5kTGFiZWwuZ2V0KCkpOworICAgIH0KKworICAg
IHJldHVybiBkc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU2NvcGVO
b2RlRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2NvcGVOb2RlRGF0YTo6U2Nv
cGVOb2RlRGF0YShQYXJzZXJBcmVuYSYgYXJlbmEsIFNvdXJjZUVsZW1lbnRzKiBzdGF0ZW1lbnRz
LCBWYXJTdGFjayogdmFyU3RhY2ssIEZ1bmN0aW9uU3RhY2sqIGZ1bmNTdGFjaywgaW50IG51bUNv
bnN0YW50cykKKyAgICA6IG1fbnVtQ29uc3RhbnRzKG51bUNvbnN0YW50cykKKyAgICAsIG1fc3Rh
dGVtZW50cyhzdGF0ZW1lbnRzKQoreworICAgIG1fYXJlbmEuc3dhcChhcmVuYSk7CisgICAgaWYg
KHZhclN0YWNrKQorICAgICAgICBtX3ZhclN0YWNrLnN3YXAoKnZhclN0YWNrKTsKKyAgICBpZiAo
ZnVuY1N0YWNrKQorICAgICAgICBtX2Z1bmN0aW9uU3RhY2suc3dhcCgqZnVuY1N0YWNrKTsKK30K
KworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNjb3BlTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQorCitTY29wZU5vZGU6OlNjb3BlTm9kZShKU0dsb2JhbERhdGEq
IGdsb2JhbERhdGEpCisgICAgOiBTdGF0ZW1lbnROb2RlKGdsb2JhbERhdGEpCisgICAgLCBQYXJz
ZXJBcmVuYVJlZkNvdW50ZWQoZ2xvYmFsRGF0YSkKKyAgICAsIG1fZmVhdHVyZXMoTm9GZWF0dXJl
cykKK3sKK30KKworU2NvcGVOb2RlOjpTY29wZU5vZGUoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRh
LCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIFNvdXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFy
U3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0YWNrKiBmdW5jU3RhY2ssIENvZGVGZWF0dXJlcyBm
ZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKKyAgICA6IFN0YXRlbWVudE5vZGUoZ2xvYmFsRGF0
YSkKKyAgICAsIFBhcnNlckFyZW5hUmVmQ291bnRlZChnbG9iYWxEYXRhKQorICAgICwgbV9kYXRh
KG5ldyBTY29wZU5vZGVEYXRhKGdsb2JhbERhdGEtPnBhcnNlci0+YXJlbmEoKSwgY2hpbGRyZW4s
IHZhclN0YWNrLCBmdW5jU3RhY2ssIG51bUNvbnN0YW50cykpCisgICAgLCBtX2ZlYXR1cmVzKGZl
YXR1cmVzKQorICAgICwgbV9zb3VyY2Uoc291cmNlKQoreworfQorCitpbmxpbmUgdm9pZCBTY29w
ZU5vZGU6OmVtaXRTdGF0ZW1lbnRzQnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIGlmIChtX2RhdGEtPm1fc3RhdGVtZW50cykKKyAg
ICAgICAgbV9kYXRhLT5tX3N0YXRlbWVudHMtPmVtaXRCeXRlY29kZShnZW5lcmF0b3IsIGRzdCk7
Cit9CisKK1N0YXRlbWVudE5vZGUqIFNjb3BlTm9kZTo6c2luZ2xlU3RhdGVtZW50KCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX3N0YXRlbWVudHMgPyBtX2RhdGEtPm1fc3RhdGVtZW50
cy0+c2luZ2xlU3RhdGVtZW50KCkgOiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gUHJvZ3JhbU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5s
aW5lIFByb2dyYW1Ob2RlOjpQcm9ncmFtTm9kZShKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEsIFNv
dXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFyU3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0YWNr
KiBmdW5jU3RhY2ssIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgQ29kZUZlYXR1cmVzIGZlYXR1
cmVzLCBpbnQgbnVtQ29uc3RhbnRzKQorICAgIDogU2NvcGVOb2RlKGdsb2JhbERhdGEsIHNvdXJj
ZSwgY2hpbGRyZW4sIHZhclN0YWNrLCBmdW5jU3RhY2ssIGZlYXR1cmVzLCBudW1Db25zdGFudHMp
Cit7Cit9CisKK1Bhc3NSZWZQdHI8UHJvZ3JhbU5vZGU+IFByb2dyYW1Ob2RlOjpjcmVhdGUoSlNH
bG9iYWxEYXRhKiBnbG9iYWxEYXRhLCBTb3VyY2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNr
KiB2YXJTdGFjaywgRnVuY3Rpb25TdGFjayogZnVuY1N0YWNrLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKK3sKKyAgICBS
ZWZQdHI8UHJvZ3JhbU5vZGU+IG5vZGUgPSBuZXcgUHJvZ3JhbU5vZGUoZ2xvYmFsRGF0YSwgY2hp
bGRyZW4sIHZhclN0YWNrLCBmdW5jU3RhY2ssIHNvdXJjZSwgZmVhdHVyZXMsIG51bUNvbnN0YW50
cyk7CisKKyAgICBBU1NFUlQobm9kZS0+ZGF0YSgpLT5tX2FyZW5hLmxhc3QoKSA9PSBub2RlKTsK
KyAgICBub2RlLT5kYXRhKCktPm1fYXJlbmEucmVtb3ZlTGFzdCgpOworICAgIEFTU0VSVCghbm9k
ZS0+ZGF0YSgpLT5tX2FyZW5hLmNvbnRhaW5zKG5vZGUuZ2V0KCkpKTsKKworICAgIHJldHVybiBu
b2RlLnJlbGVhc2UoKTsKK30KKworUmVnaXN0ZXJJRCogUHJvZ3JhbU5vZGU6OmVtaXRCeXRlY29k
ZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKikKK3sKKyAgICBnZW5l
cmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVByb2dyYW0sIGZpcnN0TGluZSgpLCBsYXN0
TGluZSgpKTsKKworICAgIFJlZlB0cjxSZWdpc3RlcklEPiBkc3RSZWdpc3RlciA9IGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKTsKKyAgICBnZW5lcmF0b3IuZW1pdExvYWQoZHN0UmVnaXN0ZXIuZ2V0
KCksIGpzVW5kZWZpbmVkKCkpOworICAgIGVtaXRTdGF0ZW1lbnRzQnl0ZWNvZGUoZ2VuZXJhdG9y
LCBkc3RSZWdpc3Rlci5nZXQoKSk7CisKKyAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhEaWRF
eGVjdXRlUHJvZ3JhbSwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAgIGdlbmVyYXRvci5l
bWl0RW5kKGRzdFJlZ2lzdGVyLmdldCgpKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2YWxOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCisKK2lubGluZSBFdmFsTm9kZTo6RXZhbE5vZGUoSlNHbG9iYWxEYXRhKiBnbG9iYWxE
YXRhLCBTb3VyY2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNrKiB2YXJTdGFjaywgRnVuY3Rp
b25TdGFjayogZnVuY1N0YWNrLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2UsIENvZGVGZWF0dXJl
cyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKKyAgICA6IFNjb3BlTm9kZShnbG9iYWxEYXRh
LCBzb3VyY2UsIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVuY1N0YWNrLCBmZWF0dXJlcywgbnVtQ29u
c3RhbnRzKQoreworfQorCitQYXNzUmVmUHRyPEV2YWxOb2RlPiBFdmFsTm9kZTo6Y3JlYXRlKEpT
R2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgU291cmNlRWxlbWVudHMqIGNoaWxkcmVuLCBWYXJTdGFj
ayogdmFyU3RhY2ssIEZ1bmN0aW9uU3RhY2sqIGZ1bmNTdGFjaywgY29uc3QgU291cmNlQ29kZSYg
c291cmNlLCBDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGludCBudW1Db25zdGFudHMpCit7CisgICAg
UmVmUHRyPEV2YWxOb2RlPiBub2RlID0gbmV3IEV2YWxOb2RlKGdsb2JhbERhdGEsIGNoaWxkcmVu
LCB2YXJTdGFjaywgZnVuY1N0YWNrLCBzb3VyY2UsIGZlYXR1cmVzLCBudW1Db25zdGFudHMpOwor
CisgICAgQVNTRVJUKG5vZGUtPmRhdGEoKS0+bV9hcmVuYS5sYXN0KCkgPT0gbm9kZSk7CisgICAg
bm9kZS0+ZGF0YSgpLT5tX2FyZW5hLnJlbW92ZUxhc3QoKTsKKyAgICBBU1NFUlQoIW5vZGUtPmRh
dGEoKS0+bV9hcmVuYS5jb250YWlucyhub2RlLmdldCgpKSk7CisKKyAgICByZXR1cm4gbm9kZS5y
ZWxlYXNlKCk7Cit9CisKK1JlZ2lzdGVySUQqIEV2YWxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCopCit7CisgICAgZ2VuZXJhdG9yLmVt
aXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVQcm9ncmFtLCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7
CisKKyAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZHN0UmVnaXN0ZXIgPSBnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCk7CisgICAgZ2VuZXJhdG9yLmVtaXRMb2FkKGRzdFJlZ2lzdGVyLmdldCgpLCBqc1Vu
ZGVmaW5lZCgpKTsKKyAgICBlbWl0U3RhdGVtZW50c0J5dGVjb2RlKGdlbmVyYXRvciwgZHN0UmVn
aXN0ZXIuZ2V0KCkpOworCisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soRGlkRXhlY3V0ZVBy
b2dyYW0sIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKyAgICBnZW5lcmF0b3IuZW1pdEVuZChk
c3RSZWdpc3Rlci5nZXQoKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbkJvZHlOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCisKK0Z1bmN0aW9uUGFyYW1ldGVyczo6RnVuY3Rpb25QYXJhbWV0ZXJzKFBhcmFtZXRl
ck5vZGUqIGZpcnN0UGFyYW1ldGVyKQoreworICAgIGZvciAoUGFyYW1ldGVyTm9kZSogcGFyYW1l
dGVyID0gZmlyc3RQYXJhbWV0ZXI7IHBhcmFtZXRlcjsgcGFyYW1ldGVyID0gcGFyYW1ldGVyLT5u
ZXh0UGFyYW0oKSkKKyAgICAgICAgYXBwZW5kKHBhcmFtZXRlci0+aWRlbnQoKSk7Cit9CisKK2lu
bGluZSBGdW5jdGlvbkJvZHlOb2RlOjpGdW5jdGlvbkJvZHlOb2RlKEpTR2xvYmFsRGF0YSogZ2xv
YmFsRGF0YSkKKyAgICA6IFNjb3BlTm9kZShnbG9iYWxEYXRhKQoreworfQorCitpbmxpbmUgRnVu
Y3Rpb25Cb2R5Tm9kZTo6RnVuY3Rpb25Cb2R5Tm9kZShKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEs
IFNvdXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFyU3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0
YWNrKiBmdW5jU3RhY2ssIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZUNvZGUsIENvZGVGZWF0dXJl
cyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKKyAgICA6IFNjb3BlTm9kZShnbG9iYWxEYXRh
LCBzb3VyY2VDb2RlLCBjaGlsZHJlbiwgdmFyU3RhY2ssIGZ1bmNTdGFjaywgZmVhdHVyZXMsIG51
bUNvbnN0YW50cykKK3sKK30KKwordm9pZCBGdW5jdGlvbkJvZHlOb2RlOjpmaW5pc2hQYXJzaW5n
KGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgUGFyYW1ldGVyTm9kZSogZmlyc3RQYXJhbWV0ZXIs
IGNvbnN0IElkZW50aWZpZXImIGlkZW50KQoreworICAgIHNldFNvdXJjZShzb3VyY2UpOworICAg
IGZpbmlzaFBhcnNpbmcoRnVuY3Rpb25QYXJhbWV0ZXJzOjpjcmVhdGUoZmlyc3RQYXJhbWV0ZXIp
LCBpZGVudCk7Cit9CisKK3ZvaWQgRnVuY3Rpb25Cb2R5Tm9kZTo6ZmluaXNoUGFyc2luZyhQYXNz
UmVmUHRyPEZ1bmN0aW9uUGFyYW1ldGVycz4gcGFyYW1ldGVycywgY29uc3QgSWRlbnRpZmllciYg
aWRlbnQpCit7CisgICAgQVNTRVJUKCFzb3VyY2UoKS5pc051bGwoKSk7CisgICAgbV9wYXJhbWV0
ZXJzID0gcGFyYW1ldGVyczsKKyAgICBtX2lkZW50ID0gaWRlbnQ7Cit9CisKK0Z1bmN0aW9uQm9k
eU5vZGUqIEZ1bmN0aW9uQm9keU5vZGU6OmNyZWF0ZShKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEp
Cit7CisgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkJvZHlOb2RlKGdsb2JhbERhdGEpOworfQorCitQ
YXNzUmVmUHRyPEZ1bmN0aW9uQm9keU5vZGU+IEZ1bmN0aW9uQm9keU5vZGU6OmNyZWF0ZShKU0ds
b2JhbERhdGEqIGdsb2JhbERhdGEsIFNvdXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFyU3RhY2sq
IHZhclN0YWNrLCBGdW5jdGlvblN0YWNrKiBmdW5jU3RhY2ssIGNvbnN0IFNvdXJjZUNvZGUmIHNv
dXJjZUNvZGUsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKK3sKKyAg
ICBSZWZQdHI8RnVuY3Rpb25Cb2R5Tm9kZT4gbm9kZSA9IG5ldyBGdW5jdGlvbkJvZHlOb2RlKGds
b2JhbERhdGEsIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVuY1N0YWNrLCBzb3VyY2VDb2RlLCBmZWF0
dXJlcywgbnVtQ29uc3RhbnRzKTsKKworICAgIEFTU0VSVChub2RlLT5kYXRhKCktPm1fYXJlbmEu
bGFzdCgpID09IG5vZGUpOworICAgIG5vZGUtPmRhdGEoKS0+bV9hcmVuYS5yZW1vdmVMYXN0KCk7
CisgICAgQVNTRVJUKCFub2RlLT5kYXRhKCktPm1fYXJlbmEuY29udGFpbnMobm9kZS5nZXQoKSkp
OworCisgICAgcmV0dXJuIG5vZGUucmVsZWFzZSgpOworfQorCitSZWdpc3RlcklEKiBGdW5jdGlv
bkJvZHlOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCopCit7CisgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soRGlkRW50ZXJDYWxsRnJh
bWUsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKKyAgICBlbWl0U3RhdGVtZW50c0J5dGVjb2Rl
KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSk7CisgICAgU3RhdGVtZW50Tm9k
ZSogc2luZ2xlU3RhdGVtZW50ID0gdGhpcy0+c2luZ2xlU3RhdGVtZW50KCk7CisgICAgaWYgKHNp
bmdsZVN0YXRlbWVudCAmJiBzaW5nbGVTdGF0ZW1lbnQtPmlzQmxvY2soKSkgeworICAgICAgICBT
dGF0ZW1lbnROb2RlKiBsYXN0U3RhdGVtZW50SW5CbG9jayA9IHN0YXRpY19jYXN0PEJsb2NrTm9k
ZSo+KHNpbmdsZVN0YXRlbWVudCktPmxhc3RTdGF0ZW1lbnQoKTsKKyAgICAgICAgaWYgKGxhc3RT
dGF0ZW1lbnRJbkJsb2NrICYmIGxhc3RTdGF0ZW1lbnRJbkJsb2NrLT5pc1JldHVybk5vZGUoKSkK
KyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFJlZ2lzdGVySUQqIHIwID0gZ2Vu
ZXJhdG9yLmVtaXRMb2FkKDAsIGpzVW5kZWZpbmVkKCkpOworICAgIGdlbmVyYXRvci5lbWl0RGVi
dWdIb29rKFdpbGxMZWF2ZUNhbGxGcmFtZSwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOworICAg
IGdlbmVyYXRvci5lbWl0UmV0dXJuKHIwKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmNEZWNsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KKworUmVnaXN0ZXJJRCogRnVuY0RlY2xOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQoreworICAgIGlm
IChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKKyAgICAgICAgZHN0ID0gMDsKKyAg
ICByZXR1cm4gZHN0OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVu
Y0V4cHJOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZWdpc3RlcklE
KiBGdW5jRXhwck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCit7CisgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0TmV3RnVuY3Rp
b25FeHByZXNzaW9uKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHRoaXMpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IEphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxlci9O
b2Rlc0NvZGVnZW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL2J5dGVjb21waWxl
ci9Ob2Rlc0NvZGVnZW4uY3BwCShyZXZpc2lvbiA1MTgxNikKKysrIEphdmFTY3JpcHRDb3JlL2J5
dGVjb21waWxlci9Ob2Rlc0NvZGVnZW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMDcsMzUgKzEw
Nyw2IEBAIGlubGluZSBSZWdpc3RlcklEKiBUaHJvd2FibGVFeHByZXNzaW9uRGEKICAgICByZXR1
cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCB0eXBlLCBtZXNzYWdlVGVtcGxhdGUsIGxhYmVs
LnVzdHJpbmcoKSk7CiB9CiAKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0
ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgU3RhdGVt
ZW50Tm9kZTo6c2V0TG9jKGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSkKLXsKLSAgICBtX2xp
bmUgPSBmaXJzdExpbmU7Ci0gICAgbV9sYXN0TGluZSA9IGxhc3RMaW5lOwotfQotCi0vLyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU291cmNlRWxlbWVudHMgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBTb3VyY2VFbGVtZW50czo6YXBwZW5kKFN0YXRlbWVu
dE5vZGUqIHN0YXRlbWVudCkKLXsKLSAgICBpZiAoc3RhdGVtZW50LT5pc0VtcHR5U3RhdGVtZW50
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICBtX3N0YXRlbWVudHMuYXBwZW5kKHN0YXRlbWVudCk7
Ci19Ci0KLWlubGluZSBTdGF0ZW1lbnROb2RlKiBTb3VyY2VFbGVtZW50czo6c2luZ2xlU3RhdGVt
ZW50KCkgY29uc3QKLXsKLSAgICBzaXplX3Qgc2l6ZSA9IG1fc3RhdGVtZW50cy5zaXplKCk7Ci0g
ICAgcmV0dXJuIHNpemUgPT0gMSA/IG1fc3RhdGVtZW50c1swXSA6IDA7Ci19Ci0KLWlubGluZSBT
dGF0ZW1lbnROb2RlKiBTb3VyY2VFbGVtZW50czo6bGFzdFN0YXRlbWVudCgpIGNvbnN0Ci17Ci0g
ICAgc2l6ZV90IHNpemUgPSBtX3N0YXRlbWVudHMuc2l6ZSgpOwotICAgIHJldHVybiBzaXplID8g
bV9zdGF0ZW1lbnRzW3NpemUgLSAxXSA6IDA7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLSBOdWxsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAKIFJlZ2lzdGVySUQqIE51bGxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQpAQCAtMTMyNiw2ICsxMjk3LDEzIEBAIFJlZ2lz
dGVySUQqIENvbnN0U3RhdGVtZW50Tm9kZTo6ZW1pdEJ5dGUKIAogLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tIFNvdXJjZUVsZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KIAorCitpbmxpbmUgU3RhdGVtZW50Tm9kZSogU291cmNlRWxlbWVudHM6Omxhc3RTdGF0
ZW1lbnQoKSBjb25zdAoreworICAgIHNpemVfdCBzaXplID0gbV9zdGF0ZW1lbnRzLnNpemUoKTsK
KyAgICByZXR1cm4gc2l6ZSA/IG1fc3RhdGVtZW50c1tzaXplIC0gMV0gOiAwOworfQorCiBpbmxp
bmUgdm9pZCBTb3VyY2VFbGVtZW50czo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBn
ZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKICAgICBzaXplX3Qgc2l6ZSA9IG1fc3RhdGVt
ZW50cy5zaXplKCk7CkBAIC0xOTQ4LDY2ICsxOTI2LDE2IEBAIFJlZ2lzdGVySUQqIFRyeU5vZGU6
OmVtaXRCeXRlY29kZShCeXRlY28KICAgICByZXR1cm4gZHN0OwogfQogCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLVNjb3BlTm9kZURhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLVNjb3BlTm9kZURhdGE6OlNjb3BlTm9kZURhdGEoUGFyc2VyQXJlbmEmIGFyZW5hLCBT
b3VyY2VFbGVtZW50cyogc3RhdGVtZW50cywgVmFyU3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0
YWNrKiBmdW5jU3RhY2ssIGludCBudW1Db25zdGFudHMpCi0gICAgOiBtX251bUNvbnN0YW50cyhu
dW1Db25zdGFudHMpCi0gICAgLCBtX3N0YXRlbWVudHMoc3RhdGVtZW50cykKLXsKLSAgICBtX2Fy
ZW5hLnN3YXAoYXJlbmEpOwotICAgIGlmICh2YXJTdGFjaykKLSAgICAgICAgbV92YXJTdGFjay5z
d2FwKCp2YXJTdGFjayk7Ci0gICAgaWYgKGZ1bmNTdGFjaykKLSAgICAgICAgbV9mdW5jdGlvblN0
YWNrLnN3YXAoKmZ1bmNTdGFjayk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLSBTY29wZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotU2NvcGVOb2Rl
OjpTY29wZU5vZGUoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhKQotICAgIDogU3RhdGVtZW50Tm9k
ZShnbG9iYWxEYXRhKQotICAgICwgUGFyc2VyQXJlbmFSZWZDb3VudGVkKGdsb2JhbERhdGEpCi0g
ICAgLCBtX2ZlYXR1cmVzKE5vRmVhdHVyZXMpCi17Ci19Ci0KLVNjb3BlTm9kZTo6U2NvcGVOb2Rl
KEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBTb3Vy
Y2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNrKiB2YXJTdGFjaywgRnVuY3Rpb25TdGFjayog
ZnVuY1N0YWNrLCBDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGludCBudW1Db25zdGFudHMpCi0gICAg
OiBTdGF0ZW1lbnROb2RlKGdsb2JhbERhdGEpCi0gICAgLCBQYXJzZXJBcmVuYVJlZkNvdW50ZWQo
Z2xvYmFsRGF0YSkKLSAgICAsIG1fZGF0YShuZXcgU2NvcGVOb2RlRGF0YShnbG9iYWxEYXRhLT5w
YXJzZXItPmFyZW5hKCksIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVuY1N0YWNrLCBudW1Db25zdGFu
dHMpKQotICAgICwgbV9mZWF0dXJlcyhmZWF0dXJlcykKLSAgICAsIG1fc291cmNlKHNvdXJjZSkK
LXsKLX0KLQogaW5saW5lIHZvaWQgU2NvcGVOb2RlOjplbWl0U3RhdGVtZW50c0J5dGVjb2RlKEJ5
dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKIHsKICAgICBpZiAo
bV9kYXRhLT5tX3N0YXRlbWVudHMpCiAgICAgICAgIG1fZGF0YS0+bV9zdGF0ZW1lbnRzLT5lbWl0
Qnl0ZWNvZGUoZ2VuZXJhdG9yLCBkc3QpOwogfQogCi1TdGF0ZW1lbnROb2RlKiBTY29wZU5vZGU6
OnNpbmdsZVN0YXRlbWVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+bV9zdGF0ZW1l
bnRzID8gbV9kYXRhLT5tX3N0YXRlbWVudHMtPnNpbmdsZVN0YXRlbWVudCgpIDogMDsKLX0KLQog
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByb2dyYW1Ob2RlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCiAKLWlubGluZSBQcm9ncmFtTm9kZTo6UHJvZ3JhbU5vZGUoSlNH
bG9iYWxEYXRhKiBnbG9iYWxEYXRhLCBTb3VyY2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNr
KiB2YXJTdGFjaywgRnVuY3Rpb25TdGFjayogZnVuY1N0YWNrLCBjb25zdCBTb3VyY2VDb2RlJiBz
b3VyY2UsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKLSAgICA6IFNj
b3BlTm9kZShnbG9iYWxEYXRhLCBzb3VyY2UsIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVuY1N0YWNr
LCBmZWF0dXJlcywgbnVtQ29uc3RhbnRzKQotewotfQotCi1QYXNzUmVmUHRyPFByb2dyYW1Ob2Rl
PiBQcm9ncmFtTm9kZTo6Y3JlYXRlKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgU291cmNlRWxl
bWVudHMqIGNoaWxkcmVuLCBWYXJTdGFjayogdmFyU3RhY2ssIEZ1bmN0aW9uU3RhY2sqIGZ1bmNT
dGFjaywgY29uc3QgU291cmNlQ29kZSYgc291cmNlLCBDb2RlRmVhdHVyZXMgZmVhdHVyZXMsIGlu
dCBudW1Db25zdGFudHMpCi17Ci0gICAgUmVmUHRyPFByb2dyYW1Ob2RlPiBub2RlID0gbmV3IFBy
b2dyYW1Ob2RlKGdsb2JhbERhdGEsIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVuY1N0YWNrLCBzb3Vy
Y2UsIGZlYXR1cmVzLCBudW1Db25zdGFudHMpOwotCi0gICAgQVNTRVJUKG5vZGUtPmRhdGEoKS0+
bV9hcmVuYS5sYXN0KCkgPT0gbm9kZSk7Ci0gICAgbm9kZS0+ZGF0YSgpLT5tX2FyZW5hLnJlbW92
ZUxhc3QoKTsKLSAgICBBU1NFUlQoIW5vZGUtPmRhdGEoKS0+bV9hcmVuYS5jb250YWlucyhub2Rl
LmdldCgpKSk7Ci0KLSAgICByZXR1cm4gbm9kZS5yZWxlYXNlKCk7Ci19Ci0KIFJlZ2lzdGVySUQq
IFByb2dyYW1Ob2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCopCiB7CiAgICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVQ
cm9ncmFtLCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7CkBAIC0yMDIzLDIyICsxOTUxLDYgQEAg
UmVnaXN0ZXJJRCogUHJvZ3JhbU5vZGU6OmVtaXRCeXRlY29kZShCeQogCiAvLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZhbE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KIAotaW5saW5lIEV2YWxOb2RlOjpFdmFsTm9kZShKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEs
IFNvdXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFyU3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0
YWNrKiBmdW5jU3RhY2ssIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgQ29kZUZlYXR1cmVzIGZl
YXR1cmVzLCBpbnQgbnVtQ29uc3RhbnRzKQotICAgIDogU2NvcGVOb2RlKGdsb2JhbERhdGEsIHNv
dXJjZSwgY2hpbGRyZW4sIHZhclN0YWNrLCBmdW5jU3RhY2ssIGZlYXR1cmVzLCBudW1Db25zdGFu
dHMpCi17Ci19Ci0KLVBhc3NSZWZQdHI8RXZhbE5vZGU+IEV2YWxOb2RlOjpjcmVhdGUoSlNHbG9i
YWxEYXRhKiBnbG9iYWxEYXRhLCBTb3VyY2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNrKiB2
YXJTdGFjaywgRnVuY3Rpb25TdGFjayogZnVuY1N0YWNrLCBjb25zdCBTb3VyY2VDb2RlJiBzb3Vy
Y2UsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKLXsKLSAgICBSZWZQ
dHI8RXZhbE5vZGU+IG5vZGUgPSBuZXcgRXZhbE5vZGUoZ2xvYmFsRGF0YSwgY2hpbGRyZW4sIHZh
clN0YWNrLCBmdW5jU3RhY2ssIHNvdXJjZSwgZmVhdHVyZXMsIG51bUNvbnN0YW50cyk7Ci0KLSAg
ICBBU1NFUlQobm9kZS0+ZGF0YSgpLT5tX2FyZW5hLmxhc3QoKSA9PSBub2RlKTsKLSAgICBub2Rl
LT5kYXRhKCktPm1fYXJlbmEucmVtb3ZlTGFzdCgpOwotICAgIEFTU0VSVCghbm9kZS0+ZGF0YSgp
LT5tX2FyZW5hLmNvbnRhaW5zKG5vZGUuZ2V0KCkpKTsKLQotICAgIHJldHVybiBub2RlLnJlbGVh
c2UoKTsKLX0KLQogUmVnaXN0ZXJJRCogRXZhbE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdl
bmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKikKIHsKICAgICBnZW5lcmF0b3IuZW1pdERl
YnVnSG9vayhXaWxsRXhlY3V0ZVByb2dyYW0sIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKQEAg
LTIwNTQsNTEgKzE5NjYsNiBAQCBSZWdpc3RlcklEKiBFdmFsTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5
dGVjCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbkJvZHlOb2Rl
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUZ1bmN0aW9uUGFyYW1ldGVyczo6RnVu
Y3Rpb25QYXJhbWV0ZXJzKFBhcmFtZXRlck5vZGUqIGZpcnN0UGFyYW1ldGVyKQotewotICAgIGZv
ciAoUGFyYW1ldGVyTm9kZSogcGFyYW1ldGVyID0gZmlyc3RQYXJhbWV0ZXI7IHBhcmFtZXRlcjsg
cGFyYW1ldGVyID0gcGFyYW1ldGVyLT5uZXh0UGFyYW0oKSkKLSAgICAgICAgYXBwZW5kKHBhcmFt
ZXRlci0+aWRlbnQoKSk7Ci19Ci0KLWlubGluZSBGdW5jdGlvbkJvZHlOb2RlOjpGdW5jdGlvbkJv
ZHlOb2RlKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSkKLSAgICA6IFNjb3BlTm9kZShnbG9iYWxE
YXRhKQotewotfQotCi1pbmxpbmUgRnVuY3Rpb25Cb2R5Tm9kZTo6RnVuY3Rpb25Cb2R5Tm9kZShK
U0dsb2JhbERhdGEqIGdsb2JhbERhdGEsIFNvdXJjZUVsZW1lbnRzKiBjaGlsZHJlbiwgVmFyU3Rh
Y2sqIHZhclN0YWNrLCBGdW5jdGlvblN0YWNrKiBmdW5jU3RhY2ssIGNvbnN0IFNvdXJjZUNvZGUm
IHNvdXJjZUNvZGUsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKLSAg
ICA6IFNjb3BlTm9kZShnbG9iYWxEYXRhLCBzb3VyY2VDb2RlLCBjaGlsZHJlbiwgdmFyU3RhY2ss
IGZ1bmNTdGFjaywgZmVhdHVyZXMsIG51bUNvbnN0YW50cykKLXsKLX0KLQotdm9pZCBGdW5jdGlv
bkJvZHlOb2RlOjpmaW5pc2hQYXJzaW5nKGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZSwgUGFyYW1l
dGVyTm9kZSogZmlyc3RQYXJhbWV0ZXIsIGNvbnN0IElkZW50aWZpZXImIGlkZW50KQotewotICAg
IHNldFNvdXJjZShzb3VyY2UpOwotICAgIGZpbmlzaFBhcnNpbmcoRnVuY3Rpb25QYXJhbWV0ZXJz
OjpjcmVhdGUoZmlyc3RQYXJhbWV0ZXIpLCBpZGVudCk7Ci19Ci0KLXZvaWQgRnVuY3Rpb25Cb2R5
Tm9kZTo6ZmluaXNoUGFyc2luZyhQYXNzUmVmUHRyPEZ1bmN0aW9uUGFyYW1ldGVycz4gcGFyYW1l
dGVycywgY29uc3QgSWRlbnRpZmllciYgaWRlbnQpCi17Ci0gICAgQVNTRVJUKCFzb3VyY2UoKS5p
c051bGwoKSk7Ci0gICAgbV9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLSAgICBtX2lkZW50ID0g
aWRlbnQ7Ci19Ci0KLUZ1bmN0aW9uQm9keU5vZGUqIEZ1bmN0aW9uQm9keU5vZGU6OmNyZWF0ZShK
U0dsb2JhbERhdGEqIGdsb2JhbERhdGEpCi17Ci0gICAgcmV0dXJuIG5ldyBGdW5jdGlvbkJvZHlO
b2RlKGdsb2JhbERhdGEpOwotfQotCi1QYXNzUmVmUHRyPEZ1bmN0aW9uQm9keU5vZGU+IEZ1bmN0
aW9uQm9keU5vZGU6OmNyZWF0ZShKU0dsb2JhbERhdGEqIGdsb2JhbERhdGEsIFNvdXJjZUVsZW1l
bnRzKiBjaGlsZHJlbiwgVmFyU3RhY2sqIHZhclN0YWNrLCBGdW5jdGlvblN0YWNrKiBmdW5jU3Rh
Y2ssIGNvbnN0IFNvdXJjZUNvZGUmIHNvdXJjZUNvZGUsIENvZGVGZWF0dXJlcyBmZWF0dXJlcywg
aW50IG51bUNvbnN0YW50cykKLXsKLSAgICBSZWZQdHI8RnVuY3Rpb25Cb2R5Tm9kZT4gbm9kZSA9
IG5ldyBGdW5jdGlvbkJvZHlOb2RlKGdsb2JhbERhdGEsIGNoaWxkcmVuLCB2YXJTdGFjaywgZnVu
Y1N0YWNrLCBzb3VyY2VDb2RlLCBmZWF0dXJlcywgbnVtQ29uc3RhbnRzKTsKLQotICAgIEFTU0VS
VChub2RlLT5kYXRhKCktPm1fYXJlbmEubGFzdCgpID09IG5vZGUpOwotICAgIG5vZGUtPmRhdGEo
KS0+bV9hcmVuYS5yZW1vdmVMYXN0KCk7Ci0gICAgQVNTRVJUKCFub2RlLT5kYXRhKCktPm1fYXJl
bmEuY29udGFpbnMobm9kZS5nZXQoKSkpOwotCi0gICAgcmV0dXJuIG5vZGUucmVsZWFzZSgpOwot
fQotCiBSZWdpc3RlcklEKiBGdW5jdGlvbkJvZHlOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVH
ZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCopCiB7CiAgICAgZ2VuZXJhdG9yLmVtaXRE
ZWJ1Z0hvb2soRGlkRW50ZXJDYWxsRnJhbWUsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKSW5k
ZXg6IEphdmFTY3JpcHRDb3JlL3BhcnNlci9Ob2Rlcy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNj
cmlwdENvcmUvcGFyc2VyL05vZGVzLmNwcAkocmV2aXNpb24gNTE4NjQpCisrKyBKYXZhU2NyaXB0
Q29yZS9wYXJzZXIvTm9kZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00OSw2MyArNDksNiBAQCB1
c2luZyBuYW1lc3BhY2UgV1RGOwogCiBuYW1lc3BhY2UgSlNDIHsKIAotLyoKLSAgICBEZXRhaWxz
IG9mIHRoZSBlbWl0Qnl0ZWNvZGUgZnVuY3Rpb24uCi0KLSAgICBSZXR1cm4gdmFsdWU6IFRoZSBy
ZWdpc3RlciBob2xkaW5nIHRoZSBwcm9kdWN0aW9uJ3MgdmFsdWUuCi0gICAgICAgICAgICAgZHN0
OiBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgbW9zdCBlZmZpY2llbnQgZGVz
dGluYXRpb24gYXQKLSAgICAgICAgICAgICAgICAgIHdoaWNoIHRvIHN0b3JlIHRoZSBwcm9kdWN0
aW9uJ3MgdmFsdWUuIFRoZSBjYWxsZWUgbXVzdCBob25vciBkc3QuCi0KLSAgICBUaGUgZHN0IGFy
Z3VtZW50IHByb3ZpZGVzIGZvciBhIGNydWRlIGZvcm0gb2YgY29weSBwcm9wYWdhdGlvbi4gRm9y
IGV4YW1wbGUsCi0KLSAgICAgICAgeCA9IDEKLQotICAgIGJlY29tZXMKLSAgICAKLSAgICAgICAg
bG9hZCByW3hdLCAxCi0gICAgCi0gICAgaW5zdGVhZCBvZiAKLQotICAgICAgICBsb2FkIHIwLCAx
Ci0gICAgICAgIG1vdiByW3hdLCByMAotICAgIAotICAgIGJlY2F1c2UgdGhlIGFzc2lnbm1lbnQg
bm9kZSwgInggPSIsIHBhc3NlcyByW3hdIGFzIGRzdCB0byB0aGUgbnVtYmVyIG5vZGUsICIxIi4K
LSovCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaHJvd2FibGVFeHByZXNz
aW9uRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBz
dWJzdGl0dXRlKFVTdHJpbmcmIHN0cmluZywgY29uc3QgVVN0cmluZyYgc3Vic3RyaW5nKQotewot
ICAgIGludCBwb3NpdGlvbiA9IHN0cmluZy5maW5kKCIlcyIpOwotICAgIEFTU0VSVChwb3NpdGlv
biAhPSAtMSk7Ci0gICAgVVN0cmluZyBuZXdTdHJpbmcgPSBzdHJpbmcuc3Vic3RyKDAsIHBvc2l0
aW9uKTsKLSAgICBuZXdTdHJpbmcuYXBwZW5kKHN1YnN0cmluZyk7Ci0gICAgbmV3U3RyaW5nLmFw
cGVuZChzdHJpbmcuc3Vic3RyKHBvc2l0aW9uICsgMikpOwotICAgIHN0cmluZyA9IG5ld1N0cmlu
ZzsKLX0KLQotUmVnaXN0ZXJJRCogVGhyb3dhYmxlRXhwcmVzc2lvbkRhdGE6OmVtaXRUaHJvd0Vy
cm9yKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIEVycm9yVHlwZSB0eXBlLCBjb25zdCBj
aGFyKiBtZXNzYWdlKQotewotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3Qo
KSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIFJlZ2lzdGVySUQqIGV4Y2VwdGlv
biA9IGdlbmVyYXRvci5lbWl0TmV3RXJyb3IoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCB0eXBl
LCBqc1N0cmluZyhnZW5lcmF0b3IuZ2xvYmFsRGF0YSgpLCBtZXNzYWdlKSk7Ci0gICAgZ2VuZXJh
dG9yLmVtaXRUaHJvdyhleGNlcHRpb24pOwotICAgIHJldHVybiBleGNlcHRpb247Ci19Ci0KLVJl
Z2lzdGVySUQqIFRocm93YWJsZUV4cHJlc3Npb25EYXRhOjplbWl0VGhyb3dFcnJvcihCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBFcnJvclR5cGUgdHlwZSwgY29uc3QgY2hhciogbWVzc2Fn
ZVRlbXBsYXRlLCBjb25zdCBVU3RyaW5nJiBsYWJlbCkKLXsKLSAgICBVU3RyaW5nIG1lc3NhZ2Ug
PSBtZXNzYWdlVGVtcGxhdGU7Ci0gICAgc3Vic3RpdHV0ZShtZXNzYWdlLCBsYWJlbCk7Ci0gICAg
Z2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRP
ZmZzZXQoKSk7Ci0gICAgUmVnaXN0ZXJJRCogZXhjZXB0aW9uID0gZ2VuZXJhdG9yLmVtaXROZXdF
cnJvcihnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIHR5cGUsIGpzU3RyaW5nKGdlbmVyYXRvci5n
bG9iYWxEYXRhKCksIG1lc3NhZ2UpKTsKLSAgICBnZW5lcmF0b3IuZW1pdFRocm93KGV4Y2VwdGlv
bik7Ci0gICAgcmV0dXJuIGV4Y2VwdGlvbjsKLX0KLQotaW5saW5lIFJlZ2lzdGVySUQqIFRocm93
YWJsZUV4cHJlc3Npb25EYXRhOjplbWl0VGhyb3dFcnJvcihCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBFcnJvclR5cGUgdHlwZSwgY29uc3QgY2hhciogbWVzc2FnZVRlbXBsYXRlLCBjb25z
dCBJZGVudGlmaWVyJiBsYWJlbCkKLXsKLSAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJh
dG9yLCB0eXBlLCBtZXNzYWdlVGVtcGxhdGUsIGxhYmVsLnVzdHJpbmcoKSk7Ci19CiAKIC8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEzMCwxODI0ICs3Myw2IEBAIGlubGluZSBTdGF0ZW1l
bnROb2RlKiBTb3VyY2VFbGVtZW50czo6c2kKICAgICByZXR1cm4gc2l6ZSA9PSAxID8gbV9zdGF0
ZW1lbnRzWzBdIDogMDsKIH0KIAotaW5saW5lIFN0YXRlbWVudE5vZGUqIFNvdXJjZUVsZW1lbnRz
OjpsYXN0U3RhdGVtZW50KCkgY29uc3QKLXsKLSAgICBzaXplX3Qgc2l6ZSA9IG1fc3RhdGVtZW50
cy5zaXplKCk7Ci0gICAgcmV0dXJuIHNpemUgPyBtX3N0YXRlbWVudHNbc2l6ZSAtIDFdIDogMDsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE51bGxOb2RlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogTnVsbE5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3Qp
Ci17Ci0gICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRMb2FkKGRzdCwganNOdWxsKCkpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQm9vbGVhbk5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBCb29sZWFuTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dCkKLXsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZHN0LCBtX3ZhbHVlKTsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE51bWJlck5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogTnVtYmVyTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dCkKLXsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZHN0LCBtX3ZhbHVlKTsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFN0cmluZ05vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogU3RyaW5nTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dCkKLXsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCi0gICAgICAg
IHJldHVybiAwOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZHN0LCBtX3ZhbHVlKTsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZ0V4cE5vZGUgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogUmVnRXhwTm9kZTo6
ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRz
dCkKLXsKLSAgICBSZWZQdHI8UmVnRXhwPiByZWdFeHAgPSBSZWdFeHA6OmNyZWF0ZShnZW5lcmF0
b3IuZ2xvYmFsRGF0YSgpLCBtX3BhdHRlcm4udXN0cmluZygpLCBtX2ZsYWdzLnVzdHJpbmcoKSk7
Ci0gICAgaWYgKCFyZWdFeHAtPmlzVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIGVtaXRUaHJvd0Vy
cm9yKGdlbmVyYXRvciwgU3ludGF4RXJyb3IsICJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjog
JXMiLCByZWdFeHAtPmVycm9yTWVzc2FnZSgpKTsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5p
Z25vcmVkUmVzdWx0KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBnZW5lcmF0b3Iu
ZW1pdE5ld1JlZ0V4cChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCByZWdFeHAuZ2V0
KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGhpc05vZGUgLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBUaGlzTm9k
ZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQq
IGRzdCkKLXsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5l
ZWRlZChkc3QsIGdlbmVyYXRvci50aGlzUmVnaXN0ZXIoKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNvbHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLWJvb2wgUmVzb2x2ZU5vZGU6OmlzUHVyZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yKSBjb25zdAotewotICAgIHJldHVybiBnZW5lcmF0b3IuaXNMb2NhbChtX2lkZW50
KTsKLX0KLQotUmVnaXN0ZXJJRCogUmVzb2x2ZU5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdl
bmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgaWYgKFJlZ2lzdGVy
SUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9yKG1faWRlbnQpKSB7Ci0gICAgICAgIGlm
IChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKLSAgICAgICAgICAgIHJldHVybiAw
OwotICAgICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0
LCBsb2NhbCk7Ci0gICAgfQotICAgIAotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8o
bV9zdGFydE9mZnNldCArIG1faWRlbnQuc2l6ZSgpLCBtX2lkZW50LnNpemUoKSwgMCk7Ci0gICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihk
c3QpLCBtX2lkZW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFy
cmF5Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJ
RCogQXJyYXlOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQotewotICAgIC8vIEZJWE1FOiBTaG91bGQgd2UgcHV0IGFsbCBvZiB0
aGlzIGNvZGUgaW50byBlbWl0TmV3QXJyYXk/Ci0KLSAgICB1bnNpZ25lZCBsZW5ndGggPSAwOwot
ICAgIEVsZW1lbnROb2RlKiBmaXJzdFB1dEVsZW1lbnQ7Ci0gICAgZm9yIChmaXJzdFB1dEVsZW1l
bnQgPSBtX2VsZW1lbnQ7IGZpcnN0UHV0RWxlbWVudDsgZmlyc3RQdXRFbGVtZW50ID0gZmlyc3RQ
dXRFbGVtZW50LT5uZXh0KCkpIHsKLSAgICAgICAgaWYgKGZpcnN0UHV0RWxlbWVudC0+ZWxpc2lv
bigpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICsrbGVuZ3RoOwotICAgIH0KLQotICAg
IGlmICghZmlyc3RQdXRFbGVtZW50ICYmICFtX2VsaXNpb24pCi0gICAgICAgIHJldHVybiBnZW5l
cmF0b3IuZW1pdE5ld0FycmF5KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIG1fZWxl
bWVudCk7Ci0KLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYXJyYXkgPSBnZW5lcmF0b3IuZW1pdE5l
d0FycmF5KGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbV9lbGVtZW50KTsKLQotICAg
IGZvciAoRWxlbWVudE5vZGUqIG4gPSBmaXJzdFB1dEVsZW1lbnQ7IG47IG4gPSBuLT5uZXh0KCkp
IHsKLSAgICAgICAgUmVnaXN0ZXJJRCogdmFsdWUgPSBnZW5lcmF0b3IuZW1pdE5vZGUobi0+dmFs
dWUoKSk7Ci0gICAgICAgIGxlbmd0aCArPSBuLT5lbGlzaW9uKCk7Ci0gICAgICAgIGdlbmVyYXRv
ci5lbWl0UHV0QnlJbmRleChhcnJheS5nZXQoKSwgbGVuZ3RoKyssIHZhbHVlKTsKLSAgICB9Ci0K
LSAgICBpZiAobV9lbGlzaW9uKSB7Ci0gICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJh
dG9yLmVtaXRMb2FkKDAsIGpzTnVtYmVyKGdlbmVyYXRvci5nbG9iYWxEYXRhKCksIG1fZWxpc2lv
biArIGxlbmd0aCkpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYXJyYXkuZ2V0KCks
IGdlbmVyYXRvci5wcm9wZXJ0eU5hbWVzKCkubGVuZ3RoLCB2YWx1ZSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGdlbmVyYXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgYXJyYXkuZ2V0
KCkpOwotfQotCi1ib29sIEFycmF5Tm9kZTo6aXNTaW1wbGVBcnJheSgpIGNvbnN0Ci17Ci0gICAg
aWYgKG1fZWxpc2lvbiB8fCBtX29wdGlvbmFsKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Zm9yIChFbGVtZW50Tm9kZSogcHRyID0gbV9lbGVtZW50OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCgp
KSB7Ci0gICAgICAgIGlmIChwdHItPmVsaXNpb24oKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUFyZ3VtZW50TGlzdE5vZGUqIEFycmF5
Tm9kZTo6dG9Bcmd1bWVudExpc3QoSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhKSBjb25zdAotewot
ICAgIEFTU0VSVCghbV9lbGlzaW9uICYmICFtX29wdGlvbmFsKTsKLSAgICBFbGVtZW50Tm9kZSog
cHRyID0gbV9lbGVtZW50OwotICAgIGlmICghcHRyKQotICAgICAgICByZXR1cm4gMDsKLSAgICBB
cmd1bWVudExpc3ROb2RlKiBoZWFkID0gbmV3IChnbG9iYWxEYXRhKSBBcmd1bWVudExpc3ROb2Rl
KGdsb2JhbERhdGEsIHB0ci0+dmFsdWUoKSk7Ci0gICAgQXJndW1lbnRMaXN0Tm9kZSogdGFpbCA9
IGhlYWQ7Ci0gICAgcHRyID0gcHRyLT5uZXh0KCk7Ci0gICAgZm9yICg7IHB0cjsgcHRyID0gcHRy
LT5uZXh0KCkpIHsKLSAgICAgICAgQVNTRVJUKCFwdHItPmVsaXNpb24oKSk7Ci0gICAgICAgIHRh
aWwgPSBuZXcgKGdsb2JhbERhdGEpIEFyZ3VtZW50TGlzdE5vZGUoZ2xvYmFsRGF0YSwgdGFpbCwg
cHRyLT52YWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhlYWQ7Ci19Ci0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPYmplY3RMaXRlcmFsTm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIE9iamVjdExpdGVyYWxOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAg
ICBpZiAoIW1fbGlzdCkgewotICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJl
c3VsdCgpKQotICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0TmV3T2JqZWN0KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCkpOwotICAgICB9
Ci0gICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX2xpc3QpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJvcGVydHlMaXN0Tm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBQcm9wZXJ0eUxpc3ROb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQot
ewotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBuZXdPYmogPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0
aW9uKGRzdCk7Ci0gICAgCi0gICAgZ2VuZXJhdG9yLmVtaXROZXdPYmplY3QobmV3T2JqLmdldCgp
KTsKLSAgICAKLSAgICBmb3IgKFByb3BlcnR5TGlzdE5vZGUqIHAgPSB0aGlzOyBwOyBwID0gcC0+
bV9uZXh0KSB7Ci0gICAgICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9yLmVtaXROb2Rl
KHAtPm1fbm9kZS0+bV9hc3NpZ24pOwotICAgICAgICAKLSAgICAgICAgc3dpdGNoIChwLT5tX25v
ZGUtPm1fdHlwZSkgewotICAgICAgICAgICAgY2FzZSBQcm9wZXJ0eU5vZGU6OkNvbnN0YW50OiB7
Ci0gICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKG5ld09iai5nZXQoKSwgcC0+
bV9ub2RlLT5uYW1lKCksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGNhc2UgUHJvcGVydHlOb2RlOjpHZXR0ZXI6IHsKLSAgICAgICAg
ICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dEdldHRlcihuZXdPYmouZ2V0KCksIHAtPm1fbm9kZS0+
bmFtZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBjYXNlIFByb3BlcnR5Tm9kZTo6U2V0dGVyOiB7Ci0gICAgICAgICAgICAgICAg
Z2VuZXJhdG9yLmVtaXRQdXRTZXR0ZXIobmV3T2JqLmdldCgpLCBwLT5tX25vZGUtPm5hbWUoKSwg
dmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9u
SWZOZWVkZWQoZHN0LCBuZXdPYmouZ2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0gQnJhY2tldEFjY2Vzc29yTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLQotCi1SZWdpc3RlcklEKiBCcmFja2V0QWNjZXNzb3JOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRl
KG1fYmFzZSwgbV9zdWJzY3JpcHRIYXNBc3NpZ25tZW50cywgbV9zdWJzY3JpcHQtPmlzUHVyZShn
ZW5lcmF0b3IpKTsKLSAgICBSZWdpc3RlcklEKiBwcm9wZXJ0eSA9IGdlbmVyYXRvci5lbWl0Tm9k
ZShtX3N1YnNjcmlwdCk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgp
LCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0
R2V0QnlWYWwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSwgcHJv
cGVydHkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRG90QWNjZXNz
b3JOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIERv
dEFjY2Vzc29yTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Is
IFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBSZWdpc3RlcklEKiBiYXNlID0gZ2VuZXJhdG9yLmVt
aXROb2RlKG1fYmFzZSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgp
LCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0
R2V0QnlJZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBiYXNlLCBtX2lkZW50KTsK
LX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFyZ3VtZW50TGlzdE5vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogQXJndW1lbnRMaXN0
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKLXsKLSAgICBBU1NFUlQobV9leHByKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVt
aXROb2RlKGRzdCwgbV9leHByKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIE5ld0V4cHJOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVn
aXN0ZXJJRCogTmV3RXhwck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2Vu
ZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1bmMg
PSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRD
b25zdHJ1Y3QoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgZnVuYy5nZXQoKSwgbV9h
cmdzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci19Ci0KLS8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFdmFsRnVuY3Rpb25DYWxsTm9kZSAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIEV2YWxGdW5jdGlvbkNhbGxO
b2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJ
RCogZHN0KQotewotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBmdW5jID0gZ2VuZXJhdG9yLnRlbXBE
ZXN0aW5hdGlvbihkc3QpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBn
ZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5m
byhkaXZvdCgpIC0gc3RhcnRPZmZzZXQoKSArIDQsIDQsIDApOwotICAgIGdlbmVyYXRvci5lbWl0
UmVzb2x2ZVdpdGhCYXNlKHRoaXNSZWdpc3Rlci5nZXQoKSwgZnVuYy5nZXQoKSwgZ2VuZXJhdG9y
LnByb3BlcnR5TmFtZXMoKS5ldmFsKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsRXZh
bChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGZ1bmMuZ2V0KCkpLCBmdW5jLmdldCgp
LCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5k
T2Zmc2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rp
b25DYWxsVmFsdWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVn
aXN0ZXJJRCogRnVuY3Rpb25DYWxsVmFsdWVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5l
cmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBmdW5jID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7Ci0gICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TG9hZChnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCksIGpzTnVsbCgpKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVy
YXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgZnVuYy5nZXQoKSksIGZ1bmMuZ2V0KCksIHRoaXNS
ZWdpc3Rlci5nZXQoKSwgbV9hcmdzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQo
KSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbkNhbGxS
ZXNvbHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVy
SUQqIEZ1bmN0aW9uQ2FsbFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0
b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmIChSZWZQdHI8UmVnaXN0
ZXJJRD4gbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAg
UmVmUHRyPFJlZ2lzdGVySUQ+IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TG9hZChnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCksIGpzTnVsbCgpKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRv
ci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIHRoaXNSZWdpc3Rlci5n
ZXQoKSksIGxvY2FsLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwg
c3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIH0KLQotICAgIGludCBpbmRleCA9IDA7
Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0ID0gMDsK
LSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRleCwgZGVw
dGgsIGZhbHNlLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIo
KSkgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuYyA9IGdlbmVyYXRvci5lbWl0R2V0
U2NvcGVkVmFyKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgZGVwdGgsIGluZGV4LCBnbG9iYWxP
YmplY3QpOwotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVyID0gZ2VuZXJh
dG9yLmVtaXRMb2FkKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwganNOdWxsKCkpOwotICAgICAg
ICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRDYWxsKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRz
dCwgZnVuYy5nZXQoKSksIGZ1bmMuZ2V0KCksIHRoaXNSZWdpc3Rlci5nZXQoKSwgbV9hcmdzLCBk
aXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgfQotCi0gICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IGZ1bmMgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKLSAg
ICBpbnQgaWRlbnRpZmllclN0YXJ0ID0gZGl2b3QoKSAtIHN0YXJ0T2Zmc2V0KCk7Ci0gICAgZ2Vu
ZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhpZGVudGlmaWVyU3RhcnQgKyBtX2lkZW50LnNpemUo
KSwgbV9pZGVudC5zaXplKCksIDApOwotICAgIGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNl
KHRoaXNSZWdpc3Rlci5nZXQoKSwgZnVuYy5nZXQoKSwgbV9pZGVudCk7Ci0gICAgcmV0dXJuIGdl
bmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIGZ1bmMuZ2V0
KCkpLCBmdW5jLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3Rh
cnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gRnVuY3Rpb25DYWxsQnJhY2tldE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBGdW5jdGlvbkNhbGxCcmFja2V0Tm9kZTo6ZW1pdEJ5
dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsK
LSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2Up
OwotICAgIFJlZ2lzdGVySUQqIHByb3BlcnR5ID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fc3Vic2Ny
aXB0KTsKLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBtX3N1YmV4
cHJlc3Npb25EaXZvdE9mZnNldCwgc3RhcnRPZmZzZXQoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90
T2Zmc2V0LCBtX3N1YmV4cHJlc3Npb25FbmRPZmZzZXQpOwotICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0R2V0QnlWYWwoZ2VuZXJhdG9yLnRlbXBEZXN0aW5h
dGlvbihkc3QpLCBiYXNlLmdldCgpLCBwcm9wZXJ0eSk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHRoaXNSZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5
KCksIGJhc2UuZ2V0KCkpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdENhbGwoZ2VuZXJhdG9y
LmZpbmFsRGVzdGluYXRpb24oZHN0LCBmdW5jdGlvbi5nZXQoKSksIGZ1bmN0aW9uLmdldCgpLCB0
aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJncywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zm
c2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRnVuY3Rpb25D
YWxsRG90Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVy
SUQqIEZ1bmN0aW9uQ2FsbERvdE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYg
Z2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZ1
bmN0aW9uID0gZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpOwotICAgIFJlZlB0cjxSZWdp
c3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgZ2Vu
ZXJhdG9yLmVtaXROb2RlKHRoaXNSZWdpc3Rlci5nZXQoKSwgbV9iYXNlKTsKLSAgICBnZW5lcmF0
b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNl
dCwgc3RhcnRPZmZzZXQoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90T2Zmc2V0LCBtX3N1YmV4cHJl
c3Npb25FbmRPZmZzZXQpOwotICAgIGdlbmVyYXRvci5lbWl0TWV0aG9kQ2hlY2soKTsKLSAgICBn
ZW5lcmF0b3IuZW1pdEdldEJ5SWQoZnVuY3Rpb24uZ2V0KCksIHRoaXNSZWdpc3Rlci5nZXQoKSwg
bV9pZGVudCk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Q2FsbChnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbihkc3QsIGZ1bmN0aW9uLmdldCgpKSwgZnVuY3Rpb24uZ2V0KCksIHRoaXNSZWdp
c3Rlci5nZXQoKSwgbV9hcmdzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7
Ci19Ci0KLVJlZ2lzdGVySUQqIENhbGxGdW5jdGlvbkNhbGxEb3ROb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIFJl
ZlB0cjxMYWJlbD4gcmVhbENhbGwgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICBSZWZQdHI8
TGFiZWw+IGVuZCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgIFJlZlB0cjxSZWdpc3RlcklE
PiBiYXNlID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fYmFzZSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRF
eHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIHN0YXJ0
T2Zmc2V0KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHByZXNzaW9uRW5k
T2Zmc2V0KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZnVuY3Rpb24gPSBnZW5lcmF0b3IuZW1p
dEdldEJ5SWQoZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBiYXNlLmdldCgpLCBtX2lk
ZW50KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZmluYWxEZXN0aW5hdGlvbiA9IGdlbmVyYXRv
ci5maW5hbERlc3RpbmF0aW9uKGRzdCwgZnVuY3Rpb24uZ2V0KCkpOwotICAgIGdlbmVyYXRvci5l
bWl0SnVtcElmTm90RnVuY3Rpb25DYWxsKGZ1bmN0aW9uLmdldCgpLCByZWFsQ2FsbC5nZXQoKSk7
Ci0gICAgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVhbEZ1bmN0aW9uID0gZ2VuZXJh
dG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQoKSk7
Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiB0aGlzUmVnaXN0ZXIgPSBnZW5lcmF0b3IubmV3
VGVtcG9yYXJ5KCk7Ci0gICAgICAgIEFyZ3VtZW50TGlzdE5vZGUqIG9sZExpc3QgPSBtX2FyZ3Mt
Pm1fbGlzdE5vZGU7Ci0gICAgICAgIGlmIChtX2FyZ3MtPm1fbGlzdE5vZGUgJiYgbV9hcmdzLT5t
X2xpc3ROb2RlLT5tX2V4cHIpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZSh0aGlz
UmVnaXN0ZXIuZ2V0KCksIG1fYXJncy0+bV9saXN0Tm9kZS0+bV9leHByKTsKLSAgICAgICAgICAg
IG1fYXJncy0+bV9saXN0Tm9kZSA9IG1fYXJncy0+bV9saXN0Tm9kZS0+bV9uZXh0OwotICAgICAg
ICB9IGVsc2UKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0TG9hZCh0aGlzUmVnaXN0ZXIuZ2V0
KCksIGpzTnVsbCgpKTsKLQotICAgICAgICBnZW5lcmF0b3IuZW1pdENhbGwoZmluYWxEZXN0aW5h
dGlvbi5nZXQoKSwgcmVhbEZ1bmN0aW9uLmdldCgpLCB0aGlzUmVnaXN0ZXIuZ2V0KCksIG1fYXJn
cywgZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgICAgICBnZW5lcmF0
b3IuZW1pdEp1bXAoZW5kLmdldCgpKTsKLSAgICAgICAgbV9hcmdzLT5tX2xpc3ROb2RlID0gb2xk
TGlzdDsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChyZWFsQ2FsbC5nZXQoKSk7Ci0g
ICAgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVyID0gZ2VuZXJhdG9y
LmVtaXRNb3ZlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQoKSk7Ci0gICAgICAg
IGdlbmVyYXRvci5lbWl0Q2FsbChmaW5hbERlc3RpbmF0aW9uLmdldCgpLCBmdW5jdGlvbi5nZXQo
KSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MsIGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVu
ZE9mZnNldCgpKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChlbmQuZ2V0KCkpOwot
ICAgIHJldHVybiBmaW5hbERlc3RpbmF0aW9uLmdldCgpOwotfQotICAgIAotc3RhdGljIGJvb2wg
YXJlVHJpdmlhbEFwcGx5QXJndW1lbnRzKEFyZ3VtZW50c05vZGUqIGFyZ3MpCi17Ci0gICAgcmV0
dXJuICFhcmdzLT5tX2xpc3ROb2RlIHx8ICFhcmdzLT5tX2xpc3ROb2RlLT5tX2V4cHIgfHwgIWFy
Z3MtPm1fbGlzdE5vZGUtPm1fbmV4dAotICAgICAgICB8fCAoIWFyZ3MtPm1fbGlzdE5vZGUtPm1f
bmV4dC0+bV9uZXh0ICYmIGFyZ3MtPm1fbGlzdE5vZGUtPm1fbmV4dC0+bV9leHByLT5pc1NpbXBs
ZUFycmF5KCkpOwotfQotCi1SZWdpc3RlcklEKiBBcHBseUZ1bmN0aW9uQ2FsbERvdE5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3Qp
Ci17Ci0gICAgLy8gQSBmZXcgc2ltcGxlIGNhc2VzIGNhbiBiZSB0cml2aWFsbHkgaGFuZGxlZCBh
cyBvcmRpbmFyeSBmdW5jdGlvbiBjYWxscy4KLSAgICAvLyBmdW5jdGlvbi5hcHBseSgpLCBmdW5j
dGlvbi5hcHBseShhcmcpIC0+IGlkZW50aWNhbCB0byBmdW5jdGlvbi5jYWxsCi0gICAgLy8gZnVu
Y3Rpb24uYXBwbHkodGhpc0FyZywgW2FyZzAsIGFyZzEsIC4uLl0pIC0+IGNhbiBiZSB0cml2aWFs
bHkgY29lcmNlZCBpbnRvIGZ1bmN0aW9uLmNhbGwodGhpc0FyZywgYXJnMCwgYXJnMSwgLi4uKSBh
bmQgc2F2ZXMgb2JqZWN0IGFsbG9jYXRpb24KLSAgICBib29sIG1heUJlQ2FsbCA9IGFyZVRyaXZp
YWxBcHBseUFyZ3VtZW50cyhtX2FyZ3MpOwotCi0gICAgUmVmUHRyPExhYmVsPiByZWFsQ2FsbCA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgIFJlZlB0cjxMYWJlbD4gZW5kID0gZ2VuZXJhdG9y
Lm5ld0xhYmVsKCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1p
dE5vZGUobV9iYXNlKTsKLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkg
LSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgc3RhcnRPZmZzZXQoKSAtIG1fc3ViZXhwcmVz
c2lvbkRpdm90T2Zmc2V0LCBtX3N1YmV4cHJlc3Npb25FbmRPZmZzZXQpOwotICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBmdW5jdGlvbiA9IGdlbmVyYXRvci5lbWl0R2V0QnlJZChnZW5lcmF0b3IudGVt
cERlc3RpbmF0aW9uKGRzdCksIGJhc2UuZ2V0KCksIG1faWRlbnQpOwotICAgIFJlZlB0cjxSZWdp
c3RlcklEPiBmaW5hbERlc3RpbmF0aW9uID0gZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0
LCBmdW5jdGlvbi5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZOb3RGdW5jdGlvbkFw
cGx5KGZ1bmN0aW9uLmdldCgpLCByZWFsQ2FsbC5nZXQoKSk7Ci0gICAgewotICAgICAgICBpZiAo
bWF5QmVDYWxsKSB7Ci0gICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcmVhbEZ1bmN0aW9u
ID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFz
ZS5nZXQoKSk7Ci0gICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVyID0g
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwotICAgICAgICAgICAgQXJndW1lbnRMaXN0Tm9kZSog
b2xkTGlzdCA9IG1fYXJncy0+bV9saXN0Tm9kZTsKLSAgICAgICAgICAgIGlmIChtX2FyZ3MtPm1f
bGlzdE5vZGUgJiYgbV9hcmdzLT5tX2xpc3ROb2RlLT5tX2V4cHIpIHsKLSAgICAgICAgICAgICAg
ICBnZW5lcmF0b3IuZW1pdE5vZGUodGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MtPm1fbGlzdE5v
ZGUtPm1fZXhwcik7Ci0gICAgICAgICAgICAgICAgbV9hcmdzLT5tX2xpc3ROb2RlID0gbV9hcmdz
LT5tX2xpc3ROb2RlLT5tX25leHQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1fYXJncy0+bV9saXN0
Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICBBU1NFUlQobV9hcmdzLT5tX2xpc3ROb2RlLT5t
X2V4cHItPmlzU2ltcGxlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFTU0VSVCghbV9h
cmdzLT5tX2xpc3ROb2RlLT5tX25leHQpOwotICAgICAgICAgICAgICAgICAgICBtX2FyZ3MtPm1f
bGlzdE5vZGUgPSBzdGF0aWNfY2FzdDxBcnJheU5vZGUqPihtX2FyZ3MtPm1fbGlzdE5vZGUtPm1f
ZXhwciktPnRvQXJndW1lbnRMaXN0KGdlbmVyYXRvci5nbG9iYWxEYXRhKCkpOwotICAgICAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGdlbmVyYXRvci5l
bWl0TG9hZCh0aGlzUmVnaXN0ZXIuZ2V0KCksIGpzTnVsbCgpKTsKLSAgICAgICAgICAgIGdlbmVy
YXRvci5lbWl0Q2FsbChmaW5hbERlc3RpbmF0aW9uLmdldCgpLCByZWFsRnVuY3Rpb24uZ2V0KCks
IHRoaXNSZWdpc3Rlci5nZXQoKSwgbV9hcmdzLCBkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRP
ZmZzZXQoKSk7Ci0gICAgICAgICAgICBtX2FyZ3MtPm1fbGlzdE5vZGUgPSBvbGRMaXN0OwotICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUKG1fYXJncy0+bV9saXN0Tm9kZSAmJiBt
X2FyZ3MtPm1fbGlzdE5vZGUtPm1fbmV4dCk7Ci0gICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJ
RD4gcmVhbEZ1bmN0aW9uID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci5uZXdUZW1wb3Jh
cnkoKSwgYmFzZS5nZXQoKSk7Ci0gICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYXJnc0Nv
dW50UmVnaXN0ZXIgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgICAgICAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVyID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwot
ICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGFyZ3NSZWdpc3RlciA9IGdlbmVyYXRvci5u
ZXdUZW1wb3JhcnkoKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZSh0aGlzUmVnaXN0
ZXIuZ2V0KCksIG1fYXJncy0+bV9saXN0Tm9kZS0+bV9leHByKTsKLSAgICAgICAgICAgIEFyZ3Vt
ZW50TGlzdE5vZGUqIGFyZ3MgPSBtX2FyZ3MtPm1fbGlzdE5vZGUtPm1fbmV4dDsKLSAgICAgICAg
ICAgIGJvb2wgaXNBcmd1bWVudHNBcHBseSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFyZ3Mt
Pm1fZXhwci0+aXNSZXNvbHZlTm9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgUmVzb2x2ZU5vZGUq
IHJlc29sdmVOb2RlID0gc3RhdGljX2Nhc3Q8UmVzb2x2ZU5vZGUqPihhcmdzLT5tX2V4cHIpOwot
ICAgICAgICAgICAgICAgIGlzQXJndW1lbnRzQXBwbHkgPSBnZW5lcmF0b3Iud2lsbFJlc29sdmVU
b0FyZ3VtZW50cyhyZXNvbHZlTm9kZS0+aWRlbnRpZmllcigpKTsKLSAgICAgICAgICAgICAgICBp
ZiAoaXNBcmd1bWVudHNBcHBseSkKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRN
b3ZlKGFyZ3NSZWdpc3Rlci5nZXQoKSwgZ2VuZXJhdG9yLnVuY2hlY2tlZFJlZ2lzdGVyRm9yQXJn
dW1lbnRzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpc0FyZ3VtZW50c0Fw
cGx5KQotICAgICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShhcmdzUmVnaXN0ZXIuZ2V0
KCksIGFyZ3MtPm1fZXhwcik7Ci0gICAgICAgICAgICB3aGlsZSAoKGFyZ3MgPSBhcmdzLT5tX25l
eHQpKQotICAgICAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShhcmdzLT5tX2V4cHIpOwot
Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdExvYWRWYXJhcmdzKGFyZ3NDb3VudFJlZ2lzdGVy
LmdldCgpLCBhcmdzUmVnaXN0ZXIuZ2V0KCkpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRD
YWxsVmFyYXJncyhmaW5hbERlc3RpbmF0aW9uLmdldCgpLCByZWFsRnVuY3Rpb24uZ2V0KCksIHRo
aXNSZWdpc3Rlci5nZXQoKSwgYXJnc0NvdW50UmVnaXN0ZXIuZ2V0KCksIGRpdm90KCksIHN0YXJ0
T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3IuZW1p
dEp1bXAoZW5kLmdldCgpKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChyZWFsQ2Fs
bC5nZXQoKSk7Ci0gICAgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGhpc1JlZ2lzdGVy
ID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgYmFzZS5nZXQo
KSk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0Q2FsbChmaW5hbERlc3RpbmF0aW9uLmdldCgpLCBm
dW5jdGlvbi5nZXQoKSwgdGhpc1JlZ2lzdGVyLmdldCgpLCBtX2FyZ3MsIGRpdm90KCksIHN0YXJ0
T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChl
bmQuZ2V0KCkpOwotICAgIHJldHVybiBmaW5hbERlc3RpbmF0aW9uLmdldCgpOwotfQotCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUG9zdGZpeFJlc29sdmVOb2RlIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFJlZ2lzdGVySUQqIGVtaXRQcmVJ
bmNPckRlYyhCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBzcmNEc3Qs
IE9wZXJhdG9yIG9wZXIpCi17Ci0gICAgcmV0dXJuIChvcGVyID09IE9wUGx1c1BsdXMpID8gZ2Vu
ZXJhdG9yLmVtaXRQcmVJbmMoc3JjRHN0KSA6IGdlbmVyYXRvci5lbWl0UHJlRGVjKHNyY0RzdCk7
Ci19Ci0KLXN0YXRpYyBSZWdpc3RlcklEKiBlbWl0UG9zdEluY09yRGVjKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCwgUmVnaXN0ZXJJRCogc3JjRHN0LCBPcGVy
YXRvciBvcGVyKQotewotICAgIGlmIChzcmNEc3QgPT0gZHN0KQotICAgICAgICByZXR1cm4gZ2Vu
ZXJhdG9yLmVtaXRUb0pTTnVtYmVyKGRzdCwgc3JjRHN0KTsKLSAgICByZXR1cm4gKG9wZXIgPT0g
T3BQbHVzUGx1cykgPyBnZW5lcmF0b3IuZW1pdFBvc3RJbmMoZHN0LCBzcmNEc3QpIDogZ2VuZXJh
dG9yLmVtaXRQb3N0RGVjKGRzdCwgc3JjRHN0KTsKLX0KLQotUmVnaXN0ZXJJRCogUG9zdGZpeFJl
c29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVn
aXN0ZXJJRCogZHN0KQotewotICAgIGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5y
ZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25z
dGFudChtX2lkZW50KSkgewotICAgICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3Jl
ZFJlc3VsdCgpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgcmV0dXJu
IGdlbmVyYXRvci5lbWl0VG9KU051bWJlcihnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qp
LCBsb2NhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25v
cmVkUmVzdWx0KCkpCi0gICAgICAgICAgICByZXR1cm4gZW1pdFByZUluY09yRGVjKGdlbmVyYXRv
ciwgbG9jYWwsIG1fb3BlcmF0b3IpOwotICAgICAgICByZXR1cm4gZW1pdFBvc3RJbmNPckRlYyhn
ZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIGxvY2FsLCBtX29wZXJh
dG9yKTsKLSAgICB9Ci0KLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHNpemVfdCBkZXB0aCA9IDA7
Ci0gICAgSlNPYmplY3QqIGdsb2JhbE9iamVjdCA9IDA7Ci0gICAgaWYgKGdlbmVyYXRvci5maW5k
U2NvcGVkUHJvcGVydHkobV9pZGVudCwgaW5kZXgsIGRlcHRoLCB0cnVlLCBnbG9iYWxPYmplY3Qp
ICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xNYXJrZXIoKSkgewotICAgICAgICBSZWZQdHI8UmVn
aXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0b3IuZW1pdEdldFNjb3BlZFZhcihnZW5lcmF0b3IubmV3
VGVtcG9yYXJ5KCksIGRlcHRoLCBpbmRleCwgZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgUmVnaXN0
ZXJJRCogb2xkVmFsdWU7Ci0gICAgICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSkgewotICAgICAgICAgICAgb2xkVmFsdWUgPSAwOwotICAgICAgICAgICAgZW1pdFByZUlu
Y09yRGVjKGdlbmVyYXRvciwgdmFsdWUuZ2V0KCksIG1fb3BlcmF0b3IpOwotICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09yRGVjKGdlbmVyYXRvciwg
Z2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCksIG1fb3BlcmF0b3Ip
OwotICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0UHV0U2NvcGVkVmFyKGRlcHRoLCBp
bmRleCwgdmFsdWUuZ2V0KCksIGdsb2JhbE9iamVjdCk7Ci0gICAgICAgIHJldHVybiBvbGRWYWx1
ZTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0
YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUg
PSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2Ug
PSBnZW5lcmF0b3IuZW1pdFJlc29sdmVXaXRoQmFzZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCks
IHZhbHVlLmdldCgpLCBtX2lkZW50KTsKLSAgICBSZWdpc3RlcklEKiBvbGRWYWx1ZTsKLSAgICBp
ZiAoZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKLSAgICAgICAgb2xkVmFsdWUg
PSAwOwotICAgICAgICBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJhdG9yLCB2YWx1ZS5nZXQoKSwgbV9v
cGVyYXRvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb2xkVmFsdWUgPSBlbWl0UG9zdEluY09y
RGVjKGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0
KCksIG1fb3BlcmF0b3IpOwotICAgIH0KLSAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5n
ZXQoKSwgbV9pZGVudCwgdmFsdWUuZ2V0KCkpOwotICAgIHJldHVybiBvbGRWYWx1ZTsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBvc3RmaXhCcmFja2V0Tm9kZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFBvc3RmaXhCcmFj
a2V0Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lz
dGVySUQqIGRzdCkKLXsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5l
bWl0Tm9kZShtX2Jhc2UpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wZXJ0eSA9IGdlbmVy
YXRvci5lbWl0Tm9kZShtX3N1YnNjcmlwdCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Np
b25JbmZvKGRpdm90KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgc3RhcnRPZmZzZXQo
KSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90T2Zmc2V0LCBtX3N1YmV4cHJlc3Npb25FbmRPZmZzZXQp
OwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiB2YWx1ZSA9IGdlbmVyYXRvci5lbWl0R2V0QnlWYWwo
Z2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBiYXNlLmdldCgpLCBwcm9wZXJ0eS5nZXQoKSk7Ci0g
ICAgUmVnaXN0ZXJJRCogb2xkVmFsdWU7Ci0gICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3Jl
ZFJlc3VsdCgpKSB7Ci0gICAgICAgIG9sZFZhbHVlID0gMDsKLSAgICAgICAgaWYgKG1fb3BlcmF0
b3IgPT0gT3BQbHVzUGx1cykKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0UHJlSW5jKHZhbHVl
LmdldCgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRQcmVEZWMo
dmFsdWUuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9sZFZhbHVlID0gKG1fb3BlcmF0
b3IgPT0gT3BQbHVzUGx1cykgPyBnZW5lcmF0b3IuZW1pdFBvc3RJbmMoZ2VuZXJhdG9yLmZpbmFs
RGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCkpIDogZ2VuZXJhdG9yLmVtaXRQb3N0RGVjKGdl
bmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHZhbHVlLmdldCgpKTsKLSAgICB9Ci0gICAg
Z2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRP
ZmZzZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRQdXRCeVZhbChiYXNlLmdldCgpLCBwcm9wZXJ0
eS5nZXQoKSwgdmFsdWUuZ2V0KCkpOwotICAgIHJldHVybiBvbGRWYWx1ZTsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBvc3RmaXhEb3ROb2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogUG9zdGZpeERvdE5vZGU6OmVtaXRC
eXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17
Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9iYXNl
KTsKLQotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIG1fc3ViZXhw
cmVzc2lvbkRpdm90T2Zmc2V0LCBzdGFydE9mZnNldCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RP
ZmZzZXQsIG1fc3ViZXhwcmVzc2lvbkVuZE9mZnNldCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHZhbHVlID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwg
YmFzZS5nZXQoKSwgbV9pZGVudCk7Ci0gICAgUmVnaXN0ZXJJRCogb2xkVmFsdWU7Ci0gICAgaWYg
KGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKSB7Ci0gICAgICAgIG9sZFZhbHVlID0g
MDsKLSAgICAgICAgaWYgKG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cykKLSAgICAgICAgICAgIGdl
bmVyYXRvci5lbWl0UHJlSW5jKHZhbHVlLmdldCgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgZ2VuZXJhdG9yLmVtaXRQcmVEZWModmFsdWUuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIG9sZFZhbHVlID0gKG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cykgPyBnZW5lcmF0b3IuZW1p
dFBvc3RJbmMoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgdmFsdWUuZ2V0KCkpIDog
Z2VuZXJhdG9yLmVtaXRQb3N0RGVjKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHZh
bHVlLmdldCgpKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZv
dCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRQdXRC
eUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHZhbHVlLmdldCgpKTsKLSAgICByZXR1cm4gb2xkVmFs
dWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3N0Zml4RXJyb3JO
b2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFBv
c3RmaXhFcnJvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKikKLXsKLSAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBS
ZWZlcmVuY2VFcnJvciwgbV9vcGVyYXRvciA9PSBPcFBsdXNQbHVzCi0gICAgICAgID8gIlBvc3Rm
aXggKysgb3BlcmF0b3IgYXBwbGllZCB0byB2YWx1ZSB0aGF0IGlzIG5vdCBhIHJlZmVyZW5jZS4i
Ci0gICAgICAgIDogIlBvc3RmaXggLS0gb3BlcmF0b3IgYXBwbGllZCB0byB2YWx1ZSB0aGF0IGlz
IG5vdCBhIHJlZmVyZW5jZS4iKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIERlbGV0ZVJlc29sdmVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVJlZ2lzdGVySUQqIERlbGV0ZVJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVH
ZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmIChnZW5lcmF0
b3IucmVnaXN0ZXJGb3IobV9pZGVudCkpCi0gICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExv
YWQoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgZmFsc2UpOwotCi0gICAgZ2VuZXJh
dG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQo
KSk7Ci0gICAgUmVnaXN0ZXJJRCogYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZUJhc2UoZ2Vu
ZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpLCBtX2lkZW50KTsKLSAgICByZXR1cm4gZ2VuZXJh
dG9yLmVtaXREZWxldGVCeUlkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgYmFzZSks
IGJhc2UsIG1faWRlbnQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g
RGVsZXRlQnJhY2tldE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
UmVnaXN0ZXJJRCogRGVsZXRlQnJhY2tldE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVmUHRyPFJlZ2lzdGVy
SUQ+IHIwID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fYmFzZSk7Ci0gICAgUmVnaXN0ZXJJRCogcjEg
PSBnZW5lcmF0b3IuZW1pdE5vZGUobV9zdWJzY3JpcHQpOwotCi0gICAgZ2VuZXJhdG9yLmVtaXRF
eHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAg
cmV0dXJuIGdlbmVyYXRvci5lbWl0RGVsZXRlQnlWYWwoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0KSwgcjAuZ2V0KCksIHIxKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIERlbGV0ZURvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotUmVnaXN0ZXJJRCogRGVsZXRlRG90Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBSZWdpc3RlcklEKiByMCA9
IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOwotCi0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNz
aW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgcmV0dXJu
IGdlbmVyYXRvci5lbWl0RGVsZXRlQnlJZChnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qp
LCByMCwgbV9pZGVudCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBE
ZWxldGVWYWx1ZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVn
aXN0ZXJJRCogRGVsZXRlVmFsdWVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3Im
IGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGdlbmVyYXRvci5lbWl0Tm9kZShn
ZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpLCBtX2V4cHIpOwotCi0gICAgLy8gZGVsZXRlIG9uIGEg
bm9uLWxvY2F0aW9uIGV4cHJlc3Npb24gaWdub3JlcyB0aGUgdmFsdWUgYW5kIHJldHVybnMgdHJ1
ZQotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdExvYWQoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0KSwgdHJ1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBW
b2lkTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVy
SUQqIFZvaWROb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSkgewotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSwgbV9leHByKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIFJlZlB0cjxSZWdp
c3RlcklEPiByMCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOwotICAgIHJldHVybiBnZW5l
cmF0b3IuZW1pdExvYWQoZHN0LCBqc1VuZGVmaW5lZCgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIFR5cGVPZlZhbHVlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBUeXBlT2ZSZXNvbHZlTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAg
ICBpZiAoUmVnaXN0ZXJJRCogbG9jYWwgPSBnZW5lcmF0b3IucmVnaXN0ZXJGb3IobV9pZGVudCkp
IHsKLSAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQotICAgICAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFR5cGVPZihnZW5l
cmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QpLCBsb2NhbCk7Ci0gICAgfQotCi0gICAgUmVmUHRy
PFJlZ2lzdGVySUQ+IHNjcmF0Y2ggPSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRv
ci50ZW1wRGVzdGluYXRpb24oZHN0KSwgbV9pZGVudCk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRHZXRC
eUlkKHNjcmF0Y2guZ2V0KCksIHNjcmF0Y2guZ2V0KCksIG1faWRlbnQpOwotICAgIGlmIChkc3Qg
PT0gZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0VHlwZU9mKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwg
c2NyYXRjaC5nZXQoKSksIHNjcmF0Y2guZ2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gVHlwZU9mVmFsdWVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFR5cGVPZlZhbHVlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5
dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBpZiAo
ZHN0ID09IGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCkpIHsKLSAgICAgICAgZ2VuZXJhdG9yLmVt
aXROb2RlKGdlbmVyYXRvci5pZ25vcmVkUmVzdWx0KCksIG1fZXhwcik7Ci0gICAgICAgIHJldHVy
biAwOwotICAgIH0KLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjID0gZ2VuZXJhdG9yLmVtaXRO
b2RlKG1fZXhwcik7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VHlwZU9mKGdlbmVyYXRvci5m
aW5hbERlc3RpbmF0aW9uKGRzdCksIHNyYy5nZXQoKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBQcmVmaXhSZXNvbHZlTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFByZWZpeFJlc29sdmVOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAg
IGlmIChSZWdpc3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkg
ewotICAgICAgICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFudChtX2lkZW50KSkgewotICAg
ICAgICAgICAgaWYgKGRzdCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQotICAgICAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHIwID0gZ2Vu
ZXJhdG9yLmVtaXRMb2FkKGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIChtX29wZXJh
dG9yID09IE9wUGx1c1BsdXMpID8gMS4wIDogLTEuMCk7Ci0gICAgICAgICAgICByZXR1cm4gZ2Vu
ZXJhdG9yLmVtaXRCaW5hcnlPcChvcF9hZGQsIHIwLmdldCgpLCBsb2NhbCwgcjAuZ2V0KCksIE9w
ZXJhbmRUeXBlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVtaXRQcmVJbmNPckRlYyhnZW5l
cmF0b3IsIGxvY2FsLCBtX29wZXJhdG9yKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5tb3Zl
VG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgbG9jYWwpOwotICAgIH0KLQotICAgIGludCBpbmRl
eCA9IDA7Ci0gICAgc2l6ZV90IGRlcHRoID0gMDsKLSAgICBKU09iamVjdCogZ2xvYmFsT2JqZWN0
ID0gMDsKLSAgICBpZiAoZ2VuZXJhdG9yLmZpbmRTY29wZWRQcm9wZXJ0eShtX2lkZW50LCBpbmRl
eCwgZGVwdGgsIGZhbHNlLCBnbG9iYWxPYmplY3QpICYmIGluZGV4ICE9IG1pc3NpbmdTeW1ib2xN
YXJrZXIoKSkgewotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcERzdCA9IGdlbmVyYXRv
ci5lbWl0R2V0U2NvcGVkVmFyKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgZGVwdGgs
IGluZGV4LCBnbG9iYWxPYmplY3QpOwotICAgICAgICBlbWl0UHJlSW5jT3JEZWMoZ2VuZXJhdG9y
LCBwcm9wRHN0LmdldCgpLCBtX29wZXJhdG9yKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRT
Y29wZWRWYXIoZGVwdGgsIGluZGV4LCBwcm9wRHN0LmdldCgpLCBnbG9iYWxPYmplY3QpOwotICAg
ICAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9w
RHN0LmdldCgpKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRp
dm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJ
RD4gcHJvcERzdCA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsKLSAgICBSZWZQdHI8
UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKSwgcHJvcERzdC5nZXQoKSwgbV9pZGVudCk7Ci0gICAgZW1pdFByZUlu
Y09yRGVjKGdlbmVyYXRvciwgcHJvcERzdC5nZXQoKSwgbV9vcGVyYXRvcik7Ci0gICAgZ2VuZXJh
dG9yLmVtaXRQdXRCeUlkKGJhc2UuZ2V0KCksIG1faWRlbnQsIHByb3BEc3QuZ2V0KCkpOwotICAg
IHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRlZChkc3QsIHByb3BEc3Qu
Z2V0KCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJlZml4QnJh
Y2tldE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklE
KiBQcmVmaXhCcmFja2V0Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5l
cmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9
IGdlbmVyYXRvci5lbWl0Tm9kZShtX2Jhc2UpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9w
ZXJ0eSA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX3N1YnNjcmlwdCk7Ci0gICAgUmVmUHRyPFJlZ2lz
dGVySUQ+IHByb3BEc3QgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCk7Ci0KLSAgICBn
ZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgKyBtX3N1YmV4cHJlc3Npb25EaXZv
dE9mZnNldCwgbV9zdWJleHByZXNzaW9uU3RhcnRPZmZzZXQsIGVuZE9mZnNldCgpIC0gbV9zdWJl
eHByZXNzaW9uRGl2b3RPZmZzZXQpOwotICAgIFJlZ2lzdGVySUQqIHZhbHVlID0gZ2VuZXJhdG9y
LmVtaXRHZXRCeVZhbChwcm9wRHN0LmdldCgpLCBiYXNlLmdldCgpLCBwcm9wZXJ0eS5nZXQoKSk7
Ci0gICAgaWYgKG1fb3BlcmF0b3IgPT0gT3BQbHVzUGx1cykKLSAgICAgICAgZ2VuZXJhdG9yLmVt
aXRQcmVJbmModmFsdWUpOwotICAgIGVsc2UKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRQcmVEZWMo
dmFsdWUpOwotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRP
ZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0UHV0QnlWYWwoYmFzZS5n
ZXQoKSwgcHJvcGVydHkuZ2V0KCksIHZhbHVlKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVU
b0Rlc3RpbmF0aW9uSWZOZWVkZWQoZHN0LCBwcm9wRHN0LmdldCgpKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZWZpeERvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBQcmVmaXhEb3ROb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fYmFzZSk7Ci0g
ICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHByb3BEc3QgPSBnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9u
KGRzdCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgKyBtX3N1
YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHByZXNzaW9uU3RhcnRPZmZzZXQsIGVuZE9m
ZnNldCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQpOwotICAgIFJlZ2lzdGVySUQqIHZh
bHVlID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKHByb3BEc3QuZ2V0KCksIGJhc2UuZ2V0KCksIG1f
aWRlbnQpOwotICAgIGlmIChtX29wZXJhdG9yID09IE9wUGx1c1BsdXMpCi0gICAgICAgIGdlbmVy
YXRvci5lbWl0UHJlSW5jKHZhbHVlKTsKLSAgICBlbHNlCi0gICAgICAgIGdlbmVyYXRvci5lbWl0
UHJlRGVjKHZhbHVlKTsKLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCks
IHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQo
YmFzZS5nZXQoKSwgbV9pZGVudCwgdmFsdWUpOwotICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRv
RGVzdGluYXRpb25JZk5lZWRlZChkc3QsIHByb3BEc3QuZ2V0KCkpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJlZml4RXJyb3JOb2RlIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFByZWZpeEVycm9yTm9kZTo6ZW1pdEJ5
dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqKQotewotICAg
IHJldHVybiBlbWl0VGhyb3dFcnJvcihnZW5lcmF0b3IsIFJlZmVyZW5jZUVycm9yLCBtX29wZXJh
dG9yID09IE9wUGx1c1BsdXMKLSAgICAgICAgPyAiUHJlZml4ICsrIG9wZXJhdG9yIGFwcGxpZWQg
dG8gdmFsdWUgdGhhdCBpcyBub3QgYSByZWZlcmVuY2UuIgotICAgICAgICA6ICJQcmVmaXggLS0g
b3BlcmF0b3IgYXBwbGllZCB0byB2YWx1ZSB0aGF0IGlzIG5vdCBhIHJlZmVyZW5jZS4iKTsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVuYXJ5IE9wZXJhdGlvbiBOb2Rl
cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBVbmFy
eU9wTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lz
dGVySUQqIGRzdCkKLXsKLSAgICBSZWdpc3RlcklEKiBzcmMgPSBnZW5lcmF0b3IuZW1pdE5vZGUo
bV9leHByKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRVbmFyeU9wKG9wY29kZUlEKCksIGdl
bmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCksIHNyYyk7Ci19Ci0KLQotLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tIExvZ2ljYWxOb3ROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTG9naWNhbE5vdE5vZGU6OmVtaXRCeXRlY29kZUluQ29u
ZGl0aW9uQ29udGV4dChCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBMYWJlbCogdHJ1ZVRh
cmdldCwgTGFiZWwqIGZhbHNlVGFyZ2V0LCBib29sIGZhbGxUaHJvdWdoTWVhbnNUcnVlKQotewot
ICAgIEFTU0VSVChleHByKCktPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkpOwotCi0gICAg
Ly8gcmV2ZXJzZSB0aGUgdHJ1ZSBhbmQgZmFsc2UgdGFyZ2V0cwotICAgIGdlbmVyYXRvci5lbWl0
Tm9kZUluQ29uZGl0aW9uQ29udGV4dChleHByKCksIGZhbHNlVGFyZ2V0LCB0cnVlVGFyZ2V0LCAh
ZmFsbFRocm91Z2hNZWFuc1RydWUpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLSBCaW5hcnkgT3BlcmF0aW9uIE5vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLS8vIEJpbmFyeU9wTm9kZTo6ZW1pdFN0cmNhdDoKLS8vCi0vLyBUaGlzIG5v
ZGUgZ2VuZXJhdGVzIGFuIG9wX3N0cmNhdCBvcGVyYXRpb24uICBUaGlzIG9wY29kZSBjYW4gaGFu
ZGxlIGNvbmNhdGVuYXRpb24gb2YgdGhyZWUgb3IKLS8vIG1vcmUgdmFsdWVzLCB3aGVyZSB3ZSBj
YW4gZGV0ZXJtaW5lIGEgc2V0IG9mIHNlcGFyYXRlIG9wX2FkZCBvcGVyYXRpb25zIHdvdWxkIGJl
IG9wZXJhdGluZyBvbgotLy8gc3RyaW5nIHZhbHVlcy4KLS8vCi0vLyBUaGlzIGZ1bmN0aW9uIGV4
cGVjdHMgdG8gYmUgb3BlcmF0aW5nIG9uIGEgZ3JhcGggb2YgQVNUIG5vZGVzIGxvb2tpbmcgc29t
ZXRoaW5nIGxpa2UgdGhpczoKLS8vCi0vLyAgICAgKGEpLi4uICAgICAoYikKLS8vICAgICAgICAg
IFwgICAvCi0vLyAgICAgICAgICAgKCspICAgICAoYykKLS8vICAgICAgICAgICAgICBcICAgLwot
Ly8gICAgICBbZF0gICAgICgoKykpCi0vLyAgICAgICAgIFwgICAgLwotLy8gICAgICAgICAgWys9
XQotLy8KLS8vIFRoZSBhc3NpZ25tZW50IG9wZXJhdGlvbiBpcyBvcHRpb25hbCwgaWYgaXQgZXhp
c3RzIHRoZSByZWdpc3RlciBob2xkaW5nIHRoZSB2YWx1ZSBvbiB0aGUKLS8vIGxlZnRoYW5kIHNp
ZGUgb2YgdGhlIGFzc2lnbm1lbnQgc2hvdWxkIGJlIHBhc3NpbmcgYXMgdGhlIG9wdGlvbmFsICds
aHMnIGFyZ3VtZW50LgotLy8KLS8vIFRoZSBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbiB0aGUg
bm9kZSBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZSBvZiByZWd1bGFyIGJpbmFyeSBhZGQKLS8vIG9w
ZXJhdGlvbnMgKG1hcmtlZCBpbiB0aGUgZGlhZ3JhbSB3aXRoIGEgZG91YmxlIHNldCBvZiBwYXJl
bnRoZXNlcykuICBUaGlzIG5vZGUgbXVzdAotLy8gYmUgcGVyZm9ybWluZyBhIHN0cmluZyBjb25j
YXRlbmF0aW9uIChkZXRlcm1pbmVkIGJ5IHN0YXRpY2FsbHkgZGV0ZWN0aW5nIHRoYXQgYXQgbGVh
c3QKLS8vIG9uZSBjaGlsZCBtdXN0IGJlIGEgc3RyaW5nKS4gIAotLy8KLS8vIFNpbmNlIHRoZSBt
aW5pbXVtIG51bWJlciBvZiB2YWx1ZXMgYmVpbmcgY29uY2F0ZW5hdGVkIHRvZ2V0aGVyIGlzIGV4
cGVjdGVkIHRvIGJlIDMsIGlmCi0vLyBhIGxocyB0byBhIGNvbmNhdGVuYXRpbmcgYXNzaWdubWVu
dCBpcyBub3QgcHJvdmlkZWQgdGhlbiB0aGUgIHJvb3QgYWRkIHNob3VsZCBoYXZlIGF0Ci0vLyBs
ZWFzdCBvbmUgbGVmdCBjaGlsZCB0aGF0IGlzIGFsc28gYW4gYWRkIHRoYXQgY2FuIGJlIGRldGVy
bWluZWQgdG8gYmUgb3BlcmF0aW5nIG9uIHN0cmluZ3MuCi0vLwotUmVnaXN0ZXJJRCogQmluYXJ5
T3BOb2RlOjplbWl0U3RyY2F0KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCwgUmVnaXN0ZXJJRCogbGhzLCBSZWFkTW9kaWZ5UmVzb2x2ZU5vZGUqIGVtaXRFeHBy
ZXNzaW9uSW5mb0Zvck1lKQotewotICAgIEFTU0VSVChpc0FkZCgpKTsKLSAgICBBU1NFUlQocmVz
dWx0RGVzY3JpcHRvcigpLmRlZmluaXRlbHlJc1N0cmluZygpKTsKLQotICAgIC8vIENyZWF0ZSBh
IGxpc3Qgb2YgZXhwcmVzc2lvbnMgZm9yIGFsbCB0aGUgYWRkcyBpbiB0aGUgdHJlZSBvZiBub2Rl
cyB3ZSBjYW4gY29udmVydCBpbnRvCi0gICAgLy8gYSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gIFRo
ZSByaWdodG1vc3Qgbm9kZSAoYykgaXMgYWRkZWQgZmlyc3QuICBUaGUgcmlnaHRtb3N0IG5vZGUg
aXMKLSAgICAvLyBhZGRlZCBmaXJzdCwgYW5kIHRoZSBsZWZ0bW9zdCBjaGlsZCBpcyBuZXZlciBh
ZGRlZCwgc28gdGhlIHZlY3RvciBwcm9kdWNlZCBmb3IgdGhlCi0gICAgLy8gZXhhbXBsZSBhYm92
ZSB3aWxsIGJlIFsgYywgYiBdLgotICAgIFZlY3RvcjxFeHByZXNzaW9uTm9kZSosIDE2PiByZXZl
cnNlRXhwcmVzc2lvbkxpc3Q7Ci0gICAgcmV2ZXJzZUV4cHJlc3Npb25MaXN0LmFwcGVuZChtX2V4
cHIyKTsKLQotICAgIC8vIEV4YW1pbmUgdGhlIGxlZnQgY2hpbGQgb2YgdGhlIGFkZC4gIFNvIGxv
bmcgYXMgdGhpcyBpcyBhIHN0cmluZyBhZGQsIGFkZCBpdHMgcmlnaHQtY2hpbGQKLSAgICAvLyB0
byB0aGUgbGlzdCwgYW5kIGtlZXAgcHJvY2Vzc2luZyBhbG9uZyB0aGUgbGVmdCBmb3JrLgotICAg
IEV4cHJlc3Npb25Ob2RlKiBsZWZ0TW9zdEFkZENoaWxkID0gbV9leHByMTsKLSAgICB3aGlsZSAo
bGVmdE1vc3RBZGRDaGlsZC0+aXNBZGQoKSAmJiBsZWZ0TW9zdEFkZENoaWxkLT5yZXN1bHREZXNj
cmlwdG9yKCkuZGVmaW5pdGVseUlzU3RyaW5nKCkpIHsKLSAgICAgICAgcmV2ZXJzZUV4cHJlc3Np
b25MaXN0LmFwcGVuZChzdGF0aWNfY2FzdDxBZGROb2RlKj4obGVmdE1vc3RBZGRDaGlsZCktPm1f
ZXhwcjIpOwotICAgICAgICBsZWZ0TW9zdEFkZENoaWxkID0gc3RhdGljX2Nhc3Q8QWRkTm9kZSo+
KGxlZnRNb3N0QWRkQ2hpbGQpLT5tX2V4cHIxOwotICAgIH0KLQotICAgIFZlY3RvcjxSZWZQdHI8
UmVnaXN0ZXJJRD4sIDE2PiB0ZW1wb3JhcnlSZWdpc3RlcnM7Ci0KLSAgICAvLyBJZiB0aGVyZSBp
cyBhbiBhc3NpZ25tZW50LCBhbGxvY2F0ZSBhIHRlbXBvcmFyeSB0byBob2xkIHRoZSBsaHMgYWZ0
ZXIgY29udmVyc2lvbi4KLSAgICAvLyBXZSBjb3VsZCBwb3NzaWJseSBhdm9pZCB0aGlzICh0aGUg
bGhzIGlzIGNvbnZlcnRlZCBsYXN0IGFueXdheSwgd2UgY291bGQgbGV0IHRoZQotICAgIC8vIG9w
X3N0cmNhdCBub2RlIGhhbmRsZSBpdHMgY29udmVyc2lvbiBpZiByZXF1aXJlZCkuCi0gICAgaWYg
KGxocykKLSAgICAgICAgdGVtcG9yYXJ5UmVnaXN0ZXJzLmFwcGVuZChnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCkpOwotCi0gICAgLy8gRW1pdCBjb2RlIGZvciB0aGUgbGVmdG1vc3Qgbm9kZSAoKGEp
IGluIHRoZSBleGFtcGxlKS4KLSAgICB0ZW1wb3JhcnlSZWdpc3RlcnMuYXBwZW5kKGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKSk7Ci0gICAgUmVnaXN0ZXJJRCogbGVmdE1vc3RBZGRDaGlsZFRlbXBS
ZWdpc3RlciA9IHRlbXBvcmFyeVJlZ2lzdGVycy5sYXN0KCkuZ2V0KCk7Ci0gICAgZ2VuZXJhdG9y
LmVtaXROb2RlKGxlZnRNb3N0QWRkQ2hpbGRUZW1wUmVnaXN0ZXIsIGxlZnRNb3N0QWRkQ2hpbGQp
OwotCi0gICAgLy8gTm90ZSBvbiBvcmRlcmluZyBvZiBjb252ZXJzaW9uczoKLSAgICAvLwotICAg
IC8vIFdlIG1haW50YWluIHRoZSBzYW1lIG9yZGVyaW5nIG9mIGNvbnZlcnNpb25zIGFzIHdlIHdv
dWxkIHNlZSBpZiB0aGUgY29uY2F0ZW5hdGlvbnMKLSAgICAvLyB3YXMgcGVyZm9ybWVkIGFzIGEg
c2VxdWVuY2Ugb2YgYWRkcyAob3RoZXJ3aXNlIHRoaXMgb3B0aW1pemF0aW9uIGNvdWxkIGNoYW5n
ZQotICAgIC8vIGJlaGF2aW91ciBzaG91bGQgYW4gb2JqZWN0IGhhdmUgYmVlbiBwcm92aWRlZCBh
IHZhbHVlT2Ygb3IgdG9TdHJpbmcgbWV0aG9kKS4KLSAgICAvLwotICAgIC8vIENvbnNpZGVyaW5n
IHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgc2VxdW5jZSBvZiBleGVjdXRpb24gaXM6Ci0gICAgLy8g
ICAgICogZXZhbHVhdGUgb3BlcmFuZCAoYSkKLSAgICAvLyAgICAgKiBldmFsdWF0ZSBvcGVyYW5k
IChiKQotICAgIC8vICAgICAqIGNvbnZlcnQgKGEpIHRvIHByaW1pdGl2ZSAgIDwtICAodGhpcyB3
b3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGZpcnN0IGFkZCkKLSAgICAvLyAgICAgKiBjb252ZXJ0
IChiKSB0byBwcmltaXRpdmUgICA8LSAgKGRpdHRvKQotICAgIC8vICAgICAqIGV2YWx1YXRlIG9w
ZXJhbmQgKGMpCi0gICAgLy8gICAgICogY29udmVydCAoYykgdG8gcHJpbWl0aXZlICAgPC0gICh0
aGlzIHdvdWxkIGJlIHRyaWdnZXJlZCBieSB0aGUgc2Vjb25kIGFkZCkKLSAgICAvLyBBbmQgb3B0
aW9uYWxseSwgaWYgdGhlcmUgaXMgYW4gYXNzaWdubWVudDoKLSAgICAvLyAgICAgKiBjb252ZXJ0
IChkKSB0byBwcmltaXRpdmUgICA8LSAgKHRoaXMgd291bGQgYmUgdHJpZ2dlcmVkIGJ5IHRoZSBh
c3NpZ25pbmcgYWRkaXRpb24pCi0gICAgLy8KLSAgICAvLyBBcyBzdWNoIHdlIGRvIG5vdCBwbGFu
dCBhbiBvcCB0byBjb252ZXJ0IHRoZSBsZWZ0bW9zdCBjaGlsZCBub3cuICBJbnN0ZWFkLCB1c2UK
LSAgICAvLyAnbGVmdE1vc3RBZGRDaGlsZFRlbXBSZWdpc3RlcicgYXMgYSBmbGFnIHRvIHRyaWdn
ZXIgZ2VuZXJhdGlvbiBvZiB0aGUgY29udmVyc2lvbgotICAgIC8vIG9uY2UgdGhlIHNlY29uZCBu
b2RlIGhhcyBiZWVuIGdlbmVyYXRlZC4gIEhvd2V2ZXIsIGlmIHRoZSBsZWZ0bW9zdCBjaGlsZCBp
cyBhbgotICAgIC8vIGltbWVkaWF0ZSB3ZSBjYW4gdHJpdmlhbGx5IGRldGVybWluZSB0aGF0IG5v
IGNvbnZlcnNpb24gd2lsbCBiZSByZXF1aXJlZC4KLSAgICAvLyBJZiB0aGlzIGlzIHRoZSBjYXNl
Ci0gICAgaWYgKGxlZnRNb3N0QWRkQ2hpbGQtPmlzU3RyaW5nKCkpCi0gICAgICAgIGxlZnRNb3N0
QWRkQ2hpbGRUZW1wUmVnaXN0ZXIgPSAwOwotCi0gICAgd2hpbGUgKHJldmVyc2VFeHByZXNzaW9u
TGlzdC5zaXplKCkpIHsKLSAgICAgICAgRXhwcmVzc2lvbk5vZGUqIG5vZGUgPSByZXZlcnNlRXhw
cmVzc2lvbkxpc3QubGFzdCgpOwotICAgICAgICByZXZlcnNlRXhwcmVzc2lvbkxpc3QucmVtb3Zl
TGFzdCgpOwotCi0gICAgICAgIC8vIEVtaXQgdGhlIGNvZGUgZm9yIHRoZSBjdXJyZW50IG5vZGUu
Ci0gICAgICAgIHRlbXBvcmFyeVJlZ2lzdGVycy5hcHBlbmQoZ2VuZXJhdG9yLm5ld1RlbXBvcmFy
eSgpKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKHRlbXBvcmFyeVJlZ2lzdGVycy5sYXN0
KCkuZ2V0KCksIG5vZGUpOwotCi0gICAgICAgIC8vIE9uIHRoZSBmaXJzdCBpdGVyYXRpb24gb2Yg
dGhpcyBsb29wLCB3aGVuIHdlIGZpcnN0IHJlYWNoIHRoaXMgcG9pbnQgd2UgaGF2ZSBqdXN0Ci0g
ICAgICAgIC8vIGdlbmVyYXRlZCB0aGUgc2Vjb25kIG5vZGUsIHdoaWNoIG1lYW5zIGl0IGlzIHRp
bWUgdG8gY29udmVydCB0aGUgbGVmdG1vc3Qgb3BlcmFuZC4KLSAgICAgICAgaWYgKGxlZnRNb3N0
QWRkQ2hpbGRUZW1wUmVnaXN0ZXIpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0VG9Qcmlt
aXRpdmUobGVmdE1vc3RBZGRDaGlsZFRlbXBSZWdpc3RlciwgbGVmdE1vc3RBZGRDaGlsZFRlbXBS
ZWdpc3Rlcik7Ci0gICAgICAgICAgICBsZWZ0TW9zdEFkZENoaWxkVGVtcFJlZ2lzdGVyID0gMDsg
Ly8gT25seSBkbyB0aGlzIG9uY2UuCi0gICAgICAgIH0KLSAgICAgICAgLy8gUGxhbnQgYSBjb252
ZXJzaW9uIGZvciB0aGlzIG5vZGUsIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgaWYgKCFub2RlLT5p
c1N0cmluZygpKQotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRUb1ByaW1pdGl2ZSh0ZW1wb3Jh
cnlSZWdpc3RlcnMubGFzdCgpLmdldCgpLCB0ZW1wb3JhcnlSZWdpc3RlcnMubGFzdCgpLmdldCgp
KTsKLSAgICB9Ci0gICAgQVNTRVJUKHRlbXBvcmFyeVJlZ2lzdGVycy5zaXplKCkgPj0gMyk7Ci0K
LSAgICAvLyBDZXJ0YWluIHJlYWQtbW9kaWZ5IG5vZGVzIHJlcXVpcmUgZXhwcmVzc2lvbiBpbmZv
IHRvIGJlIGVtaXR0ZWQgKmFmdGVyKiBtX3JpZ2h0IGhhcyBiZWVuIGdlbmVyYXRlZC4KLSAgICAv
LyBJZiB0aGlzIGlzIHJlcXVpcmVkIHRoZSBub2RlIGlzIHBhc3NlZCBhcyAnZW1pdEV4cHJlc3Np
b25JbmZvRm9yTWUnOyBkbyBzbyBub3cuCi0gICAgaWYgKGVtaXRFeHByZXNzaW9uSW5mb0Zvck1l
KQotICAgICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGVtaXRFeHByZXNzaW9uSW5m
b0Zvck1lLT5kaXZvdCgpLCBlbWl0RXhwcmVzc2lvbkluZm9Gb3JNZS0+c3RhcnRPZmZzZXQoKSwg
ZW1pdEV4cHJlc3Npb25JbmZvRm9yTWUtPmVuZE9mZnNldCgpKTsKLQotICAgIC8vIElmIHRoZXJl
IGlzIGFuIGFzc2lnbm1lbnQgY29udmVydCB0aGUgbGhzIG5vdy4gIFRoaXMgd2lsbCBhbHNvIGNv
cHkgbGhzIHRvCi0gICAgLy8gdGhlIHRlbXBvcmFyeSByZWdpc3RlciB3ZSBhbGxvY2F0ZWQgZm9y
IGl0LgotICAgIGlmIChsaHMpCi0gICAgICAgIGdlbmVyYXRvci5lbWl0VG9QcmltaXRpdmUodGVt
cG9yYXJ5UmVnaXN0ZXJzWzBdLmdldCgpLCBsaHMpOwotCi0gICAgcmV0dXJuIGdlbmVyYXRvci5l
bWl0U3RyY2F0KGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCwgdGVtcG9yYXJ5UmVnaXN0
ZXJzWzBdLmdldCgpKSwgdGVtcG9yYXJ5UmVnaXN0ZXJzWzBdLmdldCgpLCB0ZW1wb3JhcnlSZWdp
c3RlcnMuc2l6ZSgpKTsKLX0KLQotUmVnaXN0ZXJJRCogQmluYXJ5T3BOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAg
IE9wY29kZUlEIG9wY29kZUlEID0gdGhpcy0+b3Bjb2RlSUQoKTsKLQotICAgIGlmIChvcGNvZGVJ
RCA9PSBvcF9hZGQgJiYgbV9leHByMS0+aXNBZGQoKSAmJiBtX2V4cHIxLT5yZXN1bHREZXNjcmlw
dG9yKCkuZGVmaW5pdGVseUlzU3RyaW5nKCkpCi0gICAgICAgIHJldHVybiBlbWl0U3RyY2F0KGdl
bmVyYXRvciwgZHN0KTsKLQotICAgIGlmIChvcGNvZGVJRCA9PSBvcF9uZXEpIHsKLSAgICAgICAg
aWYgKG1fZXhwcjEtPmlzTnVsbCgpIHx8IG1fZXhwcjItPmlzTnVsbCgpKSB7Ci0gICAgICAgICAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gc3JjID0gZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3Qp
OwotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKHNyYy5nZXQoKSwgbV9leHByMS0+aXNO
dWxsKCkgPyBtX2V4cHIyIDogbV9leHByMSk7Ci0gICAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9y
LmVtaXRVbmFyeU9wKG9wX25lcV9udWxsLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3Qs
IHNyYy5nZXQoKSksIHNyYy5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBSZWZQdHI8
UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci5lbWl0Tm9kZUZvckxlZnRIYW5kU2lkZShtX2V4
cHIxLCBtX3JpZ2h0SGFzQXNzaWdubWVudHMsIG1fZXhwcjItPmlzUHVyZShnZW5lcmF0b3IpKTsK
LSAgICBSZWdpc3RlcklEKiBzcmMyID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcjIpOwotICAg
IHJldHVybiBnZW5lcmF0b3IuZW1pdEJpbmFyeU9wKG9wY29kZUlELCBnZW5lcmF0b3IuZmluYWxE
ZXN0aW5hdGlvbihkc3QsIHNyYzEuZ2V0KCkpLCBzcmMxLmdldCgpLCBzcmMyLCBPcGVyYW5kVHlw
ZXMobV9leHByMS0+cmVzdWx0RGVzY3JpcHRvcigpLCBtX2V4cHIyLT5yZXN1bHREZXNjcmlwdG9y
KCkpKTsKLX0KLQotUmVnaXN0ZXJJRCogRXF1YWxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVH
ZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmIChtX2V4cHIx
LT5pc051bGwoKSB8fCBtX2V4cHIyLT5pc051bGwoKSkgewotICAgICAgICBSZWZQdHI8UmVnaXN0
ZXJJRD4gc3JjID0gZ2VuZXJhdG9yLnRlbXBEZXN0aW5hdGlvbihkc3QpOwotICAgICAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoc3JjLmdldCgpLCBtX2V4cHIxLT5pc051bGwoKSA/IG1fZXhwcjIgOiBt
X2V4cHIxKTsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0VW5hcnlPcChvcF9lcV9udWxs
LCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIHNyYy5nZXQoKSksIHNyYy5nZXQoKSk7
Ci0gICAgfQotCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IuZW1pdE5v
ZGVGb3JMZWZ0SGFuZFNpZGUobV9leHByMSwgbV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBtX2V4cHIy
LT5pc1B1cmUoZ2VuZXJhdG9yKSk7Ci0gICAgUmVnaXN0ZXJJRCogc3JjMiA9IGdlbmVyYXRvci5l
bWl0Tm9kZShtX2V4cHIyKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRFcXVhbGl0eU9wKG9w
X2VxLCBnZW5lcmF0b3IuZmluYWxEZXN0aW5hdGlvbihkc3QsIHNyYzEuZ2V0KCkpLCBzcmMxLmdl
dCgpLCBzcmMyKTsKLX0KLQotUmVnaXN0ZXJJRCogU3RyaWN0RXF1YWxOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJhdG9yLmVtaXROb2RlRm9yTGVmdEhhbmRT
aWRlKG1fZXhwcjEsIG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9leHByMi0+aXNQdXJlKGdlbmVy
YXRvcikpOwotICAgIFJlZ2lzdGVySUQqIHNyYzIgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHBy
Mik7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0RXF1YWxpdHlPcChvcF9zdHJpY3RlcSwgZ2Vu
ZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwgc3Jj
Mik7Ci19Ci0KLVJlZ2lzdGVySUQqIFJldmVyc2VCaW5hcnlPcE5vZGU6OmVtaXRCeXRlY29kZShC
eXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVm
UHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IuZW1pdE5vZGVGb3JMZWZ0SGFuZFNpZGUo
bV9leHByMSwgbV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBtX2V4cHIyLT5pc1B1cmUoZ2VuZXJhdG9y
KSk7Ci0gICAgUmVnaXN0ZXJJRCogc3JjMiA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIyKTsK
LSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRCaW5hcnlPcChvcGNvZGVJRCgpLCBnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbihkc3QsIHNyYzEuZ2V0KCkpLCBzcmMyLCBzcmMxLmdldCgpLCBPcGVy
YW5kVHlwZXMobV9leHByMi0+cmVzdWx0RGVzY3JpcHRvcigpLCBtX2V4cHIxLT5yZXN1bHREZXNj
cmlwdG9yKCkpKTsKLX0KLQotUmVnaXN0ZXJJRCogVGhyb3dhYmxlQmluYXJ5T3BOb2RlOjplbWl0
Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQot
ewotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJhdG9yLmVtaXROb2RlRm9yTGVm
dEhhbmRTaWRlKG1fZXhwcjEsIG1fcmlnaHRIYXNBc3NpZ25tZW50cywgbV9leHByMi0+aXNQdXJl
KGdlbmVyYXRvcikpOwotICAgIFJlZ2lzdGVySUQqIHNyYzIgPSBnZW5lcmF0b3IuZW1pdE5vZGUo
bV9leHByMik7Ci0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFy
dE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0QmluYXJ5
T3Aob3Bjb2RlSUQoKSwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdldCgp
KSwgc3JjMS5nZXQoKSwgc3JjMiwgT3BlcmFuZFR5cGVzKG1fZXhwcjEtPnJlc3VsdERlc2NyaXB0
b3IoKSwgbV9leHByMi0+cmVzdWx0RGVzY3JpcHRvcigpKSk7Ci19Ci0KLVJlZ2lzdGVySUQqIElu
c3RhbmNlT2ZOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCogZHN0KQotewotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBzcmMxID0gZ2VuZXJh
dG9yLmVtaXROb2RlRm9yTGVmdEhhbmRTaWRlKG1fZXhwcjEsIG1fcmlnaHRIYXNBc3NpZ25tZW50
cywgbV9leHByMi0+aXNQdXJlKGdlbmVyYXRvcikpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBz
cmMyID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcjIpOwotCi0gICAgZ2VuZXJhdG9yLmVtaXRF
eHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAg
Z2VuZXJhdG9yLmVtaXRHZXRCeUlkRXhjZXB0aW9uSW5mbyhvcF9pbnN0YW5jZW9mKTsKLSAgICBS
ZWdpc3RlcklEKiBzcmMyUHJvdG90eXBlID0gZ2VuZXJhdG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKSwgc3JjMi5nZXQoKSwgZ2VuZXJhdG9yLmdsb2JhbERhdGEoKS0+cHJv
cGVydHlOYW1lcy0+cHJvdG90eXBlKTsKLQotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbklu
Zm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIHJldHVybiBnZW5l
cmF0b3IuZW1pdEluc3RhbmNlT2YoZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMx
LmdldCgpKSwgc3JjMS5nZXQoKSwgc3JjMi5nZXQoKSwgc3JjMlByb3RvdHlwZSk7Ci19Ci0KLS8v
IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBMb2dpY2FsT3BOb2RlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogTG9naWNhbE9wTm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gdGVtcCA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0
KTsKLSAgICBSZWZQdHI8TGFiZWw+IHRhcmdldCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAg
IAotICAgIGdlbmVyYXRvci5lbWl0Tm9kZSh0ZW1wLmdldCgpLCBtX2V4cHIxKTsKLSAgICBpZiAo
bV9vcGVyYXRvciA9PSBPcExvZ2ljYWxBbmQpCi0gICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElm
RmFsc2UodGVtcC5nZXQoKSwgdGFyZ2V0LmdldCgpKTsKLSAgICBlbHNlCi0gICAgICAgIGdlbmVy
YXRvci5lbWl0SnVtcElmVHJ1ZSh0ZW1wLmdldCgpLCB0YXJnZXQuZ2V0KCkpOwotICAgIGdlbmVy
YXRvci5lbWl0Tm9kZSh0ZW1wLmdldCgpLCBtX2V4cHIyKTsKLSAgICBnZW5lcmF0b3IuZW1pdExh
YmVsKHRhcmdldC5nZXQoKSk7Ci0KLSAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0
aW9uSWZOZWVkZWQoZHN0LCB0ZW1wLmdldCgpKTsKLX0KLQotdm9pZCBMb2dpY2FsT3BOb2RlOjpl
bWl0Qnl0ZWNvZGVJbkNvbmRpdGlvbkNvbnRleHQoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRv
ciwgTGFiZWwqIHRydWVUYXJnZXQsIExhYmVsKiBmYWxzZVRhcmdldCwgYm9vbCBmYWxsVGhyb3Vn
aE1lYW5zVHJ1ZSkKLXsKLSAgICBpZiAobV9leHByMS0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVn
ZW4oKSkgewotICAgICAgICBSZWZQdHI8TGFiZWw+IGFmdGVyRXhwcjEgPSBnZW5lcmF0b3IubmV3
TGFiZWwoKTsKLSAgICAgICAgaWYgKG1fb3BlcmF0b3IgPT0gT3BMb2dpY2FsQW5kKQotICAgICAg
ICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwcjEsIGFmdGVy
RXhwcjEuZ2V0KCksIGZhbHNlVGFyZ2V0LCB0cnVlKTsKLSAgICAgICAgZWxzZSAKLSAgICAgICAg
ICAgIGdlbmVyYXRvci5lbWl0Tm9kZUluQ29uZGl0aW9uQ29udGV4dChtX2V4cHIxLCB0cnVlVGFy
Z2V0LCBhZnRlckV4cHIxLmdldCgpLCBmYWxzZSk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0TGFi
ZWwoYWZ0ZXJFeHByMS5nZXQoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVnaXN0ZXJJRCog
dGVtcCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIxKTsKLSAgICAgICAgaWYgKG1fb3BlcmF0
b3IgPT0gT3BMb2dpY2FsQW5kKQotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZGYWxz
ZSh0ZW1wLCBmYWxzZVRhcmdldCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdlbmVyYXRv
ci5lbWl0SnVtcElmVHJ1ZSh0ZW1wLCB0cnVlVGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBpZiAobV9l
eHByMi0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVnZW4oKSkKLSAgICAgICAgZ2VuZXJhdG9yLmVt
aXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwcjIsIHRydWVUYXJnZXQsIGZhbHNlVGFyZ2V0
LCBmYWxsVGhyb3VnaE1lYW5zVHJ1ZSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFJlZ2lzdGVySUQq
IHRlbXAgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByMik7Ci0gICAgICAgIGlmIChmYWxsVGhy
b3VnaE1lYW5zVHJ1ZSkKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElmRmFsc2UodGVt
cCwgZmFsc2VUYXJnZXQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBnZW5lcmF0b3IuZW1p
dEp1bXBJZlRydWUodGVtcCwgdHJ1ZVRhcmdldCk7Ci0gICAgfQotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uZGl0aW9uYWxOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBDb25kaXRpb25hbE5vZGU6OmVtaXRCeXRlY29kZShC
eXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVm
UHRyPFJlZ2lzdGVySUQ+IG5ld0RzdCA9IGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9uKGRzdCk7
Ci0gICAgUmVmUHRyPExhYmVsPiBiZWZvcmVFbHNlID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0g
ICAgUmVmUHRyPExhYmVsPiBhZnRlckVsc2UgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLQotICAg
IGlmIChtX2xvZ2ljYWwtPmhhc0NvbmRpdGlvbkNvbnRleHRDb2RlZ2VuKCkpIHsKLSAgICAgICAg
UmVmUHRyPExhYmVsPiBiZWZvcmVUaGVuID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgICAg
IGdlbmVyYXRvci5lbWl0Tm9kZUluQ29uZGl0aW9uQ29udGV4dChtX2xvZ2ljYWwsIGJlZm9yZVRo
ZW4uZ2V0KCksIGJlZm9yZUVsc2UuZ2V0KCksIHRydWUpOwotICAgICAgICBnZW5lcmF0b3IuZW1p
dExhYmVsKGJlZm9yZVRoZW4uZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlZ2lzdGVy
SUQqIGNvbmQgPSBnZW5lcmF0b3IuZW1pdE5vZGUobV9sb2dpY2FsKTsKLSAgICAgICAgZ2VuZXJh
dG9yLmVtaXRKdW1wSWZGYWxzZShjb25kLCBiZWZvcmVFbHNlLmdldCgpKTsKLSAgICB9Ci0KLSAg
ICBnZW5lcmF0b3IuZW1pdE5vZGUobmV3RHN0LmdldCgpLCBtX2V4cHIxKTsKLSAgICBnZW5lcmF0
b3IuZW1pdEp1bXAoYWZ0ZXJFbHNlLmdldCgpKTsKLQotICAgIGdlbmVyYXRvci5lbWl0TGFiZWwo
YmVmb3JlRWxzZS5nZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXROb2RlKG5ld0RzdC5nZXQoKSwg
bV9leHByMik7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGFmdGVyRWxzZS5nZXQoKSk7Ci0K
LSAgICByZXR1cm4gbmV3RHN0LmdldCgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gUmVhZE1vZGlmeVJlc29sdmVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tCi0KLS8vIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBtb3ZlZCB0byBiZSBhIG1ldGhv
ZCBvbiBCeXRlY29kZUdlbmVyYXRvcj8KLXN0YXRpYyBBTFdBWVNfSU5MSU5FIFJlZ2lzdGVySUQq
IGVtaXRSZWFkTW9kaWZ5QXNzaWdubWVudChCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBS
ZWdpc3RlcklEKiBkc3QsIFJlZ2lzdGVySUQqIHNyYzEsIEV4cHJlc3Npb25Ob2RlKiBtX3JpZ2h0
LCBPcGVyYXRvciBvcGVyLCBPcGVyYW5kVHlwZXMgdHlwZXMsIFJlYWRNb2RpZnlSZXNvbHZlTm9k
ZSogZW1pdEV4cHJlc3Npb25JbmZvRm9yTWUgPSAwKQotewotICAgIE9wY29kZUlEIG9wY29kZUlE
OwotICAgIHN3aXRjaCAob3BlcikgewotICAgICAgICBjYXNlIE9wTXVsdEVxOgotICAgICAgICAg
ICAgb3Bjb2RlSUQgPSBvcF9tdWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBP
cERpdkVxOgotICAgICAgICAgICAgb3Bjb2RlSUQgPSBvcF9kaXY7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBPcFBsdXNFcToKLSAgICAgICAgICAgIGlmIChtX3JpZ2h0LT5pc0Fk
ZCgpICYmIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKS5kZWZpbml0ZWx5SXNTdHJpbmcoKSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QWRkTm9kZSo+KG1fcmlnaHQpLT5l
bWl0U3RyY2F0KGdlbmVyYXRvciwgZHN0LCBzcmMxLCBlbWl0RXhwcmVzc2lvbkluZm9Gb3JNZSk7
Ci0gICAgICAgICAgICBvcGNvZGVJRCA9IG9wX2FkZDsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIE9wTWludXNFcToKLSAgICAgICAgICAgIG9wY29kZUlEID0gb3Bfc3ViOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT3BMU2hpZnQ6Ci0gICAgICAgICAgICBvcGNv
ZGVJRCA9IG9wX2xzaGlmdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9wUlNo
aWZ0OgotICAgICAgICAgICAgb3Bjb2RlSUQgPSBvcF9yc2hpZnQ7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBPcFVSU2hpZnQ6Ci0gICAgICAgICAgICBvcGNvZGVJRCA9IG9wX3Vy
c2hpZnQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPcEFuZEVxOgotICAgICAg
ICAgICAgb3Bjb2RlSUQgPSBvcF9iaXRhbmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBPcFhPckVxOgotICAgICAgICAgICAgb3Bjb2RlSUQgPSBvcF9iaXR4b3I7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPcE9yRXE6Ci0gICAgICAgICAgICBvcGNvZGVJRCA9
IG9wX2JpdG9yOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT3BNb2RFcToKLSAg
ICAgICAgICAgIG9wY29kZUlEID0gb3BfbW9kOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICAgICAgICAg
IHJldHVybiBkc3Q7Ci0gICAgfQotCi0gICAgUmVnaXN0ZXJJRCogc3JjMiA9IGdlbmVyYXRvci5l
bWl0Tm9kZShtX3JpZ2h0KTsKLQotICAgIC8vIENlcnRhaW4gcmVhZC1tb2RpZnkgbm9kZXMgcmVx
dWlyZSBleHByZXNzaW9uIGluZm8gdG8gYmUgZW1pdHRlZCAqYWZ0ZXIqIG1fcmlnaHQgaGFzIGJl
ZW4gZ2VuZXJhdGVkLgotICAgIC8vIElmIHRoaXMgaXMgcmVxdWlyZWQgdGhlIG5vZGUgaXMgcGFz
c2VkIGFzICdlbWl0RXhwcmVzc2lvbkluZm9Gb3JNZSc7IGRvIHNvIG5vdy4KLSAgICBpZiAoZW1p
dEV4cHJlc3Npb25JbmZvRm9yTWUpCi0gICAgICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbklu
Zm8oZW1pdEV4cHJlc3Npb25JbmZvRm9yTWUtPmRpdm90KCksIGVtaXRFeHByZXNzaW9uSW5mb0Zv
ck1lLT5zdGFydE9mZnNldCgpLCBlbWl0RXhwcmVzc2lvbkluZm9Gb3JNZS0+ZW5kT2Zmc2V0KCkp
OwotCi0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0QmluYXJ5T3Aob3Bjb2RlSUQsIGRzdCwgc3Jj
MSwgc3JjMiwgdHlwZXMpOwotfQotCi1SZWdpc3RlcklEKiBSZWFkTW9kaWZ5UmVzb2x2ZU5vZGU6
OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBk
c3QpCi17Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9yLnJlZ2lzdGVyRm9y
KG1faWRlbnQpKSB7Ci0gICAgICAgIGlmIChnZW5lcmF0b3IuaXNMb2NhbENvbnN0YW50KG1faWRl
bnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZW1pdFJlYWRNb2RpZnlBc3NpZ25tZW50KGdlbmVy
YXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0KSwgbG9jYWwsIG1fcmlnaHQsIG1f
b3BlcmF0b3IsIE9wZXJhbmRUeXBlcyhSZXN1bHRUeXBlOjp1bmtub3duVHlwZSgpLCBtX3JpZ2h0
LT5yZXN1bHREZXNjcmlwdG9yKCkpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYg
KGdlbmVyYXRvci5sZWZ0SGFuZFNpZGVOZWVkc0NvcHkobV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBt
X3JpZ2h0LT5pc1B1cmUoZ2VuZXJhdG9yKSkpIHsKLSAgICAgICAgICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiByZXN1bHQgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgICAgICAgICBnZW5l
cmF0b3IuZW1pdE1vdmUocmVzdWx0LmdldCgpLCBsb2NhbCk7Ci0gICAgICAgICAgICBlbWl0UmVh
ZE1vZGlmeUFzc2lnbm1lbnQoZ2VuZXJhdG9yLCByZXN1bHQuZ2V0KCksIHJlc3VsdC5nZXQoKSwg
bV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBl
KCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwotICAgICAgICAgICAgZ2VuZXJhdG9y
LmVtaXRNb3ZlKGxvY2FsLCByZXN1bHQuZ2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIGdlbmVy
YXRvci5tb3ZlVG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0LmdldCgpKTsKLSAgICAg
ICAgfQotICAgICAgICAKLSAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1pdFJlYWRNb2Rp
ZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgbG9jYWwsIGxvY2FsLCBtX3JpZ2h0LCBtX29wZXJhdG9y
LCBPcGVyYW5kVHlwZXMoUmVzdWx0VHlwZTo6dW5rbm93blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0
RGVzY3JpcHRvcigpKSk7Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRp
b25JZk5lZWRlZChkc3QsIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgaW50IGluZGV4ID0gMDsKLSAg
ICBzaXplX3QgZGVwdGggPSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAg
IGlmIChnZW5lcmF0b3IuZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwg
dHJ1ZSwgZ2xvYmFsT2JqZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkpIHsK
LSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNyYzEgPSBnZW5lcmF0b3IuZW1pdEdldFNjb3Bl
ZFZhcihnZW5lcmF0b3IudGVtcERlc3RpbmF0aW9uKGRzdCksIGRlcHRoLCBpbmRleCwgZ2xvYmFs
T2JqZWN0KTsKLSAgICAgICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1pdFJlYWRNb2RpZnlBc3Np
Z25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCBzcmMxLmdl
dCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3BlcmFuZFR5cGVzKFJlc3Vs
dFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2NyaXB0b3IoKSkpOwotICAg
ICAgICBnZW5lcmF0b3IuZW1pdFB1dFNjb3BlZFZhcihkZXB0aCwgaW5kZXgsIHJlc3VsdCwgZ2xv
YmFsT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBSZWZQdHI8
UmVnaXN0ZXJJRD4gc3JjMSA9IGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KTsKLSAgICBn
ZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCkgLSBzdGFydE9mZnNldCgpICsgbV9p
ZGVudC5zaXplKCksIG1faWRlbnQuc2l6ZSgpLCAwKTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4g
YmFzZSA9IGdlbmVyYXRvci5lbWl0UmVzb2x2ZVdpdGhCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3Jh
cnkoKSwgc3JjMS5nZXQoKSwgbV9pZGVudCk7Ci0gICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gZW1p
dFJlYWRNb2RpZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRp
b24oZHN0LCBzcmMxLmdldCgpKSwgc3JjMS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3Bl
cmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2Ny
aXB0b3IoKSksIHRoaXMpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5n
ZXQoKSwgbV9pZGVudCwgcmVzdWx0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIEFzc2lnblJlc29sdmVOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLVJlZ2lzdGVySUQqIEFzc2lnblJlc29sdmVOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNv
ZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmIChSZWdp
c3RlcklEKiBsb2NhbCA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihtX2lkZW50KSkgewotICAgICAg
ICBpZiAoZ2VuZXJhdG9yLmlzTG9jYWxDb25zdGFudChtX2lkZW50KSkKLSAgICAgICAgICAgIHJl
dHVybiBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3JpZ2h0KTsKLSAgICAgICAgCi0gICAgICAg
IFJlZ2lzdGVySUQqIHJlc3VsdCA9IGdlbmVyYXRvci5lbWl0Tm9kZShsb2NhbCwgbV9yaWdodCk7
Ci0gICAgICAgIHJldHVybiBnZW5lcmF0b3IubW92ZVRvRGVzdGluYXRpb25JZk5lZWRlZChkc3Qs
IHJlc3VsdCk7Ci0gICAgfQotCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBzaXplX3QgZGVwdGgg
PSAwOwotICAgIEpTT2JqZWN0KiBnbG9iYWxPYmplY3QgPSAwOwotICAgIGlmIChnZW5lcmF0b3Iu
ZmluZFNjb3BlZFByb3BlcnR5KG1faWRlbnQsIGluZGV4LCBkZXB0aCwgdHJ1ZSwgZ2xvYmFsT2Jq
ZWN0KSAmJiBpbmRleCAhPSBtaXNzaW5nU3ltYm9sTWFya2VyKCkpIHsKLSAgICAgICAgaWYgKGRz
dCA9PSBnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpKQotICAgICAgICAgICAgZHN0ID0gMDsKLSAg
ICAgICAgUmVnaXN0ZXJJRCogdmFsdWUgPSBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3JpZ2h0
KTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRQdXRTY29wZWRWYXIoZGVwdGgsIGluZGV4LCB2YWx1
ZSwgZ2xvYmFsT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIFJl
ZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRSZXNvbHZlQmFzZShnZW5lcmF0
b3IubmV3VGVtcG9yYXJ5KCksIG1faWRlbnQpOwotICAgIGlmIChkc3QgPT0gZ2VuZXJhdG9yLmln
bm9yZWRSZXN1bHQoKSkKLSAgICAgICAgZHN0ID0gMDsKLSAgICBSZWdpc3RlcklEKiB2YWx1ZSA9
IGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fcmlnaHQpOwotICAgIGdlbmVyYXRvci5lbWl0RXhw
cmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRPZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIHJl
dHVybiBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgdmFsdWUpOwot
fQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXNzaWduRG90Tm9kZSAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBBc3NpZ25Eb3RO
b2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJ
RCogZHN0KQotewotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLmVtaXRO
b2RlRm9yTGVmdEhhbmRTaWRlKG1fYmFzZSwgbV9yaWdodEhhc0Fzc2lnbm1lbnRzLCBtX3JpZ2h0
LT5pc1B1cmUoZ2VuZXJhdG9yKSk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gZ2Vu
ZXJhdG9yLmRlc3RpbmF0aW9uRm9yQXNzaWduUmVzdWx0KGRzdCk7Ci0gICAgUmVnaXN0ZXJJRCog
cmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKHZhbHVlLmdldCgpLCBtX3JpZ2h0KTsKLSAgICBn
ZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zmc2V0KCksIGVuZE9m
ZnNldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwg
cmVzdWx0KTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLm1vdmVUb0Rlc3RpbmF0aW9uSWZOZWVkZWQo
ZHN0LCByZXN1bHQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVh
ZE1vZGlmeURvdE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVn
aXN0ZXJJRCogUmVhZE1vZGlmeURvdE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRv
ciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IGJhc2UgPSBnZW5lcmF0b3IuZW1pdE5vZGVGb3JMZWZ0SGFuZFNpZGUobV9iYXNlLCBtX3JpZ2h0
SGFzQXNzaWdubWVudHMsIG1fcmlnaHQtPmlzUHVyZShnZW5lcmF0b3IpKTsKLQotICAgIGdlbmVy
YXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSAtIG1fc3ViZXhwcmVzc2lvbkRpdm90T2Zm
c2V0LCBzdGFydE9mZnNldCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZzZXQsIG1fc3ViZXhw
cmVzc2lvbkVuZE9mZnNldCk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHZhbHVlID0gZ2VuZXJh
dG9yLmVtaXRHZXRCeUlkKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQo
KSwgbV9pZGVudCk7Ci0gICAgUmVnaXN0ZXJJRCogdXBkYXRlZFZhbHVlID0gZW1pdFJlYWRNb2Rp
ZnlBc3NpZ25tZW50KGdlbmVyYXRvciwgZ2VuZXJhdG9yLmZpbmFsRGVzdGluYXRpb24oZHN0LCB2
YWx1ZS5nZXQoKSksIHZhbHVlLmdldCgpLCBtX3JpZ2h0LCBtX29wZXJhdG9yLCBPcGVyYW5kVHlw
ZXMoUmVzdWx0VHlwZTo6dW5rbm93blR5cGUoKSwgbV9yaWdodC0+cmVzdWx0RGVzY3JpcHRvcigp
KSk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCksIHN0YXJ0T2Zm
c2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmVtaXRQdXRCeUlkKGJh
c2UuZ2V0KCksIG1faWRlbnQsIHVwZGF0ZWRWYWx1ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBBc3NpZ25FcnJvck5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogQXNzaWduRXJyb3JOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCopCi17Ci0gICAgcmV0dXJu
IGVtaXRUaHJvd0Vycm9yKGdlbmVyYXRvciwgUmVmZXJlbmNlRXJyb3IsICJMZWZ0IHNpZGUgb2Yg
YXNzaWdubWVudCBpcyBub3QgYSByZWZlcmVuY2UuIik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBBc3NpZ25CcmFja2V0Tm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBBc3NpZ25CcmFja2V0Tm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAg
ICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9kZUZvckxlZnRIYW5k
U2lkZShtX2Jhc2UsIG1fc3Vic2NyaXB0SGFzQXNzaWdubWVudHMgfHwgbV9yaWdodEhhc0Fzc2ln
bm1lbnRzLCBtX3N1YnNjcmlwdC0+aXNQdXJlKGdlbmVyYXRvcikgJiYgbV9yaWdodC0+aXNQdXJl
KGdlbmVyYXRvcikpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm9wZXJ0eSA9IGdlbmVyYXRv
ci5lbWl0Tm9kZUZvckxlZnRIYW5kU2lkZShtX3N1YnNjcmlwdCwgbV9yaWdodEhhc0Fzc2lnbm1l
bnRzLCBtX3JpZ2h0LT5pc1B1cmUoZ2VuZXJhdG9yKSk7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+
IHZhbHVlID0gZ2VuZXJhdG9yLmRlc3RpbmF0aW9uRm9yQXNzaWduUmVzdWx0KGRzdCk7Ci0gICAg
UmVnaXN0ZXJJRCogcmVzdWx0ID0gZ2VuZXJhdG9yLmVtaXROb2RlKHZhbHVlLmdldCgpLCBtX3Jp
Z2h0KTsKLQotICAgIGdlbmVyYXRvci5lbWl0RXhwcmVzc2lvbkluZm8oZGl2b3QoKSwgc3RhcnRP
ZmZzZXQoKSwgZW5kT2Zmc2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0UHV0QnlWYWwoYmFzZS5n
ZXQoKSwgcHJvcGVydHkuZ2V0KCksIHJlc3VsdCk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5tb3Zl
VG9EZXN0aW5hdGlvbklmTmVlZGVkKGRzdCwgcmVzdWx0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tIFJlYWRNb2RpZnlCcmFja2V0Tm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBSZWFkTW9kaWZ5QnJhY2tldE5vZGU6
OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBk
c3QpCi17Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGJhc2UgPSBnZW5lcmF0b3IuZW1pdE5vZGVG
b3JMZWZ0SGFuZFNpZGUobV9iYXNlLCBtX3N1YnNjcmlwdEhhc0Fzc2lnbm1lbnRzIHx8IG1fcmln
aHRIYXNBc3NpZ25tZW50cywgbV9zdWJzY3JpcHQtPmlzUHVyZShnZW5lcmF0b3IpICYmIG1fcmln
aHQtPmlzUHVyZShnZW5lcmF0b3IpKTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gcHJvcGVydHkg
PSBnZW5lcmF0b3IuZW1pdE5vZGVGb3JMZWZ0SGFuZFNpZGUobV9zdWJzY3JpcHQsIG1fcmlnaHRI
YXNBc3NpZ25tZW50cywgbV9yaWdodC0+aXNQdXJlKGdlbmVyYXRvcikpOwotCi0gICAgZ2VuZXJh
dG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpIC0gbV9zdWJleHByZXNzaW9uRGl2b3RPZmZz
ZXQsIHN0YXJ0T2Zmc2V0KCkgLSBtX3N1YmV4cHJlc3Npb25EaXZvdE9mZnNldCwgbV9zdWJleHBy
ZXNzaW9uRW5kT2Zmc2V0KTsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gdmFsdWUgPSBnZW5lcmF0
b3IuZW1pdEdldEJ5VmFsKGdlbmVyYXRvci50ZW1wRGVzdGluYXRpb24oZHN0KSwgYmFzZS5nZXQo
KSwgcHJvcGVydHkuZ2V0KCkpOwotICAgIFJlZ2lzdGVySUQqIHVwZGF0ZWRWYWx1ZSA9IGVtaXRS
ZWFkTW9kaWZ5QXNzaWdubWVudChnZW5lcmF0b3IsIGdlbmVyYXRvci5maW5hbERlc3RpbmF0aW9u
KGRzdCwgdmFsdWUuZ2V0KCkpLCB2YWx1ZS5nZXQoKSwgbV9yaWdodCwgbV9vcGVyYXRvciwgT3Bl
cmFuZFR5cGVzKFJlc3VsdFR5cGU6OnVua25vd25UeXBlKCksIG1fcmlnaHQtPnJlc3VsdERlc2Ny
aXB0b3IoKSkpOwotCi0gICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBz
dGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRQdXRCeVZhbChi
YXNlLmdldCgpLCBwcm9wZXJ0eS5nZXQoKSwgdXBkYXRlZFZhbHVlKTsKLQotICAgIHJldHVybiB1
cGRhdGVkVmFsdWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21t
YU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQq
IENvbW1hTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJl
Z2lzdGVySUQqIGRzdCkKLXsKLSAgICBBU1NFUlQobV9leHByZXNzaW9ucy5zaXplKCkgPiAxKTsK
LSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fZXhwcmVzc2lvbnMuc2l6ZSgpIC0gMTsgaSsr
KQotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSwg
bV9leHByZXNzaW9uc1tpXSk7Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1f
ZXhwcmVzc2lvbnMubGFzdCgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIENvbnN0RGVjbE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0K
LVJlZ2lzdGVySUQqIENvbnN0RGVjbE5vZGU6OmVtaXRDb2RlU2luZ2xlKEJ5dGVjb2RlR2VuZXJh
dG9yJiBnZW5lcmF0b3IpCi17Ci0gICAgaWYgKFJlZ2lzdGVySUQqIGxvY2FsID0gZ2VuZXJhdG9y
LmNvbnN0UmVnaXN0ZXJGb3IobV9pZGVudCkpIHsKLSAgICAgICAgaWYgKCFtX2luaXQpCi0gICAg
ICAgICAgICByZXR1cm4gbG9jYWw7Ci0KLSAgICAgICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9k
ZShsb2NhbCwgbV9pbml0KTsKLSAgICB9Ci0KLSAgICBpZiAoZ2VuZXJhdG9yLmNvZGVUeXBlKCkg
IT0gRXZhbENvZGUpIHsKLSAgICAgICAgaWYgKG1faW5pdCkKLSAgICAgICAgICAgIHJldHVybiBn
ZW5lcmF0b3IuZW1pdE5vZGUobV9pbml0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0
dXJuIGdlbmVyYXRvci5lbWl0UmVzb2x2ZShnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCksIG1faWRl
bnQpOwotICAgIH0KLSAgICAvLyBGSVhNRTogV2hpbGUgdGhpcyBjb2RlIHNob3VsZCBvbmx5IGJl
IGhpdCBpbiBldmFsIGNvZGUsIGl0IHdpbGwgcG90ZW50aWFsbHkKLSAgICAvLyBhc3NpZ24gdG8g
dGhlIHdyb25nIGJhc2UgaWYgbV9pZGVudCBleGlzdHMgaW4gYW4gaW50ZXJ2ZW5pbmcgZHluYW1p
YyBzY29wZS4KLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0UmVz
b2x2ZUJhc2UoZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCBtX2lkZW50KTsKLSAgICBSZWdpc3Rl
cklEKiB2YWx1ZSA9IG1faW5pdCA/IGdlbmVyYXRvci5lbWl0Tm9kZShtX2luaXQpIDogZ2VuZXJh
dG9yLmVtaXRMb2FkKDAsIGpzVW5kZWZpbmVkKCkpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1p
dFB1dEJ5SWQoYmFzZS5nZXQoKSwgbV9pZGVudCwgdmFsdWUpOwotfQotCi1SZWdpc3RlcklEKiBD
b25zdERlY2xOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwg
UmVnaXN0ZXJJRCopCi17Ci0gICAgUmVnaXN0ZXJJRCogcmVzdWx0ID0gMDsKLSAgICBmb3IgKENv
bnN0RGVjbE5vZGUqIG4gPSB0aGlzOyBuOyBuID0gbi0+bV9uZXh0KQotICAgICAgICByZXN1bHQg
PSBuLT5lbWl0Q29kZVNpbmdsZShnZW5lcmF0b3IpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnN0U3RhdGVtZW50Tm9kZSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBDb25zdFN0YXRlbWVu
dE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3Rl
cklEKikKLXsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVu
dCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdE5v
ZGUobV9uZXh0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNvdXJj
ZUVsZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIHZvaWQg
U291cmNlRWxlbWVudHM6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9y
LCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgc2l6ZV90IHNpemUgPSBtX3N0YXRlbWVudHMuc2l6
ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAgICAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudHNbaV0pOwotfQotCi0vLyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0gQmxvY2tOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLQotCi1pbmxpbmUgU3RhdGVtZW50Tm9kZSogQmxvY2tOb2RlOjpsYXN0U3RhdGVt
ZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9zdGF0ZW1lbnRzID8gbV9zdGF0ZW1lbnRzLT5s
YXN0U3RhdGVtZW50KCkgOiAwOwotfQotCi1SZWdpc3RlcklEKiBCbG9ja05vZGU6OmVtaXRCeXRl
Y29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0g
ICAgaWYgKG1fc3RhdGVtZW50cykKLSAgICAgICAgbV9zdGF0ZW1lbnRzLT5lbWl0Qnl0ZWNvZGUo
Z2VuZXJhdG9yLCBkc3QpOwotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gRW1wdHlTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1SZWdpc3RlcklEKiBFbXB0eVN0YXRlbWVudE5vZGU6OmVtaXRCeXRlY29kZShCeXRl
Y29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgZ2VuZXJh
dG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0
TGluZSgpKTsKLSAgICByZXR1cm4gZHN0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0gRGVidWdnZXJTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LQotCi1SZWdpc3RlcklEKiBEZWJ1Z2dlclN0YXRlbWVudE5vZGU6OmVtaXRCeXRlY29kZShCeXRl
Y29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgZ2VuZXJh
dG9yLmVtaXREZWJ1Z0hvb2soRGlkUmVhY2hCcmVha3BvaW50LCBmaXJzdExpbmUoKSwgbGFzdExp
bmUoKSk7Ci0gICAgcmV0dXJuIGRzdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tIEV4cHJTdGF0ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQot
UmVnaXN0ZXJJRCogRXhwclN0YXRlbWVudE5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgQVNTRVJUKG1fZXhwcik7
Ci0gICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0
TGluZSgpLCBsYXN0TGluZSgpKTsgCi0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShkc3Qs
IG1fZXhwcik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWYXJTdGF0
ZW1lbnROb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogVmFy
U3RhdGVtZW50Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3Is
IFJlZ2lzdGVySUQqKQotewotICAgIEFTU0VSVChtX2V4cHIpOwotICAgIGdlbmVyYXRvci5lbWl0
RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7
Ci0gICAgcmV0dXJuIGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIpOwotfQotCi0vLyAtLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSWZOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBJZk5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29k
ZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgZ2VuZXJhdG9y
LmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGlu
ZSgpKTsKLSAgICAKLSAgICBSZWZQdHI8TGFiZWw+IGFmdGVyVGhlbiA9IGdlbmVyYXRvci5uZXdM
YWJlbCgpOwotCi0gICAgaWYgKG1fY29uZGl0aW9uLT5oYXNDb25kaXRpb25Db250ZXh0Q29kZWdl
bigpKSB7Ci0gICAgICAgIFJlZlB0cjxMYWJlbD4gYmVmb3JlVGhlbiA9IGdlbmVyYXRvci5uZXdM
YWJlbCgpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRpdGlvbkNvbnRleHQobV9j
b25kaXRpb24sIGJlZm9yZVRoZW4uZ2V0KCksIGFmdGVyVGhlbi5nZXQoKSwgdHJ1ZSk7Ci0gICAg
ICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoYmVmb3JlVGhlbi5nZXQoKSk7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgUmVnaXN0ZXJJRCogY29uZCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2NvbmRpdGlv
bik7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElmRmFsc2UoY29uZCwgYWZ0ZXJUaGVuLmdl
dCgpKTsKLSAgICB9Ci0KLSAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX2lmQmxvY2spOwot
ICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoYWZ0ZXJUaGVuLmdldCgpKTsKLQotICAgIC8vIEZJWE1F
OiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIGxhc3Qgc3RhdGVtZW50IGV4ZWN1dGVkIHNvIHRoYXQg
aXQgY2FuIGJlIHJldHVybmVkIGFzIGEgQ29tcGxldGlvbi4KLSAgICByZXR1cm4gMDsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIElmRWxzZU5vZGUgLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIElmRWxzZU5vZGU6OmVt
aXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3Qp
Ci17Ci0gICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZp
cnN0TGluZSgpLCBsYXN0TGluZSgpKTsKLSAgICAKLSAgICBSZWZQdHI8TGFiZWw+IGJlZm9yZUVs
c2UgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICBSZWZQdHI8TGFiZWw+IGFmdGVyRWxzZSA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotCi0gICAgaWYgKG1fY29uZGl0aW9uLT5oYXNDb25kaXRp
b25Db250ZXh0Q29kZWdlbigpKSB7Ci0gICAgICAgIFJlZlB0cjxMYWJlbD4gYmVmb3JlVGhlbiA9
IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRp
dGlvbkNvbnRleHQobV9jb25kaXRpb24sIGJlZm9yZVRoZW4uZ2V0KCksIGJlZm9yZUVsc2UuZ2V0
KCksIHRydWUpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGJlZm9yZVRoZW4uZ2V0KCkp
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGNvbmQgPSBnZW5lcmF0b3IuZW1p
dE5vZGUobV9jb25kaXRpb24pOwotICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXBJZkZhbHNlKGNv
bmQsIGJlZm9yZUVsc2UuZ2V0KCkpOwotICAgIH0KLQotICAgIGdlbmVyYXRvci5lbWl0Tm9kZShk
c3QsIG1faWZCbG9jayk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGFmdGVyRWxzZS5nZXQoKSk7
Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGJlZm9yZUVsc2UuZ2V0KCkpOwotCi0gICAgZ2Vu
ZXJhdG9yLmVtaXROb2RlKGRzdCwgbV9lbHNlQmxvY2spOwotCi0gICAgZ2VuZXJhdG9yLmVtaXRM
YWJlbChhZnRlckVsc2UuZ2V0KCkpOwotCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHJldHVy
biB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQgc28gdGhhdCBpdCBjYW4gYmUgcmV0dXJuZWQg
YXMgYSBDb21wbGV0aW9uLgotICAgIHJldHVybiAwOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0gRG9XaGlsZU5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotCi1SZWdpc3RlcklEKiBEb1doaWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2Vu
ZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBSZWZQdHI8TGFiZWxT
Y29wZT4gc2NvcGUgPSBnZW5lcmF0b3IubmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsK
LQotICAgIFJlZlB0cjxMYWJlbD4gdG9wT2ZMb29wID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0g
ICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0b3BPZkxvb3AuZ2V0KCkpOwotCi0gICAgZ2VuZXJhdG9y
LmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGlu
ZSgpKTsKLSAgIAotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBnZW5lcmF0b3IuZW1p
dE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3Bl
LT5jb250aW51ZVRhcmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhl
Y3V0ZVN0YXRlbWVudCwgbV9leHByLT5saW5lTm8oKSwgbV9leHByLT5saW5lTm8oKSk7Ci0gICAg
aWYgKG1fZXhwci0+aGFzQ29uZGl0aW9uQ29udGV4dENvZGVnZW4oKSkKLSAgICAgICAgZ2VuZXJh
dG9yLmVtaXROb2RlSW5Db25kaXRpb25Db250ZXh0KG1fZXhwciwgdG9wT2ZMb29wLmdldCgpLCBz
Y29wZS0+YnJlYWtUYXJnZXQoKSwgZmFsc2UpOwotICAgIGVsc2UgewotICAgICAgICBSZWdpc3Rl
cklEKiBjb25kID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7Ci0gICAgICAgIGdlbmVyYXRv
ci5lbWl0SnVtcElmVHJ1ZShjb25kLCB0b3BPZkxvb3AuZ2V0KCkpOwotICAgIH0KLQotICAgIGdl
bmVyYXRvci5lbWl0TGFiZWwoc2NvcGUtPmJyZWFrVGFyZ2V0KCkpOwotICAgIHJldHVybiByZXN1
bHQuZ2V0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXaGlsZU5v
ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFdo
aWxlTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lz
dGVySUQqIGRzdCkKLXsKLSAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0b3Iu
bmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsKLQotICAgIGdlbmVyYXRvci5lbWl0SnVt
cChzY29wZS0+Y29udGludWVUYXJnZXQoKSk7Ci0KLSAgICBSZWZQdHI8TGFiZWw+IHRvcE9mTG9v
cCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9wT2ZM
b29wLmdldCgpKTsKLSAgICAKLSAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVu
dCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsK
LSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgbV9leHBy
LT5saW5lTm8oKSwgbV9leHByLT5saW5lTm8oKSk7Ci0KLSAgICBpZiAobV9leHByLT5oYXNDb25k
aXRpb25Db250ZXh0Q29kZWdlbigpKQotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRp
dGlvbkNvbnRleHQobV9leHByLCB0b3BPZkxvb3AuZ2V0KCksIHNjb3BlLT5icmVha1RhcmdldCgp
LCBmYWxzZSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIFJlZ2lzdGVySUQqIGNvbmQgPSBnZW5lcmF0
b3IuZW1pdE5vZGUobV9leHByKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZUcnVlKGNv
bmQsIHRvcE9mTG9vcC5nZXQoKSk7Ci0gICAgfQotCi0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChz
Y29wZS0+YnJlYWtUYXJnZXQoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHJl
dHVybiB0aGUgbGFzdCBzdGF0ZW1lbnQgZXhlY3V0ZWQgc28gdGhhdCBpdCBjYW4gYmUgcmV0dXJu
ZWQgYXMgYSBDb21wbGV0aW9uCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLSBGb3JOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0KLVJlZ2lzdGVySUQqIEZvck5vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVy
YXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgUmVmUHRyPExhYmVsU2Nv
cGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TG9vcCk7Ci0K
LSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RM
aW5lKCksIGxhc3RMaW5lKCkpOwotCi0gICAgaWYgKG1fZXhwcjEpCi0gICAgICAgIGdlbmVyYXRv
ci5lbWl0Tm9kZShnZW5lcmF0b3IuaWdub3JlZFJlc3VsdCgpLCBtX2V4cHIxKTsKLQotICAgIFJl
ZlB0cjxMYWJlbD4gY29uZGl0aW9uID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgZ2VuZXJh
dG9yLmVtaXRKdW1wKGNvbmRpdGlvbi5nZXQoKSk7Ci0KLSAgICBSZWZQdHI8TGFiZWw+IHRvcE9m
TG9vcCA9IGdlbmVyYXRvci5uZXdMYWJlbCgpOwotICAgIGdlbmVyYXRvci5lbWl0TGFiZWwodG9w
T2ZMb29wLmdldCgpKTsKLQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByZXN1bHQgPSBnZW5lcmF0
b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVs
KHNjb3BlLT5jb250aW51ZVRhcmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhX
aWxsRXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwotICAgIGlmICht
X2V4cHIzKQotICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1
bHQoKSwgbV9leHByMyk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGNvbmRpdGlvbi5nZXQo
KSk7Ci0gICAgaWYgKG1fZXhwcjIpIHsKLSAgICAgICAgaWYgKG1fZXhwcjItPmhhc0NvbmRpdGlv
bkNvbnRleHRDb2RlZ2VuKCkpCi0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGVJbkNvbmRp
dGlvbkNvbnRleHQobV9leHByMiwgdG9wT2ZMb29wLmdldCgpLCBzY29wZS0+YnJlYWtUYXJnZXQo
KSwgZmFsc2UpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFJlZ2lzdGVySUQqIGNvbmQg
PSBnZW5lcmF0b3IuZW1pdE5vZGUobV9leHByMik7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1p
dEp1bXBJZlRydWUoY29uZCwgdG9wT2ZMb29wLmdldCgpKTsKLSAgICAgICAgfQotICAgIH0gZWxz
ZQotICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXAodG9wT2ZMb29wLmdldCgpKTsKLQotICAgIGdl
bmVyYXRvci5lbWl0TGFiZWwoc2NvcGUtPmJyZWFrVGFyZ2V0KCkpOwotICAgIHJldHVybiByZXN1
bHQuZ2V0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGb3JJbk5v
ZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIEZv
ckluTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lz
dGVySUQqIGRzdCkKLXsKLSAgICBSZWZQdHI8TGFiZWxTY29wZT4gc2NvcGUgPSBnZW5lcmF0b3Iu
bmV3TGFiZWxTY29wZShMYWJlbFNjb3BlOjpMb29wKTsKLQotICAgIGlmICghbV9sZXhwci0+aXNM
b2NhdGlvbigpKQotICAgICAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBSZWZl
cmVuY2VFcnJvciwgIkxlZnQgc2lkZSBvZiBmb3ItaW4gc3RhdGVtZW50IGlzIG5vdCBhIHJlZmVy
ZW5jZS4iKTsKLQotICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVt
ZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7Ci0KLSAgICBpZiAobV9pbml0KQotICAgICAg
ICBnZW5lcmF0b3IuZW1pdE5vZGUoZ2VuZXJhdG9yLmlnbm9yZWRSZXN1bHQoKSwgbV9pbml0KTsK
LQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBiYXNlID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgp
OwotICAgIGdlbmVyYXRvci5lbWl0Tm9kZShiYXNlLmdldCgpLCBtX2V4cHIpOwotICAgIFJlZlB0
cjxSZWdpc3RlcklEPiBpID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwotICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBzaXplID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwotICAgIFJlZlB0cjxS
ZWdpc3RlcklEPiBleHBlY3RlZFN1YnNjcmlwdDsKLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gaXRl
ciA9IGdlbmVyYXRvci5lbWl0R2V0UHJvcGVydHlOYW1lcyhnZW5lcmF0b3IubmV3VGVtcG9yYXJ5
KCksIGJhc2UuZ2V0KCksIGkuZ2V0KCksIHNpemUuZ2V0KCksIHNjb3BlLT5icmVha1RhcmdldCgp
KTsKLSAgICBnZW5lcmF0b3IuZW1pdEp1bXAoc2NvcGUtPmNvbnRpbnVlVGFyZ2V0KCkpOwotCi0g
ICAgUmVmUHRyPExhYmVsPiBsb29wU3RhcnQgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICBn
ZW5lcmF0b3IuZW1pdExhYmVsKGxvb3BTdGFydC5nZXQoKSk7Ci0KLSAgICBSZWdpc3RlcklEKiBw
cm9wZXJ0eU5hbWU7Ci0gICAgYm9vbCBvcHRpbWl6ZWRGb3JpbkFjY2VzcyA9IGZhbHNlOwotICAg
IGlmIChtX2xleHByLT5pc1Jlc29sdmVOb2RlKCkpIHsKLSAgICAgICAgY29uc3QgSWRlbnRpZmll
ciYgaWRlbnQgPSBzdGF0aWNfY2FzdDxSZXNvbHZlTm9kZSo+KG1fbGV4cHIpLT5pZGVudGlmaWVy
KCk7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9IGdlbmVyYXRvci5yZWdpc3RlckZvcihpZGVudCk7
Ci0gICAgICAgIGlmICghcHJvcGVydHlOYW1lKSB7Ci0gICAgICAgICAgICBwcm9wZXJ0eU5hbWUg
PSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJ
RD4gcHJvdGVjdCA9IHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgIFJlZ2lzdGVySUQqIGJhc2Ug
PSBnZW5lcmF0b3IuZW1pdFJlc29sdmVCYXNlKGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKSwgaWRl
bnQpOwotCi0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdEV4cHJlc3Npb25JbmZvKGRpdm90KCks
IHN0YXJ0T2Zmc2V0KCksIGVuZE9mZnNldCgpKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0
UHV0QnlJZChiYXNlLCBpZGVudCwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgIGV4cGVjdGVkU3Vic2NyaXB0ID0gZ2VuZXJhdG9yLmVtaXRNb3ZlKGdlbmVyYXRv
ci5uZXdUZW1wb3JhcnkoKSwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5w
dXNoT3B0aW1pc2VkRm9ySW4oZXhwZWN0ZWRTdWJzY3JpcHQuZ2V0KCksIGl0ZXIuZ2V0KCksIGku
Z2V0KCksIHByb3BlcnR5TmFtZSk7Ci0gICAgICAgICAgICBvcHRpbWl6ZWRGb3JpbkFjY2VzcyA9
IHRydWU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fbGV4cHItPmlzRG90QWNjZXNzb3JO
b2RlKCkpIHsKLSAgICAgICAgRG90QWNjZXNzb3JOb2RlKiBhc3NpZ25Ob2RlID0gc3RhdGljX2Nh
c3Q8RG90QWNjZXNzb3JOb2RlKj4obV9sZXhwcik7Ci0gICAgICAgIGNvbnN0IElkZW50aWZpZXIm
IGlkZW50ID0gYXNzaWduTm9kZS0+aWRlbnRpZmllcigpOwotICAgICAgICBwcm9wZXJ0eU5hbWUg
PSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBw
cm90ZWN0ID0gcHJvcGVydHlOYW1lOwotICAgICAgICBSZWdpc3RlcklEKiBiYXNlID0gZ2VuZXJh
dG9yLmVtaXROb2RlKGFzc2lnbk5vZGUtPmJhc2UoKSk7Ci0KLSAgICAgICAgZ2VuZXJhdG9yLmVt
aXRFeHByZXNzaW9uSW5mbyhhc3NpZ25Ob2RlLT5kaXZvdCgpLCBhc3NpZ25Ob2RlLT5zdGFydE9m
ZnNldCgpLCBhc3NpZ25Ob2RlLT5lbmRPZmZzZXQoKSk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0
UHV0QnlJZChiYXNlLCBpZGVudCwgcHJvcGVydHlOYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICBBU1NFUlQobV9sZXhwci0+aXNCcmFja2V0QWNjZXNzb3JOb2RlKCkpOwotICAgICAgICBCcmFj
a2V0QWNjZXNzb3JOb2RlKiBhc3NpZ25Ob2RlID0gc3RhdGljX2Nhc3Q8QnJhY2tldEFjY2Vzc29y
Tm9kZSo+KG1fbGV4cHIpOwotICAgICAgICBwcm9wZXJ0eU5hbWUgPSBnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCk7Ci0gICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBwcm90ZWN0ID0gcHJvcGVydHlO
YW1lOwotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gYmFzZSA9IGdlbmVyYXRvci5lbWl0Tm9k
ZShhc3NpZ25Ob2RlLT5iYXNlKCkpOwotICAgICAgICBSZWdpc3RlcklEKiBzdWJzY3JpcHQgPSBn
ZW5lcmF0b3IuZW1pdE5vZGUoYXNzaWduTm9kZS0+c3Vic2NyaXB0KCkpOwotICAgICAgICAKLSAg
ICAgICAgZ2VuZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhhc3NpZ25Ob2RlLT5kaXZvdCgpLCBh
c3NpZ25Ob2RlLT5zdGFydE9mZnNldCgpLCBhc3NpZ25Ob2RlLT5lbmRPZmZzZXQoKSk7Ci0gICAg
ICAgIGdlbmVyYXRvci5lbWl0UHV0QnlWYWwoYmFzZS5nZXQoKSwgc3Vic2NyaXB0LCBwcm9wZXJ0
eU5hbWUpOwotICAgIH0gICAKLQotICAgIGdlbmVyYXRvci5lbWl0Tm9kZShkc3QsIG1fc3RhdGVt
ZW50KTsKLQotICAgIGlmIChvcHRpbWl6ZWRGb3JpbkFjY2VzcykKLSAgICAgICAgZ2VuZXJhdG9y
LnBvcE9wdGltaXNlZEZvckluKCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5j
b250aW51ZVRhcmdldCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdE5leHRQcm9wZXJ0eU5hbWUocHJv
cGVydHlOYW1lLCBiYXNlLmdldCgpLCBpLmdldCgpLCBzaXplLmdldCgpLCBpdGVyLmdldCgpLCBs
b29wU3RhcnQuZ2V0KCkpOwotICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRl
U3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRM
YWJlbChzY29wZS0+YnJlYWtUYXJnZXQoKSk7Ci0gICAgcmV0dXJuIGRzdDsKLX0KLQotLy8gLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbnRpbnVlTm9kZSAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRUNNQSAxMi43Ci1SZWdpc3RlcklEKiBDb250aW51ZU5v
ZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklE
KiBkc3QpCi17Ci0gICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1l
bnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKLSAgICAKLSAgICBMYWJlbFNjb3BlKiBzY29w
ZSA9IGdlbmVyYXRvci5jb250aW51ZVRhcmdldChtX2lkZW50KTsKLQotICAgIGlmICghc2NvcGUp
Ci0gICAgICAgIHJldHVybiBtX2lkZW50LmlzRW1wdHkoKQotICAgICAgICAgICAgPyBlbWl0VGhy
b3dFcnJvcihnZW5lcmF0b3IsIFN5bnRheEVycm9yLCAiSW52YWxpZCBjb250aW51ZSBzdGF0ZW1l
bnQuIikKLSAgICAgICAgICAgIDogZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBTeW50YXhFcnJv
ciwgIlVuZGVmaW5lZCBsYWJlbDogJyVzJy4iLCBtX2lkZW50KTsKLQotICAgIGdlbmVyYXRvci5l
bWl0SnVtcFNjb3BlcyhzY29wZS0+Y29udGludWVUYXJnZXQoKSwgc2NvcGUtPnNjb3BlRGVwdGgo
KSk7Ci0gICAgcmV0dXJuIGRzdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIEJyZWFrTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8g
RUNNQSAxMi44Ci1SZWdpc3RlcklEKiBCcmVha05vZGU6OmVtaXRCeXRlY29kZShCeXRlY29kZUdl
bmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAgZ2VuZXJhdG9yLmVt
aXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgp
KTsKLSAgICAKLSAgICBMYWJlbFNjb3BlKiBzY29wZSA9IGdlbmVyYXRvci5icmVha1RhcmdldCht
X2lkZW50KTsKLSAgICAKLSAgICBpZiAoIXNjb3BlKQotICAgICAgICByZXR1cm4gbV9pZGVudC5p
c0VtcHR5KCkKLSAgICAgICAgICAgID8gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBTeW50YXhF
cnJvciwgIkludmFsaWQgYnJlYWsgc3RhdGVtZW50LiIpCi0gICAgICAgICAgICA6IGVtaXRUaHJv
d0Vycm9yKGdlbmVyYXRvciwgU3ludGF4RXJyb3IsICJVbmRlZmluZWQgbGFiZWw6ICclcycuIiwg
bV9pZGVudCk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdEp1bXBTY29wZXMoc2NvcGUtPmJyZWFrVGFy
Z2V0KCksIHNjb3BlLT5zY29wZURlcHRoKCkpOwotICAgIHJldHVybiBkc3Q7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXR1cm5Ob2RlIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFJldHVybk5vZGU6OmVtaXRCeXRlY29k
ZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKiBkc3QpCi17Ci0gICAg
Z2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVTdGF0ZW1lbnQsIGZpcnN0TGluZSgp
LCBsYXN0TGluZSgpKTsKLSAgICBpZiAoZ2VuZXJhdG9yLmNvZGVUeXBlKCkgIT0gRnVuY3Rpb25D
b2RlKQotICAgICAgICByZXR1cm4gZW1pdFRocm93RXJyb3IoZ2VuZXJhdG9yLCBTeW50YXhFcnJv
ciwgIkludmFsaWQgcmV0dXJuIHN0YXRlbWVudC4iKTsKLQotICAgIGlmIChkc3QgPT0gZ2VuZXJh
dG9yLmlnbm9yZWRSZXN1bHQoKSkKLSAgICAgICAgZHN0ID0gMDsKLSAgICBSZWdpc3RlcklEKiBy
MCA9IG1fdmFsdWUgPyBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3ZhbHVlKSA6IGdlbmVyYXRv
ci5lbWl0TG9hZChkc3QsIGpzVW5kZWZpbmVkKCkpOwotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBy
ZXR1cm5SZWdpc3RlcjsKLSAgICBpZiAoZ2VuZXJhdG9yLnNjb3BlRGVwdGgoKSkgewotICAgICAg
ICBSZWZQdHI8TGFiZWw+IGwwID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgICAgIGlmIChn
ZW5lcmF0b3IuaGFzRmluYWxpc2VyKCkgJiYgIXIwLT5pc1RlbXBvcmFyeSgpKSB7Ci0gICAgICAg
ICAgICByZXR1cm5SZWdpc3RlciA9IGdlbmVyYXRvci5lbWl0TW92ZShnZW5lcmF0b3IubmV3VGVt
cG9yYXJ5KCksIHIwKTsKLSAgICAgICAgICAgIHIwID0gcmV0dXJuUmVnaXN0ZXIuZ2V0KCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wU2NvcGVzKGwwLmdldCgpLCAwKTsK
LSAgICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsMC5nZXQoKSk7Ci0gICAgfQotICAgIGdlbmVy
YXRvci5lbWl0RGVidWdIb29rKFdpbGxMZWF2ZUNhbGxGcmFtZSwgZmlyc3RMaW5lKCksIGxhc3RM
aW5lKCkpOwotICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdFJldHVybihyMCk7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBXaXRoTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFdpdGhOb2RlOjplbWl0Qnl0ZWNvZGUo
Qnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGdl
bmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwg
bGFzdExpbmUoKSk7Ci0gICAgCi0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHNjb3BlID0gZ2VuZXJh
dG9yLm5ld1RlbXBvcmFyeSgpOwotICAgIGdlbmVyYXRvci5lbWl0Tm9kZShzY29wZS5nZXQoKSwg
bV9leHByKTsgLy8gc2NvcGUgbXVzdCBiZSBwcm90ZWN0ZWQgdW50aWwgcG9wcGVkCi0gICAgZ2Vu
ZXJhdG9yLmVtaXRFeHByZXNzaW9uSW5mbyhtX2Rpdm90LCBtX2V4cHJlc3Npb25MZW5ndGgsIDAp
OwotICAgIGdlbmVyYXRvci5lbWl0UHVzaFNjb3BlKHNjb3BlLmdldCgpKTsKLSAgICBSZWdpc3Rl
cklEKiByZXN1bHQgPSBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7Ci0gICAg
Z2VuZXJhdG9yLmVtaXRQb3BTY29wZSgpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYXNlQ2xhdXNlTm9kZSAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxpbmUgdm9pZCBDYXNlQ2xhdXNlTm9kZTo6ZW1pdEJ5
dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsK
LSAgICBpZiAobV9zdGF0ZW1lbnRzKQotICAgICAgICBtX3N0YXRlbWVudHMtPmVtaXRCeXRlY29k
ZShnZW5lcmF0b3IsIGRzdCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSBDYXNlQmxvY2tOb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWVudW0g
U3dpdGNoS2luZCB7IAotICAgIFN3aXRjaFVuc2V0ID0gMCwKLSAgICBTd2l0Y2hOdW1iZXIgPSAx
LCAKLSAgICBTd2l0Y2hTdHJpbmcgPSAyLCAKLSAgICBTd2l0Y2hOZWl0aGVyID0gMyAKLX07Ci0K
LXN0YXRpYyB2b2lkIHByb2Nlc3NDbGF1c2VMaXN0KENsYXVzZUxpc3ROb2RlKiBsaXN0LCBWZWN0
b3I8RXhwcmVzc2lvbk5vZGUqLCA4PiYgbGl0ZXJhbFZlY3RvciwgU3dpdGNoS2luZCYgdHlwZUZv
clRhYmxlLCBib29sJiBzaW5nbGVDaGFyYWN0ZXJTd2l0Y2gsIGludDMyX3QmIG1pbl9udW0sIGlu
dDMyX3QmIG1heF9udW0pCi17Ci0gICAgZm9yICg7IGxpc3Q7IGxpc3QgPSBsaXN0LT5nZXROZXh0
KCkpIHsKLSAgICAgICAgRXhwcmVzc2lvbk5vZGUqIGNsYXVzZUV4cHJlc3Npb24gPSBsaXN0LT5n
ZXRDbGF1c2UoKS0+ZXhwcigpOwotICAgICAgICBsaXRlcmFsVmVjdG9yLmFwcGVuZChjbGF1c2VF
eHByZXNzaW9uKTsKLSAgICAgICAgaWYgKGNsYXVzZUV4cHJlc3Npb24tPmlzTnVtYmVyKCkpIHsK
LSAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSA9IHN0YXRpY19jYXN0PE51bWJlck5vZGUqPihjbGF1
c2VFeHByZXNzaW9uKS0+dmFsdWUoKTsKLSAgICAgICAgICAgIGludDMyX3QgaW50VmFsID0gc3Rh
dGljX2Nhc3Q8aW50MzJfdD4odmFsdWUpOwotICAgICAgICAgICAgaWYgKCh0eXBlRm9yVGFibGUg
JiB+U3dpdGNoTnVtYmVyKSB8fCAoaW50VmFsICE9IHZhbHVlKSkgewotICAgICAgICAgICAgICAg
IHR5cGVGb3JUYWJsZSA9IFN3aXRjaE5laXRoZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW50VmFsIDwgbWluX251bSkKLSAgICAgICAg
ICAgICAgICBtaW5fbnVtID0gaW50VmFsOwotICAgICAgICAgICAgaWYgKGludFZhbCA+IG1heF9u
dW0pCi0gICAgICAgICAgICAgICAgbWF4X251bSA9IGludFZhbDsKLSAgICAgICAgICAgIHR5cGVG
b3JUYWJsZSA9IFN3aXRjaE51bWJlcjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9
Ci0gICAgICAgIGlmIChjbGF1c2VFeHByZXNzaW9uLT5pc1N0cmluZygpKSB7Ci0gICAgICAgICAg
ICBpZiAodHlwZUZvclRhYmxlICYgflN3aXRjaFN0cmluZykgewotICAgICAgICAgICAgICAgIHR5
cGVGb3JUYWJsZSA9IFN3aXRjaE5laXRoZXI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBjb25zdCBVU3RyaW5nJiB2YWx1ZSA9IHN0YXRpY19jYXN0
PFN0cmluZ05vZGUqPihjbGF1c2VFeHByZXNzaW9uKS0+dmFsdWUoKS51c3RyaW5nKCk7Ci0gICAg
ICAgICAgICBpZiAoc2luZ2xlQ2hhcmFjdGVyU3dpdGNoICY9IHZhbHVlLnNpemUoKSA9PSAxKSB7
Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBpbnRWYWwgPSB2YWx1ZS5yZXAoKS0+ZGF0YSgpWzBd
OwotICAgICAgICAgICAgICAgIGlmIChpbnRWYWwgPCBtaW5fbnVtKQotICAgICAgICAgICAgICAg
ICAgICBtaW5fbnVtID0gaW50VmFsOwotICAgICAgICAgICAgICAgIGlmIChpbnRWYWwgPiBtYXhf
bnVtKQotICAgICAgICAgICAgICAgICAgICBtYXhfbnVtID0gaW50VmFsOwotICAgICAgICAgICAg
fQotICAgICAgICAgICAgdHlwZUZvclRhYmxlID0gU3dpdGNoU3RyaW5nOwotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdHlwZUZvclRhYmxlID0gU3dpdGNoTmVpdGhl
cjsKLSAgICAgICAgYnJlYWs7ICAgICAgICAKLSAgICB9Ci19Ci0gICAgCi1Td2l0Y2hJbmZvOjpT
d2l0Y2hUeXBlIENhc2VCbG9ja05vZGU6OnRyeU9wdGltaXplZFN3aXRjaChWZWN0b3I8RXhwcmVz
c2lvbk5vZGUqLCA4PiYgbGl0ZXJhbFZlY3RvciwgaW50MzJfdCYgbWluX251bSwgaW50MzJfdCYg
bWF4X251bSkKLXsKLSAgICBTd2l0Y2hLaW5kIHR5cGVGb3JUYWJsZSA9IFN3aXRjaFVuc2V0Owot
ICAgIGJvb2wgc2luZ2xlQ2hhcmFjdGVyU3dpdGNoID0gdHJ1ZTsKLSAgICAKLSAgICBwcm9jZXNz
Q2xhdXNlTGlzdChtX2xpc3QxLCBsaXRlcmFsVmVjdG9yLCB0eXBlRm9yVGFibGUsIHNpbmdsZUNo
YXJhY3RlclN3aXRjaCwgbWluX251bSwgbWF4X251bSk7Ci0gICAgcHJvY2Vzc0NsYXVzZUxpc3Qo
bV9saXN0MiwgbGl0ZXJhbFZlY3RvciwgdHlwZUZvclRhYmxlLCBzaW5nbGVDaGFyYWN0ZXJTd2l0
Y2gsIG1pbl9udW0sIG1heF9udW0pOwotICAgIAotICAgIGlmICh0eXBlRm9yVGFibGUgPT0gU3dp
dGNoVW5zZXQgfHwgdHlwZUZvclRhYmxlID09IFN3aXRjaE5laXRoZXIpCi0gICAgICAgIHJldHVy
biBTd2l0Y2hJbmZvOjpTd2l0Y2hOb25lOwotICAgIAotICAgIGlmICh0eXBlRm9yVGFibGUgPT0g
U3dpdGNoTnVtYmVyKSB7Ci0gICAgICAgIGludDMyX3QgcmFuZ2UgPSBtYXhfbnVtIC0gbWluX251
bTsKLSAgICAgICAgaWYgKG1pbl9udW0gPD0gbWF4X251bSAmJiByYW5nZSA8PSAxMDAwICYmIChy
YW5nZSAvIGxpdGVyYWxWZWN0b3Iuc2l6ZSgpKSA8IDEwKQotICAgICAgICAgICAgcmV0dXJuIFN3
aXRjaEluZm86OlN3aXRjaEltbWVkaWF0ZTsKLSAgICAgICAgcmV0dXJuIFN3aXRjaEluZm86OlN3
aXRjaE5vbmU7Ci0gICAgfSAKLSAgICAKLSAgICBBU1NFUlQodHlwZUZvclRhYmxlID09IFN3aXRj
aFN0cmluZyk7Ci0gICAgCi0gICAgaWYgKHNpbmdsZUNoYXJhY3RlclN3aXRjaCkgewotICAgICAg
ICBpbnQzMl90IHJhbmdlID0gbWF4X251bSAtIG1pbl9udW07Ci0gICAgICAgIGlmIChtaW5fbnVt
IDw9IG1heF9udW0gJiYgcmFuZ2UgPD0gMTAwMCAmJiAocmFuZ2UgLyBsaXRlcmFsVmVjdG9yLnNp
emUoKSkgPCAxMCkKLSAgICAgICAgICAgIHJldHVybiBTd2l0Y2hJbmZvOjpTd2l0Y2hDaGFyYWN0
ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIFN3aXRjaEluZm86OlN3aXRjaFN0cmluZzsKLX0KLQot
UmVnaXN0ZXJJRCogQ2FzZUJsb2NrTm9kZTo6ZW1pdEJ5dGVjb2RlRm9yQmxvY2soQnl0ZWNvZGVH
ZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogc3dpdGNoRXhwcmVzc2lvbiwgUmVnaXN0
ZXJJRCogZHN0KQotewotICAgIFJlZlB0cjxMYWJlbD4gZGVmYXVsdExhYmVsOwotICAgIFZlY3Rv
cjxSZWZQdHI8TGFiZWw+LCA4PiBsYWJlbFZlY3RvcjsKLSAgICBWZWN0b3I8RXhwcmVzc2lvbk5v
ZGUqLCA4PiBsaXRlcmFsVmVjdG9yOwotICAgIGludDMyX3QgbWluX251bSA9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8aW50MzJfdD46Om1heCgpOwotICAgIGludDMyX3QgbWF4X251bSA9IHN0ZDo6bnVt
ZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpOwotICAgIFN3aXRjaEluZm86OlN3aXRjaFR5cGUg
c3dpdGNoVHlwZSA9IHRyeU9wdGltaXplZFN3aXRjaChsaXRlcmFsVmVjdG9yLCBtaW5fbnVtLCBt
YXhfbnVtKTsKLQotICAgIGlmIChzd2l0Y2hUeXBlICE9IFN3aXRjaEluZm86OlN3aXRjaE5vbmUp
IHsKLSAgICAgICAgLy8gUHJlcGFyZSB0aGUgdmFyaW91cyBsYWJlbHMKLSAgICAgICAgZm9yICh1
aW50MzJfdCBpID0gMDsgaSA8IGxpdGVyYWxWZWN0b3Iuc2l6ZSgpOyBpKyspCi0gICAgICAgICAg
ICBsYWJlbFZlY3Rvci5hcHBlbmQoZ2VuZXJhdG9yLm5ld0xhYmVsKCkpOwotICAgICAgICBkZWZh
dWx0TGFiZWwgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICAgICAgZ2VuZXJhdG9yLmJlZ2lu
U3dpdGNoKHN3aXRjaEV4cHJlc3Npb24sIHN3aXRjaFR5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAg
ICAgIC8vIFNldHVwIGp1bXBzCi0gICAgICAgIGZvciAoQ2xhdXNlTGlzdE5vZGUqIGxpc3QgPSBt
X2xpc3QxOyBsaXN0OyBsaXN0ID0gbGlzdC0+Z2V0TmV4dCgpKSB7Ci0gICAgICAgICAgICBSZWZQ
dHI8UmVnaXN0ZXJJRD4gY2xhdXNlVmFsID0gZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpOwotICAg
ICAgICAgICAgZ2VuZXJhdG9yLmVtaXROb2RlKGNsYXVzZVZhbC5nZXQoKSwgbGlzdC0+Z2V0Q2xh
dXNlKCktPmV4cHIoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdEJpbmFyeU9wKG9wX3N0
cmljdGVxLCBjbGF1c2VWYWwuZ2V0KCksIGNsYXVzZVZhbC5nZXQoKSwgc3dpdGNoRXhwcmVzc2lv
biwgT3BlcmFuZFR5cGVzKCkpOwotICAgICAgICAgICAgbGFiZWxWZWN0b3IuYXBwZW5kKGdlbmVy
YXRvci5uZXdMYWJlbCgpKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0SnVtcElmVHJ1ZShj
bGF1c2VWYWwuZ2V0KCksIGxhYmVsVmVjdG9yW2xhYmVsVmVjdG9yLnNpemUoKSAtIDFdLmdldCgp
KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgZm9yIChDbGF1c2VMaXN0Tm9kZSogbGlz
dCA9IG1fbGlzdDI7IGxpc3Q7IGxpc3QgPSBsaXN0LT5nZXROZXh0KCkpIHsKLSAgICAgICAgICAg
IFJlZlB0cjxSZWdpc3RlcklEPiBjbGF1c2VWYWwgPSBnZW5lcmF0b3IubmV3VGVtcG9yYXJ5KCk7
Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdE5vZGUoY2xhdXNlVmFsLmdldCgpLCBsaXN0LT5n
ZXRDbGF1c2UoKS0+ZXhwcigpKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5lbWl0QmluYXJ5T3Ao
b3Bfc3RyaWN0ZXEsIGNsYXVzZVZhbC5nZXQoKSwgY2xhdXNlVmFsLmdldCgpLCBzd2l0Y2hFeHBy
ZXNzaW9uLCBPcGVyYW5kVHlwZXMoKSk7Ci0gICAgICAgICAgICBsYWJlbFZlY3Rvci5hcHBlbmQo
Z2VuZXJhdG9yLm5ld0xhYmVsKCkpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wSWZU
cnVlKGNsYXVzZVZhbC5nZXQoKSwgbGFiZWxWZWN0b3JbbGFiZWxWZWN0b3Iuc2l6ZSgpIC0gMV0u
Z2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHRMYWJlbCA9IGdlbmVyYXRvci5uZXdM
YWJlbCgpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdEp1bXAoZGVmYXVsdExhYmVsLmdldCgpKTsK
LSAgICB9Ci0KLSAgICBSZWdpc3RlcklEKiByZXN1bHQgPSAwOwotCi0gICAgc2l6ZV90IGkgPSAw
OwotICAgIGZvciAoQ2xhdXNlTGlzdE5vZGUqIGxpc3QgPSBtX2xpc3QxOyBsaXN0OyBsaXN0ID0g
bGlzdC0+Z2V0TmV4dCgpKSB7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0TGFiZWwobGFiZWxWZWN0
b3JbaSsrXS5nZXQoKSk7Ci0gICAgICAgIGxpc3QtPmdldENsYXVzZSgpLT5lbWl0Qnl0ZWNvZGUo
Z2VuZXJhdG9yLCBkc3QpOwotICAgIH0KLQotICAgIGlmIChtX2RlZmF1bHRDbGF1c2UpIHsKLSAg
ICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChkZWZhdWx0TGFiZWwuZ2V0KCkpOwotICAgICAgICBt
X2RlZmF1bHRDbGF1c2UtPmVtaXRCeXRlY29kZShnZW5lcmF0b3IsIGRzdCk7Ci0gICAgfQotCi0g
ICAgZm9yIChDbGF1c2VMaXN0Tm9kZSogbGlzdCA9IG1fbGlzdDI7IGxpc3Q7IGxpc3QgPSBsaXN0
LT5nZXROZXh0KCkpIHsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRMYWJlbChsYWJlbFZlY3Rvcltp
KytdLmdldCgpKTsKLSAgICAgICAgbGlzdC0+Z2V0Q2xhdXNlKCktPmVtaXRCeXRlY29kZShnZW5l
cmF0b3IsIGRzdCk7Ci0gICAgfQotICAgIGlmICghbV9kZWZhdWx0Q2xhdXNlKQotICAgICAgICBn
ZW5lcmF0b3IuZW1pdExhYmVsKGRlZmF1bHRMYWJlbC5nZXQoKSk7Ci0KLSAgICBBU1NFUlQoaSA9
PSBsYWJlbFZlY3Rvci5zaXplKCkpOwotICAgIGlmIChzd2l0Y2hUeXBlICE9IFN3aXRjaEluZm86
OlN3aXRjaE5vbmUpIHsKLSAgICAgICAgQVNTRVJUKGxhYmVsVmVjdG9yLnNpemUoKSA9PSBsaXRl
cmFsVmVjdG9yLnNpemUoKSk7Ci0gICAgICAgIGdlbmVyYXRvci5lbmRTd2l0Y2gobGFiZWxWZWN0
b3Iuc2l6ZSgpLCBsYWJlbFZlY3Rvci5kYXRhKCksIGxpdGVyYWxWZWN0b3IuZGF0YSgpLCBkZWZh
dWx0TGFiZWwuZ2V0KCksIG1pbl9udW0sIG1heF9udW0pOwotICAgIH0KLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3dpdGNoTm9kZSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1SZWdpc3RlcklEKiBTd2l0Y2hO
b2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJ
RCogZHN0KQotewotICAgIGdlbmVyYXRvci5lbWl0RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVt
ZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7Ci0gICAgCi0gICAgUmVmUHRyPExhYmVsU2Nv
cGU+IHNjb3BlID0gZ2VuZXJhdG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6U3dpdGNoKTsK
LQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiByMCA9IGdlbmVyYXRvci5lbWl0Tm9kZShtX2V4cHIp
OwotICAgIFJlZ2lzdGVySUQqIHIxID0gbV9ibG9jay0+ZW1pdEJ5dGVjb2RlRm9yQmxvY2soZ2Vu
ZXJhdG9yLCByMC5nZXQoKSwgZHN0KTsKLQotICAgIGdlbmVyYXRvci5lbWl0TGFiZWwoc2NvcGUt
PmJyZWFrVGFyZ2V0KCkpOwotICAgIHJldHVybiByMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tIExhYmVsTm9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KLQotUmVnaXN0ZXJJRCogTGFiZWxOb2RlOjplbWl0Qnl0ZWNvZGUoQnl0ZWNvZGVHZW5l
cmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGdlbmVyYXRvci5lbWl0
RGVidWdIb29rKFdpbGxFeGVjdXRlU3RhdGVtZW50LCBmaXJzdExpbmUoKSwgbGFzdExpbmUoKSk7
Ci0KLSAgICBpZiAoZ2VuZXJhdG9yLmJyZWFrVGFyZ2V0KG1fbmFtZSkpCi0gICAgICAgIHJldHVy
biBlbWl0VGhyb3dFcnJvcihnZW5lcmF0b3IsIFN5bnRheEVycm9yLCAiRHVwbGljYXRlIGxhYmVs
OiAlcy4iLCBtX25hbWUpOwotCi0gICAgUmVmUHRyPExhYmVsU2NvcGU+IHNjb3BlID0gZ2VuZXJh
dG9yLm5ld0xhYmVsU2NvcGUoTGFiZWxTY29wZTo6TmFtZWRMYWJlbCwgJm1fbmFtZSk7Ci0gICAg
UmVnaXN0ZXJJRCogcjAgPSBnZW5lcmF0b3IuZW1pdE5vZGUoZHN0LCBtX3N0YXRlbWVudCk7Ci0K
LSAgICBnZW5lcmF0b3IuZW1pdExhYmVsKHNjb3BlLT5icmVha1RhcmdldCgpKTsKLSAgICByZXR1
cm4gcjA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUaHJvd05vZGUg
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lzdGVySUQqIFRocm93
Tm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVy
SUQqIGRzdCkKLXsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVN0YXRl
bWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwotCi0gICAgaWYgKGRzdCA9PSBnZW5lcmF0
b3IuaWdub3JlZFJlc3VsdCgpKQotICAgICAgICBkc3QgPSAwOwotICAgIFJlZlB0cjxSZWdpc3Rl
cklEPiBleHByID0gZ2VuZXJhdG9yLmVtaXROb2RlKG1fZXhwcik7Ci0gICAgZ2VuZXJhdG9yLmVt
aXRFeHByZXNzaW9uSW5mbyhkaXZvdCgpLCBzdGFydE9mZnNldCgpLCBlbmRPZmZzZXQoKSk7Ci0g
ICAgZ2VuZXJhdG9yLmVtaXRUaHJvdyhleHByLmdldCgpKTsKLSAgICByZXR1cm4gMDsKLX0KLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyeU5vZGUgLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogVHJ5Tm9kZTo6ZW1pdEJ5dGVj
b2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAg
ICAvLyBOT1RFOiBUaGUgY2F0Y2ggYW5kIGZpbmFsbHkgYmxvY2tzIG11c3QgYmUgbGFiZWxlZCBl
eHBsaWNpdGx5LCBzbyB0aGUKLSAgICAvLyBvcHRpbWl6ZXIga25vd3MgdGhleSBtYXkgYmUganVt
cGVkIHRvIGZyb20gYW55d2hlcmUuCi0KLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxs
RXhlY3V0ZVN0YXRlbWVudCwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwotCi0gICAgUmVmUHRy
PExhYmVsPiB0cnlTdGFydExhYmVsID0gZ2VuZXJhdG9yLm5ld0xhYmVsKCk7Ci0gICAgUmVmUHRy
PExhYmVsPiBmaW5hbGx5U3RhcnQ7Ci0gICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGZpbmFsbHlSZXR1
cm5BZGRyOwotICAgIGlmIChtX2ZpbmFsbHlCbG9jaykgewotICAgICAgICBmaW5hbGx5U3RhcnQg
PSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLSAgICAgICAgZmluYWxseVJldHVybkFkZHIgPSBnZW5l
cmF0b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgICAgIGdlbmVyYXRvci5wdXNoRmluYWxseUNvbnRl
eHQoZmluYWxseVN0YXJ0LmdldCgpLCBmaW5hbGx5UmV0dXJuQWRkci5nZXQoKSk7Ci0gICAgfQot
Ci0gICAgZ2VuZXJhdG9yLmVtaXRMYWJlbCh0cnlTdGFydExhYmVsLmdldCgpKTsKLSAgICBnZW5l
cmF0b3IuZW1pdE5vZGUoZHN0LCBtX3RyeUJsb2NrKTsKLQotICAgIGlmIChtX2NhdGNoQmxvY2sp
IHsKLSAgICAgICAgUmVmUHRyPExhYmVsPiBjYXRjaEVuZExhYmVsID0gZ2VuZXJhdG9yLm5ld0xh
YmVsKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBOb3JtYWwgcGF0aDoganVtcCBvdmVyIHRoZSBj
YXRjaCBibG9jay4KLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGNhdGNoRW5kTGFiZWwuZ2V0
KCkpOwotCi0gICAgICAgIC8vIFVuY2F1Z2h0IGV4Y2VwdGlvbiBwYXRoOiB0aGUgY2F0Y2ggYmxv
Y2suCi0gICAgICAgIFJlZlB0cjxMYWJlbD4gaGVyZSA9IGdlbmVyYXRvci5lbWl0TGFiZWwoZ2Vu
ZXJhdG9yLm5ld0xhYmVsKCkuZ2V0KCkpOwotICAgICAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZXhj
ZXB0aW9uUmVnaXN0ZXIgPSBnZW5lcmF0b3IuZW1pdENhdGNoKGdlbmVyYXRvci5uZXdUZW1wb3Jh
cnkoKSwgdHJ5U3RhcnRMYWJlbC5nZXQoKSwgaGVyZS5nZXQoKSk7Ci0gICAgICAgIGlmIChtX2Nh
dGNoSGFzRXZhbCkgewotICAgICAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IGR5bmFtaWNTY29w
ZU9iamVjdCA9IGdlbmVyYXRvci5lbWl0TmV3T2JqZWN0KGdlbmVyYXRvci5uZXdUZW1wb3Jhcnko
KSk7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdFB1dEJ5SWQoZHluYW1pY1Njb3BlT2JqZWN0
LmdldCgpLCBtX2V4Y2VwdGlvbklkZW50LCBleGNlcHRpb25SZWdpc3Rlci5nZXQoKSk7Ci0gICAg
ICAgICAgICBnZW5lcmF0b3IuZW1pdE1vdmUoZXhjZXB0aW9uUmVnaXN0ZXIuZ2V0KCksIGR5bmFt
aWNTY29wZU9iamVjdC5nZXQoKSk7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuZW1pdFB1c2hTY29w
ZShleGNlcHRpb25SZWdpc3Rlci5nZXQoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAg
Z2VuZXJhdG9yLmVtaXRQdXNoTmV3U2NvcGUoZXhjZXB0aW9uUmVnaXN0ZXIuZ2V0KCksIG1fZXhj
ZXB0aW9uSWRlbnQsIGV4Y2VwdGlvblJlZ2lzdGVyLmdldCgpKTsKLSAgICAgICAgZ2VuZXJhdG9y
LmVtaXROb2RlKGRzdCwgbV9jYXRjaEJsb2NrKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRQb3BT
Y29wZSgpOwotICAgICAgICBnZW5lcmF0b3IuZW1pdExhYmVsKGNhdGNoRW5kTGFiZWwuZ2V0KCkp
OwotICAgIH0KLQotICAgIGlmIChtX2ZpbmFsbHlCbG9jaykgewotICAgICAgICBnZW5lcmF0b3Iu
cG9wRmluYWxseUNvbnRleHQoKTsKLSAgICAgICAgLy8gdGhlcmUgbWF5IGJlIGltcG9ydGFudCBy
ZWdpc3RlcnMgbGl2ZSBhdCB0aGUgdGltZSB3ZSBqdW1wCi0gICAgICAgIC8vIHRvIGEgZmluYWxs
eSBibG9jayAoc3VjaCBhcyBmb3IgYSByZXR1cm4gb3IgdGhyb3cpIHNvIHdlCi0gICAgICAgIC8v
IHJlZiB0aGUgaGlnaGVzdCByZWdpc3RlciBldmVyIHVzZWQgYXMgYSBjb25zZXJ2YXRpdmUKLSAg
ICAgICAgLy8gYXBwcm9hY2ggdG8gbm90IGNsb2JiZXJpbmcgYW55dGhpbmcgaW1wb3J0YW50Ci0g
ICAgICAgIFJlZlB0cjxSZWdpc3RlcklEPiBoaWdoZXN0VXNlZFJlZ2lzdGVyID0gZ2VuZXJhdG9y
LmhpZ2hlc3RVc2VkUmVnaXN0ZXIoKTsKLSAgICAgICAgUmVmUHRyPExhYmVsPiBmaW5hbGx5RW5k
TGFiZWwgPSBnZW5lcmF0b3IubmV3TGFiZWwoKTsKLQotICAgICAgICAvLyBOb3JtYWwgcGF0aDog
aW52b2tlIHRoZSBmaW5hbGx5IGJsb2NrLCB0aGVuIGp1bXAgb3ZlciBpdC4KLSAgICAgICAgZ2Vu
ZXJhdG9yLmVtaXRKdW1wU3Vicm91dGluZShmaW5hbGx5UmV0dXJuQWRkci5nZXQoKSwgZmluYWxs
eVN0YXJ0LmdldCgpKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1wKGZpbmFsbHlFbmRMYWJl
bC5nZXQoKSk7Ci0KLSAgICAgICAgLy8gVW5jYXVnaHQgZXhjZXB0aW9uIHBhdGg6IGludm9rZSB0
aGUgZmluYWxseSBibG9jaywgdGhlbiByZS10aHJvdyB0aGUgZXhjZXB0aW9uLgotICAgICAgICBS
ZWZQdHI8TGFiZWw+IGhlcmUgPSBnZW5lcmF0b3IuZW1pdExhYmVsKGdlbmVyYXRvci5uZXdMYWJl
bCgpLmdldCgpKTsKLSAgICAgICAgUmVmUHRyPFJlZ2lzdGVySUQ+IHRlbXBFeGNlcHRpb25SZWdp
c3RlciA9IGdlbmVyYXRvci5lbWl0Q2F0Y2goZ2VuZXJhdG9yLm5ld1RlbXBvcmFyeSgpLCB0cnlT
dGFydExhYmVsLmdldCgpLCBoZXJlLmdldCgpKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRKdW1w
U3Vicm91dGluZShmaW5hbGx5UmV0dXJuQWRkci5nZXQoKSwgZmluYWxseVN0YXJ0LmdldCgpKTsK
LSAgICAgICAgZ2VuZXJhdG9yLmVtaXRUaHJvdyh0ZW1wRXhjZXB0aW9uUmVnaXN0ZXIuZ2V0KCkp
OwotCi0gICAgICAgIC8vIFRoZSBmaW5hbGx5IGJsb2NrLgotICAgICAgICBnZW5lcmF0b3IuZW1p
dExhYmVsKGZpbmFsbHlTdGFydC5nZXQoKSk7Ci0gICAgICAgIGdlbmVyYXRvci5lbWl0Tm9kZShk
c3QsIG1fZmluYWxseUJsb2NrKTsKLSAgICAgICAgZ2VuZXJhdG9yLmVtaXRTdWJyb3V0aW5lUmV0
dXJuKGZpbmFsbHlSZXR1cm5BZGRyLmdldCgpKTsKLQotICAgICAgICBnZW5lcmF0b3IuZW1pdExh
YmVsKGZpbmFsbHlFbmRMYWJlbC5nZXQoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGRzdDsKLX0K
LQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1TY29wZU5vZGVEYXRhIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTY29wZU5vZGVEYXRhOjpTY29wZU5vZGVEYXRhKFBhcnNl
ckFyZW5hJiBhcmVuYSwgU291cmNlRWxlbWVudHMqIHN0YXRlbWVudHMsIFZhclN0YWNrKiB2YXJT
dGFjaywgRnVuY3Rpb25TdGFjayogZnVuY1N0YWNrLCBpbnQgbnVtQ29uc3RhbnRzKQpAQCAtMTk3
OSwxMiArMTA0LDYgQEAgU2NvcGVOb2RlOjpTY29wZU5vZGUoSlNHbG9iYWxEYXRhKiBnbG9iYQog
ewogfQogCi1pbmxpbmUgdm9pZCBTY29wZU5vZGU6OmVtaXRTdGF0ZW1lbnRzQnl0ZWNvZGUoQnl0
ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewotICAgIGlmICht
X2RhdGEtPm1fc3RhdGVtZW50cykKLSAgICAgICAgbV9kYXRhLT5tX3N0YXRlbWVudHMtPmVtaXRC
eXRlY29kZShnZW5lcmF0b3IsIGRzdCk7Ci19Ci0KIFN0YXRlbWVudE5vZGUqIFNjb3BlTm9kZTo6
c2luZ2xlU3RhdGVtZW50KCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9kYXRhLT5tX3N0YXRlbWVu
dHMgPyBtX2RhdGEtPm1fc3RhdGVtZW50cy0+c2luZ2xlU3RhdGVtZW50KCkgOiAwOwpAQCAtMjAw
OCwxOSArMTI3LDYgQEAgUGFzc1JlZlB0cjxQcm9ncmFtTm9kZT4gUHJvZ3JhbU5vZGU6OmNyZQog
ICAgIHJldHVybiBub2RlLnJlbGVhc2UoKTsKIH0KIAotUmVnaXN0ZXJJRCogUHJvZ3JhbU5vZGU6
OmVtaXRCeXRlY29kZShCeXRlY29kZUdlbmVyYXRvciYgZ2VuZXJhdG9yLCBSZWdpc3RlcklEKikK
LXsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsRXhlY3V0ZVByb2dyYW0sIGZpcnN0
TGluZSgpLCBsYXN0TGluZSgpKTsKLQotICAgIFJlZlB0cjxSZWdpc3RlcklEPiBkc3RSZWdpc3Rl
ciA9IGdlbmVyYXRvci5uZXdUZW1wb3JhcnkoKTsKLSAgICBnZW5lcmF0b3IuZW1pdExvYWQoZHN0
UmVnaXN0ZXIuZ2V0KCksIGpzVW5kZWZpbmVkKCkpOwotICAgIGVtaXRTdGF0ZW1lbnRzQnl0ZWNv
ZGUoZ2VuZXJhdG9yLCBkc3RSZWdpc3Rlci5nZXQoKSk7Ci0KLSAgICBnZW5lcmF0b3IuZW1pdERl
YnVnSG9vayhEaWRFeGVjdXRlUHJvZ3JhbSwgZmlyc3RMaW5lKCksIGxhc3RMaW5lKCkpOwotICAg
IGdlbmVyYXRvci5lbWl0RW5kKGRzdFJlZ2lzdGVyLmdldCgpKTsKLSAgICByZXR1cm4gMDsKLX0K
LQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV2YWxOb2RlIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tCiAKIGlubGluZSBFdmFsTm9kZTo6RXZhbE5vZGUoSlNHbG9iYWxE
YXRhKiBnbG9iYWxEYXRhLCBTb3VyY2VFbGVtZW50cyogY2hpbGRyZW4sIFZhclN0YWNrKiB2YXJT
dGFjaywgRnVuY3Rpb25TdGFjayogZnVuY1N0YWNrLCBjb25zdCBTb3VyY2VDb2RlJiBzb3VyY2Us
IENvZGVGZWF0dXJlcyBmZWF0dXJlcywgaW50IG51bUNvbnN0YW50cykKQEAgLTIwMzksMTkgKzE0
NSw2IEBAIFBhc3NSZWZQdHI8RXZhbE5vZGU+IEV2YWxOb2RlOjpjcmVhdGUoSlMKICAgICByZXR1
cm4gbm9kZS5yZWxlYXNlKCk7CiB9CiAKLVJlZ2lzdGVySUQqIEV2YWxOb2RlOjplbWl0Qnl0ZWNv
ZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCopCi17Ci0gICAgZ2Vu
ZXJhdG9yLmVtaXREZWJ1Z0hvb2soV2lsbEV4ZWN1dGVQcm9ncmFtLCBmaXJzdExpbmUoKSwgbGFz
dExpbmUoKSk7Ci0KLSAgICBSZWZQdHI8UmVnaXN0ZXJJRD4gZHN0UmVnaXN0ZXIgPSBnZW5lcmF0
b3IubmV3VGVtcG9yYXJ5KCk7Ci0gICAgZ2VuZXJhdG9yLmVtaXRMb2FkKGRzdFJlZ2lzdGVyLmdl
dCgpLCBqc1VuZGVmaW5lZCgpKTsKLSAgICBlbWl0U3RhdGVtZW50c0J5dGVjb2RlKGdlbmVyYXRv
ciwgZHN0UmVnaXN0ZXIuZ2V0KCkpOwotCi0gICAgZ2VuZXJhdG9yLmVtaXREZWJ1Z0hvb2soRGlk
RXhlY3V0ZVByb2dyYW0sIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKLSAgICBnZW5lcmF0b3Iu
ZW1pdEVuZChkc3RSZWdpc3Rlci5nZXQoKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIC8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGdW5jdGlvbkJvZHlOb2RlIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCiAKIEZ1bmN0aW9uUGFyYW1ldGVyczo6RnVuY3Rpb25QYXJhbWV0ZXJz
KFBhcmFtZXRlck5vZGUqIGZpcnN0UGFyYW1ldGVyKQpAQCAtMjA5OSwzNyArMTkyLDQgQEAgUGFz
c1JlZlB0cjxGdW5jdGlvbkJvZHlOb2RlPiBGdW5jdGlvbkJvZAogICAgIHJldHVybiBub2RlLnJl
bGVhc2UoKTsKIH0KIAotUmVnaXN0ZXJJRCogRnVuY3Rpb25Cb2R5Tm9kZTo6ZW1pdEJ5dGVjb2Rl
KEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIFJlZ2lzdGVySUQqKQotewotICAgIGdlbmVy
YXRvci5lbWl0RGVidWdIb29rKERpZEVudGVyQ2FsbEZyYW1lLCBmaXJzdExpbmUoKSwgbGFzdExp
bmUoKSk7Ci0gICAgZW1pdFN0YXRlbWVudHNCeXRlY29kZShnZW5lcmF0b3IsIGdlbmVyYXRvci5p
Z25vcmVkUmVzdWx0KCkpOwotICAgIFN0YXRlbWVudE5vZGUqIHNpbmdsZVN0YXRlbWVudCA9IHRo
aXMtPnNpbmdsZVN0YXRlbWVudCgpOwotICAgIGlmIChzaW5nbGVTdGF0ZW1lbnQgJiYgc2luZ2xl
U3RhdGVtZW50LT5pc0Jsb2NrKCkpIHsKLSAgICAgICAgU3RhdGVtZW50Tm9kZSogbGFzdFN0YXRl
bWVudEluQmxvY2sgPSBzdGF0aWNfY2FzdDxCbG9ja05vZGUqPihzaW5nbGVTdGF0ZW1lbnQpLT5s
YXN0U3RhdGVtZW50KCk7Ci0gICAgICAgIGlmIChsYXN0U3RhdGVtZW50SW5CbG9jayAmJiBsYXN0
U3RhdGVtZW50SW5CbG9jay0+aXNSZXR1cm5Ob2RlKCkpCi0gICAgICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBSZWdpc3RlcklEKiByMCA9IGdlbmVyYXRvci5lbWl0TG9hZCgwLCBqc1Vu
ZGVmaW5lZCgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdERlYnVnSG9vayhXaWxsTGVhdmVDYWxsRnJh
bWUsIGZpcnN0TGluZSgpLCBsYXN0TGluZSgpKTsKLSAgICBnZW5lcmF0b3IuZW1pdFJldHVybihy
MCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LSBGdW5jRGVjbE5vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVJlZ2lz
dGVySUQqIEZ1bmNEZWNsTm9kZTo6ZW1pdEJ5dGVjb2RlKEJ5dGVjb2RlR2VuZXJhdG9yJiBnZW5l
cmF0b3IsIFJlZ2lzdGVySUQqIGRzdCkKLXsKLSAgICBpZiAoZHN0ID09IGdlbmVyYXRvci5pZ25v
cmVkUmVzdWx0KCkpCi0gICAgICAgIGRzdCA9IDA7Ci0gICAgcmV0dXJuIGRzdDsKLX0KLQotLy8g
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZ1bmNFeHByTm9kZSAtLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUmVnaXN0ZXJJRCogRnVuY0V4cHJOb2RlOjplbWl0Qnl0
ZWNvZGUoQnl0ZWNvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgUmVnaXN0ZXJJRCogZHN0KQotewot
ICAgIHJldHVybiBnZW5lcmF0b3IuZW1pdE5ld0Z1bmN0aW9uRXhwcmVzc2lvbihnZW5lcmF0b3Iu
ZmluYWxEZXN0aW5hdGlvbihkc3QpLCB0aGlzKTsKLX0KLQogfSAvLyBuYW1lc3BhY2UgSlNDCg==
</data>
<flag name="review"
          id="26350"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>