<?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>121049</bug_id>
          
          <creation_ts>2013-09-09 14:42:16 -0700</creation_ts>
          <short_desc>Move all collapsing margin code out of RenderBlock and into RenderBlockFlow</short_desc>
          <delta_ts>2013-09-11 12:49:51 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>84924</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dave Hyatt">hyatt</reporter>
          <assigned_to name="Dave Hyatt">hyatt</assigned_to>
          <cc>bdakin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>WebkitBugTracker</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>926912</commentid>
    <comment_count>0</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-09-09 14:42:16 -0700</bug_when>
    <thetext>Move all collapsing margin code out of RenderBlock and into RenderBlockFlow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>926915</commentid>
    <comment_count>1</comment_count>
      <attachid>211089</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-09-09 14:45:49 -0700</bug_when>
    <thetext>Created attachment 211089
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>926917</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-09 14:48:48 -0700</bug_when>
    <thetext>Attachment 211089 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/rendering/RenderBlock.cpp&apos;, u&apos;Source/WebCore/rendering/RenderBlock.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockFlow.cpp&apos;, u&apos;Source/WebCore/rendering/RenderBlockFlow.h&apos;, u&apos;Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp&apos;, u&apos;Source/WebCore/rendering/RenderTable.cpp&apos;]&quot; exit_code: 1
Source/WebCore/rendering/RenderBlockFlow.h:123:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.h:129:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlock.h:1001:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/rendering/RenderBlockFlow.cpp:62:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:64:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:65:  Boolean expressions that span multiple lines should have their operators on the left side of the line instead of the right side.  [whitespace/operators] [4]
Source/WebCore/rendering/RenderBlockFlow.cpp:65:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:459:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:462:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:463:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:531:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:587:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:635:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:637:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:642:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:643:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:644:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:678:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:679:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:691:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:869:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:905:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:906:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:1213:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/rendering/RenderBlockFlow.cpp:1235:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Total errors found: 25 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>926920</commentid>
    <comment_count>3</comment_count>
      <attachid>211091</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-09-09 14:53:11 -0700</bug_when>
    <thetext>Created attachment 211091
New patch that should pass style queue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>926922</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-09 14:54:34 -0700</bug_when>
    <thetext>Attachment 211091 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/rendering/RenderBlock.cpp&apos;, u&apos;Source/WebCore/rendering/RenderBlock.h&apos;, u&apos;Source/WebCore/rendering/RenderBlockFlow.cpp&apos;, u&apos;Source/WebCore/rendering/RenderBlockFlow.h&apos;, u&apos;Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp&apos;, u&apos;Source/WebCore/rendering/RenderTable.cpp&apos;]&quot; exit_code: 1
Source/WebCore/rendering/RenderBlock.h:1001:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/rendering/RenderBlockFlow.cpp:65:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebCore/rendering/RenderBlockFlow.cpp:587:  Should have only a single space after a punctuation in a comment.  [whitespace/comments] [5]
Total errors found: 3 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>926925</commentid>
    <comment_count>5</comment_count>
      <attachid>211094</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-09-09 14:57:44 -0700</bug_when>
    <thetext>Created attachment 211094
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927937</commentid>
    <comment_count>6</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2013-09-11 12:49:51 -0700</bug_when>
    <thetext>Landed in r155555.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211089</attachid>
            <date>2013-09-09 14:45:49 -0700</date>
            <delta_ts>2013-09-09 14:53:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>136176</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1NTM4NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExMSBAQAorMjAxMy0wOS0wOSAgRGF2aWQg
SHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBhbGwgY29sbGFwc2luZyBt
YXJnaW4gY29kZSBvdXQgb2YgUmVuZGVyQmxvY2sgYW5kIGludG8gUmVuZGVyQmxvY2tGbG93Lgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMDQ5CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRj
aCBiZWdpbnMgdGhlIG1pZ3JhdGlvbiBvZiB0aGUgcmFyZSBkYXRhIHN0cnVjdCBvZiBSZW5kZXJC
bG9jayBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gRHVyaW5nIHRoaXMgcHJvY2VzcyB3
ZSB3aWxsIHRlbXBvcmFyaWx5IGhhdmUgcmFyZSBkYXRhIHN0cnVjdHMKKyAgICAgICAgaW4gYm90
aCBwbGFjZXMsIGJ1dCB1bHRpbWF0ZWx5IGFsbCBvZiB0aGUgbWVtYmVycyBhcmUgZ29pbmcgdG8g
bW92ZSBkb3duIGludG8KKyAgICAgICAgUmVuZGVyQmxvY2tGbG93LCBhbmQgaWYgYW55IGRvbid0
LCB0aGV5IHdpbGwgZ2V0IGZvcmNlZCBpbnRvIGEgaGFzaC4KKyAgICAgICAgCisgICAgICAgIEZv
ciB0aGlzIHBhdGNoLCB0aGUgbWFyZ2luIGluZm9ybWF0aW9uIGlzIGJlaW5nIHNoaWZ0ZWQgb3V0
IG9mIFJlbmRlckJsb2NrIGFuZCBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gQW55IGZ1
bmN0aW9ucyB0aGF0IHJlZmVyIHRvIE1hcmdpblZhbHVlcyBvciB0byBNYXJnaW5JbmZvIGFsc28g
Z290CisgICAgICAgIG1vdmVkIGRvd24gaW50byBSZW5kZXJCbG9ja0Zsb3cuIE1vc3Qgb2YgYmxv
Y2sgY2hpbGQgbGF5b3V0IGlzIG5vdyBpbiBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgYWZ0ZXIg
dGhpcyBwYXRjaC4KKyAgICAgICAgCisgICAgICAgIE5vdGUgdGhhdCBpbiBtYW55IGNhc2VzIHRo
ZSBjb2RlIGRpZG4ndCBzaW1wbHkgbW92ZS4gVGhlcmUgaXMgc29tZSB0eXBlIHRpZ2h0ZW5pbmcK
KyAgICAgICAgdGhhdCBoYXBwZW5lZCBhcyB3ZWxsLCBpLmUuLCBwbGFjZXMgdGhhdCBsb29rIGZv
ciBSZW5kZXJCbG9jayBjYW4gbm93IGxvb2sgZm9yCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyBp
bnN0ZWFkIGFuZCBsZXQgUmVuZGVyQmxvY2sgZXhlY3V0ZSB0aGUgYmFzZSBSZW5kZXJCb3ggZnVu
Y3Rpb25zLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9jazo6c2V0UGFnaW5hdGlvblN0cnV0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9jazo6c2V0QnJlYWtBdExpbmVUb0F2b2lkV2lkb3cpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9jay5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnNldExpbmVHcmlk
Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzZXRTaGFwZUluc2lkZUluZm8p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OlJlbmRlckJsb2NrUmFyZURhdGE6OlJl
bmRlckJsb2NrUmFyZURhdGEpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpNYXJn
aW5JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxvY2tG
bG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGls
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdFBvc2l0aW9uZWRC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZsb2F0aW5n
QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5WYWx1ZXNG
b3JDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFy
Z2lucyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzSWZO
ZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5CZWZvcmVF
c3RpbWF0ZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZXN0
aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpoYW5kbGVBZnRlclNpZGVPZkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpzZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2FyZE1hcmdp
bkJlZm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNjYXJk
TWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlz
Y2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6bXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6bXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9yQ2hpbGQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0U2VwYXJhdGVNYXJnaW5BZnRlckZv
ckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OmluTm9ybWFsRmxvdyk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGx5QmVmb3JlQnJlYWspOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjphcHBseUFmdGVyQnJlYWspOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbik6CisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Ok1hcmdpblZhbHVlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6cG9zaXRpdmVNYXJnaW5CZWZvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Om5lZ2F0aXZl
TWFyZ2luQmVmb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2lu
VmFsdWVzOjpwb3NpdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpuZWdhdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpzZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6
c2V0TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpNYXJnaW5WYWx1ZXM6OnNldFBvc2l0aXZlTWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6OnNldE5lZ2F0aXZlTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dS
YXJlRGF0YTo6UmVuZGVyQmxvY2tGbG93UmFyZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxv
Y2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2
ZU1hcmdpbkFmdGVyRGVmYXVsdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEF0QmVmb3Jl
U2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXRBdEFmdGVyU2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpjbGVhck1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEhhc01hcmdpbkJlZm9yZVF1aXJrKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0SGFzTWFyZ2luQWZ0
ZXJRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86
OnNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldFBvc2l0aXZlTWFyZ2luKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpzZXRQb3NpdGl2
ZU1hcmdpbklmTGFyZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFy
Z2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW5JZkxhcmdlcik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldE1hcmdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJX
aXRoQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXREaXNjYXJkTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6TWFyZ2luSW5mbzo6YXRCZWZvcmVTaWRlT2ZCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxh
cHNlV2l0aE1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpjYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6cXVpcmtDb250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpkZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmspOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpoYXNNYXJnaW5CZWZvcmVR
dWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Omhh
c01hcmdpbkFmdGVyUXVpcmspOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpN
YXJnaW5JbmZvOjpwb3NpdGl2ZU1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6Ok1hcmdpbkluZm86Om5lZ2F0aXZlTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6ZGlzY2FyZE1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Om1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5BZnRl
cik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmluaXRNYXhNYXJnaW5WYWx1
ZXMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJEZXByZWNhdGVkRmxleGlibGVCb3guY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94OjpsYXlvdXRC
bG9jayk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRhYmxlOjpsYXlvdXQpOgorCiAyMDEzLTA5LTA5ICBUaGlhZ28gZGUgQmFy
cm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFtC
dWcgRml4XSBDYWxsaW5nIG1fYXVkaW9Db21wb25lbnRzLnJlbW92ZSBpbiByZW1vdmVBdWRpb0Nv
bXBvbmVudCAoTWVkaWFTdHJlYW1EZXNjcmlwdG9yKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCwxMyArOTQs
NiBAQCBzdHJ1Y3QgU2FtZVNpemVBc0Zsb2F0aW5nT2JqZWN0IHsKICAgICB1aW50MzJfdCBiaXRm
aWVsZHMgOiA4OwogfTsKIAotQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrOjpNYXJn
aW5WYWx1ZXMpID09IHNpemVvZihMYXlvdXRVbml0WzRdKSwgTWFyZ2luVmFsdWVzX3Nob3VsZF9z
dGF5X3NtYWxsKTsKLQotc3RydWN0IFNhbWVTaXplQXNNYXJnaW5JbmZvIHsKLSAgICB1aW50MzJf
dCBiaXRmaWVsZHMgOiAxNjsKLSAgICBMYXlvdXRVbml0IG1hcmdpbnNbMl07Ci19OwotCiB0eXBl
ZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBPd25QdHI8Q29sdW1uSW5mbz4gPiBD
b2x1bW5JbmZvTWFwOwogc3RhdGljIENvbHVtbkluZm9NYXAqIGdDb2x1bW5JbmZvTWFwID0gMDsK
IApAQCAtMTU4LDM5ICsxNTEsNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9oYWRWZXJ0aWNhbExh
eW91dE92ZXJmbG93OwogfTsKIAotLy8gT3VyIE1hcmdpbkluZm8gc3RhdGUgdXNlZCB3aGVuIGxh
eWluZyBvdXQgYmxvY2sgY2hpbGRyZW4uCi1SZW5kZXJCbG9jazo6TWFyZ2luSW5mbzo6TWFyZ2lu
SW5mbyhSZW5kZXJCbG9jayogYmxvY2ssIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywg
TGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpCi0gICAgOiBtX2F0QmVmb3JlU2lkZU9mQmxv
Y2sodHJ1ZSkKLSAgICAsIG1fYXRBZnRlclNpZGVPZkJsb2NrKGZhbHNlKQotICAgICwgbV9oYXNN
YXJnaW5CZWZvcmVRdWlyayhmYWxzZSkKLSAgICAsIG1faGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxz
ZSkKLSAgICAsIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKQotICAgICwgbV9k
aXNjYXJkTWFyZ2luKGZhbHNlKQotewotICAgIFJlbmRlclN0eWxlKiBibG9ja1N0eWxlID0gYmxv
Y2stPnN0eWxlKCk7Ci0gICAgQVNTRVJUKGJsb2NrLT5pc1JlbmRlclZpZXcoKSB8fCBibG9jay0+
cGFyZW50KCkpOwotICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVu
ZGVyVmlldygpICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKQotICAgICAgICAmJiAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFi
bGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkKLSAgICAgICAgJiYgIWJsb2NrLT5pc1JlbmRlckZsb3dUaHJl
YWQoKSAmJiAhYmxvY2stPmlzV3JpdGluZ01vZGVSb290KCkgJiYgIWJsb2NrLT5wYXJlbnQoKS0+
aXNGbGV4aWJsZUJveCgpCi0gICAgICAgICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5Db3Vu
dCgpICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5XaWR0aCgpICYmICFibG9ja1N0eWxlLT5j
b2x1bW5TcGFuKCk7Ci0KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVu
ID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAhYmVmb3JlQm9yZGVyUGFkZGluZyAmJiBi
bG9ja1N0eWxlLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKLQotICAgIC8v
IElmIGFueSBoZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4g
d2UgZG9uJ3QgY29sbGFwc2Ugb3VyIGJvdHRvbQotICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hp
bGRyZW4ncyBtYXJnaW5zLiAgVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZp
c3VhbAotICAgIC8vIGVmZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRo
ZSBwYXJlbnQgYmxvY2sgYW5kIHlldCBzdGlsbCBjb2xsYXBzZQotICAgIC8vIHdpdGggaXQuICBX
ZSBhbHNvIGRvbid0IGNvbGxhcHNlIGlmIHdlIGhhdmUgYW55IGJvdHRvbSBib3JkZXIvcGFkZGlu
Zy4KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxh
cHNlV2l0aENoaWxkcmVuICYmIChhZnRlckJvcmRlclBhZGRpbmcgPT0gMCkgJiYKLSAgICAgICAg
KGJsb2NrU3R5bGUtPmxvZ2ljYWxIZWlnaHQoKS5pc0F1dG8oKSAmJiAhYmxvY2tTdHlsZS0+bG9n
aWNhbEhlaWdodCgpLnZhbHVlKCkpICYmIGJsb2NrU3R5bGUtPm1hcmdpbkFmdGVyQ29sbGFwc2Uo
KSAhPSBNU0VQQVJBVEU7Ci0gICAgCi0gICAgbV9xdWlya0NvbnRhaW5lciA9IGJsb2NrLT5pc1Rh
YmxlQ2VsbCgpIHx8IGJsb2NrLT5pc0JvZHkoKTsKLQotICAgIG1fZGlzY2FyZE1hcmdpbiA9IG1f
Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgYmxvY2stPm11c3REaXNjYXJk
TWFyZ2luQmVmb3JlKCk7Ci0KLSAgICBtX3Bvc2l0aXZlTWFyZ2luID0gKG1fY2FuQ29sbGFwc2VN
YXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgIWJsb2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZSgpKSA/IGJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogTGF5b3V0VW5pdCgpOwot
ICAgIG1fbmVnYXRpdmVNYXJnaW4gPSAobV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGls
ZHJlbiAmJiAhYmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkpID8gYmxvY2stPm1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVuZGVyQmxvY2s6OlJlbmRl
ckJsb2NrKEVsZW1lbnQqIGVsZW1lbnQpCkBAIC0yMDQsNyArMTY0LDYgQEAgUmVuZGVyQmxvY2s6
OlJlbmRlckJsb2NrKEVsZW1lbnQqIGVsZW1lbgogewogICAgIHNldENoaWxkcmVuSW5saW5lKHRy
dWUpOwogICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihSZW5kZXJCbG9jazo6RmxvYXRpbmdPYmpl
Y3QpID09IHNpemVvZihTYW1lU2l6ZUFzRmxvYXRpbmdPYmplY3QpLCBGbG9hdGluZ09iamVjdF9z
aG91bGRfc3RheV9zbWFsbCk7Ci0gICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2Nr
OjpNYXJnaW5JbmZvKSA9PSBzaXplb2YoU2FtZVNpemVBc01hcmdpbkluZm8pLCBNYXJnaW5JbmZv
X3Nob3VsZF9zdGF5X3NtYWxsKTsKIH0KIAogc3RhdGljIHZvaWQgcmVtb3ZlQmxvY2tGcm9tRGVz
Y2VuZGFudEFuZENvbnRhaW5lck1hcHMoUmVuZGVyQmxvY2sqIGJsb2NrLCBUcmFja2VkRGVzY2Vu
ZGFudHNNYXAqJiBkZXNjZW5kYW50TWFwLCBUcmFja2VkQ29udGFpbmVyTWFwKiYgY29udGFpbmVy
TWFwKQpAQCAtMTc3Niw1MSArMTczNSw2IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0Vu
Y2xvc2VPdmVyaGEKICAgICAgICAgICAgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNUYWJsZUNhcHRpb24oKSB8fCBpc0ZpZWxkc2V0KCkgfHwgaXNXcml0aW5nTW9kZVJvb3Qo
KSB8fCBpc1Jvb3QoKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0UG9zaXRpb25lZEJs
b2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0g
ICAgYm9vbCBpc0hvcml6b250YWwgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpOwotICAgIGJv
b2wgaGFzU3RhdGljQmxvY2tQb3NpdGlvbiA9IGNoaWxkLT5zdHlsZSgpLT5oYXNTdGF0aWNCbG9j
a1Bvc2l0aW9uKGlzSG9yaXpvbnRhbCk7Ci0gICAgCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9w
ID0gbG9naWNhbEhlaWdodCgpOwotICAgIHVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hp
bGQoY2hpbGQsIGxvZ2ljYWxUb3ApOwotCi0gICAgaWYgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNl
V2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIC8vIFBvc2l0aW9uZWQgYmxvY2tzIGRvbid0
IGNvbGxhcHNlIG1hcmdpbnMsIHNvIGFkZCB0aGUgbWFyZ2luIHByb3ZpZGVkIGJ5Ci0gICAgICAg
IC8vIHRoZSBjb250YWluZXIgbm93LiBUaGUgY2hpbGQncyBvd24gbWFyZ2luIGlzIGFkZGVkIGxh
dGVyIHdoZW4gY2FsY3VsYXRpbmcgaXRzIGxvZ2ljYWwgdG9wLgotICAgICAgICBMYXlvdXRVbml0
IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1hcmdpbkluZm8ucG9zaXRpdmVNYXJnaW4oKTsKLSAgICAg
ICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVOZWcgPSBtYXJnaW5JbmZvLm5lZ2F0aXZlTWFy
Z2luKCk7Ci0gICAgICAgIGxvZ2ljYWxUb3AgKz0gY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFw
c2VkQmVmb3JlTmVnOwotICAgIH0KLSAgICAKLSAgICBSZW5kZXJMYXllciogY2hpbGRMYXllciA9
IGNoaWxkLT5sYXllcigpOwotICAgIGlmIChjaGlsZExheWVyLT5zdGF0aWNCbG9ja1Bvc2l0aW9u
KCkgIT0gbG9naWNhbFRvcCkgewotICAgICAgICBjaGlsZExheWVyLT5zZXRTdGF0aWNCbG9ja1Bv
c2l0aW9uKGxvZ2ljYWxUb3ApOwotICAgICAgICBpZiAoaGFzU3RhdGljQmxvY2tQb3NpdGlvbikK
LSAgICAgICAgICAgIGNoaWxkLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhp
cyk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGp1c3RGbG9hdGluZ0Jsb2NrKGNv
bnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gVGhlIGZsb2F0IHNob3VsZCBi
ZSBwb3NpdGlvbmVkIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGJvdHRvbSBtYXJnaW4KLSAgICAv
LyBvZiB0aGUgcHJldmlvdXMgZmxvdy4gIFdlIGFkZCB0aGF0IG1hcmdpbiBpbnRvIHRoZSBoZWln
aHQsIGdldCB0aGUKLSAgICAvLyBmbG9hdCBwb3NpdGlvbmVkIHByb3Blcmx5LCBhbmQgdGhlbiBz
dWJ0cmFjdCB0aGUgbWFyZ2luIG91dCBvZiB0aGUKLSAgICAvLyBoZWlnaHQgYWdhaW4uICBJbiB0
aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCB3ZSBhbHdheXMganVzdAotICAgIC8v
IHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgY29s
bGFwc2VkIGl0cwotICAgIC8vIG93biBib3R0b20gbWFyZ2luIGludG8gaXRzIHRvcCBtYXJnaW4u
Ci0gICAgLy8KLSAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGUgcHJldmlvdXMgZmxvdyBtYXkgY29s
bGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YKLSAgICAvLyBvdXIgYmxvY2suICBJZiB0
aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIGRvIG5vdCBhZGQgdGhlIG1hcmdpbiBpbiB0byBvdXIK
LSAgICAvLyBoZWlnaHQgd2hlbiBjb21wdXRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdC4g
ICBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCi0gICAgLy8gZm9yIGJ5IHNpbXBseSBjYWxs
aW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4gIFNlZQotICAgIC8vIGh0dHA6Ly93d3cu
aGl4aWUuY2gvdGVzdHMvYWRob2MvY3NzL2JveC9ibG9jay9tYXJnaW4tY29sbGFwc2UvMDQ2Lmh0
bWwgZm9yCi0gICAgLy8gYW4gZXhhbXBsZSBvZiB0aGlzIHNjZW5hcmlvLgotICAgIExheW91dFVu
aXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUo
KSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0gICAgc2V0TG9naWNhbEhl
aWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5PZmZzZXQpOwotICAgIHBvc2l0aW9uTmV3Rmxv
YXRzKCk7Ci0gICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgLSBtYXJnaW5PZmZz
ZXQpOwotfQotCiBzdGF0aWMgdm9pZCBkZXN0cm95UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3Qq
IHJ1bkluKQogewogICAgIEFTU0VSVChydW5Jbi0+aXNSdW5JbigpKTsKQEAgLTE5NTksMzI1ICsx
ODczLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6bW92ZVJ1bkluVG9PcmlnaW5hbFBvcwogICAgIHBh
cmVudCgpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJveCogY2hpbGQsIE1hcmdp
bkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUg
PSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICBib29sIGNoaWxk
RGlzY2FyZE1hcmdpbkFmdGVyID0gbXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKGNoaWxk
KTsKLSAgICBib29sIGNoaWxkSXNTZWxmQ29sbGFwc2luZyA9IGNoaWxkLT5pc1NlbGZDb2xsYXBz
aW5nQmxvY2soKTsKLQotICAgIC8vIFRoZSBjaGlsZCBkaXNjYXJkcyB0aGUgYmVmb3JlIG1hcmdp
biB3aGVuIHRoZSB0aGUgYWZ0ZXIgbWFyZ2luIGhhcyBkaXNjYXJkIGluIHRoZSBjYXNlIG9mIGEg
c2VsZiBjb2xsYXBzaW5nIGJsb2NrLgotICAgIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IGNo
aWxkRGlzY2FyZE1hcmdpbkJlZm9yZSB8fCAoY2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIgJiYgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nKTsKLQotICAgIC8vIEdldCB0aGUgZm91ciBtYXJnaW4gdmFsdWVz
IGZvciB0aGUgY2hpbGQgYW5kIGNhY2hlIHRoZW0uCi0gICAgY29uc3QgTWFyZ2luVmFsdWVzIGNo
aWxkTWFyZ2lucyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKLQotICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIExheW91dFVuaXQgcG9zVG9wID0g
Y2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBuZWdU
b3AgPSBjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLQotICAgIC8vIEZvciBz
ZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90dG9tIG1hcmdpbnMgaW50byBv
dXIKLSAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5lZ1RvcCB2YWx1ZXMuCi0gICAg
aWYgKGNoaWxkSXNTZWxmQ29sbGFwc2luZykgewotICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9w
LCBjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgbmVnVG9wID0g
bWF4KG5lZ1RvcCwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0gICAgfQot
ICAgIAotICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2Fy
ZSBpZiB0aGlzIGNoaWxkIGhhcwotICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdp
dGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGhhc01hcmdpbkJlZm9yZVF1aXJrKGNoaWxkKTsK
LQotICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0g
ICAgICAgIGlmICghY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSkgewotICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdp
dGggdGhlIHRvcCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGJsb2NrLiBJZiBpdCBoYXMgbGFyZ2Vy
IG1hcmdpbiB2YWx1ZXMsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUKLSAgICAgICAgICAgIC8vIG91
ciBvd24gbWF4aW1hbCB2YWx1ZXMuCi0gICAgICAgICAgICBpZiAoIWRvY3VtZW50KCkuaW5RdWly
a3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhdG9wUXVpcmspCi0g
ICAgICAgICAgICAgICAgc2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKG1heChwb3NUb3AsIG1heFBv
c2l0aXZlTWFyZ2luQmVmb3JlKCkpLCBtYXgobmVnVG9wLCBtYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpKSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBtaW51dGUgYW55IG9mIHRoZSBtYXJnaW5zIGlu
dm9sdmVkIGlzbid0IGEgcXVpcmssIGRvbid0Ci0gICAgICAgICAgICAvLyBjb2xsYXBzZSBpdCBh
d2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20K
LSAgICAgICAgICAgIC8vIGhhcyBhbiBleGFtcGxlIG9mIHRoaXMsIGEgPGR0PiB3aXRoIDAuOGVt
IGF1dGhvci1zcGVjaWZpZWQgaW5zaWRlCi0gICAgICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEg
PHRkPi4KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpIHsKLSAgICAgICAgICAg
ICAgICBzZXRIYXNNYXJnaW5CZWZvcmVRdWlyayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXREZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiB0b3BRdWlyayAmJiAhbWFyZ2luQmVmb3JlKCkpCi0gICAgICAgICAgICAgICAg
Ly8gV2UgaGF2ZSBubyB0b3AgbWFyZ2luIGFuZCBvdXIgdG9wIGNoaWxkIGhhcyBhIHF1aXJreSBt
YXJnaW4uCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMgcXVpcmt5IG1h
cmdpbiBhbmQgcGFzcyBpdCB0aHJvdWdoLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMg
d2l0aCB0aGUgPHRkPjxkaXY+PHA+IGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZG8g
dGhpcyBmb3IgYSBibG9jayB0aGF0IHNwbGl0IHR3byBpbmxpbmVzIHRob3VnaC4gWW91IGRvCi0g
ICAgICAgICAgICAgICAgLy8gc3RpbGwgYXBwbHkgbWFyZ2lucyBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgICAgICAgICAgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgLy8gVGhlIGJlZm9yZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB3aWxs
IGFsc28gZGlzY2FyZCBhbGwgdGhlIG1hcmdpbnMgaXQgaXMgY29sbGFwc2luZyB3aXRoLgotICAg
ICAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKTsKLSAgICB9Ci0KLSAgICAvLyBP
bmNlIHdlIGZpbmQgYSBjaGlsZCB3aXRoIGRpc2NhcmRNYXJnaW5CZWZvcmUgYWxsIHRoZSBtYXJn
aW5zIGNvbGxhcHNpbmcgd2l0aCB1cyBtdXN0IGFsc28gZGlzY2FyZC4gCi0gICAgaWYgKGNoaWxk
RGlzY2FyZE1hcmdpbkJlZm9yZSkgewotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJn
aW4odHJ1ZSk7Ci0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICB9Ci0KLSAg
ICBpZiAobWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpICYmIG1hcmdpbkluZm8uYXRCZWZvcmVT
aWRlT2ZCbG9jaygpICYmIChwb3NUb3AgLSBuZWdUb3ApKQotICAgICAgICBtYXJnaW5JbmZvLnNl
dEhhc01hcmdpbkJlZm9yZVF1aXJrKHRvcFF1aXJrKTsKLQotICAgIExheW91dFVuaXQgYmVmb3Jl
Q29sbGFwc2VMb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOwotICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcCA9IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcDsKLSAgICBpZiAoY2hpbGRJc1NlbGZD
b2xsYXBzaW5nKSB7Ci0gICAgICAgIC8vIEZvciBhIHNlbGYgY29sbGFwc2luZyBibG9jayBib3Ro
IHRoZSBiZWZvcmUgYW5kIGFmdGVyIG1hcmdpbnMgZ2V0IGRpc2NhcmRlZC4gVGhlIGJsb2NrIGRv
ZXNuJ3QgY29udHJpYnV0ZSBhbnl0aGluZyB0byB0aGUgaGVpZ2h0IG9mIHRoZSBibG9jay4KLSAg
ICAgICAgLy8gQWxzbywgdGhlIGNoaWxkJ3MgdG9wIHBvc2l0aW9uIGVxdWFscyB0aGUgbG9naWNh
bCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lci4KLSAgICAgICAgaWYgKCFjaGlsZERpc2NhcmRNYXJn
aW5CZWZvcmUgJiYgIW1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpKSB7Ci0gICAgICAgICAgICAv
LyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKLSAgICAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAotICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IGFuIGFjY3VyYXRl
IHBvc2l0aW9uIGZvciB0aGUgemVyby1oZWlnaHQgYmxvY2suCi0gICAgICAgICAgICBMYXlvdXRV
bml0IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCks
IGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIExheW91
dFVuaXQgY29sbGFwc2VkQmVmb3JlTmVnID0gbWF4KG1hcmdpbkluZm8ubmVnYXRpdmVNYXJnaW4o
KSwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkpOwotICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXRNYXJnaW4oY29sbGFwc2VkQmVmb3JlUG9zLCBjb2xsYXBzZWRCZWZvcmVOZWcp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgY29sbGFwc2UgdGhlIGNoaWxkJ3Mg
bWFyZ2lucyB0b2dldGhlciwgd2hpY2ggbWVhbnMgZXhhbWluaW5nIG91cgotICAgICAgICAgICAg
Ly8gYm90dG9tIG1hcmdpbiB2YWx1ZXMgYXMgd2VsbC4gCi0gICAgICAgICAgICBtYXJnaW5JbmZv
LnNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIoY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQWZ0
ZXIoKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ2F0aXZlTWFyZ2luSWZMYXJnZXIo
Y2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmICgh
bWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkKLSAgICAgICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZi1j
b2xsYXBzaW5nIGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCwgc2luY2UgaXQg
Y291bGQgaGF2ZSBvdmVyZmxvd2luZyBjb250ZW50Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBu
ZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0Ci0gICAg
ICAgICAgICAgICAgLy8gaGFkIGEgc3BlY2lmaWVkIGhlaWdodCBvZiAwIGJ1dCB0aGF0IGFjdHVh
bGx5IGhhZCBzdWJjb250ZW50KS4KLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gbG9naWNh
bEhlaWdodCgpICsgY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFwc2VkQmVmb3JlTmVnOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSkgewotICAgICAgICAgICAgQVNTRVJUKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSB8fCAobWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgJiYgIW1hcmdpbkluZm8u
bWFyZ2luKCkpKTsKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhdCB0aGUgYmVmb3JlIHNpZGUg
b2YgdGhlIGJsb2NrIGFuZCB3ZSBjb2xsYXBzZSwgaWdub3JlIHRoZSBjb21wdXRlZCBtYXJnaW4K
LSAgICAgICAgICAgIC8vIGFuZCBqdXN0IGFkZCB0aGUgY2hpbGQgbWFyZ2luIHRvIHRoZSBjb250
YWluZXIgaGVpZ2h0LiBUaGlzIHdpbGwgY29ycmVjdGx5IHBvc2l0aW9uCi0gICAgICAgICAgICAv
LyB0aGUgY2hpbGQgaW5zaWRlIHRoZSBjb250YWluZXIuCi0gICAgICAgICAgICBMYXlvdXRVbml0
IHNlcGFyYXRlTWFyZ2luID0gIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3Jl
KCkgPyBtYXJnaW5JbmZvLm1hcmdpbigpIDogTGF5b3V0VW5pdCgwKTsKLSAgICAgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgc2VwYXJhdGVNYXJnaW4gKyBtYXJnaW5C
ZWZvcmVGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxI
ZWlnaHQoKTsKLSAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkg
JiYgKCFtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKQotICAgICAgICAgICAgfHwgKCFt
YXJnaW5JbmZvLmNhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuKCkKLSAgICAgICAg
ICAgICYmICghZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAhbWFyZ2luSW5mby5xdWlya0Nv
bnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkpKSkpIHsKLSAg
ICAgICAgICAgIC8vIFdlJ3JlIGNvbGxhcHNpbmcgd2l0aCBhIHByZXZpb3VzIHNpYmxpbmcncyBt
YXJnaW5zIGFuZCBub3QKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIHRvcCBvZiB0aGUgYmxvY2su
Ci0gICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1heChtYXJn
aW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc1RvcCkgLSBtYXgobWFyZ2luSW5mby5uZWdhdGl2
ZU1hcmdpbigpLCBuZWdUb3ApKTsKLSAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVp
Z2h0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJnaW4o
Y2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFtYXJnaW5J
bmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NpdGl2
ZU1hcmdpbihjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgICAg
IG1hcmdpbkluZm8uc2V0TmVnYXRpdmVNYXJnaW4oY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2lu
QWZ0ZXIoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWFyZ2luSW5mby5jbGVhck1h
cmdpbigpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXRIYXNNYXJnaW5BZnRlclF1aXJrKGhhc01hcmdpbkFmdGVyUXVpcmsoY2hp
bGQpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgbWFyZ2lucyB3b3VsZCBwdWxsIHVzIHBhc3Qg
dGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBiYWNrIGFuZCBw
cmV0ZW5kIGxpa2UgdGhlIG1hcmdpbnMKLSAgICAvLyBjb2xsYXBzZWQgaW50byB0aGUgcGFnZSBl
ZGdlLgotICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgp
OwotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFn
ZUxvZ2ljYWxIZWlnaHQoKSAmJiBsb2dpY2FsVG9wID4gYmVmb3JlQ29sbGFwc2VMb2dpY2FsVG9w
Ci0gICAgICAgICYmIGhhc05leHRQYWdlKGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCkpIHsKLSAg
ICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNhbFRvcDsKLSAgICAgICAgbG9n
aWNhbFRvcCA9IG1pbihsb2dpY2FsVG9wLCBuZXh0UGFnZUxvZ2ljYWxUb3AoYmVmb3JlQ29sbGFw
c2VMb2dpY2FsVG9wKSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgp
ICsgKGxvZ2ljYWxUb3AgLSBvbGRMb2dpY2FsVG9wKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2Ug
aGF2ZSBjb2xsYXBzZWQgaW50byBhIHByZXZpb3VzIHNpYmxpbmcgYW5kIHNvIHJlZHVjZWQgdGhl
IGhlaWdodCBvZiB0aGUgcGFyZW50LCBlbnN1cmUgYW55IGZsb2F0cyB0aGF0IG5vdwotICAgIC8v
IG92ZXJoYW5nIGZyb20gdGhlIHByZXZpb3VzIHNpYmxpbmcgYXJlIGFkZGVkIHRvIG91ciBwYXJl
bnQuIElmIHRoZSBjaGlsZCdzIHByZXZpb3VzIHNpYmxpbmcgaXRzZWxmIGlzIGEgZmxvYXQgdGhl
IGNoaWxkIHdpbGwgYXZvaWQKLSAgICAvLyBvciBjbGVhciBpdCBhbnl3YXksIHNvIGRvbid0IHdv
cnJ5IGFib3V0IGFueSBmbG9hdGluZyBjaGlsZHJlbiBpdCBtYXkgY29udGFpbi4KLSAgICBMYXlv
dXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsVG9wKTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC0+cHJl
dmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJCbG9ja0Zsb3co
KSAmJiAhcHJldi0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAg
IFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7Ci0gICAgICAgIGlmIChi
bG9jay0+Y29udGFpbnNGbG9hdHMoKSAmJiAhYmxvY2stPmF2b2lkc0Zsb2F0cygpICYmIChibG9j
ay0+bG9naWNhbFRvcCgpICsgYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpKSA+IGxv
Z2ljYWxUb3ApIAotICAgICAgICAgICAgYWRkT3ZlcmhhbmdpbmdGbG9hdHMoYmxvY2ssIGZhbHNl
KTsKLSAgICB9Ci0gICAgc2V0TG9naWNhbEhlaWdodChvbGRMb2dpY2FsSGVpZ2h0KTsKLQotICAg
IHJldHVybiBsb2dpY2FsVG9wOwotfQotCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrOjpjbGVhckZs
b2F0c0lmTmVlZGVkKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExh
eW91dFVuaXQgb2xkVG9wUG9zTWFyZ2luLCBMYXlvdXRVbml0IG9sZFRvcE5lZ01hcmdpbiwgTGF5
b3V0VW5pdCB5UG9zKQotewotICAgIExheW91dFVuaXQgaGVpZ2h0SW5jcmVhc2UgPSBnZXRDbGVh
ckRlbHRhKGNoaWxkLCB5UG9zKTsKLSAgICBpZiAoIWhlaWdodEluY3JlYXNlKQotICAgICAgICBy
ZXR1cm4geVBvczsKLQotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsK
LSAgICAgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW4gPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSB8fCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGQp
OwotCi0gICAgICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgY2xlYXIsIHRo
ZXkgY2FuIHN0aWxsIGNvbGxhcHNlIHRoZWlyCi0gICAgICAgIC8vIG1hcmdpbnMgd2l0aCBmb2xs
b3dpbmcgc2libGluZ3MuICBSZXNldCB0aGUgY3VycmVudCBtYXJnaW5zIHRvIHJlcHJlc2VudAot
ICAgICAgICAvLyB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrJ3MgbWFyZ2lucyBvbmx5LgotICAg
ICAgICAvLyBJZiBESVNDQVJEIGlzIHNwZWNpZmllZCBmb3IgLXdlYmtpdC1tYXJnaW4tY29sbGFw
c2UsIHJlc2V0IHRoZSBtYXJnaW4gdmFsdWVzLgotICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1h
cmdpbikgewotICAgICAgICAgICAgTWFyZ2luVmFsdWVzIGNoaWxkTWFyZ2lucyA9IG1hcmdpblZh
bHVlc0ZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVN
YXJnaW4obWF4KGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpLCBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z2F0aXZlTWFyZ2luKG1heChjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSwgY2hp
bGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXRE
aXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbik7Ci0KLSAgICAgICAgLy8gQ1NTMi4xIHN0
YXRlczoKLSAgICAgICAgLy8gIklmIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIG9mIGFuIGVs
ZW1lbnQgd2l0aCBjbGVhcmFuY2UgYXJlIGFkam9pbmluZywgaXRzIG1hcmdpbnMgY29sbGFwc2Ug
d2l0aCAKLSAgICAgICAgLy8gdGhlIGFkam9pbmluZyBtYXJnaW5zIG9mIGZvbGxvd2luZyBzaWJs
aW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhl
IGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4iCi0gICAgICAgIC8vIFNvIHRoZSBw
YXJlbnQncyBib3R0b20gbWFyZ2luIGNhbm5vdCBjb2xsYXBzZSB0aHJvdWdoIHRoaXMgYmxvY2sg
b3IgYW55IHN1YnNlcXVlbnQgc2VsZi1jb2xsYXBzaW5nIGJsb2Nrcy4gQ2hlY2sgc3Vic2VxdWVu
dCBzaWJsaW5ncwotICAgICAgICAvLyBmb3IgYSBibG9jayB3aXRoIGhlaWdodCAtIGlmIG5vbmUg
aXMgZm91bmQgdGhlbiBkb24ndCBhbGxvdyB0aGUgbWFyZ2lucyB0byBjb2xsYXBzZSB3aXRoIHRo
ZSBwYXJlbnQuCi0gICAgICAgIGJvb2wgd291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50ID0g
bWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKCk7Ci0gICAgICAg
IGZvciAoUmVuZGVyQm94KiBjdXJyID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCk7IGN1cnIgJiYg
d291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50OyBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmdC
b3goKSkgewotICAgICAgICAgICAgaWYgKCFjdXJyLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3Np
dGlvbmVkKCkgJiYgIWN1cnItPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICAgICAg
ICAgIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIGlmICh3b3VsZENvbGxhcHNlTWFyZ2luc1dpdGhQYXJlbnQpCi0gICAgICAgICAgICBt
YXJnaW5JbmZvLnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4oZmFsc2UpOwot
Ci0gICAgICAgIC8vIENTUzIuMTogInRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCBzbyB0
aGF0IGNsZWFyYW5jZSArIG1hcmdpbi10b3AgPSBbaGVpZ2h0IG9mIGZsb2F0XSwgaS5lLiwgY2xl
YXJhbmNlID0gW2hlaWdodCBvZiBmbG9hdF0gLSBtYXJnaW4tdG9wIgotICAgICAgICAvLyBNb3Zl
IHRoZSB0b3Agb2YgdGhlIGNoaWxkIGJveCB0byB0aGUgYm90dG9tIG9mIHRoZSBmbG9hdCBpZ25v
cmluZyB0aGUgY2hpbGQncyB0b3AgbWFyZ2luLgotICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNl
ZE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChjaGlsZC0+bG9naWNhbFRvcCgpIC0gY29sbGFwc2VkTWFyZ2luKTsK
LSAgICAgICAgLy8gQSBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luLXRvcCB2YWx1ZSBjYW5jZWxz
IGl0c2VsZiBvdXQgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBmYWN0b3JlZCBpbnRvIHx5UG9zfCBh
Ym92ZS4KLSAgICAgICAgaGVpZ2h0SW5jcmVhc2UgLT0gbWF4KExheW91dFVuaXQoKSwgY29sbGFw
c2VkTWFyZ2luKTsKLSAgICB9IGVsc2UKLSAgICAgICAgLy8gSW5jcmVhc2Ugb3VyIGhlaWdodCBi
eSB0aGUgYW1vdW50IHdlIGhhZCB0byBjbGVhci4KLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBoZWlnaHRJbmNyZWFzZSk7Ci0gICAgCi0gICAgaWYgKG1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKLSAgICAgICAgLy8gV2UgY2FuIG5v
IGxvbmdlciBjb2xsYXBzZSB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrIHNpbmNlIGEgY2xlYXIK
LSAgICAgICAgLy8gb2NjdXJyZWQuICBUaGUgZW1wdHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhl
IGNsZWFyZWQgYmxvY2suCi0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJl
Y3QuICBOZWVkIGNsYXJpZmljYXRpb24gZm9yIHdoYXQgdG8gZG8KLSAgICAgICAgLy8gaWYgdGhl
IGhlaWdodCB0aGUgY2xlYXJlZCBibG9jayBpcyBvZmZzZXQgYnkgaXMgc21hbGxlciB0aGFuIHRo
ZQotICAgICAgICAvLyBtYXJnaW5zIGludm9sdmVkLgotICAgICAgICBzZXRNYXhNYXJnaW5CZWZv
cmVWYWx1ZXMob2xkVG9wUG9zTWFyZ2luLCBvbGRUb3BOZWdNYXJnaW4pOwotICAgICAgICBtYXJn
aW5JbmZvLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgICAgIC8vIEluIGNh
c2UgdGhlIGNoaWxkIGRpc2NhcmRlZCB0aGUgYmVmb3JlIG1hcmdpbiBvZiB0aGUgYmxvY2sgd2Ug
bmVlZCB0byByZXNldCB0aGUgbXVzdERpc2NhcmRNYXJnaW5CZWZvcmUgZmxhZyB0byB0aGUgaW5p
dGlhbCB2YWx1ZS4KLSAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0gICAgfQotCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wID0geVBvcyArIGhlaWdodEluY3JlYXNlOwotICAgIC8vIEFmdGVyIG1h
cmdpbiBjb2xsYXBzaW5nLCBvbmUgb2Ygb3VyIGZsb2F0cyBtYXkgbm93IGludHJ1ZGUgaW50byB0
aGUgY2hpbGQuIElmIHRoZSBjaGlsZCBkb2Vzbid0IGNvbnRhaW4gZmxvYXRzIG9mIGl0cyBvd24g
aXQKLSAgICAvLyB3b24ndCBnZXQgcGlja2VkIHVwIGZvciByZWxheW91dCBldmVuIHRob3VnaCB0
aGUgbG9naWNhbCB0b3AgZXN0aW1hdGUgd2FzIHdyb25nIC0gc28gYWRkIHRoZSBuZXdseSBpbnRy
dWRpbmcgZmxvYXQgbm93LgotICAgIGlmIChjb250YWluc0Zsb2F0cygpICYmIGNoaWxkLT5pc1Jl
bmRlckJsb2NrKCkgJiYgIXRvUmVuZGVyQmxvY2soY2hpbGQpLT5jb250YWluc0Zsb2F0cygpICYm
ICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wKQotICAgICAgICB0b1JlbmRlckJsb2NrKGNoaWxkKS0+YWRkSW50cnVkaW5nRmxv
YXRzKHRoaXMsIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudCgpLCBsb2dpY2FsVG9wKTsKLQot
ICAgIHJldHVybiBsb2dpY2FsVG9wOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjptYXJnaW5CZWZv
cmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQmIHBvc2l0aXZl
TWFyZ2luQmVmb3JlLCBMYXlvdXRVbml0JiBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgYm9vbCYgZGlz
Y2FyZE1hcmdpbkJlZm9yZSkgY29uc3QKLXsKLSAgICAvLyBHaXZlIHVwIGlmIGluIHF1aXJrcyBt
b2RlIGFuZCB3ZSdyZSBhIGJvZHkvdGFibGUgY2VsbCBhbmQgdGhlIHRvcCBtYXJnaW4gb2YgdGhl
IGNoaWxkIGJveCBpcyBxdWlya3kuCi0gICAgLy8gR2l2ZSB1cCBpZiB0aGUgY2hpbGQgc3BlY2lm
aWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlOiBzZXBhcmF0ZSB0aGF0IHByZXZlbnRzIGNvbGxh
cHNpbmcuCi0gICAgLy8gRklYTUU6IFVzZSB3cml0aW5nIG1vZGUgaW5kZXBlbmRlbnQgYWNjZXNz
b3IgZm9yIG1hcmdpbkJlZm9yZUNvbGxhcHNlLgotICAgIGlmICgoZG9jdW1lbnQoKS5pblF1aXJr
c01vZGUoKSAmJiBoYXNNYXJnaW5BZnRlclF1aXJrKGNoaWxkKSAmJiAoaXNUYWJsZUNlbGwoKSB8
fCBpc0JvZHkoKSkpIHx8IGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09
IE1TRVBBUkFURSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhlIG1hcmdpbnMgYXJlIGRp
c2NhcmRlZCBieSBhIGNoaWxkIHRoYXQgc3BlY2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNl
OiBkaXNjYXJkLgotICAgIC8vIEZJWE1FOiBVc2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFj
Y2Vzc29yIGZvciBtYXJnaW5CZWZvcmVDb2xsYXBzZS4KLSAgICBpZiAoY2hpbGQtPnN0eWxlKCkt
Pm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgcG9zaXRpdmVN
YXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7Ci0gICAg
ICAgIGRpc2NhcmRNYXJnaW5CZWZvcmUgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgTGF5b3V0VW5pdCBiZWZvcmVDaGlsZE1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxk
KGNoaWxkKTsKLSAgICBwb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IG1heChwb3NpdGl2ZU1hcmdpbkJl
Zm9yZSwgYmVmb3JlQ2hpbGRNYXJnaW4pOwotICAgIG5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4
KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCAtYmVmb3JlQ2hpbGRNYXJnaW4pOwotCi0gICAgaWYgKCFj
aGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSB0b1JlbmRlckJsb2NrKGNoaWxkKTsKLSAgICBpZiAoY2hpbGRC
bG9jay0+Y2hpbGRyZW5JbmxpbmUoKSB8fCBjaGlsZEJsb2NrLT5pc1dyaXRpbmdNb2RlUm9vdCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBNYXJnaW5JbmZvIGNoaWxkTWFyZ2luSW5mbyhjaGls
ZEJsb2NrLCBjaGlsZEJsb2NrLT5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCksIGNoaWxkQmxvY2st
PmJvcmRlckFuZFBhZGRpbmdBZnRlcigpKTsKLSAgICBpZiAoIWNoaWxkTWFyZ2luSW5mby5jYW5D
b2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBSZW5kZXJCb3gqIGdyYW5kY2hpbGRCb3ggPSBjaGlsZEJsb2NrLT5maXJzdENoaWxkQm94KCk7
Ci0gICAgZm9yICggOyBncmFuZGNoaWxkQm94OyBncmFuZGNoaWxkQm94ID0gZ3JhbmRjaGlsZEJv
eC0+bmV4dFNpYmxpbmdCb3goKSkgewotICAgICAgICBpZiAoIWdyYW5kY2hpbGRCb3gtPmlzRmxv
YXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICAKLSAgICAvLyBHaXZlIHVwIGlmIHRoZXJlIGlzIGNsZWFyYW5jZSBvbiB0aGUgYm94LCBz
aW5jZSBpdCBwcm9iYWJseSB3b24ndCBjb2xsYXBzZSBpbnRvIHVzLgotICAgIGlmICghZ3JhbmRj
aGlsZEJveCB8fCBncmFuZGNoaWxkQm94LT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBibG9jayBtYXJn
aW5zIG5vdyBmb3IgdGhlIGdyYW5kY2hpbGQgYm94IHNvIHRoYXQgd2UncmUgbG9va2luZyBhdCBj
dXJyZW50IHZhbHVlcy4KLSAgICBpZiAoZ3JhbmRjaGlsZEJveC0+bmVlZHNMYXlvdXQoKSkgewot
ICAgICAgICBncmFuZGNoaWxkQm94LT5jb21wdXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5z
KHRoaXMpOwotICAgICAgICBpZiAoZ3JhbmRjaGlsZEJveC0+aXNSZW5kZXJCbG9jaygpKSB7Ci0g
ICAgICAgICAgICBSZW5kZXJCbG9jayogZ3JhbmRjaGlsZEJsb2NrID0gdG9SZW5kZXJCbG9jayhn
cmFuZGNoaWxkQm94KTsKLSAgICAgICAgICAgIGdyYW5kY2hpbGRCbG9jay0+c2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoZ3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQmVmb3JlUXVpcmso
KSk7Ci0gICAgICAgICAgICBncmFuZGNoaWxkQmxvY2stPnNldEhhc01hcmdpbkFmdGVyUXVpcmso
Z3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQWZ0ZXJRdWlyaygpKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIENvbGxhcHNlIHRoZSBtYXJnaW4gb2YgdGhlIGdyYW5kY2hpbGQg
Ym94IHdpdGggb3VyIG93biB0byBwcm9kdWNlIGFuIGVzdGltYXRlLgotICAgIGNoaWxkQmxvY2st
Pm1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoZ3JhbmRjaGlsZEJveCwgcG9zaXRpdmVNYXJn
aW5CZWZvcmUsIG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKLX0K
LQotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6ZXN0aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24oUmVu
ZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYg
ZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbikKLXsKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBl
bGltaW5hdGUgdGhlIGVzdGltYXRpb24gb2YgdmVydGljYWwgcG9zaXRpb24sIGJlY2F1c2Ugd2hl
biBpdCdzIHdyb25nIHdlIHNvbWV0aW1lcyB0cmlnZ2VyIGEgcGF0aG9sb2dpY2FsCi0gICAgLy8g
cmVsYXlvdXQgaWYgdGhlcmUgYXJlIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgTGF5b3V0VW5pdCBs
b2dpY2FsVG9wRXN0aW1hdGUgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKCFtYXJnaW5JbmZv
LmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgcG9z
aXRpdmVNYXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2lu
QmVmb3JlID0gMDsKLSAgICAgICAgYm9vbCBkaXNjYXJkTWFyZ2luQmVmb3JlID0gZmFsc2U7Ci0g
ICAgICAgIGlmIChjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgIC8vIFRy
eSB0byBkbyBhIGJhc2ljIGVzdGltYXRpb24gb2YgaG93IHRoZSBjb2xsYXBzZSBpcyBnb2luZyB0
byBnby4KLSAgICAgICAgICAgIG1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoY2hpbGQsIHBv
c2l0aXZlTWFyZ2luQmVmb3JlLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgZGlzY2FyZE1hcmdpbkJl
Zm9yZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIGNhY2hlZCBj
b2xsYXBzZWQgbWFyZ2luIHZhbHVlcyBmcm9tIGEgcHJldmlvdXMgbGF5b3V0LiBNb3N0IG9mIHRo
ZSB0aW1lIHRoZXkKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgcmlnaHQuCi0gICAgICAgICAgICBN
YXJnaW5WYWx1ZXMgbWFyZ2luVmFsdWVzID0gbWFyZ2luVmFsdWVzRm9yQ2hpbGQoY2hpbGQpOwot
ICAgICAgICAgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSBtYXgocG9zaXRpdmVNYXJnaW5CZWZv
cmUsIG1hcmdpblZhbHVlcy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIG5l
Z2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBtYXJnaW5WYWx1
ZXMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSk7Ci0gICAgICAgICAgICBkaXNjYXJkTWFyZ2luQmVm
b3JlID0gbXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCk7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBDb2xsYXBzZSB0aGUgcmVzdWx0IHdpdGggb3VyIGN1cnJlbnQgbWFyZ2lu
cy4KLSAgICAgICAgaWYgKCFkaXNjYXJkTWFyZ2luQmVmb3JlKQotICAgICAgICAgICAgbG9naWNh
bFRvcEVzdGltYXRlICs9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc2l0aXZl
TWFyZ2luQmVmb3JlKSAtIG1heChtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCksIG5lZ2F0aXZl
TWFyZ2luQmVmb3JlKTsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgbG9naWNhbFRvcEVzdGltYXRl
IGRvd24gdG8gdGhlIG5leHQgcGFnZSBpZiB0aGUgbWFyZ2lucyBhcmUgc28gbGFyZ2UgdGhhdCB3
ZSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQKLSAgICAvLyBwYWdlLgotICAgIExheW91dFN0YXRl
KiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpOwotICAgIGlmIChsYXlvdXRTdGF0
ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFnZUxvZ2ljYWxIZWlnaHQoKSAmJiBs
b2dpY2FsVG9wRXN0aW1hdGUgPiBsb2dpY2FsSGVpZ2h0KCkKLSAgICAgICAgJiYgaGFzTmV4dFBh
Z2UobG9naWNhbEhlaWdodCgpKSkKLSAgICAgICAgbG9naWNhbFRvcEVzdGltYXRlID0gbWluKGxv
Z2ljYWxUb3BFc3RpbWF0ZSwgbmV4dFBhZ2VMb2dpY2FsVG9wKGxvZ2ljYWxIZWlnaHQoKSkpOwot
Ci0gICAgbG9naWNhbFRvcEVzdGltYXRlICs9IGdldENsZWFyRGVsdGEoY2hpbGQsIGxvZ2ljYWxU
b3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiA9IGxvZ2lj
YWxUb3BFc3RpbWF0ZTsKLQotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSkgewot
ICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29sdW1uIGJyZWFrIHZhbHVl
IG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUgdG9wIG9mIHRoZSBuZXh0
IHBhZ2UuCi0gICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IGFwcGx5QmVmb3JlQnJlYWsoY2hp
bGQsIGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgICAgIC8vIEZvciByZXBsYWNlZCBl
bGVtZW50cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0
aGUgbmV4dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICAg
ICAgbG9naWNhbFRvcEVzdGltYXRlID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGQs
IGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWNoaWxkLT5zZWxm
TmVlZHNMYXlvdXQoKSAmJiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICAgICAgbG9n
aWNhbFRvcEVzdGltYXRlICs9IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5wYWdpbmF0aW9uU3RydXQo
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9naWNhbFRvcEVzdGltYXRlOwotfQotCiBMYXlvdXRV
bml0IFJlbmRlckJsb2NrOjpjb21wdXRlU3RhcnRQb3NpdGlvbkRlbHRhRm9yQ2hpbGRBdm9pZGlu
Z0Zsb2F0cyhjb25zdCBSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGNoaWxkTWFyZ2luU3Rh
cnQsIFJlbmRlclJlZ2lvbiogcmVnaW9uKQogewogICAgIExheW91dFVuaXQgc3RhcnRQb3NpdGlv
biA9IHN0YXJ0T2Zmc2V0Rm9yQ29udGVudChyZWdpb24pOwpAQCAtMjMyMSw1MSArMTkxNiw2IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmRldGVybWluZUxvZ2ljYWxMZWZ0UG8KICAgICBzZXRMb2dpY2Fs
TGVmdEZvckNoaWxkKGNoaWxkLCBzdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBu
ZXdQb3NpdGlvbiA6IHRvdGFsQXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gbmV3UG9zaXRpb24gLSBs
b2dpY2FsV2lkdGhGb3JDaGlsZChjaGlsZCksIGFwcGx5RGVsdGEpOwogfQogCi12b2lkIFJlbmRl
ckJsb2NrOjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4oY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2lu
SW5mbykKLXsKLSAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5BZnRlcigp
ICYmICFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAg
IC8vIFVwZGF0ZSB0aGUgYWZ0ZXIgc2lkZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB0byBkaXNj
YXJkIGlmIHRoZSBhZnRlciBtYXJnaW4gb2YgdGhlIGxhc3QgY2hpbGQgYWxzbyBkaXNjYXJkcyBh
bmQgd2UgY29sbGFwc2Ugd2l0aCBpdC4KLSAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSBtYXgg
bWFyZ2luIHZhbHVlcyBiZWNhdXNlIHdlIHdvbid0IG5lZWQgdGhlbSBhbnl3YXkuCi0gICAgICAg
IGlmIChtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgc2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gVXBkYXRlIG91ciBtYXggcG9zL25lZyBib3R0b20gbWFyZ2lucywgc2luY2Ugd2Ug
Y29sbGFwc2VkIG91ciBib3R0b20gbWFyZ2lucwotICAgICAgICAvLyB3aXRoIG91ciBjaGlsZHJl
bi4KLSAgICAgICAgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMobWF4KG1heFBvc2l0aXZlTWFyZ2lu
QWZ0ZXIoKSwgbWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpKSwgbWF4KG1heE5lZ2F0aXZlTWFy
Z2luQWZ0ZXIoKSwgbWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpKSk7Ci0KLSAgICAgICAgaWYg
KCFtYXJnaW5JbmZvLmhhc01hcmdpbkFmdGVyUXVpcmsoKSkKLSAgICAgICAgICAgIHNldEhhc01h
cmdpbkFmdGVyUXVpcmsoZmFsc2UpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLmhhc01hcmdp
bkFmdGVyUXVpcmsoKSAmJiAhbWFyZ2luQWZ0ZXIoKSkKLSAgICAgICAgICAgIC8vIFdlIGhhdmUg
bm8gYm90dG9tIG1hcmdpbiBhbmQgb3VyIGxhc3QgY2hpbGQgaGFzIGEgcXVpcmt5IG1hcmdpbi4K
LSAgICAgICAgICAgIC8vIFdlIHdpbGwgcGljayB1cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBh
c3MgaXQgdGhyb3VnaC4KLSAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMgd2l0aCB0aGUgPHRkPjxk
aXY+PHA+IGNhc2UuCi0gICAgICAgICAgICBzZXRIYXNNYXJnaW5BZnRlclF1aXJrKHRydWUpOwot
ICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6aGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IGJlZm9yZVNpZGUsIExheW91dFVuaXQgYWZ0ZXJTaWRlLCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQotewotICAgIG1hcmdpbkluZm8uc2V0QXRBZnRlclNpZGVPZkJsb2NrKHRydWUpOwot
Ci0gICAgLy8gSWYgd2UgY2FuJ3QgY29sbGFwc2Ugd2l0aCBjaGlsZHJlbiB0aGVuIGdvIGFoZWFk
IGFuZCBhZGQgaW4gdGhlIGJvdHRvbSBtYXJnaW4uCi0gICAgaWYgKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQWZ0ZXIoKSAm
JiAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKQotICAgICAgICAmJiAo
IWRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIo
KSB8fCAhbWFyZ2luSW5mby5oYXNNYXJnaW5BZnRlclF1aXJrKCkpKSkKLSAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdpbigpKTsKLSAgICAg
ICAgCi0gICAgLy8gTm93IGFkZCBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nLgotICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJTaWRlKTsKLQotICAgIC8vIE5l
Z2F0aXZlIG1hcmdpbnMgY2FuIGNhdXNlIG91ciBoZWlnaHQgdG8gc2hyaW5rIGJlbG93IG91ciBt
aW5pbWFsIGhlaWdodCAoYm9yZGVyL3BhZGRpbmcpLgotICAgIC8vIElmIHRoaXMgaGFwcGVucywg
ZW5zdXJlIHRoYXQgdGhlIGNvbXB1dGVkIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gdGhlIG1pbmlt
YWwgaGVpZ2h0LgotICAgIHNldExvZ2ljYWxIZWlnaHQobWF4KGxvZ2ljYWxIZWlnaHQoKSwgYmVm
b3JlU2lkZSArIGFmdGVyU2lkZSkpOwotCi0gICAgLy8gVXBkYXRlIG91ciBib3R0b20gY29sbGFw
c2VkIG1hcmdpbiBpbmZvLgotICAgIHNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihtYXJnaW5JbmZv
KTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0TG9naWNhbExlZnRGb3JDaGlsZChSZW5kZXJC
b3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBBcHBseUxheW91dERlbHRhTW9kZSBh
cHBseURlbHRhKQogewogICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7CkBAIC0y
NDM1LDE2MCArMTk4NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRpcnR5Rm9yTGF5b3V0RnJvbVBl
cmMKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dEJsb2NrQ2hpbGQoUmVuZGVy
Qm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYgcHJldmlvdXNG
bG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZsb2F0TG9naWNhbEJvdHRvbSkKLXsK
LSAgICBMYXlvdXRVbml0IG9sZFBvc01hcmdpbkJlZm9yZSA9IG1heFBvc2l0aXZlTWFyZ2luQmVm
b3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBvbGROZWdNYXJnaW5CZWZvcmUgPSBtYXhOZWdhdGl2ZU1h
cmdpbkJlZm9yZSgpOwotCi0gICAgLy8gVGhlIGNoaWxkIGlzIGEgbm9ybWFsIGZsb3cgb2JqZWN0
LiAgQ29tcHV0ZSB0aGUgbWFyZ2lucyB3ZSB3aWxsIHVzZSBmb3IgY29sbGFwc2luZyBub3cuCi0g
ICAgY2hpbGQtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7Ci0KLSAg
ICAvLyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgbG9naWNhbCB0b3AgcG9zaXRpb24uICBJbiBt
b3N0IGNhc2VzIHRoaXMgZ3Vlc3Mgd2lsbAotICAgIC8vIGJlIGNvcnJlY3QuICBPbmx5IGlmIHdl
J3JlIHdyb25nICh3aGVuIHdlIGNvbXB1dGUgdGhlIHJlYWwgbG9naWNhbCB0b3AgcG9zaXRpb24p
Ci0gICAgLy8gd2lsbCB3ZSBoYXZlIHRvIHBvdGVudGlhbGx5IHJlbGF5b3V0LgotICAgIExheW91
dFVuaXQgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbjsKLSAgICBMYXlvdXRVbml0IGxvZ2ljYWxU
b3BFc3RpbWF0ZSA9IGVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKGNoaWxkLCBtYXJnaW5JbmZv
LCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uKTsKLQotICAgIC8vIENhY2hlIG91ciBvbGQgcmVj
dCBzbyB0aGF0IHdlIGNhbiBkaXJ0eSB0aGUgcHJvcGVyIHJlcGFpbnQgcmVjdHMgaWYgdGhlIGNo
aWxkIG1vdmVzLgotICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkLT5mcmFtZVJlY3QoKTsK
LSAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQp
OwotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEg
PSB2aWV3KCkubGF5b3V0RGVsdGEoKTsKLSNlbmRpZgotICAgIC8vIEdvIGFoZWFkIGFuZCBwb3Np
dGlvbiB0aGUgY2hpbGQgYXMgdGhvdWdoIGl0IGRpZG4ndCBjb2xsYXBzZSB3aXRoIHRoZSB0b3Au
Ci0gICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUsIEFw
cGx5TGF5b3V0RGVsdGEpOwotICAgIGVzdGltYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGlsZChjaGls
ZCk7Ci0KLSAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRl
ckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7Ci0gICAgYm9vbCBtYXJrRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzID0gZmFsc2U7Ci0gICAgaWYgKGxvZ2ljYWxUb3BFc3RpbWF0ZSAhPSBv
bGRMb2dpY2FsVG9wICYmICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9j
ayAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICBtYXJrRGVz
Y2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSNpZiBFTkFCTEUoU1VCUElYRUxfTEFZT1VUKQot
ICAgIGVsc2UgaWYgKFVOTElLRUxZKGxvZ2ljYWxUb3BFc3RpbWF0ZS5taWdodEJlU2F0dXJhdGVk
KCkpKQotICAgICAgICAvLyBsb2dpY2FsVG9wRXN0aW1hdGUsIHJldHVybmVkIGJ5IGVzdGltYXRl
TG9naWNhbFRvcFBvc2l0aW9uLCBtaWdodCBiZSBzYXR1cmF0ZWQgZm9yCi0gICAgICAgIC8vIHZl
cnkgbGFyZ2UgZWxlbWVudHMuIElmIGl0IGRvZXMgdGhlIGNvbXBhcmlzb24gd2l0aCBvbGRMb2dp
Y2FsVG9wIG1pZ2h0IHlpZWxkIGEKLSAgICAgICAgLy8gZmFsc2UgbmVnYXRpdmUgYXMgYWRkaW5n
IGFuZCByZW1vdmluZyBtYXJnaW5zLCBib3JkZXJzIGV0YyBmcm9tIGEgc2F0dXJhdGVkIG51bWJl
cgotICAgICAgICAvLyBtaWdodCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cy4gSWYgdGhpcyBpcyB0
aGUgY2FzZSBhbHdheXMgbWFyayBmb3IgbGF5b3V0LgotICAgICAgICBtYXJrRGVzY2VuZGFudHNX
aXRoRmxvYXRzID0gdHJ1ZTsKLSNlbmRpZgotICAgIGVsc2UgaWYgKCFjaGlsZC0+YXZvaWRzRmxv
YXRzKCkgfHwgY2hpbGQtPnNocmlua1RvQXZvaWRGbG9hdHMoKSkgewotICAgICAgICAvLyBJZiBh
biBlbGVtZW50IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHRo
ZW4gYWx3YXlzIG1hcmsgaXQgZm9yCi0gICAgICAgIC8vIGxheW91dC4KLSAgICAgICAgTGF5b3V0
VW5pdCBmYiA9IG1heChwcmV2aW91c0Zsb2F0TG9naWNhbEJvdHRvbSwgbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tKCkpOwotICAgICAgICBpZiAoZmIgPiBsb2dpY2FsVG9wRXN0aW1hdGUpCi0gICAg
ICAgICAgICBtYXJrRGVzY2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICBpZiAobWFya0Rlc2NlbmRhbnRzV2l0aEZs
b2F0cykKLSAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJv
b3QoKSkKLSAgICAgICAgICAgIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KHByZXZp
b3VzRmxvYXRMb2dpY2FsQm90dG9tLCBvbGRMb2dpY2FsVG9wICsgY2hpbGRSZW5kZXJCbG9jay0+
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpOwotICAgIH0KLQotICAgIGlmICghY2hpbGQtPm5l
ZWRzTGF5b3V0KCkpCi0gICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZO
ZWVkZWQoKTsKLQotICAgIGJvb2wgY2hpbGRIYWRMYXlvdXQgPSBjaGlsZC0+ZXZlckhhZExheW91
dCgpOwotICAgIGJvb2wgY2hpbGROZWVkZWRMYXlvdXQgPSBjaGlsZC0+bmVlZHNMYXlvdXQoKTsK
LSAgICBpZiAoY2hpbGROZWVkZWRMYXlvdXQpCi0gICAgICAgIGNoaWxkLT5sYXlvdXQoKTsKLQot
ICAgIC8vIENhY2hlIGlmIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayByaWdodCBub3cu
Ci0gICAgYm9vbCBhdEJlZm9yZVNpZGVPZkJsb2NrID0gbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVP
ZkJsb2NrKCk7Ci0KLSAgICAvLyBOb3cgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHlwb3MgYmFzZWQg
b2ZmIGV4YW1pbmF0aW9uIG9mIGNvbGxhcHNpbmcgbWFyZ2luCi0gICAgLy8gdmFsdWVzLgotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZUNsZWFyID0gY29sbGFwc2VNYXJnaW5zKGNoaWxk
LCBtYXJnaW5JbmZvKTsKLQotICAgIC8vIE5vdyBjaGVjayBmb3IgY2xlYXIuCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciA9IGNsZWFyRmxvYXRzSWZOZWVkZWQoY2hpbGQsIG1h
cmdpbkluZm8sIG9sZFBvc01hcmdpbkJlZm9yZSwgb2xkTmVnTWFyZ2luQmVmb3JlLCBsb2dpY2Fs
VG9wQmVmb3JlQ2xlYXIpOwotICAgIAotICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmxheW91
dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7Ci0gICAgaWYgKHBhZ2luYXRlZCkKLSAgICAgICAgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBhZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihsb2dpY2Fs
VG9wQWZ0ZXJDbGVhciwgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiwgY2hpbGQsCi0gICAgICAg
ICAgICBhdEJlZm9yZVNpZGVPZkJsb2NrICYmIGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9PSBsb2dp
Y2FsVG9wQWZ0ZXJDbGVhcik7Ci0KLSAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxv
Z2ljYWxUb3BBZnRlckNsZWFyLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIC8vIE5vdyB3ZSBo
YXZlIGEgZmluYWwgdG9wIHBvc2l0aW9uLiAgU2VlIGlmIGl0IHJlYWxseSBkb2VzIGVuZCB1cCBi
ZWluZyBkaWZmZXJlbnQgZnJvbSBvdXIgZXN0aW1hdGUuCi0gICAgLy8gY2xlYXJGbG9hdHNJZk5l
ZWRlZCBjYW4gYWxzbyBtYXJrIHRoZSBjaGlsZCBhcyBuZWVkaW5nIGEgbGF5b3V0IGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndCBtb3ZlLiBUaGlzIGhhcHBlbnMKLSAgICAvLyB3aGVuIGNvbGxhcHNlTWFy
Z2lucyBkeW5hbWljYWxseSBhZGRzIG92ZXJoYW5naW5nIGZsb2F0cyBiZWNhdXNlIG9mIGEgY2hp
bGQgd2l0aCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgIGlmIChsb2dpY2FsVG9wQWZ0ZXJDbGVhciAh
PSBsb2dpY2FsVG9wRXN0aW1hdGUgfHwgY2hpbGQtPm5lZWRzTGF5b3V0KCkgfHwgKHBhZ2luYXRl
ZCAmJiBjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxvY2stPnNob3VsZEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KCkpKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZs
b2F0cygpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRo
ZSBsaW5lIHdpZHRoLgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNs
ZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KLSAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVz
ZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCi0gICAgICAgICAgICAvLyBTbyBn
byBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGNoaWxkLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWNo
aWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygp
KQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0
KCkpCi0gICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5l
ZWRlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFr
ZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCi0gICAgICAgIGNoaWxkLT5sYXlvdXRJ
Zk5lZWRlZCgpOwotICAgIH0KLQotICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxk
KGNoaWxkKSkgewotICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSwgTWFya09ubHlU
aGlzKTsKLSAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgfQotCi0gICAgLy8g
V2UgYXJlIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIg
YSBub24tZW1wdHkgY2hpbGQuICAKLSAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGNo
ZWNraW5nIGZvciBjbGVhciwgc28gdGhhdCBtYXJnaW5zIGNhbiBiZSByZXNldCBpZiBhIGNsZWFy
IG9jY3VycmVkLgotICAgIGlmIChtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAh
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICBtYXJnaW5JbmZvLnNldEF0
QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgLy8gTm93IHBsYWNlIHRoZSBjaGlsZCBp
biB0aGUgY29ycmVjdCBsZWZ0IHBvc2l0aW9uCi0gICAgZGV0ZXJtaW5lTG9naWNhbExlZnRQb3Np
dGlvbkZvckNoaWxkKGNoaWxkLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIExheW91dFNpemUg
Y2hpbGRPZmZzZXQgPSBjaGlsZC0+bG9jYXRpb24oKSAtIG9sZFJlY3QubG9jYXRpb24oKTsKLSNp
ZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSAgICByZWxheW91dFNoYXBlRGVzY2VuZGFudElmTW92ZWQo
Y2hpbGRSZW5kZXJCbG9jaywgY2hpbGRPZmZzZXQpOwotI2VuZGlmCi0KLSAgICAvLyBVcGRhdGUg
b3VyIGhlaWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3Jy
ZWN0IHBvc2l0aW9uLgotICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbG9n
aWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7Ci0gICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkFm
dGVyRm9yQ2hpbGQoY2hpbGQpKSB7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhl
aWdodCgpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICBtYXJnaW5JbmZv
LmNsZWFyTWFyZ2luKCk7Ci0gICAgfQotICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgb3Zlcmhhbmdp
bmcgZmxvYXRzIHRoYXQgaW50cnVkZSBpbnRvIGZvbGxvd2luZyBzaWJsaW5ncyAob3IgcG9zc2li
bHkgb3V0Ci0gICAgLy8gb2YgdGhpcyBibG9jayksIHRoZW4gdGhlIHBhcmVudCBnZXRzIG5vdGlm
aWVkIG9mIHRoZSBmbG9hdHMgbm93LgotICAgIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxk
UmVuZGVyQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIG1heEZsb2F0TG9naWNhbEJv
dHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRv
UmVuZGVyQmxvY2soY2hpbGQpLCAhY2hpbGROZWVkZWRMYXlvdXQpKTsKLQotICAgIGlmIChjaGls
ZE9mZnNldC53aWR0aCgpIHx8IGNoaWxkT2Zmc2V0LmhlaWdodCgpKSB7Ci0gICAgICAgIHZpZXco
KS5hZGRMYXlvdXREZWx0YShjaGlsZE9mZnNldCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNoaWxk
IG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9z
aXRpb25lZAotICAgICAgICAvLyBkZXNjZW5kYW50cy4gIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBu
ZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvCi0gICAg
ICAgIC8vIHJlcGFpbnQgb3Vyc2VsdmVzIChhbmQgdGhlIGNoaWxkKSBhbnl3YXkuCi0gICAgICAg
IGlmIChjaGlsZEhhZExheW91dCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkgJiYgY2hpbGQtPmNoZWNr
Rm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAgY2hpbGQtPnJlcGFpbnREdXJp
bmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOwotICAgIH0KLQotICAgIGlmICghY2hpbGRIYWRMYXlv
dXQgJiYgY2hpbGQtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKSB7Ci0gICAgICAgIGNo
aWxkLT5yZXBhaW50KCk7Ci0gICAgICAgIGNoaWxkLT5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMo
dHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBhZ2luYXRlZCkgewotICAgICAgICAvLyBDaGVjayBm
b3IgYW4gYWZ0ZXIgcGFnZS9jb2x1bW4gYnJlYWsuCi0gICAgICAgIExheW91dFVuaXQgbmV3SGVp
Z2h0ID0gYXBwbHlBZnRlckJyZWFrKGNoaWxkLCBsb2dpY2FsSGVpZ2h0KCksIG1hcmdpbkluZm8p
OwotICAgICAgICBpZiAobmV3SGVpZ2h0ICE9IGhlaWdodCgpKQotICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChuZXdIZWlnaHQpOwotICAgIH0KLQotICAgIEFTU0VSVCh2aWV3KCkubGF5b3V0
RGVsdGFNYXRjaGVzKG9sZExheW91dERlbHRhKSk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNp
bXBsaWZpZWROb3JtYWxGbG93TGF5b3V0KCkKIHsKICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkg
ewpAQCAtNjg1NiwxMjcgKzYyNTIsMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJUcnVuY2F0
aW9uKCkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnNldE1heE1hcmdpbkJlZm9yZVZh
bHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVE
YXRhKSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVN
YXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpICYmIG5lZyA9PSBSZW5kZXJCbG9ja1JhcmVEYXRhOjpu
ZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcykpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlz
KSk7Ci0gICAgfQotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZShwb3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShuZWcpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhNYXJnaW5BZnRlclZhbHVl
cyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVEYXRh
KSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQodGhpcykgJiYgbmVnID09IFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0
aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRoaXMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOwot
ICAgIH0KLSAgICBtX3JhcmVEYXRhLT5tX21hcmdpbnMuc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihw
b3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkFmdGVyKG5l
Zyk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnNldE11c3REaXNjYXJkTWFyZ2luQmVmb3JlKGJv
b2wgdmFsdWUpCi17Ci0gICAgaWYgKHN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAoIW1fcmFyZURhdGEpCi0gICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihu
ZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7Ci0KLSAgICBtX3JhcmVEYXRhLT5tX2Rpc2Nh
cmRNYXJnaW5CZWZvcmUgPSB2YWx1ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6c2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcihib29sIHZhbHVlKQotewotICAgIGlmIChzdHlsZSgpLT5tYXJnaW5B
ZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbV9yYXJlRGF0YSAmJiAhdmFsdWUpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0
YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKLQotICAgIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gdmFsdWU7Ci19Ci0KLWJvb2wgUmVuZGVyQmxv
Y2s6Om11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUo
KS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBt
X3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUpOwotfQotCi1ib29sIFJlbmRlckJsb2Nr
OjptdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEIHx8IChtX3JhcmVEYXRhICYmIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyKTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVz
dERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25z
dAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAgICBpZiAoIWNo
aWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQotICAgICAgICByZXR1cm4gY2hpbGQtPmlzUmVuZGVy
QmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgp
IDogKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsK
LSAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0
b1JlbmRlckJsb2NrKGNoaWxkKS0+bXVzdERpc2NhcmRNYXJnaW5BZnRlcigpIDogKGNoaWxkLT5z
dHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwotCi0gICAgLy8gRklY
TUU6IFdlIHJldHVybiBmYWxzZSBoZXJlIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uIGlzIG5v
dCBnZW9tZXRyaWNhbGx5IGNvbXBsZXRlLiBXZSBoYXZlIHZhbHVlcyBvbmx5IGZvciBiZWZvcmUv
YWZ0ZXIsIG5vdCBzdGFydC9lbmQuCi0gICAgLy8gSW4gY2FzZSB0aGUgYm94ZXMgYXJlIHBlcnBl
bmRpY3VsYXIgd2UgYXNzdW1lIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLgotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVzdERpc2NhcmRNYXJnaW5BZnRl
ckZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFj
aGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOwotICAgIGlmICghY2hpbGQtPmlzV3JpdGluZ01vZGVS
b290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8gdG9SZW5kZXJC
bG9jayhjaGlsZCktPm11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSA6IChjaGlsZC0+c3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsKLSAgICBpZiAoY2hpbGQtPmlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAg
ICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKS0+
bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3Jl
Q29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2Fy
ZE1hcmdpbkJlZm9yZUZvckNoaWxkfCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgUmVuZGVyQmxvY2s6Om11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJl
bmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5
b3V0KCkpOwotICAgIGNvbnN0IFJlbmRlclN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxl
KCk7Ci0gICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKLSAgICAgICAgcmV0dXJu
IGNoaWxkU3R5bGUtPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlm
IChjaGlsZC0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKQotICAgICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgp
ID09IE1TRVBBUkFURTsKLQotICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVm
b3JlRm9yQ2hpbGR8IGFib3ZlLgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJC
bG9jazo6bXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNo
aWxkKSBjb25zdAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAg
ICBjb25zdCBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IGNoaWxkLT5zdHlsZSgpOwotICAgIGlm
ICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZFN0eWxl
LT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlmIChjaGlsZC0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAg
ICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNU0VQQVJB
VEU7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxk
fCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFBh
Z2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KQogewogICAgIGlmICghbV9yYXJlRGF0YSkg
ewogICAgICAgICBpZiAoIXN0cnV0KQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3Jh
cmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOworICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAg
fQogICAgIG1fcmFyZURhdGEtPm1fcGFnaW5hdGlvblN0cnV0ID0gc3RydXQ7CiB9CkBAIC02OTg2
LDcgKzYyNjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldChMCiAg
ICAgaWYgKCFtX3JhcmVEYXRhKSB7CiAgICAgICAgIGlmICghbG9naWNhbE9mZnNldCkKICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJC
bG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBS
ZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIH0KICAgICBtX3JhcmVEYXRhLT5tX3BhZ2VMb2dp
Y2FsT2Zmc2V0ID0gbG9naWNhbE9mZnNldDsKIH0KQEAgLTY5OTUsNyArNjI3Niw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnNldEJyZWFrQXRMaW5lVG9Bdm9pZFcKIHsKICAgICBBU1NFUlQobGluZVRv
QnJlYWspOwogICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0
UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9
IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIG1fcmFyZURhdGEtPm1f
c2hvdWxkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3cgPSB0cnVlOwogICAgIG1fcmFyZURhdGEtPm1f
bGluZUJyZWFrVG9Bdm9pZFdpZG93ID0gbGluZVRvQnJlYWs7CiB9CkBAIC03MTg5LDczICs2NDcw
LDExIEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2s6Om5leHRQYWdlTG9naWNhbFQKICAgICByZXR1
cm4gbG9naWNhbE9mZnNldCArIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7CiB9CiAKLXN0YXRpYyBi
b29sIGluTm9ybWFsRmxvdyhSZW5kZXJCb3gqIGNoaWxkKQotewotICAgIFJlbmRlckJsb2NrKiBj
dXJyID0gY2hpbGQtPmNvbnRhaW5pbmdCbG9jaygpOwotICAgIHdoaWxlIChjdXJyICYmIGN1cnIg
IT0gJmNoaWxkLT52aWV3KCkpIHsKLSAgICAgICAgaWYgKGN1cnItPmhhc0NvbHVtbnMoKSB8fCBj
dXJyLT5pc1JlbmRlckZsb3dUaHJlYWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICBpZiAoY3Vyci0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjdXJyID0gY3Vyci0+Y29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCiBDb2x1bW5JbmZvOjpQYWdpbmF0aW9u
VW5pdCBSZW5kZXJCbG9jazo6cGFnaW5hdGlvblVuaXQoKSBjb25zdAogewogICAgIHJldHVybiBD
b2x1bW5JbmZvOjpDb2x1bW47CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6OmFwcGx5QmVm
b3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KQotewot
ICAgIC8vIEZJWE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9y
dCBwcmludGluZy4KLSAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0
YXRlKCktPmlzUGFnaW5hdGluZ0NvbHVtbnMoKTsKLSAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9
ICFjaGVja0NvbHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNh
bEhlaWdodDsgLy8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVj
ayB0aGlzLgotICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29u
dGFpbmluZ0Jsb2NrKCk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQg
JiYgZmxvd1RocmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKLSAgICBib29sIGNoZWNr
QmVmb3JlQWx3YXlzID0gKGNoZWNrQ29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1
bW5CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxk
LT5zdHlsZSgpLT5wYWdlQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUykKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5y
ZWdpb25CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKTsKLSAgICBpZiAoY2hlY2tCZWZvcmVBbHdh
eXMgJiYgaW5Ob3JtYWxGbG93KGNoaWxkKSAmJiBoYXNOZXh0UGFnZShsb2dpY2FsT2Zmc2V0LCBJ
bmNsdWRlUGFnZUJvdW5kYXJ5KSkgewotICAgICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0g
ICAgICAgICAgICB2aWV3KCkubGF5b3V0U3RhdGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hp
bGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAg
ICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAg
ICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3JjZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9t
TG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBsb2dpY2FsT2Zmc2V0LCBjaGlsZCwgdHJ1ZSwgJm9m
ZnNldEJyZWFrQWRqdXN0bWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZz
ZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5l
eHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2s6OmFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxP
ZmZzZXQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gRklYTUU6IEFkZCBwYWdl
IGJyZWFrIGNoZWNraW5nIGhlcmUgd2hlbiB3ZSBzdXBwb3J0IHByaW50aW5nLgotICAgIGJvb2wg
Y2hlY2tDb2x1bW5CcmVha3MgPSB2aWV3KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0aW5nQ29s
dW1ucygpOwotICAgIGJvb2wgY2hlY2tQYWdlQnJlYWtzID0gIWNoZWNrQ29sdW1uQnJlYWtzICYm
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VMb2dpY2FsSGVpZ2h0OyAvLyBGSVhNRTogT25j
ZSBjb2x1bW5zIGNhbiBwcmludCB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMuCi0gICAgUmVuZGVyRmxv
d1RocmVhZCogZmxvd1RocmVhZCA9IGZsb3dUaHJlYWRDb250YWluaW5nQmxvY2soKTsKLSAgICBi
b29sIGNoZWNrUmVnaW9uQnJlYWtzID0gZmxvd1RocmVhZCAmJiBmbG93VGhyZWFkLT5pc1JlbmRl
ck5hbWVkRmxvd1RocmVhZCgpOwotICAgIGJvb2wgY2hlY2tBZnRlckFsd2F5cyA9IChjaGVja0Nv
bHVtbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+Y29sdW1uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtBZnRl
cigpID09IFBCQUxXQVlTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1Jl
Z2lvbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+cmVnaW9uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKTsKLSAgICBpZiAoY2hlY2tBZnRlckFsd2F5cyAmJiBpbk5vcm1hbEZsb3coY2hpbGQpICYm
IGhhc05leHRQYWdlKGxvZ2ljYWxPZmZzZXQsIEluY2x1ZGVQYWdlQm91bmRhcnkpKSB7Ci0gICAg
ICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhN
YXJnaW5CZWZvcmUoKSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0KLSAg
ICAgICAgLy8gU28gb3VyIG1hcmdpbiBkb2Vzbid0IHBhcnRpY2lwYXRlIGluIHRoZSBuZXh0IGNv
bGxhcHNpbmcgc3RlcHMuCi0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLQotICAg
ICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0gICAgICAgICAgICB2aWV3KCkubGF5b3V0U3Rh
dGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hpbGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAg
ICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0
QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAgICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3Jj
ZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9tTG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBs
b2dpY2FsT2Zmc2V0ICsgbWFyZ2luT2Zmc2V0LCBjaGlsZCwgZmFsc2UsICZvZmZzZXRCcmVha0Fk
anVzdG1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0ICsgbWFyZ2lu
T2Zmc2V0ICsgb2Zmc2V0QnJlYWtBZGp1c3RtZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBuZXh0UGFnZUxvZ2ljYWxUb3AobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFyeSk7
Ci0gICAgfQotICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0OwotfQotCiBMYXlvdXRVbml0IFJlbmRl
ckJsb2NrOjpwYWdlTG9naWNhbFRvcEZvck9mZnNldChMYXlvdXRVbml0IG9mZnNldCkgY29uc3QK
IHsKICAgICBMYXlvdXRVbml0IGZpcnN0UGFnZUxvZ2ljYWxUb3AgPSBpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpID8gdmlldygpLmxheW91dFN0YXRlKCktPm1fcGFnZU9mZnNldC5oZWlnaHQoKSA6
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VPZmZzZXQud2lkdGgoKTsKQEAgLTc0MzcsODcg
KzY2NTYsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RMaW5lUG9zaXRpb25Gb3JQCiAgICAg
ICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VCcmVhayh0cnVlKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5p
dCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5b3V0VW5pdCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0
aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2spCi17Ci0gICAg
UmVuZGVyQmxvY2sqIGNoaWxkUmVuZGVyQmxvY2sgPSBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8g
dG9SZW5kZXJCbG9jayhjaGlsZCkgOiAwOwotCi0gICAgaWYgKGVzdGltYXRlV2l0aG91dFBhZ2lu
YXRpb24gIT0gbG9naWNhbFRvcEFmdGVyQ2xlYXIpIHsKLSAgICAgICAgLy8gT3VyIGd1ZXNzIHBy
aW9yIHRvIHBhZ2luYXRpb24gbW92ZW1lbnQgd2FzIHdyb25nLiBCZWZvcmUgd2UgYXR0ZW1wdCB0
byBwYWdpbmF0ZSwgbGV0J3MgdHJ5IGFnYWluIGF0IHRoZSBuZXcKLSAgICAgICAgLy8gcG9zaXRp
b24uCi0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotICAg
ICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBB
cHBseUxheW91dERlbHRhKTsKLQotICAgICAgICBpZiAoY2hpbGQtPnNocmlua1RvQXZvaWRGbG9h
dHMoKSkgewotICAgICAgICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggZGVwZW5kcyBvbiB0aGUg
bGluZSB3aWR0aC4KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNoaWxkIHNoaWZ0cyB0byBjbGVh
ciBhbiBpdGVtLCBpdHMgd2lkdGggY2FuCi0gICAgICAgICAgICAvLyBjaGFuZ2UgKGJlY2F1c2Ug
aXQgaGFzIG1vcmUgYXZhaWxhYmxlIGxpbmUgd2lkdGgpLgotICAgICAgICAgICAgLy8gU28gZ28g
YWhlYWQgYW5kIG1hcmsgdGhlIGl0ZW0gYXMgZGlydHkuCi0gICAgICAgICAgICBjaGlsZC0+c2V0
Q2hpbGROZWVkc0xheW91dCh0cnVlLCBNYXJrT25seVRoaXMpOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICBpZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICAgICAgaWYgKCFjaGls
ZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkK
LSAgICAgICAgICAgICAgICBjaGlsZFJlbmRlckJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRo
RmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgp
KQotICAgICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVk
ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE91ciBndWVzcyB3YXMgd3JvbmcuIE1ha2Ug
dGhlIGNoaWxkIGxheSBpdHNlbGYgb3V0IGFnYWluLgotICAgICAgICBjaGlsZC0+bGF5b3V0SWZO
ZWVkZWQoKTsKLSAgICB9Ci0KLSAgICBMYXlvdXRVbml0IG9sZFRvcCA9IGxvZ2ljYWxUb3BBZnRl
ckNsZWFyOwotCi0gICAgLy8gSWYgdGhlIG9iamVjdCBoYXMgYSBwYWdlIG9yIGNvbHVtbiBicmVh
ayB2YWx1ZSBvZiAiYmVmb3JlIiwgdGhlbiB3ZSBzaG91bGQgc2hpZnQgdG8gdGhlIHRvcCBvZiB0
aGUgbmV4dCBwYWdlLgotICAgIExheW91dFVuaXQgcmVzdWx0ID0gYXBwbHlCZWZvcmVCcmVhayhj
aGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotCi0gICAgaWYgKHBhZ2VMb2dpY2FsSGVpZ2h0
Rm9yT2Zmc2V0KHJlc3VsdCkpIHsKLSAgICAgICAgTGF5b3V0VW5pdCByZW1haW5pbmdMb2dpY2Fs
SGVpZ2h0ID0gcGFnZVJlbWFpbmluZ0xvZ2ljYWxIZWlnaHRGb3JPZmZzZXQocmVzdWx0LCBFeGNs
dWRlUGFnZUJvdW5kYXJ5KTsKLSAgICAgICAgTGF5b3V0VW5pdCBzcGFjZVNob3J0YWdlID0gY2hp
bGQtPmxvZ2ljYWxIZWlnaHQoKSAtIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7Ci0gICAgICAgIGlm
IChzcGFjZVNob3J0YWdlID4gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGNyb3Nz
ZXMgYSBjb2x1bW4gYm91bmRhcnksIHJlcG9ydCBhIGJyZWFrLCBpbiBjYXNlIG5vdGhpbmcgaW5z
aWRlIGl0IGhhcyBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBkb25lIHNvLiBUaGUgY29sdW1uIGJh
bGFuY2VyIG5lZWRzIHRvIGtub3cgaG93IG11Y2ggaXQgaGFzIHRvIHN0cmV0Y2ggdGhlIGNvbHVt
bnMgdG8gbWFrZSBtb3JlCi0gICAgICAgICAgICAvLyBjb250ZW50IGZpdC4gSWYgbm8gYnJlYWtz
IGFyZSByZXBvcnRlZCAoYnV0IGRvIG9jY3VyKSwgdGhlIGJhbGFuY2VyIHdpbGwgaGF2ZSBubyBj
bHVlLiBGSVhNRToKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkLCB0aG91
Z2gsIGJlY2F1c2UgaGVyZSB3ZSBqdXN0IHByZXRlbmQgdGhhdCB0aGUgY2hpbGQgaXMKLSAgICAg
ICAgICAgIC8vIHVuc3BsaXR0YWJsZS4gQSBzcGxpdHRhYmxlIGNoaWxkLCBvbiB0aGUgb3RoZXIg
aGFuZCwgaGFzIGJyZWFrIG9wcG9ydHVuaXRpZXMgYXQgZXZlcnkgcG9zaXRpb24KLSAgICAgICAg
ICAgIC8vIHdoZXJlIHRoZXJlJ3Mgbm8gY2hpbGQgY29udGVudCwgYm9yZGVyIG9yIHBhZGRpbmcu
IEluIG90aGVyIHdvcmRzLCB3ZSByaXNrIHN0cmV0Y2hpbmcgbW9yZQotICAgICAgICAgICAgLy8g
dGhhbiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBzZXRQYWdlQnJlYWsocmVzdWx0LCBzcGFjZVNo
b3J0YWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZvciByZXBsYWNlZCBlbGVtZW50
cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0aGUgbmV4
dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxUb3BCZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50ID0gcmVzdWx0OwotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVudCA9IGFkanVz
dEZvclVuc3BsaXR0YWJsZUNoaWxkKGNoaWxkLCByZXN1bHQpOwotICAgIAotICAgIExheW91dFVu
aXQgcGFnaW5hdGlvblN0cnV0ID0gMDsKLSAgICBMYXlvdXRVbml0IHVuc3BsaXR0YWJsZUFkanVz
dG1lbnREZWx0YSA9IGxvZ2ljYWxUb3BBZnRlclVuc3BsaXR0YWJsZUFkanVzdG1lbnQgLSBsb2dp
Y2FsVG9wQmVmb3JlVW5zcGxpdHRhYmxlQWRqdXN0bWVudDsKLSAgICBpZiAodW5zcGxpdHRhYmxl
QWRqdXN0bWVudERlbHRhKQotICAgICAgICBwYWdpbmF0aW9uU3RydXQgPSB1bnNwbGl0dGFibGVB
ZGp1c3RtZW50RGVsdGE7Ci0gICAgZWxzZSBpZiAoY2hpbGRSZW5kZXJCbG9jayAmJiBjaGlsZFJl
bmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKSkKLSAgICAgICAgcGFnaW5hdGlvblN0cnV0ID0g
Y2hpbGRSZW5kZXJCbG9jay0+cGFnaW5hdGlvblN0cnV0KCk7Ci0KLSAgICBpZiAocGFnaW5hdGlv
blN0cnV0KSB7Ci0gICAgICAgIC8vIFdlIGFyZSB3aWxsaW5nIHRvIHByb3BhZ2F0ZSBvdXQgdG8g
b3VyIHBhcmVudCBibG9jayBhcyBsb25nIGFzIHdlIHdlcmUgYXQgdGhlIHRvcCBvZiB0aGUgYmxv
Y2sgcHJpb3IKLSAgICAgICAgLy8gdG8gY29sbGFwc2luZyBvdXIgbWFyZ2lucywgYW5kIGFzIGxv
bmcgYXMgd2UgZGlkbid0IGNsZWFyIG9yIG1vdmUgYXMgYSByZXN1bHQgb2Ygb3RoZXIgcGFnaW5h
dGlvbi4KLSAgICAgICAgaWYgKGF0QmVmb3JlU2lkZU9mQmxvY2sgJiYgb2xkVG9wID09IHJlc3Vs
dCAmJiAhaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWlzVGFibGVDZWxsKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBTaG91bGQgcmVhbGx5IGNoZWNrIGlmIHdlJ3JlIGV4Y2VlZGluZyB0
aGUgcGFnZSBoZWlnaHQgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBzdHJ1dCwgYnV0IHdlIGRvbid0
Ci0gICAgICAgICAgICAvLyBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZG8gc28gKHRoZSBz
dHJ1dCBvbmx5IGhhcyB0aGUgcmVtYWluaW5nIGFtb3VudCB0byBwdXNoKS4gR2Vja28gZ2V0cyB0
aGlzIHdyb25nIHRvbwotICAgICAgICAgICAgLy8gYW5kIHB1c2hlcyB0byB0aGUgbmV4dCBwYWdl
IGFueXdheSwgc28gbm90IHRvbyBjb25jZXJuZWQgYWJvdXQgaXQuCi0gICAgICAgICAgICBzZXRQ
YWdpbmF0aW9uU3RydXQocmVzdWx0ICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAgIGlm
IChjaGlsZFJlbmRlckJsb2NrKQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPnNl
dFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXN1bHQg
Kz0gcGFnaW5hdGlvblN0cnV0OwotICAgIH0KLQotICAgIC8vIFNpbWlsYXIgdG8gaG93IHdlIGFw
cGx5IGNsZWFyYW5jZS4gR28gYWhlYWQgYW5kIGJvb3N0IGhlaWdodCgpIHRvIGJlIHRoZSBwbGFj
ZSB3aGVyZSB3ZSdyZSBnb2luZyB0byBwb3NpdGlvbiB0aGUgY2hpbGQuCi0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyAocmVzdWx0IC0gb2xkVG9wKSk7Ci0gICAgCi0gICAg
Ly8gUmV0dXJuIHRoZSBmaW5hbCBhZGp1c3RlZCBsb2dpY2FsIHRvcC4KLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCiBib29sIFJlbmRlckJsb2NrOjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hh
bmdlZChSb290SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVy
Rmxvd1RocmVhZCogZmxvd1RocmVhZCkgY29uc3QKIHsKICAgICBpZiAoIWZsb3dUaHJlYWQpCkBA
IC03NzE4LDY2ICs2ODU2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6aGFzTWFyZ2luQWZ0ZXJRdWly
ayhjbwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotUmVuZGVyQmxvY2s6Ok1hcmdpblZhbHVlcyBS
ZW5kZXJCbG9jazo6bWFyZ2luVmFsdWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3QK
LXsKLSAgICBMYXlvdXRVbml0IGNoaWxkQmVmb3JlUG9zaXRpdmUgPSAwOwotICAgIExheW91dFVu
aXQgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IDA7Ci0gICAgTGF5b3V0VW5pdCBjaGlsZEFmdGVyUG9z
aXRpdmUgPSAwOwotICAgIExheW91dFVuaXQgY2hpbGRBZnRlck5lZ2F0aXZlID0gMDsKLQotICAg
IExheW91dFVuaXQgYmVmb3JlTWFyZ2luID0gMDsKLSAgICBMYXlvdXRVbml0IGFmdGVyTWFyZ2lu
ID0gMDsKLQotICAgIFJlbmRlckJsb2NrKiBjaGlsZFJlbmRlckJsb2NrID0gY2hpbGQtPmlzUmVu
ZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpIDogMDsKLSAgICAKLSAgICAvLyBJZiB0
aGUgY2hpbGQgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbmFsaXR5IGFzIHdlIGRvLCB0aGVuIHdlIGNh
biBqdXN0IHJldHVybiBpdHMKLSAgICAvLyBtYXJnaW5zIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4K
LSAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKSB7Ci0gICAgICAgIGlmIChjaGls
ZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBjaGlsZEJlZm9yZVBvc2l0aXZlID0gY2hpbGRS
ZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgICAgIGNoaWxk
QmVmb3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+
bWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZl
ID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgYmVmb3JlTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgp
OwotICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgewotICAgICAgICAvLyBUaGUgY2hpbGQgaGFzIGEg
ZGlmZmVyZW50IGRpcmVjdGlvbmFsaXR5LiAgSWYgdGhlIGNoaWxkIGlzIHBhcmFsbGVsLCB0aGVu
IGl0J3MganVzdAotICAgICAgICAvLyBmbGlwcGVkIHJlbGF0aXZlIHRvIHVzLiAgV2UgY2FuIHVz
ZSB0aGUgbWFyZ2lucyBmb3IgdGhlIG9wcG9zaXRlIGVkZ2VzLgotICAgICAgICBpZiAoY2hpbGRS
ZW5kZXJCbG9jaykgewotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGNoaWxkUmVu
ZGVyQmxvY2stPm1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKTsKLSAgICAgICAgICAgIGNoaWxkQmVm
b3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
Ci0gICAgICAgICAgICBjaGlsZEFmdGVyUG9zaXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhQ
b3NpdGl2ZU1hcmdpbkJlZm9yZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZlID0g
Y2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIGJlZm9yZU1hcmdpbiA9IGNoaWxkLT5tYXJnaW5BZnRlcigpOwot
ICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQmVmb3JlKCk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgY2hpbGQgaXMgcGVycGVuZGljdWxhciB0
byB1cywgd2hpY2ggbWVhbnMgaXRzIG1hcmdpbnMgZG9uJ3QgY29sbGFwc2UgYnV0IGFyZSBvbiB0
aGUKLSAgICAgICAgLy8gImxvZ2ljYWwgbGVmdC9yaWdodCIgc2lkZXMgb2YgdGhlIGNoaWxkIGJv
eC4gIFdlIGNhbiBqdXN0IHJldHVybiB0aGUgcmF3IG1hcmdpbiBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgIGJlZm9yZU1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
YWZ0ZXJNYXJnaW4gPSBtYXJnaW5BZnRlckZvckNoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICAv
LyBSZXNvbHZlIHVuY29sbGFwc2luZyBtYXJnaW5zIGludG8gdGhlaXIgcG9zaXRpdmUvbmVnYXRp
dmUgYnVja2V0cy4KLSAgICBpZiAoYmVmb3JlTWFyZ2luKSB7Ci0gICAgICAgIGlmIChiZWZvcmVN
YXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGJlZm9yZU1hcmdp
bjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IC1iZWZv
cmVNYXJnaW47Ci0gICAgfQotICAgIGlmIChhZnRlck1hcmdpbikgewotICAgICAgICBpZiAoYWZ0
ZXJNYXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gYWZ0ZXJNYXJn
aW47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IC1hZnRl
ck1hcmdpbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9z
aXRpdmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRl
ck5lZ2F0aXZlKTsKLX0KLQogY29uc3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBj
b25zdAogewogICAgIGlmIChpc0JvZHkoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDcgKzM0Miw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNldExpbmVHcmlkQm94KFJvb3RJbmxpbmVCb3gqIGJveCkKICAgICB7CiAg
ICAgICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0
cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRh
ID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIGlmIChtX3Jh
cmVEYXRhLT5tX2xpbmVHcmlkQm94KQogICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5lR3Jp
ZEJveC0+ZGVzdHJveShyZW5kZXJBcmVuYSgpKTsKICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5l
R3JpZEJveCA9IGJveDsKQEAgLTM3MSwzMyArMzcxLDYgQEAgcHVibGljOgogCiAgICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZpcnN0TGV0dGVyKCk7CiAKLSAgICBjbGFzcyBNYXJnaW5WYWx1ZXMgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgTWFyZ2luVmFsdWVzKExheW91dFVuaXQgYmVmb3JlUG9zLCBM
YXlvdXRVbml0IGJlZm9yZU5lZywgTGF5b3V0VW5pdCBhZnRlclBvcywgTGF5b3V0VW5pdCBhZnRl
ck5lZykKLSAgICAgICAgICAgIDogbV9wb3NpdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVQb3MpCi0g
ICAgICAgICAgICAsIG1fbmVnYXRpdmVNYXJnaW5CZWZvcmUoYmVmb3JlTmVnKQotICAgICAgICAg
ICAgLCBtX3Bvc2l0aXZlTWFyZ2luQWZ0ZXIoYWZ0ZXJQb3MpCi0gICAgICAgICAgICAsIG1fbmVn
YXRpdmVNYXJnaW5BZnRlcihhZnRlck5lZykKLSAgICAgICAgeyB9Ci0gICAgICAgIAotICAgICAg
ICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQmVm
b3JlKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBM
YXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aXZl
TWFyZ2luQWZ0ZXI7IH0KLSAgICAgICAgTGF5b3V0VW5pdCBuZWdhdGl2ZU1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkFmdGVyOyB9Ci0gICAgICAgIAotICAgICAg
ICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luQmVmb3JlKExheW91dFVuaXQgcG9zKSB7IG1fcG9zaXRp
dmVNYXJnaW5CZWZvcmUgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShMYXlvdXRVbml0IG5lZykgeyBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbmVnOyB9Ci0g
ICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihMYXlvdXRVbml0IHBvcykgeyBtX3Bv
c2l0aXZlTWFyZ2luQWZ0ZXIgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdp
bkFmdGVyKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5BZnRlciA9IG5lZzsgfQot
ICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkJl
Zm9yZTsKLSAgICAgICAgTGF5b3V0VW5pdCBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlOwotICAgICAg
ICBMYXlvdXRVbml0IG1fcG9zaXRpdmVNYXJnaW5BZnRlcjsKLSAgICAgICAgTGF5b3V0VW5pdCBt
X25lZ2F0aXZlTWFyZ2luQWZ0ZXI7Ci0gICAgfTsKLSAgICBNYXJnaW5WYWx1ZXMgbWFyZ2luVmFs
dWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQg
c2Nyb2xsYmFyc0NoYW5nZWQoYm9vbCAvKmhvcml6b250YWxTY3JvbGxiYXJDaGFuZ2VkKi8sIGJv
b2wgLyp2ZXJ0aWNhbFNjcm9sbGJhckNoYW5nZWQqLykgeyB9OwogCiAgICAgTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoUmVuZGVyUmVnaW9uKikgY29uc3Q7CkBAIC00Njgs
NyArNDQxLDcgQEAgcHVibGljOgogICAgIHZvaWQgc2V0U2hhcGVJbnNpZGVJbmZvKFBhc3NPd25Q
dHI8U2hhcGVJbnNpZGVJbmZvPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIGlmICghbV9yYXJlRGF0
YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJl
RGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRl
ckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIG1fcmFyZURhdGEtPm1fc2hhcGVJbnNpZGVJbmZv
ID0gdmFsdWU7CiAgICAgfQogICAgIHZvaWQgbWFya1NoYXBlSW5zaWRlRGVzY2VuZGFudHNGb3JM
YXlvdXQoKTsKQEAgLTQ4MCwzOCArNDUzLDYgQEAgcHVibGljOgogcHJvdGVjdGVkOgogICAgIHZp
cnR1YWwgdm9pZCB3aWxsQmVEZXN0cm95ZWQoKTsKIAotICAgIExheW91dFVuaXQgbWF4UG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+
bV9tYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgOiBSZW5kZXJCbG9ja1JhcmVEYXRhOjpw
b3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyk7IH0KLSAgICBMYXlvdXRVbml0IG1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURh
dGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVuZGVyQmxvY2tSYXJlRGF0
YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpOyB9Ci0gICAgTGF5b3V0VW5pdCBt
YXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFy
ZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkgOiBSZW5kZXJCbG9ja1JhcmVE
YXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKTsgfQotICAgIExheW91dFVuaXQg
bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmFyZURhdGEgPyBtX3Jh
cmVEYXRhLT5tX21hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRlcigpIDogUmVuZGVyQmxvY2tSYXJl
RGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1bHQodGhpcyk7IH0KLSAgICAKLSAgICB2b2lk
IHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcp
OwotICAgIHZvaWQgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91
dFVuaXQgbmVnKTsKLQotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCA9
IHRydWUpOwotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5BZnRlcihib29sID0gdHJ1ZSk7
Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3Q7Ci0gICAgYm9vbCBt
dXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3Q7Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFy
Z2luQmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0gICAgYm9vbCBtdXN0
RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0KLSAg
ICBib29sIG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCop
IGNvbnN0OwotICAgIGJvb2wgbXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBS
ZW5kZXJCb3gqKSBjb25zdDsKLQotICAgIHZvaWQgaW5pdE1heE1hcmdpblZhbHVlcygpCi0gICAg
ewotICAgICAgICBpZiAobV9yYXJlRGF0YSkgewotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9t
YXJnaW5zID0gTWFyZ2luVmFsdWVzKFJlbmRlckJsb2NrUmFyZURhdGE6OnBvc2l0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSAsIFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJCbG9ja1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVm
YXVsdCh0aGlzKSwgUmVuZGVyQmxvY2tSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1
bHQodGhpcykpOwotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9wYWdpbmF0aW9uU3RydXQgPSAw
OwotCi0gICAgICAgICAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUgPSBmYWxz
ZTsKLSAgICAgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7CiAKICAgICB2
b2lkIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBm
aXhlZFBvc2l0aW9uT2JqZWN0c09ubHkgPSBmYWxzZSk7CkBAIC02MzUsOSArNTc2LDYgQEAgcHJp
dmF0ZToKICAgICAKICAgICB2aXJ0dWFsIGJvb2wgaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgY29u
c3QgT1ZFUlJJREUgRklOQUw7CiAKLSAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFy
Z2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUgRklOQUwgeyByZXR1cm4gbWF4UG9zaXRpdmVNYXJn
aW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7IH0KLSAgICB2aXJ0dWFsIExh
eW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0ZXIoKSBjb25zdCBPVkVSUklERSBGSU5BTCB7IHJl
dHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgLSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
IH0KLQogICAgIHZpcnR1YWwgdm9pZCByZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWlu
dEFsbERlc2NlbmRhbnRzKSBPVkVSUklERSBGSU5BTDsKIAogICAgIEJpZGlSdW4qIGhhbmRsZVRy
YWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgQmlkaUNvbnRleHQqKTsKQEAgLTEw
MDYsMTAxICs5NDQsMTAgQEAgcHJpdmF0ZToKICAgICBSZW5kZXJCbG9jayogY29udGFpbmluZ0Nv
bHVtbnNCbG9jayhib29sIGFsbG93QW5vbnltb3VzQ29sdW1uQmxvY2sgPSB0cnVlKTsKICAgICBS
ZW5kZXJCbG9jayogY29sdW1uc0Jsb2NrRm9yU3Bhbm5pbmdFbGVtZW50KFJlbmRlck9iamVjdCog
bmV3Q2hpbGQpOwogCi0gICAgY2xhc3MgTWFyZ2luSW5mbyB7Ci0gICAgICAgIC8vIENvbGxhcHNp
bmcgZmxhZ3MgZm9yIHdoZXRoZXIgd2UgY2FuIGNvbGxhcHNlIG91ciBtYXJnaW5zIHdpdGggb3Vy
IGNoaWxkcmVuJ3MgbWFyZ2lucy4KLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRy
ZW4gOiAxOwotCi0gICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBhIHF1aXJreSBjb250
YWluZXIsIGkuZS4sIGRvIHdlIGNvbGxhcHNlIGF3YXkgdG9wIGFuZCBib3R0b20KLSAgICAgICAg
Ly8gbWFyZ2lucyBpbiBvdXIgY29udGFpbmVyLiAgVGFibGUgY2VsbHMgYW5kIHRoZSBib2R5IGFy
ZSB0aGUgY29tbW9uIGV4YW1wbGVzLiBXZQotICAgICAgICAvLyBhbHNvIGhhdmUgYSBjdXN0b20g
c3R5bGUgcHJvcGVydHkgZm9yIFNhZmFyaSBSU1MgdG8gZGVhbCB3aXRoIFR5cGVQYWQgYmxvZyBh
cnRpY2xlcy4KLSAgICAgICAgYm9vbCBtX3F1aXJrQ29udGFpbmVyIDogMTsKLQotICAgICAgICAv
LyBUaGlzIGZsYWcgdHJhY2tzIHdoZXRoZXIgd2UgYXJlIHN0aWxsIGxvb2tpbmcgYXQgY2hpbGQg
bWFyZ2lucyB0aGF0IGNhbiBhbGwgY29sbGFwc2UgdG9nZXRoZXIgYXQgdGhlIGJlZ2lubmluZyBv
ZiBhIGJsb2NrLiAgCi0gICAgICAgIC8vIFRoZXkgbWF5IG9yIG1heSBub3QgY29sbGFwc2Ugd2l0
aCB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgYmxvY2sgKHxtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxk
cmVufCB0ZWxscyB1cyB0aGF0KSwgYnV0IHRoZXkgd2lsbAotICAgICAgICAvLyBhbHdheXMgYmUg
Y29sbGFwc2luZyB3aXRoIG9uZSBhbm90aGVyLiAgVGhpcyB2YXJpYWJsZSBjYW4gcmVtYWluIHNl
dCB0byB0cnVlIHRocm91Z2ggbXVsdGlwbGUgaXRlcmF0aW9ucyAKLSAgICAgICAgLy8gYXMgbG9u
ZyBhcyB3ZSBrZWVwIGVuY291bnRlcmluZyBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLgotICAgICAg
ICBib29sIG1fYXRCZWZvcmVTaWRlT2ZCbG9jayA6IDE7Ci0KLSAgICAgICAgLy8gVGhpcyBmbGFn
IGlzIHNldCB3aGVuIHdlIGtub3cgd2UncmUgZXhhbWluaW5nIGJvdHRvbSBtYXJnaW5zIGFuZCB3
ZSBrbm93IHdlJ3JlIGF0IHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLgotICAgICAgICBib29sIG1f
YXRBZnRlclNpZGVPZkJsb2NrIDogMTsKLQotICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJl
IHVzZWQgdG8gZGV0ZWN0IHF1aXJreSBtYXJnaW5zIHRoYXQgd2UgbmVlZCB0byBjb2xsYXBzZSBh
d2F5IChpbiB0YWJsZSBjZWxscwotICAgICAgICAvLyBhbmQgaW4gdGhlIGJvZHkgZWxlbWVudCku
Ci0gICAgICAgIGJvb2wgbV9oYXNNYXJnaW5CZWZvcmVRdWlyayA6IDE7Ci0gICAgICAgIGJvb2wg
bV9oYXNNYXJnaW5BZnRlclF1aXJrIDogMTsKLSAgICAgICAgYm9vbCBtX2RldGVybWluZWRNYXJn
aW5CZWZvcmVRdWlyayA6IDE7Ci0KLSAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW4gOiAxOwot
Ci0gICAgICAgIC8vIFRoZXNlIGZsYWdzIHRyYWNrIHRoZSBwcmV2aW91cyBtYXhpbWFsIHBvc2l0
aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgICAgICBMYXlvdXRVbml0IG1fcG9zaXRpdmVN
YXJnaW47Ci0gICAgICAgIExheW91dFVuaXQgbV9uZWdhdGl2ZU1hcmdpbjsKLQotICAgIHB1Ymxp
YzoKLSAgICAgICAgTWFyZ2luSW5mbyhSZW5kZXJCbG9jayosIExheW91dFVuaXQgYmVmb3JlQm9y
ZGVyUGFkZGluZywgTGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpOwotCi0gICAgICAgIHZv
aWQgc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9hdEJlZm9yZVNpZGVPZkJsb2Nr
ID0gYjsgfQotICAgICAgICB2b2lkIHNldEF0QWZ0ZXJTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9h
dEFmdGVyU2lkZU9mQmxvY2sgPSBiOyB9Ci0gICAgICAgIHZvaWQgY2xlYXJNYXJnaW4oKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBtX3Bvc2l0aXZlTWFyZ2luID0gMDsKLSAgICAgICAgICAgIG1f
bmVnYXRpdmVNYXJnaW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoYm9vbCBiKSB7IG1faGFzTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAg
ICAgIHZvaWQgc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhib29sIGIpIHsgbV9oYXNNYXJnaW5BZnRl
clF1aXJrID0gYjsgfQotICAgICAgICB2b2lkIHNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
ayhib29sIGIpIHsgbV9kZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAgICAg
IHZvaWQgc2V0UG9zaXRpdmVNYXJnaW4oTGF5b3V0VW5pdCBwKSB7IEFTU0VSVCghbV9kaXNjYXJk
TWFyZ2luKTsgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2
ZU1hcmdpbihMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX25lZ2F0
aXZlTWFyZ2luID0gbjsgfQotICAgICAgICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIo
TGF5b3V0VW5pdCBwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fZGlzY2FyZE1h
cmdpbik7Ci0gICAgICAgICAgICBpZiAocCA+IG1fcG9zaXRpdmVNYXJnaW4pCi0gICAgICAgICAg
ICAgICAgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRO
ZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKExheW91dFVuaXQgbikKLSAgICAgICAgewotICAgICAgICAg
ICAgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOwotICAgICAgICAgICAgaWYgKG4gPiBtX25lZ2F0
aXZlTWFyZ2luKQotICAgICAgICAgICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSBuOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNYXJnaW4oTGF5b3V0VW5pdCBwLCBMYXlvdXRVbml0IG4p
IHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX3Bvc2l0aXZlTWFyZ2luID0gcDsgbV9uZWdh
dGl2ZU1hcmdpbiA9IG47IH0KLSAgICAgICAgdm9pZCBzZXRDYW5Db2xsYXBzZU1hcmdpbkFmdGVy
V2l0aENoaWxkcmVuKGJvb2wgY29sbGFwc2UpIHsgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0
aENoaWxkcmVuID0gY29sbGFwc2U7IH0KLSAgICAgICAgdm9pZCBzZXREaXNjYXJkTWFyZ2luKGJv
b2wgdmFsdWUpIHsgbV9kaXNjYXJkTWFyZ2luID0gdmFsdWU7IH0KLQotICAgICAgICBib29sIGF0
QmVmb3JlU2lkZU9mQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2s7
IH0KLSAgICAgICAgYm9vbCBjYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJl
dHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdp
dGhDaGlsZHJlbjsgfQotICAgICAgICBib29sIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9hdEFmdGVyU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5CZWZv
cmVXaXRoQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3Jl
V2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhD
aGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGls
ZHJlbjsgfQotICAgICAgICBib29sIHF1aXJrQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gbV9x
dWlya0NvbnRhaW5lcjsgfQotICAgICAgICBib29sIGRldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
aygpIGNvbnN0IHsgcmV0dXJuIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrOyB9Ci0gICAg
ICAgIGJvb2wgaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSBjb25zdCB7IHJldHVybiBtX2hhc01hcmdp
bkJlZm9yZVF1aXJrOyB9Ci0gICAgICAgIGJvb2wgaGFzTWFyZ2luQWZ0ZXJRdWlyaygpIGNvbnN0
IHsgcmV0dXJuIG1faGFzTWFyZ2luQWZ0ZXJRdWlyazsgfQotICAgICAgICBMYXlvdXRVbml0IHBv
c2l0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGl2ZU1hcmdpbjsgfQotICAgICAg
ICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1h
cmdpbjsgfQotICAgICAgICBib29sIGRpc2NhcmRNYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX2Rp
c2NhcmRNYXJnaW47IH0KLSAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW4oKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aXZlTWFyZ2luIC0gbV9uZWdhdGl2ZU1hcmdpbjsgfQotICAgIH07Ci0KLSAgICB2
b2lkIGxheW91dEJsb2NrQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYsIExheW91
dFVuaXQmIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExv
Z2ljYWxCb3R0b20pOwotICAgIHZvaWQgYWRqdXN0UG9zaXRpb25lZEJsb2NrKFJlbmRlckJveCog
Y2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIGFkanVzdEZsb2F0aW5nQmxvY2so
Y29uc3QgTWFyZ2luSW5mbyYpOwotCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNyZWF0ZVJl
cGxhY2VtZW50UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3QqIHJ1bkluKTsKICAgICB2b2lkIG1v
dmVSdW5JblVuZGVyU2libGluZ0Jsb2NrSWZOZWVkZWQoUmVuZGVyT2JqZWN0KiBydW5Jbik7CiAg
ICAgdm9pZCBtb3ZlUnVuSW5Ub09yaWdpbmFsUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBydW5Jbik7
CiAKLSAgICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJn
aW5JbmZvJik7Ci0gICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlckJveCog
Y2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRvcFBvc01hcmdpbiwgTGF5b3V0VW5p
dCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7Ci0gICAgTGF5b3V0VW5pdCBlc3Rp
bWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZv
JiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbik7Ci0gICAgdm9pZCBtYXJn
aW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCosIExheW91dFVuaXQmLCBMYXlvdXRV
bml0JiwgYm9vbCYpIGNvbnN0OwotICAgIHZvaWQgaGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IHRvcCwgTGF5b3V0VW5pdCBib3R0b20sIE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIHNl
dENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJik7Ci0gICAgLy8gRW5kIGhl
bHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCBieSBsYXlvdXRCbG9ja0NoaWxkcmVuLgot
CiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCiAgICAg
Um9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJp
ZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRz
Jik7CiAgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wg
aGFzSW5saW5lQ2hpbGQpOwpAQCAtMTEzMyw5ICs5ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2
aXJ0dWFsIENvbHVtbkluZm86OlBhZ2luYXRpb25Vbml0IHBhZ2luYXRpb25Vbml0KCkgY29uc3Q7
CiAKLSAgICBMYXlvdXRVbml0IGFwcGx5QmVmb3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5
b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KTsgLy8gSWYgdGhlIGNoaWxkIGhhcyBhIGJlZm9yZSBicmVh
aywgdGhlbiByZXR1cm4gYSBuZXcgeVBvcyB0aGF0IHNoaWZ0cyB0byB0aGUgdG9wIG9mIHRoZSBu
ZXh0IHBhZ2UvY29sdW1uLgotICAgIExheW91dFVuaXQgYXBwbHlBZnRlckJyZWFrKFJlbmRlckJv
eCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgTWFyZ2luSW5mbyYpOyAvLyBJZiB0
aGUgY2hpbGQgaGFzIGFuIGFmdGVyIGJyZWFrLCB0aGVuIHJldHVybiBhIG5ldyBvZmZzZXQgdGhh
dCBzaGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlL2NvbHVtbi4KLQogcHVibGljOgog
ICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxUb3BGb3JPZmZzZXQoTGF5b3V0VW5pdCBvZmZzZXQp
IGNvbnN0OwogICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxIZWlnaHRGb3JPZmZzZXQoTGF5b3V0
VW5pdCBvZmZzZXQpIGNvbnN0OwpAQCAtMTE1NCw4ICs5OTgsNyBAQCBwcm90ZWN0ZWQ6CiAKICAg
ICBMYXlvdXRVbml0IGFkanVzdEZvclVuc3BsaXR0YWJsZUNoaWxkKFJlbmRlckJveCogY2hpbGQs
IExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgYm9vbCBpbmNsdWRlTWFyZ2lucyA9IGZhbHNlKTsg
Ly8gSWYgdGhlIGNoaWxkIGlzIHVuc3BsaXR0YWJsZSBhbmQgY2FuJ3QgZml0IG9uIHRoZSBjdXJy
ZW50IHBhZ2UsIHJldHVybiB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgogICAgIHZv
aWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihSb290SW5saW5lQm94KiwgTGF5b3V0
VW5pdCYgZGVsdGFPZmZzZXQsIFJlbmRlckZsb3dUaHJlYWQqKTsgLy8gQ29tcHV0ZXMgYSBkZWx0
YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdl
IGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgTGF5b3V0VW5pdCBh
ZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNs
ZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hp
bGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jayk7Ci0KKyAKICAgICAvLyBBZGp1c3QgZnJvbSBw
YWludGluZyBvZmZzZXRzIHRvIHRoZSBsb2NhbCBjb29yZHMgb2YgdGhpcyByZW5kZXJlcgogICAg
IHZvaWQgb2Zmc2V0Rm9yQ29udGVudHMoTGF5b3V0UG9pbnQmKSBjb25zdDsKIApAQCAtMTI4Mywz
NiArMTEyNiwxNSBAQCBwdWJsaWM6CiAgICAgc3RydWN0IFJlbmRlckJsb2NrUmFyZURhdGEgewog
ICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShSZW5kZXJCbG9ja1JhcmVEYXRhKTsgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CiAgICAgcHVibGljOgotICAgICAgICBSZW5kZXJCbG9ja1JhcmVE
YXRhKGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykgCi0gICAgICAgICAgICA6IG1fbWFyZ2lucyhw
b3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQoYmxvY2spLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZURl
ZmF1bHQoYmxvY2spLCBwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdChibG9jayksIG5lZ2F0aXZl
TWFyZ2luQWZ0ZXJEZWZhdWx0KGJsb2NrKSkKLSAgICAgICAgICAgICwgbV9wYWdpbmF0aW9uU3Ry
dXQoMCkKKyAgICAgICAgUmVuZGVyQmxvY2tSYXJlRGF0YSgpIAorICAgICAgICAgICAgOiBtX3Bh
Z2luYXRpb25TdHJ1dCgwKQogICAgICAgICAgICAgLCBtX3BhZ2VMb2dpY2FsT2Zmc2V0KDApCiAg
ICAgICAgICAgICAsIG1fbGluZUdyaWRCb3goMCkKICAgICAgICAgICAgICwgbV9saW5lQnJlYWtU
b0F2b2lkV2lkb3coLTEpCiAgICAgICAgICAgICAsIG1fc2hvdWxkQnJlYWtBdExpbmVUb0F2b2lk
V2lkb3coZmFsc2UpCi0gICAgICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkJlZm9yZShmYWxzZSkK
LSAgICAgICAgICAgICwgbV9kaXNjYXJkTWFyZ2luQWZ0ZXIoZmFsc2UpCiAgICAgICAgIHsgCiAg
ICAgICAgIH0KIAotICAgICAgICBzdGF0aWMgTGF5b3V0VW5pdCBwb3NpdGl2ZU1hcmdpbkJlZm9y
ZURlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQotICAgICAgICB7IAotICAgICAgICAg
ICAgcmV0dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KGJsb2NrLT5tYXJnaW5CZWZvcmUoKSwgMCk7
Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgbmVnYXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKLSAgICAgICAgeyAKLSAgICAgICAg
ICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PigtYmxvY2stPm1hcmdpbkJlZm9yZSgpLCAw
KTsKLSAgICAgICAgfQotICAgICAgICBzdGF0aWMgTGF5b3V0VW5pdCBwb3NpdGl2ZU1hcmdpbkFm
dGVyRGVmYXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+bWFyZ2luQWZ0ZXIoKSwgMCk7
Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgbmVnYXRpdmVNYXJnaW5BZnRl
ckRlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2NrLT5tYXJnaW5BZnRlcigpLCAwKTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWFyZ2luVmFsdWVzIG1fbWFyZ2luczsKICAg
ICAgICAgTGF5b3V0VW5pdCBtX3BhZ2luYXRpb25TdHJ1dDsKICAgICAgICAgTGF5b3V0VW5pdCBt
X3BhZ2VMb2dpY2FsT2Zmc2V0OwogICAgICAgICAKQEAgLTEzMjMsOCArMTE0NSw2IEBAIHB1Ymxp
YzoKICAgICAgICAgT3duUHRyPFNoYXBlSW5zaWRlSW5mbz4gbV9zaGFwZUluc2lkZUluZm87CiAj
ZW5kaWYKICAgICAgICAgYm9vbCBtX3Nob3VsZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93IDogMTsK
LSAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW5CZWZvcmUgOiAxOwotICAgICAgICBib29sIG1f
ZGlzY2FyZE1hcmdpbkFmdGVyIDogMTsKICAgICAgfTsKIAogcHJvdGVjdGVkOgpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAJKHJldmlzaW9uIDE1
NTM3NykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMyw5ICszMyw1MCBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKK3N0cnVjdCBTYW1lU2l6ZUFzTWFyZ2luSW5mbyB7CisgICAg
dWludDMyX3QgYml0ZmllbGRzIDogMTY7CisgICAgTGF5b3V0VW5pdCBtYXJnaW5zWzJdOworfTsK
KworQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzKSA9
PSBzaXplb2YoTGF5b3V0VW5pdFs0XSksIE1hcmdpblZhbHVlc19zaG91bGRfc3RheV9zbWFsbCk7
CisKKy8vIE91ciBNYXJnaW5JbmZvIHN0YXRlIHVzZWQgd2hlbiBsYXlpbmcgb3V0IGJsb2NrIGNo
aWxkcmVuLgorUmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmRlckJs
b2NrRmxvdyogYmxvY2ssIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywgTGF5b3V0VW5p
dCBhZnRlckJvcmRlclBhZGRpbmcpCisgICAgOiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sodHJ1ZSkK
KyAgICAsIG1fYXRBZnRlclNpZGVPZkJsb2NrKGZhbHNlKQorICAgICwgbV9oYXNNYXJnaW5CZWZv
cmVRdWlyayhmYWxzZSkKKyAgICAsIG1faGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxzZSkKKyAgICAs
IG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKQorICAgICwgbV9kaXNjYXJkTWFy
Z2luKGZhbHNlKQoreworICAgIFJlbmRlclN0eWxlKiBibG9ja1N0eWxlID0gYmxvY2stPnN0eWxl
KCk7CisgICAgQVNTRVJUKGJsb2NrLT5pc1JlbmRlclZpZXcoKSB8fCBibG9jay0+cGFyZW50KCkp
OworICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVuZGVyVmlldygp
ICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKQor
ICAgICAgICAmJiAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkg
JiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkKKyAgICAgICAgJiYgIWJsb2NrLT5pc1JlbmRlckZsb3dUaHJlYWQoKSAmJiAh
YmxvY2stPmlzV3JpdGluZ01vZGVSb290KCkgJiYgIWJsb2NrLT5wYXJlbnQoKS0+aXNGbGV4aWJs
ZUJveCgpCisgICAgICAgICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5Db3VudCgpICYmIGJs
b2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5XaWR0aCgpICYmICFibG9ja1N0eWxlLT5jb2x1bW5TcGFu
KCk7CisKKyAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuID0gbV9jYW5D
b2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAhYmVmb3JlQm9yZGVyUGFkZGluZyAmJiBibG9ja1N0eWxl
LT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKKworICAgIC8vIElmIGFueSBo
ZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4gd2UgZG9uJ3Qg
Y29sbGFwc2Ugb3VyIGJvdHRvbQorICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hpbGRyZW4ncyBt
YXJnaW5zLiAgVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZpc3VhbAorICAg
IC8vIGVmZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRoZSBwYXJlbnQg
YmxvY2sgYW5kIHlldCBzdGlsbCBjb2xsYXBzZQorICAgIC8vIHdpdGggaXQuICBXZSBhbHNvIGRv
bid0IGNvbGxhcHNlIGlmIHdlIGhhdmUgYW55IGJvdHRvbSBib3JkZXIvcGFkZGluZy4KKyAgICBt
X2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxhcHNlV2l0aENo
aWxkcmVuICYmIChhZnRlckJvcmRlclBhZGRpbmcgPT0gMCkgJiYKKyAgICAgICAgKGJsb2NrU3R5
bGUtPmxvZ2ljYWxIZWlnaHQoKS5pc0F1dG8oKSAmJiAhYmxvY2tTdHlsZS0+bG9naWNhbEhlaWdo
dCgpLnZhbHVlKCkpICYmIGJsb2NrU3R5bGUtPm1hcmdpbkFmdGVyQ29sbGFwc2UoKSAhPSBNU0VQ
QVJBVEU7CisgICAgCisgICAgbV9xdWlya0NvbnRhaW5lciA9IGJsb2NrLT5pc1RhYmxlQ2VsbCgp
IHx8IGJsb2NrLT5pc0JvZHkoKTsKKworICAgIG1fZGlzY2FyZE1hcmdpbiA9IG1fY2FuQ29sbGFw
c2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgYmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVm
b3JlKCk7CisKKyAgICBtX3Bvc2l0aXZlTWFyZ2luID0gKG1fY2FuQ29sbGFwc2VNYXJnaW5CZWZv
cmVXaXRoQ2hpbGRyZW4gJiYgIWJsb2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgpKSA/IGJs
b2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogTGF5b3V0VW5pdCgpOworICAgIG1fbmVn
YXRpdmVNYXJnaW4gPSAobV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbiAmJiAh
YmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkpID8gYmxvY2stPm1heE5lZ2F0aXZlTWFy
Z2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Cit9CisKIFJlbmRlckJsb2NrRmxvdzo6UmVuZGVy
QmxvY2tGbG93KEVsZW1lbnQqIGVsZW1lbnQpCiAgICAgOiBSZW5kZXJCbG9jayhlbGVtZW50KQog
eworICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm8p
ID09IHNpemVvZihTYW1lU2l6ZUFzTWFyZ2luSW5mbyksIE1hcmdpbkluZm9fc2hvdWxkX3N0YXlf
c21hbGwpOwogfQogCiBSZW5kZXJCbG9ja0Zsb3c6On5SZW5kZXJCbG9ja0Zsb3coKQpAQCAtNDEw
LDQgKzQ1MSw4ODUgQEAgdm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dEJsb2NrQ2hpbGRyZQog
ICAgIGhhbmRsZUFmdGVyU2lkZU9mQmxvY2soYmVmb3JlRWRnZSwgYWZ0ZXJFZGdlLCBtYXJnaW5J
bmZvKTsKIH0KIAordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmxheW91dEJsb2NrQ2hpbGQoUmVuZGVy
Qm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYgcHJldmlvdXNG
bG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZsb2F0TG9naWNhbEJvdHRvbSkKK3sK
KyAgICBMYXlvdXRVbml0IG9sZFBvc01hcmdpbkJlZm9yZSA9IG1heFBvc2l0aXZlTWFyZ2luQmVm
b3JlKCk7CisgICAgTGF5b3V0VW5pdCBvbGROZWdNYXJnaW5CZWZvcmUgPSBtYXhOZWdhdGl2ZU1h
cmdpbkJlZm9yZSgpOworCisgICAgLy8gVGhlIGNoaWxkIGlzIGEgbm9ybWFsIGZsb3cgb2JqZWN0
LiAgQ29tcHV0ZSB0aGUgbWFyZ2lucyB3ZSB3aWxsIHVzZSBmb3IgY29sbGFwc2luZyBub3cuCisg
ICAgY2hpbGQtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7CisKKyAg
ICAvLyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgbG9naWNhbCB0b3AgcG9zaXRpb24uICBJbiBt
b3N0IGNhc2VzIHRoaXMgZ3Vlc3Mgd2lsbAorICAgIC8vIGJlIGNvcnJlY3QuICBPbmx5IGlmIHdl
J3JlIHdyb25nICh3aGVuIHdlIGNvbXB1dGUgdGhlIHJlYWwgbG9naWNhbCB0b3AgcG9zaXRpb24p
CisgICAgLy8gd2lsbCB3ZSBoYXZlIHRvIHBvdGVudGlhbGx5IHJlbGF5b3V0LgorICAgIExheW91
dFVuaXQgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbjsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxU
b3BFc3RpbWF0ZSA9IGVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKGNoaWxkLCBtYXJnaW5JbmZv
LCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uKTsKKworICAgIC8vIENhY2hlIG91ciBvbGQgcmVj
dCBzbyB0aGF0IHdlIGNhbiBkaXJ0eSB0aGUgcHJvcGVyIHJlcGFpbnQgcmVjdHMgaWYgdGhlIGNo
aWxkIG1vdmVzLgorICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkLT5mcmFtZVJlY3QoKTsK
KyAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQp
OworCisjaWYgIUFTU0VSVF9ESVNBQkxFRAorICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEg
PSB2aWV3KCkubGF5b3V0RGVsdGEoKTsKKyNlbmRpZgorICAgIC8vIEdvIGFoZWFkIGFuZCBwb3Np
dGlvbiB0aGUgY2hpbGQgYXMgdGhvdWdoIGl0IGRpZG4ndCBjb2xsYXBzZSB3aXRoIHRoZSB0b3Au
CisgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUsIEFw
cGx5TGF5b3V0RGVsdGEpOworICAgIGVzdGltYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGlsZChjaGls
ZCk7CisKKyAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRl
ckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7CisgICAgYm9vbCBtYXJrRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzID0gZmFsc2U7CisgICAgaWYgKGxvZ2ljYWxUb3BFc3RpbWF0ZSAhPSBv
bGRMb2dpY2FsVG9wICYmICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9j
ayAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQorICAgICAgICBtYXJrRGVz
Y2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKKyNpZiBFTkFCTEUoU1VCUElYRUxfTEFZT1VUKQor
ICAgIGVsc2UgaWYgKFVOTElLRUxZKGxvZ2ljYWxUb3BFc3RpbWF0ZS5taWdodEJlU2F0dXJhdGVk
KCkpKQorICAgICAgICAvLyBsb2dpY2FsVG9wRXN0aW1hdGUsIHJldHVybmVkIGJ5IGVzdGltYXRl
TG9naWNhbFRvcFBvc2l0aW9uLCBtaWdodCBiZSBzYXR1cmF0ZWQgZm9yCisgICAgICAgIC8vIHZl
cnkgbGFyZ2UgZWxlbWVudHMuIElmIGl0IGRvZXMgdGhlIGNvbXBhcmlzb24gd2l0aCBvbGRMb2dp
Y2FsVG9wIG1pZ2h0IHlpZWxkIGEKKyAgICAgICAgLy8gZmFsc2UgbmVnYXRpdmUgYXMgYWRkaW5n
IGFuZCByZW1vdmluZyBtYXJnaW5zLCBib3JkZXJzIGV0YyBmcm9tIGEgc2F0dXJhdGVkIG51bWJl
cgorICAgICAgICAvLyBtaWdodCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cy4gSWYgdGhpcyBpcyB0
aGUgY2FzZSBhbHdheXMgbWFyayBmb3IgbGF5b3V0LgorICAgICAgICBtYXJrRGVzY2VuZGFudHNX
aXRoRmxvYXRzID0gdHJ1ZTsKKyNlbmRpZgorICAgIGVsc2UgaWYgKCFjaGlsZC0+YXZvaWRzRmxv
YXRzKCkgfHwgY2hpbGQtPnNocmlua1RvQXZvaWRGbG9hdHMoKSkgeworICAgICAgICAvLyBJZiBh
biBlbGVtZW50IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHRo
ZW4gYWx3YXlzIG1hcmsgaXQgZm9yCisgICAgICAgIC8vIGxheW91dC4KKyAgICAgICAgTGF5b3V0
VW5pdCBmYiA9IG1heChwcmV2aW91c0Zsb2F0TG9naWNhbEJvdHRvbSwgbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tKCkpOworICAgICAgICBpZiAoZmIgPiBsb2dpY2FsVG9wRXN0aW1hdGUpCisgICAg
ICAgICAgICBtYXJrRGVzY2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAoY2hpbGRSZW5kZXJCbG9jaykgeworICAgICAgICBpZiAobWFya0Rlc2NlbmRhbnRzV2l0aEZs
b2F0cykKKyAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKKyAgICAgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJv
b3QoKSkKKyAgICAgICAgICAgIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KHByZXZp
b3VzRmxvYXRMb2dpY2FsQm90dG9tLCBvbGRMb2dpY2FsVG9wICsgY2hpbGRSZW5kZXJCbG9jay0+
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpOworICAgIH0KKworICAgIGlmICghY2hpbGQtPm5l
ZWRzTGF5b3V0KCkpCisgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZO
ZWVkZWQoKTsKKworICAgIGJvb2wgY2hpbGRIYWRMYXlvdXQgPSBjaGlsZC0+ZXZlckhhZExheW91
dCgpOworICAgIGJvb2wgY2hpbGROZWVkZWRMYXlvdXQgPSBjaGlsZC0+bmVlZHNMYXlvdXQoKTsK
KyAgICBpZiAoY2hpbGROZWVkZWRMYXlvdXQpCisgICAgICAgIGNoaWxkLT5sYXlvdXQoKTsKKwor
ICAgIC8vIENhY2hlIGlmIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayByaWdodCBub3cu
CisgICAgYm9vbCBhdEJlZm9yZVNpZGVPZkJsb2NrID0gbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVP
ZkJsb2NrKCk7CisKKyAgICAvLyBOb3cgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHlwb3MgYmFzZWQg
b2ZmIGV4YW1pbmF0aW9uIG9mIGNvbGxhcHNpbmcgbWFyZ2luCisgICAgLy8gdmFsdWVzLgorICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZUNsZWFyID0gY29sbGFwc2VNYXJnaW5zKGNoaWxk
LCBtYXJnaW5JbmZvKTsKKworICAgIC8vIE5vdyBjaGVjayBmb3IgY2xlYXIuCisgICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciA9IGNsZWFyRmxvYXRzSWZOZWVkZWQoY2hpbGQsIG1h
cmdpbkluZm8sIG9sZFBvc01hcmdpbkJlZm9yZSwgb2xkTmVnTWFyZ2luQmVmb3JlLCBsb2dpY2Fs
VG9wQmVmb3JlQ2xlYXIpOworICAgIAorICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmxheW91
dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7CisgICAgaWYgKHBhZ2luYXRlZCkKKyAgICAgICAgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBhZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihsb2dpY2Fs
VG9wQWZ0ZXJDbGVhciwgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiwgY2hpbGQsCisgICAgICAg
ICAgICBhdEJlZm9yZVNpZGVPZkJsb2NrICYmIGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9PSBsb2dp
Y2FsVG9wQWZ0ZXJDbGVhcik7CisKKyAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxv
Z2ljYWxUb3BBZnRlckNsZWFyLCBBcHBseUxheW91dERlbHRhKTsKKworICAgIC8vIE5vdyB3ZSBo
YXZlIGEgZmluYWwgdG9wIHBvc2l0aW9uLiAgU2VlIGlmIGl0IHJlYWxseSBkb2VzIGVuZCB1cCBi
ZWluZyBkaWZmZXJlbnQgZnJvbSBvdXIgZXN0aW1hdGUuCisgICAgLy8gY2xlYXJGbG9hdHNJZk5l
ZWRlZCBjYW4gYWxzbyBtYXJrIHRoZSBjaGlsZCBhcyBuZWVkaW5nIGEgbGF5b3V0IGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndCBtb3ZlLiBUaGlzIGhhcHBlbnMKKyAgICAvLyB3aGVuIGNvbGxhcHNlTWFy
Z2lucyBkeW5hbWljYWxseSBhZGRzIG92ZXJoYW5naW5nIGZsb2F0cyBiZWNhdXNlIG9mIGEgY2hp
bGQgd2l0aCBuZWdhdGl2ZSBtYXJnaW5zLgorICAgIGlmIChsb2dpY2FsVG9wQWZ0ZXJDbGVhciAh
PSBsb2dpY2FsVG9wRXN0aW1hdGUgfHwgY2hpbGQtPm5lZWRzTGF5b3V0KCkgfHwgKHBhZ2luYXRl
ZCAmJiBjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxvY2stPnNob3VsZEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KCkpKSB7CisgICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZs
b2F0cygpKSB7CisgICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRo
ZSBsaW5lIHdpZHRoLgorICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNs
ZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KKyAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVz
ZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCisgICAgICAgICAgICAvLyBTbyBn
byBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KKyAgICAgICAgICAgIGNoaWxkLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAoIWNo
aWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygp
KQorICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0
KCkpCisgICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5l
ZWRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFr
ZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCisgICAgICAgIGNoaWxkLT5sYXlvdXRJ
Zk5lZWRlZCgpOworICAgIH0KKworICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxk
KGNoaWxkKSkgeworICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSwgTWFya09ubHlU
aGlzKTsKKyAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7CisgICAgfQorCisgICAgLy8g
V2UgYXJlIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIg
YSBub24tZW1wdHkgY2hpbGQuICAKKyAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGNo
ZWNraW5nIGZvciBjbGVhciwgc28gdGhhdCBtYXJnaW5zIGNhbiBiZSByZXNldCBpZiBhIGNsZWFy
IG9jY3VycmVkLgorICAgIGlmIChtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAh
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQorICAgICAgICBtYXJnaW5JbmZvLnNldEF0
QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOworCisgICAgLy8gTm93IHBsYWNlIHRoZSBjaGlsZCBp
biB0aGUgY29ycmVjdCBsZWZ0IHBvc2l0aW9uCisgICAgZGV0ZXJtaW5lTG9naWNhbExlZnRQb3Np
dGlvbkZvckNoaWxkKGNoaWxkLCBBcHBseUxheW91dERlbHRhKTsKKworICAgIExheW91dFNpemUg
Y2hpbGRPZmZzZXQgPSBjaGlsZC0+bG9jYXRpb24oKSAtIG9sZFJlY3QubG9jYXRpb24oKTsKKyNp
ZiBFTkFCTEUoQ1NTX1NIQVBFUykKKyAgICByZWxheW91dFNoYXBlRGVzY2VuZGFudElmTW92ZWQo
Y2hpbGRSZW5kZXJCbG9jaywgY2hpbGRPZmZzZXQpOworI2VuZGlmCisKKyAgICAvLyBVcGRhdGUg
b3VyIGhlaWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3Jy
ZWN0IHBvc2l0aW9uLgorICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbG9n
aWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7CisgICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkFm
dGVyRm9yQ2hpbGQoY2hpbGQpKSB7CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhl
aWdodCgpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCkpOworICAgICAgICBtYXJnaW5JbmZv
LmNsZWFyTWFyZ2luKCk7CisgICAgfQorICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgb3Zlcmhhbmdp
bmcgZmxvYXRzIHRoYXQgaW50cnVkZSBpbnRvIGZvbGxvd2luZyBzaWJsaW5ncyAob3IgcG9zc2li
bHkgb3V0CisgICAgLy8gb2YgdGhpcyBibG9jayksIHRoZW4gdGhlIHBhcmVudCBnZXRzIG5vdGlm
aWVkIG9mIHRoZSBmbG9hdHMgbm93LgorICAgIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxk
UmVuZGVyQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1heEZsb2F0TG9naWNhbEJv
dHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRv
UmVuZGVyQmxvY2soY2hpbGQpLCAhY2hpbGROZWVkZWRMYXlvdXQpKTsKKworICAgIGlmIChjaGls
ZE9mZnNldC53aWR0aCgpIHx8IGNoaWxkT2Zmc2V0LmhlaWdodCgpKSB7CisgICAgICAgIHZpZXco
KS5hZGRMYXlvdXREZWx0YShjaGlsZE9mZnNldCk7CisKKyAgICAgICAgLy8gSWYgdGhlIGNoaWxk
IG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9z
aXRpb25lZAorICAgICAgICAvLyBkZXNjZW5kYW50cy4gIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBu
ZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvCisgICAg
ICAgIC8vIHJlcGFpbnQgb3Vyc2VsdmVzIChhbmQgdGhlIGNoaWxkKSBhbnl3YXkuCisgICAgICAg
IGlmIChjaGlsZEhhZExheW91dCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkgJiYgY2hpbGQtPmNoZWNr
Rm9yUmVwYWludER1cmluZ0xheW91dCgpKQorICAgICAgICAgICAgY2hpbGQtPnJlcGFpbnREdXJp
bmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOworICAgIH0KKworICAgIGlmICghY2hpbGRIYWRMYXlv
dXQgJiYgY2hpbGQtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKSB7CisgICAgICAgIGNo
aWxkLT5yZXBhaW50KCk7CisgICAgICAgIGNoaWxkLT5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMo
dHJ1ZSk7CisgICAgfQorCisgICAgaWYgKHBhZ2luYXRlZCkgeworICAgICAgICAvLyBDaGVjayBm
b3IgYW4gYWZ0ZXIgcGFnZS9jb2x1bW4gYnJlYWsuCisgICAgICAgIExheW91dFVuaXQgbmV3SGVp
Z2h0ID0gYXBwbHlBZnRlckJyZWFrKGNoaWxkLCBsb2dpY2FsSGVpZ2h0KCksIG1hcmdpbkluZm8p
OworICAgICAgICBpZiAobmV3SGVpZ2h0ICE9IGhlaWdodCgpKQorICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChuZXdIZWlnaHQpOworICAgIH0KKworICAgIEFTU0VSVCh2aWV3KCkubGF5b3V0
RGVsdGFNYXRjaGVzKG9sZExheW91dERlbHRhKSk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93
OjphZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbykKK3sKKyAgICBib29sIGlzSG9yaXpvbnRhbCA9IGlzSG9yaXpvbnRhbFdy
aXRpbmdNb2RlKCk7CisgICAgYm9vbCBoYXNTdGF0aWNCbG9ja1Bvc2l0aW9uID0gY2hpbGQtPnN0
eWxlKCktPmhhc1N0YXRpY0Jsb2NrUG9zaXRpb24oaXNIb3Jpem9udGFsKTsKKyAgICAKKyAgICBM
YXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgdXBkYXRlU3RhdGlj
SW5saW5lUG9zaXRpb25Gb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcCk7CisKKyAgICBpZiAoIW1h
cmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKKyAgICAgICAgLy8gUG9z
aXRpb25lZCBibG9ja3MgZG9uJ3QgY29sbGFwc2UgbWFyZ2lucywgc28gYWRkIHRoZSBtYXJnaW4g
cHJvdmlkZWQgYnkKKyAgICAgICAgLy8gdGhlIGNvbnRhaW5lciBub3cuIFRoZSBjaGlsZCdzIG93
biBtYXJnaW4gaXMgYWRkZWQgbGF0ZXIgd2hlbiBjYWxjdWxhdGluZyBpdHMgbG9naWNhbCB0b3Au
CisgICAgICAgIExheW91dFVuaXQgY29sbGFwc2VkQmVmb3JlUG9zID0gbWFyZ2luSW5mby5wb3Np
dGl2ZU1hcmdpbigpOworICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNlZEJlZm9yZU5lZyA9IG1h
cmdpbkluZm8ubmVnYXRpdmVNYXJnaW4oKTsKKyAgICAgICAgbG9naWNhbFRvcCArPSBjb2xsYXBz
ZWRCZWZvcmVQb3MgLSBjb2xsYXBzZWRCZWZvcmVOZWc7CisgICAgfQorICAgIAorICAgIFJlbmRl
ckxheWVyKiBjaGlsZExheWVyID0gY2hpbGQtPmxheWVyKCk7CisgICAgaWYgKGNoaWxkTGF5ZXIt
PnN0YXRpY0Jsb2NrUG9zaXRpb24oKSAhPSBsb2dpY2FsVG9wKSB7CisgICAgICAgIGNoaWxkTGF5
ZXItPnNldFN0YXRpY0Jsb2NrUG9zaXRpb24obG9naWNhbFRvcCk7CisgICAgICAgIGlmIChoYXNT
dGF0aWNCbG9ja1Bvc2l0aW9uKQorICAgICAgICAgICAgY2hpbGQtPnNldENoaWxkTmVlZHNMYXlv
dXQodHJ1ZSwgTWFya09ubHlUaGlzKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93
OjphZGp1c3RGbG9hdGluZ0Jsb2NrKGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCit7Cisg
ICAgLy8gVGhlIGZsb2F0IHNob3VsZCBiZSBwb3NpdGlvbmVkIHRha2luZyBpbnRvIGFjY291bnQg
dGhlIGJvdHRvbSBtYXJnaW4KKyAgICAvLyBvZiB0aGUgcHJldmlvdXMgZmxvdy4gIFdlIGFkZCB0
aGF0IG1hcmdpbiBpbnRvIHRoZSBoZWlnaHQsIGdldCB0aGUKKyAgICAvLyBmbG9hdCBwb3NpdGlv
bmVkIHByb3Blcmx5LCBhbmQgdGhlbiBzdWJ0cmFjdCB0aGUgbWFyZ2luIG91dCBvZiB0aGUKKyAg
ICAvLyBoZWlnaHQgYWdhaW4uICBJbiB0aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tz
LCB3ZSBhbHdheXMganVzdAorICAgIC8vIHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBz
ZWxmLWNvbGxhcHNpbmcgYmxvY2sgY29sbGFwc2VkIGl0cworICAgIC8vIG93biBib3R0b20gbWFy
Z2luIGludG8gaXRzIHRvcCBtYXJnaW4uCisgICAgLy8KKyAgICAvLyBOb3RlIGFsc28gdGhhdCB0
aGUgcHJldmlvdXMgZmxvdyBtYXkgY29sbGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YK
KyAgICAvLyBvdXIgYmxvY2suICBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIGRvIG5vdCBh
ZGQgdGhlIG1hcmdpbiBpbiB0byBvdXIKKyAgICAvLyBoZWlnaHQgd2hlbiBjb21wdXRpbmcgdGhl
IHBvc2l0aW9uIG9mIHRoZSBmbG9hdC4gICBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCisg
ICAgLy8gZm9yIGJ5IHNpbXBseSBjYWxsaW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4g
IFNlZQorICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gvdGVzdHMvYWRob2MvY3NzL2JveC9ibG9j
ay9tYXJnaW4tY29sbGFwc2UvMDQ2Lmh0bWwgZm9yCisgICAgLy8gYW4gZXhhbXBsZSBvZiB0aGlz
IHNjZW5hcmlvLgorICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5D
b2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFy
Z2luKCk7CisgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5PZmZz
ZXQpOworICAgIHBvc2l0aW9uTmV3RmxvYXRzKCk7CisgICAgc2V0TG9naWNhbEhlaWdodChsb2dp
Y2FsSGVpZ2h0KCkgLSBtYXJnaW5PZmZzZXQpOworfQorCitSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdp
blZhbHVlcyBSZW5kZXJCbG9ja0Zsb3c6Om1hcmdpblZhbHVlc0ZvckNoaWxkKFJlbmRlckJveCog
Y2hpbGQpIGNvbnN0Cit7CisgICAgTGF5b3V0VW5pdCBjaGlsZEJlZm9yZVBvc2l0aXZlID0gMDsK
KyAgICBMYXlvdXRVbml0IGNoaWxkQmVmb3JlTmVnYXRpdmUgPSAwOworICAgIExheW91dFVuaXQg
Y2hpbGRBZnRlclBvc2l0aXZlID0gMDsKKyAgICBMYXlvdXRVbml0IGNoaWxkQWZ0ZXJOZWdhdGl2
ZSA9IDA7CisKKyAgICBMYXlvdXRVbml0IGJlZm9yZU1hcmdpbiA9IDA7CisgICAgTGF5b3V0VW5p
dCBhZnRlck1hcmdpbiA9IDA7CisKKyAgICBSZW5kZXJCbG9ja0Zsb3cqIGNoaWxkUmVuZGVyQmxv
Y2sgPSBjaGlsZC0+aXNSZW5kZXJCbG9ja0Zsb3coKSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxk
KSA6IDA7CisgICAgCisgICAgLy8gSWYgdGhlIGNoaWxkIGhhcyB0aGUgc2FtZSBkaXJlY3Rpb25h
bGl0eSBhcyB3ZSBkbywgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gaXRzCisgICAgLy8gbWFyZ2lu
cyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24uCisgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJv
b3QoKSkgeworICAgICAgICBpZiAoY2hpbGRSZW5kZXJCbG9jaykgeworICAgICAgICAgICAgY2hp
bGRCZWZvcmVQb3NpdGl2ZSA9IGNoaWxkUmVuZGVyQmxvY2stPm1heFBvc2l0aXZlTWFyZ2luQmVm
b3JlKCk7CisgICAgICAgICAgICBjaGlsZEJlZm9yZU5lZ2F0aXZlID0gY2hpbGRSZW5kZXJCbG9j
ay0+bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAgICAgICAgIGNoaWxkQWZ0ZXJQb3Np
dGl2ZSA9IGNoaWxkUmVuZGVyQmxvY2stPm1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKTsKKyAgICAg
ICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IGNoaWxkUmVuZGVyQmxvY2stPm1heE5lZ2F0aXZl
TWFyZ2luQWZ0ZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJlZm9yZU1hcmdp
biA9IGNoaWxkLT5tYXJnaW5CZWZvcmUoKTsKKyAgICAgICAgICAgIGFmdGVyTWFyZ2luID0gY2hp
bGQtPm1hcmdpbkFmdGVyKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNoaWxkLT5pc0hv
cml6b250YWxXcml0aW5nTW9kZSgpID09IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpIHsKKyAg
ICAgICAgLy8gVGhlIGNoaWxkIGhhcyBhIGRpZmZlcmVudCBkaXJlY3Rpb25hbGl0eS4gIElmIHRo
ZSBjaGlsZCBpcyBwYXJhbGxlbCwgdGhlbiBpdCdzIGp1c3QKKyAgICAgICAgLy8gZmxpcHBlZCBy
ZWxhdGl2ZSB0byB1cy4gIFdlIGNhbiB1c2UgdGhlIG1hcmdpbnMgZm9yIHRoZSBvcHBvc2l0ZSBl
ZGdlcy4KKyAgICAgICAgaWYgKGNoaWxkUmVuZGVyQmxvY2spIHsKKyAgICAgICAgICAgIGNoaWxk
QmVmb3JlUG9zaXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkFmdGVy
KCk7CisgICAgICAgICAgICBjaGlsZEJlZm9yZU5lZ2F0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+
bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOworICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZl
ID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAgICAg
ICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IGNoaWxkUmVuZGVyQmxvY2stPm1heE5lZ2F0aXZlTWFy
Z2luQmVmb3JlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWZvcmVNYXJnaW4g
PSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKKyAgICAgICAgICAgIGFmdGVyTWFyZ2luID0gY2hpbGQt
Pm1hcmdpbkJlZm9yZSgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhl
IGNoaWxkIGlzIHBlcnBlbmRpY3VsYXIgdG8gdXMsIHdoaWNoIG1lYW5zIGl0cyBtYXJnaW5zIGRv
bid0IGNvbGxhcHNlIGJ1dCBhcmUgb24gdGhlCisgICAgICAgIC8vICJsb2dpY2FsIGxlZnQvcmln
aHQiIHNpZGVzIG9mIHRoZSBjaGlsZCBib3guICBXZSBjYW4ganVzdCByZXR1cm4gdGhlIHJhdyBt
YXJnaW4gaW4gdGhpcyBjYXNlLgorICAgICAgICBiZWZvcmVNYXJnaW4gPSBtYXJnaW5CZWZvcmVG
b3JDaGlsZChjaGlsZCk7CisgICAgICAgIGFmdGVyTWFyZ2luID0gbWFyZ2luQWZ0ZXJGb3JDaGls
ZChjaGlsZCk7CisgICAgfQorCisgICAgLy8gUmVzb2x2ZSB1bmNvbGxhcHNpbmcgbWFyZ2lucyBp
bnRvIHRoZWlyIHBvc2l0aXZlL25lZ2F0aXZlIGJ1Y2tldHMuCisgICAgaWYgKGJlZm9yZU1hcmdp
bikgeworICAgICAgICBpZiAoYmVmb3JlTWFyZ2luID4gMCkKKyAgICAgICAgICAgIGNoaWxkQmVm
b3JlUG9zaXRpdmUgPSBiZWZvcmVNYXJnaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNo
aWxkQmVmb3JlTmVnYXRpdmUgPSAtYmVmb3JlTWFyZ2luOworICAgIH0KKyAgICBpZiAoYWZ0ZXJN
YXJnaW4pIHsKKyAgICAgICAgaWYgKGFmdGVyTWFyZ2luID4gMCkKKyAgICAgICAgICAgIGNoaWxk
QWZ0ZXJQb3NpdGl2ZSA9IGFmdGVyTWFyZ2luOworICAgICAgICBlbHNlCisgICAgICAgICAgICBj
aGlsZEFmdGVyTmVnYXRpdmUgPSAtYWZ0ZXJNYXJnaW47CisgICAgfQorCisgICAgcmV0dXJuIE1h
cmdpblZhbHVlcyhjaGlsZEJlZm9yZVBvc2l0aXZlLCBjaGlsZEJlZm9yZU5lZ2F0aXZlLCBjaGls
ZEFmdGVyUG9zaXRpdmUsIGNoaWxkQWZ0ZXJOZWdhdGl2ZSk7Cit9CisKK0xheW91dFVuaXQgUmVu
ZGVyQmxvY2tGbG93Ojpjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5m
byYgbWFyZ2luSW5mbykKK3sKKyAgICBib29sIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IG11
c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQpOworICAgIGJvb2wgY2hpbGREaXNj
YXJkTWFyZ2luQWZ0ZXIgPSBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGQpOwor
ICAgIGJvb2wgY2hpbGRJc1NlbGZDb2xsYXBzaW5nID0gY2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdC
bG9jaygpOworCisgICAgLy8gVGhlIGNoaWxkIGRpc2NhcmRzIHRoZSBiZWZvcmUgbWFyZ2luIHdo
ZW4gdGhlIHRoZSBhZnRlciBtYXJnaW4gaGFzIGRpc2NhcmQgaW4gdGhlIGNhc2Ugb2YgYSBzZWxm
IGNvbGxhcHNpbmcgYmxvY2suCisgICAgY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlID0gY2hpbGRE
aXNjYXJkTWFyZ2luQmVmb3JlIHx8IChjaGlsZERpc2NhcmRNYXJnaW5BZnRlciAmJiBjaGlsZElz
U2VsZkNvbGxhcHNpbmcpOworCisgICAgLy8gR2V0IHRoZSBmb3VyIG1hcmdpbiB2YWx1ZXMgZm9y
IHRoZSBjaGlsZCBhbmQgY2FjaGUgdGhlbS4KKyAgICBjb25zdCBNYXJnaW5WYWx1ZXMgY2hpbGRN
YXJnaW5zID0gbWFyZ2luVmFsdWVzRm9yQ2hpbGQoY2hpbGQpOworCisgICAgLy8gR2V0IG91ciBt
YXggcG9zIGFuZCBuZWcgdG9wIG1hcmdpbnMuCisgICAgTGF5b3V0VW5pdCBwb3NUb3AgPSBjaGls
ZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICBMYXlvdXRVbml0IG5lZ1RvcCA9
IGNoaWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpOworCisgICAgLy8gRm9yIHNlbGYt
Y29sbGFwc2luZyBibG9ja3MsIGNvbGxhcHNlIG91ciBib3R0b20gbWFyZ2lucyBpbnRvIG91cgor
ICAgIC8vIHRvcCB0byBnZXQgbmV3IHBvc1RvcCBhbmQgbmVnVG9wIHZhbHVlcy4KKyAgICBpZiAo
Y2hpbGRJc1NlbGZDb2xsYXBzaW5nKSB7CisgICAgICAgIHBvc1RvcCA9IG1heChwb3NUb3AsIGNo
aWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICBuZWdUb3AgPSBtYXgo
bmVnVG9wLCBjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRlcigpKTsKKyAgICB9CisgICAg
CisgICAgLy8gU2VlIGlmIHRoZSB0b3AgbWFyZ2luIGlzIHF1aXJreS4gV2Ugb25seSBjYXJlIGlm
IHRoaXMgY2hpbGQgaGFzCisgICAgLy8gbWFyZ2lucyB0aGF0IHdpbGwgY29sbGFwc2Ugd2l0aCB1
cy4KKyAgICBib29sIHRvcFF1aXJrID0gaGFzTWFyZ2luQmVmb3JlUXVpcmsoY2hpbGQpOworCisg
ICAgaWYgKG1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKKyAgICAg
ICAgaWYgKCFjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUgJiYgIW1hcmdpbkluZm8uZGlzY2FyZE1h
cmdpbigpKSB7CisgICAgICAgICAgICAvLyBUaGlzIGNoaWxkIGlzIGNvbGxhcHNpbmcgd2l0aCB0
aGUgdG9wIG9mIHRoZQorICAgICAgICAgICAgLy8gYmxvY2suIElmIGl0IGhhcyBsYXJnZXIgbWFy
Z2luIHZhbHVlcywgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZQorICAgICAgICAgICAgLy8gb3VyIG93
biBtYXhpbWFsIHZhbHVlcy4KKyAgICAgICAgICAgIGlmICghZG9jdW1lbnQoKS5pblF1aXJrc01v
ZGUoKSB8fCAhbWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpIHx8ICF0b3BRdWlyaykKKyAgICAg
ICAgICAgICAgICBzZXRNYXhNYXJnaW5CZWZvcmVWYWx1ZXMobWF4KHBvc1RvcCwgbWF4UG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSksIG1heChuZWdUb3AsIG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkp
KTsKKworICAgICAgICAgICAgLy8gVGhlIG1pbnV0ZSBhbnkgb2YgdGhlIG1hcmdpbnMgaW52b2x2
ZWQgaXNuJ3QgYSBxdWlyaywgZG9uJ3QKKyAgICAgICAgICAgIC8vIGNvbGxhcHNlIGl0IGF3YXks
IGV2ZW4gaWYgdGhlIG1hcmdpbiBpcyBzbWFsbGVyICh3d3cud2VicmVmZXJlbmNlLmNvbQorICAg
ICAgICAgICAgLy8gaGFzIGFuIGV4YW1wbGUgb2YgdGhpcywgYSA8ZHQ+IHdpdGggMC44ZW0gYXV0
aG9yLXNwZWNpZmllZCBpbnNpZGUKKyAgICAgICAgICAgIC8vIGEgPGRsPiBpbnNpZGUgYSA8dGQ+
LgorICAgICAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
aygpICYmICF0b3BRdWlyayAmJiAocG9zVG9wIC0gbmVnVG9wKSkgeworICAgICAgICAgICAgICAg
IHNldEhhc01hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtYXJnaW5J
bmZvLnNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayh0cnVlKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmRldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
aygpICYmIHRvcFF1aXJrICYmICFtYXJnaW5CZWZvcmUoKSkKKyAgICAgICAgICAgICAgICAvLyBX
ZSBoYXZlIG5vIHRvcCBtYXJnaW4gYW5kIG91ciB0b3AgY2hpbGQgaGFzIGEgcXVpcmt5IG1hcmdp
bi4KKyAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIHBpY2sgdXAgdGhpcyBxdWlya3kgbWFyZ2lu
IGFuZCBwYXNzIGl0IHRocm91Z2guCisgICAgICAgICAgICAgICAgLy8gVGhpcyBkZWFscyB3aXRo
IHRoZSA8dGQ+PGRpdj48cD4gY2FzZS4KKyAgICAgICAgICAgICAgICAvLyBEb24ndCBkbyB0aGlz
IGZvciBhIGJsb2NrIHRoYXQgc3BsaXQgdHdvIGlubGluZXMgdGhvdWdoLiBZb3UgZG8KKyAgICAg
ICAgICAgICAgICAvLyBzdGlsbCBhcHBseSBtYXJnaW5zIGluIHRoaXMgY2FzZS4KKyAgICAgICAg
ICAgICAgICBzZXRIYXNNYXJnaW5CZWZvcmVRdWlyayh0cnVlKTsKKyAgICAgICAgfSBlbHNlCisg
ICAgICAgICAgICAvLyBUaGUgYmVmb3JlIG1hcmdpbiBvZiB0aGUgY29udGFpbmVyIHdpbGwgYWxz
byBkaXNjYXJkIGFsbCB0aGUgbWFyZ2lucyBpdCBpcyBjb2xsYXBzaW5nIHdpdGguCisgICAgICAg
ICAgICBzZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgpOworICAgIH0KKworICAgIC8vIE9uY2Ug
d2UgZmluZCBhIGNoaWxkIHdpdGggZGlzY2FyZE1hcmdpbkJlZm9yZSBhbGwgdGhlIG1hcmdpbnMg
Y29sbGFwc2luZyB3aXRoIHVzIG11c3QgYWxzbyBkaXNjYXJkLiAKKyAgICBpZiAoY2hpbGREaXNj
YXJkTWFyZ2luQmVmb3JlKSB7CisgICAgICAgIG1hcmdpbkluZm8uc2V0RGlzY2FyZE1hcmdpbih0
cnVlKTsKKyAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigpOworICAgIH0KKworICAgIGlm
IChtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgJiYgbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVP
ZkJsb2NrKCkgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpCisgICAgICAgIG1hcmdpbkluZm8uc2V0SGFz
TWFyZ2luQmVmb3JlUXVpcmsodG9wUXVpcmspOworCisgICAgTGF5b3V0VW5pdCBiZWZvcmVDb2xs
YXBzZUxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgTGF5b3V0VW5pdCBsb2dpY2Fs
VG9wID0gYmVmb3JlQ29sbGFwc2VMb2dpY2FsVG9wOworICAgIGlmIChjaGlsZElzU2VsZkNvbGxh
cHNpbmcpIHsKKyAgICAgICAgLy8gRm9yIGEgc2VsZiBjb2xsYXBzaW5nIGJsb2NrIGJvdGggdGhl
IGJlZm9yZSBhbmQgYWZ0ZXIgbWFyZ2lucyBnZXQgZGlzY2FyZGVkLiBUaGUgYmxvY2sgZG9lc24n
dCBjb250cmlidXRlIGFueXRoaW5nIHRvIHRoZSBoZWlnaHQgb2YgdGhlIGJsb2NrLgorICAgICAg
ICAvLyBBbHNvLCB0aGUgY2hpbGQncyB0b3AgcG9zaXRpb24gZXF1YWxzIHRoZSBsb2dpY2FsIGhl
aWdodCBvZiB0aGUgY29udGFpbmVyLgorICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1hcmdpbkJl
Zm9yZSAmJiAhbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkpIHsKKyAgICAgICAgICAgIC8vIFRo
aXMgY2hpbGQgaGFzIG5vIGhlaWdodC4gV2UgbmVlZCB0byBjb21wdXRlIG91cgorICAgICAgICAg
ICAgLy8gcG9zaXRpb24gYmVmb3JlIHdlIGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9n
ZXRoZXIsCisgICAgICAgICAgICAvLyBzbyB0aGF0IHdlIGNhbiBnZXQgYW4gYWNjdXJhdGUgcG9z
aXRpb24gZm9yIHRoZSB6ZXJvLWhlaWdodCBibG9jay4KKyAgICAgICAgICAgIExheW91dFVuaXQg
Y29sbGFwc2VkQmVmb3JlUG9zID0gbWF4KG1hcmdpbkluZm8ucG9zaXRpdmVNYXJnaW4oKSwgY2hp
bGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCkpOworICAgICAgICAgICAgTGF5b3V0VW5p
dCBjb2xsYXBzZWRCZWZvcmVOZWcgPSBtYXgobWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpLCBj
aGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSk7CisgICAgICAgICAgICBtYXJnaW5J
bmZvLnNldE1hcmdpbihjb2xsYXBzZWRCZWZvcmVQb3MsIGNvbGxhcHNlZEJlZm9yZU5lZyk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIE5vdyBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJn
aW5zIHRvZ2V0aGVyLCB3aGljaCBtZWFucyBleGFtaW5pbmcgb3VyCisgICAgICAgICAgICAvLyBi
b3R0b20gbWFyZ2luIHZhbHVlcyBhcyB3ZWxsLiAKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0
UG9zaXRpdmVNYXJnaW5JZkxhcmdlcihjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigp
KTsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0TmVnYXRpdmVNYXJnaW5JZkxhcmdlcihjaGls
ZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRlcigpKTsKKworICAgICAgICAgICAgaWYgKCFtYXJn
aW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKQorICAgICAgICAgICAgICAgIC8v
IFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWxmLWNvbGxh
cHNpbmcgYmxvY2sKKyAgICAgICAgICAgICAgICAvLyBpcyBjb3JyZWN0LCBzaW5jZSBpdCBjb3Vs
ZCBoYXZlIG92ZXJmbG93aW5nIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IG5lZWRz
IHRvIGJlIHBvc2l0aW9uZWQgY29ycmVjdGx5IChlLmcuLCBhIGJsb2NrIHRoYXQKKyAgICAgICAg
ICAgICAgICAvLyBoYWQgYSBzcGVjaWZpZWQgaGVpZ2h0IG9mIDAgYnV0IHRoYXQgYWN0dWFsbHkg
aGFkIHN1YmNvbnRlbnQpLgorICAgICAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVp
Z2h0KCkgKyBjb2xsYXBzZWRCZWZvcmVQb3MgLSBjb2xsYXBzZWRCZWZvcmVOZWc7CisgICAgICAg
IH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9y
Q2hpbGQoY2hpbGQpKSB7CisgICAgICAgICAgICBBU1NFUlQoIW1hcmdpbkluZm8uZGlzY2FyZE1h
cmdpbigpIHx8IChtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSAmJiAhbWFyZ2luSW5mby5tYXJn
aW4oKSkpOworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGF0IHRoZSBiZWZvcmUgc2lkZSBvZiB0
aGUgYmxvY2sgYW5kIHdlIGNvbGxhcHNlLCBpZ25vcmUgdGhlIGNvbXB1dGVkIG1hcmdpbgorICAg
ICAgICAgICAgLy8gYW5kIGp1c3QgYWRkIHRoZSBjaGlsZCBtYXJnaW4gdG8gdGhlIGNvbnRhaW5l
ciBoZWlnaHQuIFRoaXMgd2lsbCBjb3JyZWN0bHkgcG9zaXRpb24KKyAgICAgICAgICAgIC8vIHRo
ZSBjaGlsZCBpbnNpZGUgdGhlIGNvbnRhaW5lci4KKyAgICAgICAgICAgIExheW91dFVuaXQgc2Vw
YXJhdGVNYXJnaW4gPSAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSA/
IG1hcmdpbkluZm8ubWFyZ2luKCkgOiBMYXlvdXRVbml0KDApOworICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBzZXBhcmF0ZU1hcmdpbiArIG1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSk7CisgICAgICAgICAgICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdo
dCgpOworICAgICAgICB9IGVsc2UgaWYgKCFtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSAmJiAo
IW1hcmdpbkluZm8uYXRCZWZvcmVTaWRlT2ZCbG9jaygpCisgICAgICAgICAgICB8fCAoIW1hcmdp
bkluZm8uY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4oKQorICAgICAgICAgICAg
JiYgKCFkb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFp
bmVyKCkgfHwgIW1hcmdpbkluZm8uaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSkpKSkgeworICAgICAg
ICAgICAgLy8gV2UncmUgY29sbGFwc2luZyB3aXRoIGEgcHJldmlvdXMgc2libGluZydzIG1hcmdp
bnMgYW5kIG5vdAorICAgICAgICAgICAgLy8gd2l0aCB0aGUgdG9wIG9mIHRoZSBibG9jay4KKyAg
ICAgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbWF4KG1hcmdpbklu
Zm8ucG9zaXRpdmVNYXJnaW4oKSwgcG9zVG9wKSAtIG1heChtYXJnaW5JbmZvLm5lZ2F0aXZlTWFy
Z2luKCksIG5lZ1RvcCkpOworICAgICAgICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQo
KTsKKyAgICAgICAgfQorCisgICAgICAgIG1hcmdpbkluZm8uc2V0RGlzY2FyZE1hcmdpbihjaGls
ZERpc2NhcmRNYXJnaW5BZnRlcik7CisgICAgICAgIAorICAgICAgICBpZiAoIW1hcmdpbkluZm8u
ZGlzY2FyZE1hcmdpbigpKSB7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldFBvc2l0aXZlTWFy
Z2luKGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXROZWdhdGl2ZU1hcmdpbihjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRl
cigpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtYXJnaW5JbmZvLmNsZWFyTWFyZ2lu
KCk7CisKKyAgICAgICAgaWYgKG1hcmdpbkluZm8ubWFyZ2luKCkpCisgICAgICAgICAgICBtYXJn
aW5JbmZvLnNldEhhc01hcmdpbkFmdGVyUXVpcmsoaGFzTWFyZ2luQWZ0ZXJRdWlyayhjaGlsZCkp
OworICAgIH0KKyAgICAKKyAgICAvLyBJZiBtYXJnaW5zIHdvdWxkIHB1bGwgdXMgcGFzdCB0aGUg
dG9wIG9mIHRoZSBuZXh0IHBhZ2UsIHRoZW4gd2UgbmVlZCB0byBwdWxsIGJhY2sgYW5kIHByZXRl
bmQgbGlrZSB0aGUgbWFyZ2lucworICAgIC8vIGNvbGxhcHNlZCBpbnRvIHRoZSBwYWdlIGVkZ2Uu
CisgICAgTGF5b3V0U3RhdGUqIGxheW91dFN0YXRlID0gdmlldygpLmxheW91dFN0YXRlKCk7Cisg
ICAgaWYgKGxheW91dFN0YXRlLT5pc1BhZ2luYXRlZCgpICYmIGxheW91dFN0YXRlLT5wYWdlTG9n
aWNhbEhlaWdodCgpICYmIGxvZ2ljYWxUb3AgPiBiZWZvcmVDb2xsYXBzZUxvZ2ljYWxUb3AKKyAg
ICAgICAgJiYgaGFzTmV4dFBhZ2UoYmVmb3JlQ29sbGFwc2VMb2dpY2FsVG9wKSkgeworICAgICAg
ICBMYXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wOworICAgICAgICBsb2dpY2Fs
VG9wID0gbWluKGxvZ2ljYWxUb3AsIG5leHRQYWdlTG9naWNhbFRvcChiZWZvcmVDb2xsYXBzZUxv
Z2ljYWxUb3ApKTsKKyAgICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyAo
bG9naWNhbFRvcCAtIG9sZExvZ2ljYWxUb3ApKTsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZl
IGNvbGxhcHNlZCBpbnRvIGEgcHJldmlvdXMgc2libGluZyBhbmQgc28gcmVkdWNlZCB0aGUgaGVp
Z2h0IG9mIHRoZSBwYXJlbnQsIGVuc3VyZSBhbnkgZmxvYXRzIHRoYXQgbm93CisgICAgLy8gb3Zl
cmhhbmcgZnJvbSB0aGUgcHJldmlvdXMgc2libGluZyBhcmUgYWRkZWQgdG8gb3VyIHBhcmVudC4g
SWYgdGhlIGNoaWxkJ3MgcHJldmlvdXMgc2libGluZyBpdHNlbGYgaXMgYSBmbG9hdCB0aGUgY2hp
bGQgd2lsbCBhdm9pZAorICAgIC8vIG9yIGNsZWFyIGl0IGFueXdheSwgc28gZG9uJ3Qgd29ycnkg
YWJvdXQgYW55IGZsb2F0aW5nIGNoaWxkcmVuIGl0IG1heSBjb250YWluLgorICAgIExheW91dFVu
aXQgb2xkTG9naWNhbEhlaWdodCA9IGxvZ2ljYWxIZWlnaHQoKTsKKyAgICBzZXRMb2dpY2FsSGVp
Z2h0KGxvZ2ljYWxUb3ApOworICAgIFJlbmRlck9iamVjdCogcHJldiA9IGNoaWxkLT5wcmV2aW91
c1NpYmxpbmcoKTsKKyAgICBpZiAocHJldiAmJiBwcmV2LT5pc1JlbmRlckJsb2NrRmxvdygpICYm
ICFwcmV2LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpIHsKKyAgICAgICAgUmVu
ZGVyQmxvY2sqIGJsb2NrID0gdG9SZW5kZXJCbG9jayhwcmV2KTsKKyAgICAgICAgaWYgKGJsb2Nr
LT5jb250YWluc0Zsb2F0cygpICYmICFibG9jay0+YXZvaWRzRmxvYXRzKCkgJiYgKGJsb2NrLT5s
b2dpY2FsVG9wKCkgKyBibG9jay0+bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpID4gbG9naWNh
bFRvcCkgCisgICAgICAgICAgICBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyhibG9jaywgZmFsc2UpOwor
ICAgIH0KKyAgICBzZXRMb2dpY2FsSGVpZ2h0KG9sZExvZ2ljYWxIZWlnaHQpOworCisgICAgcmV0
dXJuIGxvZ2ljYWxUb3A7Cit9CisKK0xheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93OjpjbGVhckZs
b2F0c0lmTmVlZGVkKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExh
eW91dFVuaXQgb2xkVG9wUG9zTWFyZ2luLCBMYXlvdXRVbml0IG9sZFRvcE5lZ01hcmdpbiwgTGF5
b3V0VW5pdCB5UG9zKQoreworICAgIExheW91dFVuaXQgaGVpZ2h0SW5jcmVhc2UgPSBnZXRDbGVh
ckRlbHRhKGNoaWxkLCB5UG9zKTsKKyAgICBpZiAoIWhlaWdodEluY3JlYXNlKQorICAgICAgICBy
ZXR1cm4geVBvczsKKworICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsK
KyAgICAgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW4gPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSB8fCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGQp
OworCisgICAgICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgY2xlYXIsIHRo
ZXkgY2FuIHN0aWxsIGNvbGxhcHNlIHRoZWlyCisgICAgICAgIC8vIG1hcmdpbnMgd2l0aCBmb2xs
b3dpbmcgc2libGluZ3MuICBSZXNldCB0aGUgY3VycmVudCBtYXJnaW5zIHRvIHJlcHJlc2VudAor
ICAgICAgICAvLyB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrJ3MgbWFyZ2lucyBvbmx5LgorICAg
ICAgICAvLyBJZiBESVNDQVJEIGlzIHNwZWNpZmllZCBmb3IgLXdlYmtpdC1tYXJnaW4tY29sbGFw
c2UsIHJlc2V0IHRoZSBtYXJnaW4gdmFsdWVzLgorICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1h
cmdpbikgeworICAgICAgICAgICAgTWFyZ2luVmFsdWVzIGNoaWxkTWFyZ2lucyA9IG1hcmdpblZh
bHVlc0ZvckNoaWxkKGNoaWxkKTsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVN
YXJnaW4obWF4KGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpLCBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKSk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z2F0aXZlTWFyZ2luKG1heChjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSwgY2hp
bGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSkpOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKKyAgICAgICAgbWFyZ2luSW5mby5zZXRE
aXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbik7CisKKyAgICAgICAgLy8gQ1NTMi4xIHN0
YXRlczoKKyAgICAgICAgLy8gIklmIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIG9mIGFuIGVs
ZW1lbnQgd2l0aCBjbGVhcmFuY2UgYXJlIGFkam9pbmluZywgaXRzIG1hcmdpbnMgY29sbGFwc2Ug
d2l0aCAKKyAgICAgICAgLy8gdGhlIGFkam9pbmluZyBtYXJnaW5zIG9mIGZvbGxvd2luZyBzaWJs
aW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhl
IGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4iCisgICAgICAgIC8vIFNvIHRoZSBw
YXJlbnQncyBib3R0b20gbWFyZ2luIGNhbm5vdCBjb2xsYXBzZSB0aHJvdWdoIHRoaXMgYmxvY2sg
b3IgYW55IHN1YnNlcXVlbnQgc2VsZi1jb2xsYXBzaW5nIGJsb2Nrcy4gQ2hlY2sgc3Vic2VxdWVu
dCBzaWJsaW5ncworICAgICAgICAvLyBmb3IgYSBibG9jayB3aXRoIGhlaWdodCAtIGlmIG5vbmUg
aXMgZm91bmQgdGhlbiBkb24ndCBhbGxvdyB0aGUgbWFyZ2lucyB0byBjb2xsYXBzZSB3aXRoIHRo
ZSBwYXJlbnQuCisgICAgICAgIGJvb2wgd291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50ID0g
bWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKCk7CisgICAgICAg
IGZvciAoUmVuZGVyQm94KiBjdXJyID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCk7IGN1cnIgJiYg
d291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50OyBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmdC
b3goKSkgeworICAgICAgICAgICAgaWYgKCFjdXJyLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3Np
dGlvbmVkKCkgJiYgIWN1cnItPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQorICAgICAgICAgICAg
ICAgIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIGlmICh3b3VsZENvbGxhcHNlTWFyZ2luc1dpdGhQYXJlbnQpCisgICAgICAgICAgICBt
YXJnaW5JbmZvLnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4oZmFsc2UpOwor
CisgICAgICAgIC8vIENTUzIuMTogInRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCBzbyB0
aGF0IGNsZWFyYW5jZSArIG1hcmdpbi10b3AgPSBbaGVpZ2h0IG9mIGZsb2F0XSwgaS5lLiwgY2xl
YXJhbmNlID0gW2hlaWdodCBvZiBmbG9hdF0gLSBtYXJnaW4tdG9wIgorICAgICAgICAvLyBNb3Zl
IHRoZSB0b3Agb2YgdGhlIGNoaWxkIGJveCB0byB0aGUgYm90dG9tIG9mIHRoZSBmbG9hdCBpZ25v
cmluZyB0aGUgY2hpbGQncyB0b3AgbWFyZ2luLgorICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNl
ZE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKKyAgICAgICAg
c2V0TG9naWNhbEhlaWdodChjaGlsZC0+bG9naWNhbFRvcCgpIC0gY29sbGFwc2VkTWFyZ2luKTsK
KyAgICAgICAgLy8gQSBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luLXRvcCB2YWx1ZSBjYW5jZWxz
IGl0c2VsZiBvdXQgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBmYWN0b3JlZCBpbnRvIHx5UG9zfCBh
Ym92ZS4KKyAgICAgICAgaGVpZ2h0SW5jcmVhc2UgLT0gbWF4KExheW91dFVuaXQoKSwgY29sbGFw
c2VkTWFyZ2luKTsKKyAgICB9IGVsc2UKKyAgICAgICAgLy8gSW5jcmVhc2Ugb3VyIGhlaWdodCBi
eSB0aGUgYW1vdW50IHdlIGhhZCB0byBjbGVhci4KKyAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBoZWlnaHRJbmNyZWFzZSk7CisgICAgCisgICAgaWYgKG1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKKyAgICAgICAgLy8gV2UgY2FuIG5v
IGxvbmdlciBjb2xsYXBzZSB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrIHNpbmNlIGEgY2xlYXIK
KyAgICAgICAgLy8gb2NjdXJyZWQuICBUaGUgZW1wdHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhl
IGNsZWFyZWQgYmxvY2suCisgICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJl
Y3QuICBOZWVkIGNsYXJpZmljYXRpb24gZm9yIHdoYXQgdG8gZG8KKyAgICAgICAgLy8gaWYgdGhl
IGhlaWdodCB0aGUgY2xlYXJlZCBibG9jayBpcyBvZmZzZXQgYnkgaXMgc21hbGxlciB0aGFuIHRo
ZQorICAgICAgICAvLyBtYXJnaW5zIGludm9sdmVkLgorICAgICAgICBzZXRNYXhNYXJnaW5CZWZv
cmVWYWx1ZXMob2xkVG9wUG9zTWFyZ2luLCBvbGRUb3BOZWdNYXJnaW4pOworICAgICAgICBtYXJn
aW5JbmZvLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOworCisgICAgICAgIC8vIEluIGNh
c2UgdGhlIGNoaWxkIGRpc2NhcmRlZCB0aGUgYmVmb3JlIG1hcmdpbiBvZiB0aGUgYmxvY2sgd2Ug
bmVlZCB0byByZXNldCB0aGUgbXVzdERpc2NhcmRNYXJnaW5CZWZvcmUgZmxhZyB0byB0aGUgaW5p
dGlhbCB2YWx1ZS4KKyAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisgICAgfQorCisgICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wID0geVBvcyArIGhlaWdodEluY3JlYXNlOworICAgIC8vIEFmdGVyIG1h
cmdpbiBjb2xsYXBzaW5nLCBvbmUgb2Ygb3VyIGZsb2F0cyBtYXkgbm93IGludHJ1ZGUgaW50byB0
aGUgY2hpbGQuIElmIHRoZSBjaGlsZCBkb2Vzbid0IGNvbnRhaW4gZmxvYXRzIG9mIGl0cyBvd24g
aXQKKyAgICAvLyB3b24ndCBnZXQgcGlja2VkIHVwIGZvciByZWxheW91dCBldmVuIHRob3VnaCB0
aGUgbG9naWNhbCB0b3AgZXN0aW1hdGUgd2FzIHdyb25nIC0gc28gYWRkIHRoZSBuZXdseSBpbnRy
dWRpbmcgZmxvYXQgbm93LgorICAgIGlmIChjb250YWluc0Zsb2F0cygpICYmIGNoaWxkLT5pc1Jl
bmRlckJsb2NrKCkgJiYgIXRvUmVuZGVyQmxvY2soY2hpbGQpLT5jb250YWluc0Zsb2F0cygpICYm
ICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wKQorICAgICAgICB0b1JlbmRlckJsb2NrKGNoaWxkKS0+YWRkSW50cnVkaW5nRmxv
YXRzKHRoaXMsIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudCgpLCBsb2dpY2FsVG9wKTsKKwor
ICAgIHJldHVybiBsb2dpY2FsVG9wOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6bWFyZ2lu
QmVmb3JlRXN0aW1hdGVGb3JDaGlsZChSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0JiBwb3Np
dGl2ZU1hcmdpbkJlZm9yZSwgTGF5b3V0VW5pdCYgbmVnYXRpdmVNYXJnaW5CZWZvcmUsIGJvb2wm
IGRpc2NhcmRNYXJnaW5CZWZvcmUpIGNvbnN0Cit7CisgICAgLy8gR2l2ZSB1cCBpZiBpbiBxdWly
a3MgbW9kZSBhbmQgd2UncmUgYSBib2R5L3RhYmxlIGNlbGwgYW5kIHRoZSB0b3AgbWFyZ2luIG9m
IHRoZSBjaGlsZCBib3ggaXMgcXVpcmt5LgorICAgIC8vIEdpdmUgdXAgaWYgdGhlIGNoaWxkIHNw
ZWNpZmllZCAtd2Via2l0LW1hcmdpbi1jb2xsYXBzZTogc2VwYXJhdGUgdGhhdCBwcmV2ZW50cyBj
b2xsYXBzaW5nLgorICAgIC8vIEZJWE1FOiBVc2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFj
Y2Vzc29yIGZvciBtYXJnaW5CZWZvcmVDb2xsYXBzZS4KKyAgICBpZiAoKGRvY3VtZW50KCkuaW5R
dWlya3NNb2RlKCkgJiYgaGFzTWFyZ2luQWZ0ZXJRdWlyayhjaGlsZCkgJiYgKGlzVGFibGVDZWxs
KCkgfHwgaXNCb2R5KCkpKSB8fCBjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3JlQ29sbGFwc2Uo
KSA9PSBNU0VQQVJBVEUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBtYXJnaW5zIGFy
ZSBkaXNjYXJkZWQgYnkgYSBjaGlsZCB0aGF0IHNwZWNpZmllZCAtd2Via2l0LW1hcmdpbi1jb2xs
YXBzZTogZGlzY2FyZC4KKyAgICAvLyBGSVhNRTogVXNlIHdyaXRpbmcgbW9kZSBpbmRlcGVuZGVu
dCBhY2Nlc3NvciBmb3IgbWFyZ2luQmVmb3JlQ29sbGFwc2UuCisgICAgaWYgKGNoaWxkLT5zdHls
ZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVNDQVJEKSB7CisgICAgICAgIHBvc2l0
aXZlTWFyZ2luQmVmb3JlID0gMDsKKyAgICAgICAgbmVnYXRpdmVNYXJnaW5CZWZvcmUgPSAwOwor
ICAgICAgICBkaXNjYXJkTWFyZ2luQmVmb3JlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIExheW91dFVuaXQgYmVmb3JlQ2hpbGRNYXJnaW4gPSBtYXJnaW5CZWZvcmVGb3JD
aGlsZChjaGlsZCk7CisgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSBtYXgocG9zaXRpdmVNYXJn
aW5CZWZvcmUsIGJlZm9yZUNoaWxkTWFyZ2luKTsKKyAgICBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9
IG1heChuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgLWJlZm9yZUNoaWxkTWFyZ2luKTsKKworICAgIGlm
ICghY2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAg
ICBSZW5kZXJCbG9ja0Zsb3cqIGNoaWxkQmxvY2sgPSB0b1JlbmRlckJsb2NrRmxvdyhjaGlsZCk7
CisgICAgaWYgKGNoaWxkQmxvY2stPmNoaWxkcmVuSW5saW5lKCkgfHwgY2hpbGRCbG9jay0+aXNX
cml0aW5nTW9kZVJvb3QoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWFyZ2luSW5mbyBjaGls
ZE1hcmdpbkluZm8oY2hpbGRCbG9jaywgY2hpbGRCbG9jay0+Ym9yZGVyQW5kUGFkZGluZ0JlZm9y
ZSgpLCBjaGlsZEJsb2NrLT5ib3JkZXJBbmRQYWRkaW5nQWZ0ZXIoKSk7CisgICAgaWYgKCFjaGls
ZE1hcmdpbkluZm8uY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4oKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgUmVuZGVyQm94KiBncmFuZGNoaWxkQm94ID0gY2hpbGRCbG9jay0+
Zmlyc3RDaGlsZEJveCgpOworICAgIGZvciAoIDsgZ3JhbmRjaGlsZEJveDsgZ3JhbmRjaGlsZEJv
eCA9IGdyYW5kY2hpbGRCb3gtPm5leHRTaWJsaW5nQm94KCkpIHsKKyAgICAgICAgaWYgKCFncmFu
ZGNoaWxkQm94LT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgICAg
ICBicmVhazsKKyAgICB9CisgICAgCisgICAgLy8gR2l2ZSB1cCBpZiB0aGVyZSBpcyBjbGVhcmFu
Y2Ugb24gdGhlIGJveCwgc2luY2UgaXQgcHJvYmFibHkgd29uJ3QgY29sbGFwc2UgaW50byB1cy4K
KyAgICBpZiAoIWdyYW5kY2hpbGRCb3ggfHwgZ3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+Y2xlYXIo
KSAhPSBDTk9ORSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gTWFrZSBzdXJlIHRvIHVwZGF0
ZSB0aGUgYmxvY2sgbWFyZ2lucyBub3cgZm9yIHRoZSBncmFuZGNoaWxkIGJveCBzbyB0aGF0IHdl
J3JlIGxvb2tpbmcgYXQgY3VycmVudCB2YWx1ZXMuCisgICAgaWYgKGdyYW5kY2hpbGRCb3gtPm5l
ZWRzTGF5b3V0KCkpIHsKKyAgICAgICAgZ3JhbmRjaGlsZEJveC0+Y29tcHV0ZUFuZFNldEJsb2Nr
RGlyZWN0aW9uTWFyZ2lucyh0aGlzKTsKKyAgICAgICAgaWYgKGdyYW5kY2hpbGRCb3gtPmlzUmVu
ZGVyQmxvY2soKSkgeworICAgICAgICAgICAgUmVuZGVyQmxvY2sqIGdyYW5kY2hpbGRCbG9jayA9
IHRvUmVuZGVyQmxvY2soZ3JhbmRjaGlsZEJveCk7CisgICAgICAgICAgICBncmFuZGNoaWxkQmxv
Y2stPnNldEhhc01hcmdpbkJlZm9yZVF1aXJrKGdyYW5kY2hpbGRCb3gtPnN0eWxlKCktPmhhc01h
cmdpbkJlZm9yZVF1aXJrKCkpOworICAgICAgICAgICAgZ3JhbmRjaGlsZEJsb2NrLT5zZXRIYXNN
YXJnaW5BZnRlclF1aXJrKGdyYW5kY2hpbGRCb3gtPnN0eWxlKCktPmhhc01hcmdpbkFmdGVyUXVp
cmsoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb2xsYXBzZSB0aGUgbWFyZ2luIG9m
IHRoZSBncmFuZGNoaWxkIGJveCB3aXRoIG91ciBvd24gdG8gcHJvZHVjZSBhbiBlc3RpbWF0ZS4K
KyAgICBjaGlsZEJsb2NrLT5tYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKGdyYW5kY2hpbGRC
b3gsIHBvc2l0aXZlTWFyZ2luQmVmb3JlLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgZGlzY2FyZE1h
cmdpbkJlZm9yZSk7Cit9CisKK0xheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93Ojplc3RpbWF0ZUxv
Z2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvLCBMYXlvdXRVbml0JiBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uKQoreworICAgIC8v
IEZJWE1FOiBXZSBuZWVkIHRvIGVsaW1pbmF0ZSB0aGUgZXN0aW1hdGlvbiBvZiB2ZXJ0aWNhbCBw
b3NpdGlvbiwgYmVjYXVzZSB3aGVuIGl0J3Mgd3Jvbmcgd2Ugc29tZXRpbWVzIHRyaWdnZXIgYSBw
YXRob2xvZ2ljYWwKKyAgICAvLyByZWxheW91dCBpZiB0aGVyZSBhcmUgaW50cnVkaW5nIGZsb2F0
cy4KKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IGxvZ2ljYWxIZWlnaHQoKTsK
KyAgICBpZiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKKyAg
ICAgICAgTGF5b3V0VW5pdCBwb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IDA7CisgICAgICAgIExheW91
dFVuaXQgbmVnYXRpdmVNYXJnaW5CZWZvcmUgPSAwOworICAgICAgICBib29sIGRpc2NhcmRNYXJn
aW5CZWZvcmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGNoaWxkLT5zZWxmTmVlZHNMYXlvdXQoKSkg
eworICAgICAgICAgICAgLy8gVHJ5IHRvIGRvIGEgYmFzaWMgZXN0aW1hdGlvbiBvZiBob3cgdGhl
IGNvbGxhcHNlIGlzIGdvaW5nIHRvIGdvLgorICAgICAgICAgICAgbWFyZ2luQmVmb3JlRXN0aW1h
dGVGb3JDaGlsZChjaGlsZCwgcG9zaXRpdmVNYXJnaW5CZWZvcmUsIG5lZ2F0aXZlTWFyZ2luQmVm
b3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IC8vIFVzZSB0aGUgY2FjaGVkIGNvbGxhcHNlZCBtYXJnaW4gdmFsdWVzIGZyb20gYSBwcmV2aW91
cyBsYXlvdXQuIE1vc3Qgb2YgdGhlIHRpbWUgdGhleQorICAgICAgICAgICAgLy8gd2lsbCBiZSBy
aWdodC4KKyAgICAgICAgICAgIE1hcmdpblZhbHVlcyBtYXJnaW5WYWx1ZXMgPSBtYXJnaW5WYWx1
ZXNGb3JDaGlsZChjaGlsZCk7CisgICAgICAgICAgICBwb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IG1h
eChwb3NpdGl2ZU1hcmdpbkJlZm9yZSwgbWFyZ2luVmFsdWVzLnBvc2l0aXZlTWFyZ2luQmVmb3Jl
KCkpOworICAgICAgICAgICAgbmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBtYXgobmVnYXRpdmVNYXJn
aW5CZWZvcmUsIG1hcmdpblZhbHVlcy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpKTsKKyAgICAgICAg
ICAgIGRpc2NhcmRNYXJnaW5CZWZvcmUgPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxk
KGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbGxhcHNlIHRoZSByZXN1bHQgd2l0
aCBvdXIgY3VycmVudCBtYXJnaW5zLgorICAgICAgICBpZiAoIWRpc2NhcmRNYXJnaW5CZWZvcmUp
CisgICAgICAgICAgICBsb2dpY2FsVG9wRXN0aW1hdGUgKz0gbWF4KG1hcmdpbkluZm8ucG9zaXRp
dmVNYXJnaW4oKSwgcG9zaXRpdmVNYXJnaW5CZWZvcmUpIC0gbWF4KG1hcmdpbkluZm8ubmVnYXRp
dmVNYXJnaW4oKSwgbmVnYXRpdmVNYXJnaW5CZWZvcmUpOworICAgIH0KKworICAgIC8vIEFkanVz
dCBsb2dpY2FsVG9wRXN0aW1hdGUgZG93biB0byB0aGUgbmV4dCBwYWdlIGlmIHRoZSBtYXJnaW5z
IGFyZSBzbyBsYXJnZSB0aGF0IHdlIGRvbid0IGZpdCBvbiB0aGUgY3VycmVudAorICAgIC8vIHBh
Z2UuCisgICAgTGF5b3V0U3RhdGUqIGxheW91dFN0YXRlID0gdmlldygpLmxheW91dFN0YXRlKCk7
CisgICAgaWYgKGxheW91dFN0YXRlLT5pc1BhZ2luYXRlZCgpICYmIGxheW91dFN0YXRlLT5wYWdl
TG9naWNhbEhlaWdodCgpICYmIGxvZ2ljYWxUb3BFc3RpbWF0ZSA+IGxvZ2ljYWxIZWlnaHQoKQor
ICAgICAgICAmJiBoYXNOZXh0UGFnZShsb2dpY2FsSGVpZ2h0KCkpKQorICAgICAgICBsb2dpY2Fs
VG9wRXN0aW1hdGUgPSBtaW4obG9naWNhbFRvcEVzdGltYXRlLCBuZXh0UGFnZUxvZ2ljYWxUb3Ao
bG9naWNhbEhlaWdodCgpKSk7CisKKyAgICBsb2dpY2FsVG9wRXN0aW1hdGUgKz0gZ2V0Q2xlYXJE
ZWx0YShjaGlsZCwgbG9naWNhbFRvcEVzdGltYXRlKTsKKyAgICAKKyAgICBlc3RpbWF0ZVdpdGhv
dXRQYWdpbmF0aW9uID0gbG9naWNhbFRvcEVzdGltYXRlOworCisgICAgaWYgKGxheW91dFN0YXRl
LT5pc1BhZ2luYXRlZCgpKSB7CisgICAgICAgIC8vIElmIHRoZSBvYmplY3QgaGFzIGEgcGFnZSBv
ciBjb2x1bW4gYnJlYWsgdmFsdWUgb2YgImJlZm9yZSIsIHRoZW4gd2Ugc2hvdWxkIHNoaWZ0IHRv
IHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZS4KKyAgICAgICAgbG9naWNhbFRvcEVzdGltYXRlID0g
YXBwbHlCZWZvcmVCcmVhayhjaGlsZCwgbG9naWNhbFRvcEVzdGltYXRlKTsKKyAgICAKKyAgICAg
ICAgLy8gRm9yIHJlcGxhY2VkIGVsZW1lbnRzIGFuZCBzY3JvbGxlZCBlbGVtZW50cywgd2Ugd2Fu
dCB0byBzaGlmdCB0aGVtIHRvIHRoZSBuZXh0IHBhZ2UgaWYgdGhleSBkb24ndCBmaXQgb24gdGhl
IGN1cnJlbnQgb25lLgorICAgICAgICBsb2dpY2FsVG9wRXN0aW1hdGUgPSBhZGp1c3RGb3JVbnNw
bGl0dGFibGVDaGlsZChjaGlsZCwgbG9naWNhbFRvcEVzdGltYXRlKTsKKyAgICAgICAgCisgICAg
ICAgIGlmICghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpICYmIGNoaWxkLT5pc1JlbmRlckJsb2Nr
KCkpCisgICAgICAgICAgICBsb2dpY2FsVG9wRXN0aW1hdGUgKz0gdG9SZW5kZXJCbG9jayhjaGls
ZCktPnBhZ2luYXRpb25TdHJ1dCgpOworICAgIH0KKworICAgIHJldHVybiBsb2dpY2FsVG9wRXN0
aW1hdGU7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpzZXRDb2xsYXBzZWRCb3R0b21NYXJn
aW4oY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKK3sKKyAgICBpZiAobWFyZ2luSW5mby5j
YW5Db2xsYXBzZVdpdGhNYXJnaW5BZnRlcigpICYmICFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0
aE1hcmdpbkJlZm9yZSgpKSB7CisgICAgICAgIC8vIFVwZGF0ZSB0aGUgYWZ0ZXIgc2lkZSBtYXJn
aW4gb2YgdGhlIGNvbnRhaW5lciB0byBkaXNjYXJkIGlmIHRoZSBhZnRlciBtYXJnaW4gb2YgdGhl
IGxhc3QgY2hpbGQgYWxzbyBkaXNjYXJkcyBhbmQgd2UgY29sbGFwc2Ugd2l0aCBpdC4KKyAgICAg
ICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSBtYXggbWFyZ2luIHZhbHVlcyBiZWNhdXNlIHdlIHdvbid0
IG5lZWQgdGhlbSBhbnl3YXkuCisgICAgICAgIGlmIChtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4o
KSkgeworICAgICAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5BZnRlcigpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVXBkYXRlIG91ciBtYXggcG9zL25l
ZyBib3R0b20gbWFyZ2lucywgc2luY2Ugd2UgY29sbGFwc2VkIG91ciBib3R0b20gbWFyZ2lucwor
ICAgICAgICAvLyB3aXRoIG91ciBjaGlsZHJlbi4KKyAgICAgICAgc2V0TWF4TWFyZ2luQWZ0ZXJW
YWx1ZXMobWF4KG1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSwgbWFyZ2luSW5mby5wb3NpdGl2ZU1h
cmdpbigpKSwgbWF4KG1heE5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSwgbWFyZ2luSW5mby5uZWdhdGl2
ZU1hcmdpbigpKSk7CisKKyAgICAgICAgaWYgKCFtYXJnaW5JbmZvLmhhc01hcmdpbkFmdGVyUXVp
cmsoKSkKKyAgICAgICAgICAgIHNldEhhc01hcmdpbkFmdGVyUXVpcmsoZmFsc2UpOworCisgICAg
ICAgIGlmIChtYXJnaW5JbmZvLmhhc01hcmdpbkFmdGVyUXVpcmsoKSAmJiAhbWFyZ2luQWZ0ZXIo
KSkKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gYm90dG9tIG1hcmdpbiBhbmQgb3VyIGxhc3Qg
Y2hpbGQgaGFzIGEgcXVpcmt5IG1hcmdpbi4KKyAgICAgICAgICAgIC8vIFdlIHdpbGwgcGljayB1
cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBhc3MgaXQgdGhyb3VnaC4KKyAgICAgICAgICAgIC8v
IFRoaXMgZGVhbHMgd2l0aCB0aGUgPHRkPjxkaXY+PHA+IGNhc2UuCisgICAgICAgICAgICBzZXRI
YXNNYXJnaW5BZnRlclF1aXJrKHRydWUpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OmhhbmRsZUFmdGVyU2lkZU9mQmxvY2soTGF5b3V0VW5pdCBiZWZvcmVTaWRlLCBMYXlvdXRV
bml0IGFmdGVyU2lkZSwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKK3sKKyAgICBtYXJnaW5JbmZv
LnNldEF0QWZ0ZXJTaWRlT2ZCbG9jayh0cnVlKTsKKworICAgIC8vIElmIHdlIGNhbid0IGNvbGxh
cHNlIHdpdGggY2hpbGRyZW4gdGhlbiBnbyBhaGVhZCBhbmQgYWRkIGluIHRoZSBib3R0b20gbWFy
Z2luLgorICAgIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgJiYgKCFtYXJnaW5JbmZv
LmNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkgJiYgIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VX
aXRoTWFyZ2luQmVmb3JlKCkKKyAgICAgICAgJiYgKCFkb2N1bWVudCgpLmluUXVpcmtzTW9kZSgp
IHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIW1hcmdpbkluZm8uaGFzTWFyZ2lu
QWZ0ZXJRdWlyaygpKSkpCisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgp
ICsgbWFyZ2luSW5mby5tYXJnaW4oKSk7CisgICAgICAgIAorICAgIC8vIE5vdyBhZGQgaW4gb3Vy
IGJvdHRvbSBib3JkZXIvcGFkZGluZy4KKyAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWln
aHQoKSArIGFmdGVyU2lkZSk7CisKKyAgICAvLyBOZWdhdGl2ZSBtYXJnaW5zIGNhbiBjYXVzZSBv
dXIgaGVpZ2h0IHRvIHNocmluayBiZWxvdyBvdXIgbWluaW1hbCBoZWlnaHQgKGJvcmRlci9wYWRk
aW5nKS4KKyAgICAvLyBJZiB0aGlzIGhhcHBlbnMsIGVuc3VyZSB0aGF0IHRoZSBjb21wdXRlZCBo
ZWlnaHQgaXMgaW5jcmVhc2VkIHRvIHRoZSBtaW5pbWFsIGhlaWdodC4KKyAgICBzZXRMb2dpY2Fs
SGVpZ2h0KG1heChsb2dpY2FsSGVpZ2h0KCksIGJlZm9yZVNpZGUgKyBhZnRlclNpZGUpKTsKKwor
ICAgIC8vIFVwZGF0ZSBvdXIgYm90dG9tIGNvbGxhcHNlZCBtYXJnaW4gaW5mby4KKyAgICBzZXRD
b2xsYXBzZWRCb3R0b21NYXJnaW4obWFyZ2luSW5mbyk7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tG
bG93OjpzZXRNYXhNYXJnaW5CZWZvcmVWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91dFVuaXQg
bmVnKQoreworICAgIGlmICghbV9yYXJlRGF0YSkgeworICAgICAgICBpZiAocG9zID09IFJlbmRl
ckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcykgJiYg
bmVnID09IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1
bHQodGhpcykpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG1fcmFyZURhdGEgPSBhZG9w
dFB0cihuZXcgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEodGhpcykpOworICAgIH0KKyAgICBtX3Jh
cmVEYXRhLT5tX21hcmdpbnMuc2V0UG9zaXRpdmVNYXJnaW5CZWZvcmUocG9zKTsKKyAgICBtX3Jh
cmVEYXRhLT5tX21hcmdpbnMuc2V0TmVnYXRpdmVNYXJnaW5CZWZvcmUobmVnKTsKK30KKwordm9p
ZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1heE1hcmdpbkFmdGVyVmFsdWVzKExheW91dFVuaXQgcG9z
LCBMYXlvdXRVbml0IG5lZykKK3sKKyAgICBpZiAoIW1fcmFyZURhdGEpIHsKKyAgICAgICAgaWYg
KHBvcyA9PSBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5BZnRlckRlZmF1
bHQodGhpcykgJiYgbmVnID09IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdp
bkFmdGVyRGVmYXVsdCh0aGlzKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgbV9yYXJl
RGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YSh0aGlzKSk7CisgICAg
fQorICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXRQb3NpdGl2ZU1hcmdpbkFmdGVyKHBvcyk7
CisgICAgbV9yYXJlRGF0YS0+bV9tYXJnaW5zLnNldE5lZ2F0aXZlTWFyZ2luQWZ0ZXIobmVnKTsK
K30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2luQmVmb3JlKGJv
b2wgdmFsdWUpCit7CisgICAgaWYgKHN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpIHsKKyAgICAgICAgQVNTRVJUKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICAKKyAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQorICAgICAgICByZXR1cm47
CisKKyAgICBpZiAoIW1fcmFyZURhdGEpCisgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihu
ZXcgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEodGhpcykpOworCisgICAgbV9yYXJlRGF0YS0+bV9k
aXNjYXJkTWFyZ2luQmVmb3JlID0gdmFsdWU7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93Ojpz
ZXRNdXN0RGlzY2FyZE1hcmdpbkFmdGVyKGJvb2wgdmFsdWUpCit7CisgICAgaWYgKHN0eWxlKCkt
Pm1hcmdpbkFmdGVyQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCkgeworICAgICAgICBBU1NFUlQodmFs
dWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX3JhcmVEYXRhICYmICF2
YWx1ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX3JhcmVEYXRhKQorICAgICAgICBt
X3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhKHRoaXMpKTsK
KworICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gdmFsdWU7Cit9CisKK2Jv
b2wgUmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTURJU0NBUkQgfHwg
KG1fcmFyZURhdGEgJiYgbV9yYXJlRGF0YS0+bV9kaXNjYXJkTWFyZ2luQmVmb3JlKTsKK30KKwor
Ym9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSBjb25zdAorewor
ICAgIHJldHVybiBzdHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQgfHwg
KG1fcmFyZURhdGEgJiYgbV9yYXJlRGF0YS0+bV9kaXNjYXJkTWFyZ2luQWZ0ZXIpOworfQorCiti
b29sIFJlbmRlckJsb2NrRmxvdzo6bXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjb25z
dCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdAoreworICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVk
c0xheW91dCgpKTsKKyAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAg
ICByZXR1cm4gY2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkgPyB0b1JlbmRlckJsb2NrRmxvdyhj
aGlsZCktPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgOiAoY2hpbGQtPnN0eWxlKCktPm1hcmdp
bkJlZm9yZUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOworICAgIGlmIChjaGlsZC0+aXNIb3Jpem9u
dGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICBy
ZXR1cm4gY2hpbGQtPmlzUmVuZGVyQmxvY2tGbG93KCkgPyB0b1JlbmRlckJsb2NrRmxvdyhjaGls
ZCktPm11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQWZ0
ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsKKworICAgIC8vIEZJWE1FOiBXZSByZXR1cm4gZmFs
c2UgaGVyZSBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZ2VvbWV0cmljYWxseSBj
b21wbGV0ZS4gV2UgaGF2ZSB2YWx1ZXMgb25seSBmb3IgYmVmb3JlL2FmdGVyLCBub3Qgc3RhcnQv
ZW5kLgorICAgIC8vIEluIGNhc2UgdGhlIGJveGVzIGFyZSBwZXJwZW5kaWN1bGFyIHdlIGFzc3Vt
ZSB0aGUgcHJvcGVydHkgaXMgbm90IHNwZWNpZmllZC4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Jvb2wgUmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29u
c3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3QKK3sKKyAgICBBU1NFUlQoIWNoaWxkLT5zZWxmTmVl
ZHNMYXlvdXQoKSk7CisgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKKyAgICAg
ICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrRmxvdygpID8gdG9SZW5kZXJCbG9ja0Zsb3co
Y2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgOiAoY2hpbGQtPnN0eWxlKCktPm1hcmdp
bkFmdGVyQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisgICAgaWYgKGNoaWxkLT5pc0hvcml6b250
YWxXcml0aW5nTW9kZSgpID09IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJl
dHVybiBjaGlsZC0+aXNSZW5kZXJCbG9ja0Zsb3coKSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxk
KS0+bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVm
b3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7CisKKyAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlz
Y2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkfCBhYm92ZS4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Jvb2wgUmVuZGVyQmxvY2tGbG93OjptdXN0U2VwYXJhdGVNYXJnaW5CZWZvcmVGb3JDaGlsZChj
b25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdAoreworICAgIEFTU0VSVCghY2hpbGQtPnNlbGZO
ZWVkc0xheW91dCgpKTsKKyAgICBjb25zdCBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IGNoaWxk
LT5zdHlsZSgpOworICAgIGlmICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkpCisgICAgICAg
IHJldHVybiBjaGlsZFN0eWxlLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1TRVBBUkFURTsK
KyAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkU3R5bGUtPm1hcmdpbkFmdGVyQ29s
bGFwc2UoKSA9PSBNU0VQQVJBVEU7CisKKyAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2FyZE1h
cmdpbkJlZm9yZUZvckNoaWxkfCBhYm92ZS4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
UmVuZGVyQmxvY2tGbG93OjptdXN0U2VwYXJhdGVNYXJnaW5BZnRlckZvckNoaWxkKGNvbnN0IFJl
bmRlckJveCogY2hpbGQpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5
b3V0KCkpOworICAgIGNvbnN0IFJlbmRlclN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxl
KCk7CisgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKKyAgICAgICAgcmV0dXJu
IGNoaWxkU3R5bGUtPm1hcmdpbkFmdGVyQ29sbGFwc2UoKSA9PSBNU0VQQVJBVEU7CisgICAgaWYg
KGNoaWxkLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpID09IGlzSG9yaXpvbnRhbFdyaXRpbmdN
b2RlKCkpCisgICAgICAgIHJldHVybiBjaGlsZFN0eWxlLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgp
ID09IE1TRVBBUkFURTsKKworICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVm
b3JlRm9yQ2hpbGR8IGFib3ZlLgorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wg
aW5Ob3JtYWxGbG93KFJlbmRlckJveCogY2hpbGQpCit7CisgICAgUmVuZGVyQmxvY2sqIGN1cnIg
PSBjaGlsZC0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgd2hpbGUgKGN1cnIgJiYgY3VyciAhPSAm
Y2hpbGQtPnZpZXcoKSkgeworICAgICAgICBpZiAoY3Vyci0+aGFzQ29sdW1ucygpIHx8IGN1cnIt
PmlzUmVuZGVyRmxvd1RocmVhZCgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IGlmIChjdXJyLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3NpdGlvbmVkKCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGN1cnIgPSBjdXJyLT5jb250YWluaW5nQmxvY2soKTsK
KyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0xheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93
OjphcHBseUJlZm9yZUJyZWFrKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9m
ZnNldCkKK3sKKyAgICAvLyBGSVhNRTogQWRkIHBhZ2UgYnJlYWsgY2hlY2tpbmcgaGVyZSB3aGVu
IHdlIHN1cHBvcnQgcHJpbnRpbmcuCisgICAgYm9vbCBjaGVja0NvbHVtbkJyZWFrcyA9IHZpZXco
KS5sYXlvdXRTdGF0ZSgpLT5pc1BhZ2luYXRpbmdDb2x1bW5zKCk7CisgICAgYm9vbCBjaGVja1Bh
Z2VCcmVha3MgPSAhY2hlY2tDb2x1bW5CcmVha3MgJiYgdmlldygpLmxheW91dFN0YXRlKCktPm1f
cGFnZUxvZ2ljYWxIZWlnaHQ7IC8vIEZJWE1FOiBPbmNlIGNvbHVtbnMgY2FuIHByaW50IHdlIGhh
dmUgdG8gY2hlY2sgdGhpcy4KKyAgICBSZW5kZXJGbG93VGhyZWFkKiBmbG93VGhyZWFkID0gZmxv
d1RocmVhZENvbnRhaW5pbmdCbG9jaygpOworICAgIGJvb2wgY2hlY2tSZWdpb25CcmVha3MgPSBm
bG93VGhyZWFkICYmIGZsb3dUaHJlYWQtPmlzUmVuZGVyTmFtZWRGbG93VGhyZWFkKCk7CisgICAg
Ym9vbCBjaGVja0JlZm9yZUFsd2F5cyA9IChjaGVja0NvbHVtbkJyZWFrcyAmJiBjaGlsZC0+c3R5
bGUoKS0+Y29sdW1uQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUykgfHwgKGNoZWNrUGFnZUJyZWFr
cyAmJiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQmVmb3JlKCkgPT0gUEJBTFdBWVMpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1JlZ2lvbkJyZWFrcyAmJiBjaGlsZC0+
c3R5bGUoKS0+cmVnaW9uQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUyk7CisgICAgaWYgKGNoZWNr
QmVmb3JlQWx3YXlzICYmIGluTm9ybWFsRmxvdyhjaGlsZCkgJiYgaGFzTmV4dFBhZ2UobG9naWNh
bE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFyeSkpIHsKKyAgICAgICAgaWYgKGNoZWNrQ29sdW1u
QnJlYWtzKQorICAgICAgICAgICAgdmlldygpLmxheW91dFN0YXRlKCktPmFkZEZvcmNlZENvbHVt
bkJyZWFrKGNoaWxkLCBsb2dpY2FsT2Zmc2V0KTsKKyAgICAgICAgaWYgKGNoZWNrUmVnaW9uQnJl
YWtzKSB7CisgICAgICAgICAgICBMYXlvdXRVbml0IG9mZnNldEJyZWFrQWRqdXN0bWVudCA9IDA7
CisgICAgICAgICAgICBpZiAoZmxvd1RocmVhZC0+YWRkRm9yY2VkUmVnaW9uQnJlYWsodGhpcywg
b2Zmc2V0RnJvbUxvZ2ljYWxUb3BPZkZpcnN0UGFnZSgpICsgbG9naWNhbE9mZnNldCwgY2hpbGQs
IHRydWUsICZvZmZzZXRCcmVha0FkanVzdG1lbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBs
b2dpY2FsT2Zmc2V0ICsgb2Zmc2V0QnJlYWtBZGp1c3RtZW50OworICAgICAgICB9CisgICAgICAg
IHJldHVybiBuZXh0UGFnZUxvZ2ljYWxUb3AobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3Vu
ZGFyeSk7CisgICAgfQorICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0OworfQorCitMYXlvdXRVbml0
IFJlbmRlckJsb2NrRmxvdzo6YXBwbHlBZnRlckJyZWFrKFJlbmRlckJveCogY2hpbGQsIExheW91
dFVuaXQgbG9naWNhbE9mZnNldCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKK3sKKyAgICAvLyBG
SVhNRTogQWRkIHBhZ2UgYnJlYWsgY2hlY2tpbmcgaGVyZSB3aGVuIHdlIHN1cHBvcnQgcHJpbnRp
bmcuCisgICAgYm9vbCBjaGVja0NvbHVtbkJyZWFrcyA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5p
c1BhZ2luYXRpbmdDb2x1bW5zKCk7CisgICAgYm9vbCBjaGVja1BhZ2VCcmVha3MgPSAhY2hlY2tD
b2x1bW5CcmVha3MgJiYgdmlldygpLmxheW91dFN0YXRlKCktPm1fcGFnZUxvZ2ljYWxIZWlnaHQ7
IC8vIEZJWE1FOiBPbmNlIGNvbHVtbnMgY2FuIHByaW50IHdlIGhhdmUgdG8gY2hlY2sgdGhpcy4K
KyAgICBSZW5kZXJGbG93VGhyZWFkKiBmbG93VGhyZWFkID0gZmxvd1RocmVhZENvbnRhaW5pbmdC
bG9jaygpOworICAgIGJvb2wgY2hlY2tSZWdpb25CcmVha3MgPSBmbG93VGhyZWFkICYmIGZsb3dU
aHJlYWQtPmlzUmVuZGVyTmFtZWRGbG93VGhyZWFkKCk7CisgICAgYm9vbCBjaGVja0FmdGVyQWx3
YXlzID0gKGNoZWNrQ29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1bW5CcmVha0Fm
dGVyKCkgPT0gUEJBTFdBWVMpIHx8IChjaGVja1BhZ2VCcmVha3MgJiYgY2hpbGQtPnN0eWxlKCkt
PnBhZ2VCcmVha0FmdGVyKCkgPT0gUEJBTFdBWVMpCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgfHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5yZWdpb25CcmVha0Fm
dGVyKCkgPT0gUEJBTFdBWVMpOworICAgIGlmIChjaGVja0FmdGVyQWx3YXlzICYmIGluTm9ybWFs
RmxvdyhjaGlsZCkgJiYgaGFzTmV4dFBhZ2UobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3Vu
ZGFyeSkpIHsKKyAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW5PZmZzZXQgPSBtYXJnaW5JbmZvLmNh
bkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpID8gTGF5b3V0VW5pdCgpIDogbWFyZ2luSW5mby5t
YXJnaW4oKTsKKworICAgICAgICAvLyBTbyBvdXIgbWFyZ2luIGRvZXNuJ3QgcGFydGljaXBhdGUg
aW4gdGhlIG5leHQgY29sbGFwc2luZyBzdGVwcy4KKyAgICAgICAgbWFyZ2luSW5mby5jbGVhck1h
cmdpbigpOworCisgICAgICAgIGlmIChjaGVja0NvbHVtbkJyZWFrcykKKyAgICAgICAgICAgIHZp
ZXcoKS5sYXlvdXRTdGF0ZSgpLT5hZGRGb3JjZWRDb2x1bW5CcmVhayhjaGlsZCwgbG9naWNhbE9m
ZnNldCk7CisgICAgICAgIGlmIChjaGVja1JlZ2lvbkJyZWFrcykgeworICAgICAgICAgICAgTGF5
b3V0VW5pdCBvZmZzZXRCcmVha0FkanVzdG1lbnQgPSAwOworICAgICAgICAgICAgaWYgKGZsb3dU
aHJlYWQtPmFkZEZvcmNlZFJlZ2lvbkJyZWFrKHRoaXMsIG9mZnNldEZyb21Mb2dpY2FsVG9wT2ZG
aXJzdFBhZ2UoKSArIGxvZ2ljYWxPZmZzZXQgKyBtYXJnaW5PZmZzZXQsIGNoaWxkLCBmYWxzZSwg
Jm9mZnNldEJyZWFrQWRqdXN0bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxP
ZmZzZXQgKyBtYXJnaW5PZmZzZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRl
UGFnZUJvdW5kYXJ5KTsKKyAgICB9CisgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Cit9CisKK0xh
eW91dFVuaXQgUmVuZGVyQmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihM
YXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91
dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hpbGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jaykK
K3sKKyAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRlckJs
b2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7CisKKyAgICBpZiAoZXN0aW1hdGVXaXRo
b3V0UGFnaW5hdGlvbiAhPSBsb2dpY2FsVG9wQWZ0ZXJDbGVhcikgeworICAgICAgICAvLyBPdXIg
Z3Vlc3MgcHJpb3IgdG8gcGFnaW5hdGlvbiBtb3ZlbWVudCB3YXMgd3JvbmcuIEJlZm9yZSB3ZSBh
dHRlbXB0IHRvIHBhZ2luYXRlLCBsZXQncyB0cnkgYWdhaW4gYXQgdGhlIG5ldworICAgICAgICAv
LyBwb3NpdGlvbi4KKyAgICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wQWZ0ZXJDbGVh
cik7CisgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcEFmdGVy
Q2xlYXIsIEFwcGx5TGF5b3V0RGVsdGEpOworCisgICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9B
dm9pZEZsb2F0cygpKSB7CisgICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRz
IG9uIHRoZSBsaW5lIHdpZHRoLgorICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRz
IHRvIGNsZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KKyAgICAgICAgICAgIC8vIGNoYW5nZSAo
YmVjYXVzZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCisgICAgICAgICAgICAv
LyBTbyBnbyBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KKyAgICAgICAgICAgIGNo
aWxkLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBp
ZiAoIWNoaWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zs
b2F0cygpKQorICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5k
YW50c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRz
TGF5b3V0KCkpCisgICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlv
dXRJZk5lZWRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9u
Zy4gTWFrZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCisgICAgICAgIGNoaWxkLT5s
YXlvdXRJZk5lZWRlZCgpOworICAgIH0KKworICAgIExheW91dFVuaXQgb2xkVG9wID0gbG9naWNh
bFRvcEFmdGVyQ2xlYXI7CisKKyAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29s
dW1uIGJyZWFrIHZhbHVlIG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUg
dG9wIG9mIHRoZSBuZXh0IHBhZ2UuCisgICAgTGF5b3V0VW5pdCByZXN1bHQgPSBhcHBseUJlZm9y
ZUJyZWFrKGNoaWxkLCBsb2dpY2FsVG9wQWZ0ZXJDbGVhcik7CisKKyAgICBpZiAocGFnZUxvZ2lj
YWxIZWlnaHRGb3JPZmZzZXQocmVzdWx0KSkgeworICAgICAgICBMYXlvdXRVbml0IHJlbWFpbmlu
Z0xvZ2ljYWxIZWlnaHQgPSBwYWdlUmVtYWluaW5nTG9naWNhbEhlaWdodEZvck9mZnNldChyZXN1
bHQsIEV4Y2x1ZGVQYWdlQm91bmRhcnkpOworICAgICAgICBMYXlvdXRVbml0IHNwYWNlU2hvcnRh
Z2UgPSBjaGlsZC0+bG9naWNhbEhlaWdodCgpIC0gcmVtYWluaW5nTG9naWNhbEhlaWdodDsKKyAg
ICAgICAgaWYgKHNwYWNlU2hvcnRhZ2UgPiAwKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2hp
bGQgY3Jvc3NlcyBhIGNvbHVtbiBib3VuZGFyeSwgcmVwb3J0IGEgYnJlYWssIGluIGNhc2Ugbm90
aGluZyBpbnNpZGUgaXQgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGRvbmUgc28uIFRoZSBj
b2x1bW4gYmFsYW5jZXIgbmVlZHMgdG8ga25vdyBob3cgbXVjaCBpdCBoYXMgdG8gc3RyZXRjaCB0
aGUgY29sdW1ucyB0byBtYWtlIG1vcmUKKyAgICAgICAgICAgIC8vIGNvbnRlbnQgZml0LiBJZiBu
byBicmVha3MgYXJlIHJlcG9ydGVkIChidXQgZG8gb2NjdXIpLCB0aGUgYmFsYW5jZXIgd2lsbCBo
YXZlIG5vIGNsdWUuIEZJWE1FOgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wcm92
ZWQsIHRob3VnaCwgYmVjYXVzZSBoZXJlIHdlIGp1c3QgcHJldGVuZCB0aGF0IHRoZSBjaGlsZCBp
cworICAgICAgICAgICAgLy8gdW5zcGxpdHRhYmxlLiBBIHNwbGl0dGFibGUgY2hpbGQsIG9uIHRo
ZSBvdGhlciBoYW5kLCBoYXMgYnJlYWsgb3Bwb3J0dW5pdGllcyBhdCBldmVyeSBwb3NpdGlvbgor
ICAgICAgICAgICAgLy8gd2hlcmUgdGhlcmUncyBubyBjaGlsZCBjb250ZW50LCBib3JkZXIgb3Ig
cGFkZGluZy4gSW4gb3RoZXIgd29yZHMsIHdlIHJpc2sgc3RyZXRjaGluZyBtb3JlCisgICAgICAg
ICAgICAvLyB0aGFuIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIHNldFBhZ2VCcmVhayhyZXN1bHQs
IHNwYWNlU2hvcnRhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIHJlcGxhY2Vk
IGVsZW1lbnRzIGFuZCBzY3JvbGxlZCBlbGVtZW50cywgd2Ugd2FudCB0byBzaGlmdCB0aGVtIHRv
IHRoZSBuZXh0IHBhZ2UgaWYgdGhleSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQgb25lLgorICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZVVuc3BsaXR0YWJsZUFkanVzdG1lbnQgPSByZXN1
bHQ7CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wQWZ0ZXJVbnNwbGl0dGFibGVBZGp1c3RtZW50
ID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGQsIHJlc3VsdCk7CisgICAgCisgICAg
TGF5b3V0VW5pdCBwYWdpbmF0aW9uU3RydXQgPSAwOworICAgIExheW91dFVuaXQgdW5zcGxpdHRh
YmxlQWRqdXN0bWVudERlbHRhID0gbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVu
dCAtIGxvZ2ljYWxUb3BCZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50OworICAgIGlmICh1bnNw
bGl0dGFibGVBZGp1c3RtZW50RGVsdGEpCisgICAgICAgIHBhZ2luYXRpb25TdHJ1dCA9IHVuc3Bs
aXR0YWJsZUFkanVzdG1lbnREZWx0YTsKKyAgICBlbHNlIGlmIChjaGlsZFJlbmRlckJsb2NrICYm
IGNoaWxkUmVuZGVyQmxvY2stPnBhZ2luYXRpb25TdHJ1dCgpKQorICAgICAgICBwYWdpbmF0aW9u
U3RydXQgPSBjaGlsZFJlbmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKTsKKworICAgIGlmIChw
YWdpbmF0aW9uU3RydXQpIHsKKyAgICAgICAgLy8gV2UgYXJlIHdpbGxpbmcgdG8gcHJvcGFnYXRl
IG91dCB0byBvdXIgcGFyZW50IGJsb2NrIGFzIGxvbmcgYXMgd2Ugd2VyZSBhdCB0aGUgdG9wIG9m
IHRoZSBibG9jayBwcmlvcgorICAgICAgICAvLyB0byBjb2xsYXBzaW5nIG91ciBtYXJnaW5zLCBh
bmQgYXMgbG9uZyBhcyB3ZSBkaWRuJ3QgY2xlYXIgb3IgbW92ZSBhcyBhIHJlc3VsdCBvZiBvdGhl
ciBwYWdpbmF0aW9uLgorICAgICAgICBpZiAoYXRCZWZvcmVTaWRlT2ZCbG9jayAmJiBvbGRUb3Ag
PT0gcmVzdWx0ICYmICFpc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhaXNUYWJsZUNlbGwoKSkg
eworICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZCByZWFsbHkgY2hlY2sgaWYgd2UncmUgZXhj
ZWVkaW5nIHRoZSBwYWdlIGhlaWdodCBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIHN0cnV0LCBidXQg
d2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBkbyBz
byAodGhlIHN0cnV0IG9ubHkgaGFzIHRoZSByZW1haW5pbmcgYW1vdW50IHRvIHB1c2gpLiBHZWNr
byBnZXRzIHRoaXMgd3JvbmcgdG9vCisgICAgICAgICAgICAvLyBhbmQgcHVzaGVzIHRvIHRoZSBu
ZXh0IHBhZ2UgYW55d2F5LCBzbyBub3QgdG9vIGNvbmNlcm5lZCBhYm91dCBpdC4KKyAgICAgICAg
ICAgIHNldFBhZ2luYXRpb25TdHJ1dChyZXN1bHQgKyBwYWdpbmF0aW9uU3RydXQpOworICAgICAg
ICAgICAgaWYgKGNoaWxkUmVuZGVyQmxvY2spCisgICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJC
bG9jay0+c2V0UGFnaW5hdGlvblN0cnV0KDApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAg
IHJlc3VsdCArPSBwYWdpbmF0aW9uU3RydXQ7CisgICAgfQorCisgICAgLy8gU2ltaWxhciB0byBo
b3cgd2UgYXBwbHkgY2xlYXJhbmNlLiBHbyBhaGVhZCBhbmQgYm9vc3QgaGVpZ2h0KCkgdG8gYmUg
dGhlIHBsYWNlIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIHBvc2l0aW9uIHRoZSBjaGlsZC4KKyAgICBz
ZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIChyZXN1bHQgLSBvbGRUb3ApKTsKKyAg
ICAKKyAgICAvLyBSZXR1cm4gdGhlIGZpbmFsIGFkanVzdGVkIGxvZ2ljYWwgdG9wLgorICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDE1NTM3NykKKysr
IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5
KQpAQCAtNDcsNiArNDcsMTk5IEBAIHByb3RlY3RlZDoKICAgICAvLyBXaGVuIHRoZSBjaGlsZHJl
biBhcmUgYXJlIGFsbCBpbmxpbmUgKGUuZy4sIGxpbmVzKSwgd2UgY2FsbCBsYXlvdXRJbmxpbmVD
aGlsZHJlbi4KICAgICB2b2lkIGxheW91dEJsb2NrQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxk
cmVuLCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pOwogICAgIHZvaWQgbGF5b3V0
SW5saW5lQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiByZXBhaW50
TG9naWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxCb3R0b20pOworICAgIAorICAg
IC8vIFJlbmRlckJsb2NrRmxvd3Mgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcywgc2luY2UgdGhleSBh
cmUgdGhlIG9ubHkgY2xhc3MgdGhhdCBzdXBwb3J0cyBtYXJnaW4gY29sbGFwc2luZy4KKyAgICB2
aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUg
RklOQUwgeyByZXR1cm4gbWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFy
Z2luQmVmb3JlKCk7IH0KKyAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0
ZXIoKSBjb25zdCBPVkVSUklERSBGSU5BTCB7IHJldHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVy
KCkgLSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7IH0KKworcHVibGljOgorICAgIGNsYXNzIE1h
cmdpblZhbHVlcyB7CisgICAgcHVibGljOgorICAgICAgICBNYXJnaW5WYWx1ZXMoTGF5b3V0VW5p
dCBiZWZvcmVQb3MsIExheW91dFVuaXQgYmVmb3JlTmVnLCBMYXlvdXRVbml0IGFmdGVyUG9zLCBM
YXlvdXRVbml0IGFmdGVyTmVnKQorICAgICAgICAgICAgOiBtX3Bvc2l0aXZlTWFyZ2luQmVmb3Jl
KGJlZm9yZVBvcykKKyAgICAgICAgICAgICwgbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVO
ZWcpCisgICAgICAgICAgICAsIG1fcG9zaXRpdmVNYXJnaW5BZnRlcihhZnRlclBvcykKKyAgICAg
ICAgICAgICwgbV9uZWdhdGl2ZU1hcmdpbkFmdGVyKGFmdGVyTmVnKQorICAgICAgICB7IH0KKyAg
ICAgICAgCisgICAgICAgIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7
IHJldHVybiBtX3Bvc2l0aXZlTWFyZ2luQmVmb3JlOyB9CisgICAgICAgIExheW91dFVuaXQgbmVn
YXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQmVmb3Jl
OyB9CisgICAgICAgIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0
dXJuIG1fcG9zaXRpdmVNYXJnaW5BZnRlcjsgfQorICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZl
TWFyZ2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQWZ0ZXI7IH0KKyAg
ICAgICAgCisgICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5CZWZvcmUoTGF5b3V0VW5pdCBw
b3MpIHsgbV9wb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IHBvczsgfQorICAgICAgICB2b2lkIHNldE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5CZWZv
cmUgPSBuZWc7IH0KKyAgICAgICAgdm9pZCBzZXRQb3NpdGl2ZU1hcmdpbkFmdGVyKExheW91dFVu
aXQgcG9zKSB7IG1fcG9zaXRpdmVNYXJnaW5BZnRlciA9IHBvczsgfQorICAgICAgICB2b2lkIHNl
dE5lZ2F0aXZlTWFyZ2luQWZ0ZXIoTGF5b3V0VW5pdCBuZWcpIHsgbV9uZWdhdGl2ZU1hcmdpbkFm
dGVyID0gbmVnOyB9CisgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgTGF5b3V0VW5pdCBtX3Bv
c2l0aXZlTWFyZ2luQmVmb3JlOworICAgICAgICBMYXlvdXRVbml0IG1fbmVnYXRpdmVNYXJnaW5C
ZWZvcmU7CisgICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkFmdGVyOworICAgICAg
ICBMYXlvdXRVbml0IG1fbmVnYXRpdmVNYXJnaW5BZnRlcjsKKyAgICB9OworICAgIE1hcmdpblZh
bHVlcyBtYXJnaW5WYWx1ZXNGb3JDaGlsZChSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKKworICAg
IC8vIEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBvZiB0aGVzZSBmaWVsZHMgaGF2ZSBub24tZGVm
YXVsdCB2YWx1ZXMKKyAgICBzdHJ1Y3QgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEgeworICAgICAg
ICBXVEZfTUFLRV9OT05DT1BZQUJMRShSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YSk7IFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyQmxvY2tGbG93UmFy
ZURhdGEoY29uc3QgUmVuZGVyQmxvY2tGbG93KiBibG9jaykKKyAgICAgICAgICAgIDogbV9tYXJn
aW5zKHBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdChibG9jayksIG5lZ2F0aXZlTWFyZ2luQmVm
b3JlRGVmYXVsdChibG9jayksIHBvc2l0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KGJsb2NrKSwgbmVn
YXRpdmVNYXJnaW5BZnRlckRlZmF1bHQoYmxvY2spKQorICAgICAgICAgICAgLCBtX2Rpc2NhcmRN
YXJnaW5CZWZvcmUoZmFsc2UpCisgICAgICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkFmdGVyKGZh
bHNlKQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIExheW91dFVuaXQg
cG9zaXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAg
ICAgICAgeyAKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+
bWFyZ2luQmVmb3JlKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0
IG5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCisg
ICAgICAgIHsgCisgICAgICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2Nr
LT5tYXJnaW5CZWZvcmUoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIExheW91dFVu
aXQgcG9zaXRpdmVNYXJnaW5BZnRlckRlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQor
ICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oYmxvY2st
Pm1hcmdpbkFmdGVyKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0
IG5lZ2F0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAg
ICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KC1ibG9jay0+
bWFyZ2luQWZ0ZXIoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1hcmdpblZh
bHVlcyBtX21hcmdpbnM7CisgICAgICAgIGJvb2wgbV9kaXNjYXJkTWFyZ2luQmVmb3JlIDogMTsK
KyAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW5BZnRlciA6IDE7CisgICAgfTsKKworICAgIGNs
YXNzIE1hcmdpbkluZm8geworICAgICAgICAvLyBDb2xsYXBzaW5nIGZsYWdzIGZvciB3aGV0aGVy
IHdlIGNhbiBjb2xsYXBzZSBvdXIgbWFyZ2lucyB3aXRoIG91ciBjaGlsZHJlbidzIG1hcmdpbnMu
CisgICAgICAgIGJvb2wgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJv
b2wgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJv
b2wgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuIDogMTsKKworICAgICAgICAv
LyBXaGV0aGVyIG9yIG5vdCB3ZSBhcmUgYSBxdWlya3kgY29udGFpbmVyLCBpLmUuLCBkbyB3ZSBj
b2xsYXBzZSBhd2F5IHRvcCBhbmQgYm90dG9tCisgICAgICAgIC8vIG1hcmdpbnMgaW4gb3VyIGNv
bnRhaW5lci4gIFRhYmxlIGNlbGxzIGFuZCB0aGUgYm9keSBhcmUgdGhlIGNvbW1vbiBleGFtcGxl
cy4gV2UKKyAgICAgICAgLy8gYWxzbyBoYXZlIGEgY3VzdG9tIHN0eWxlIHByb3BlcnR5IGZvciBT
YWZhcmkgUlNTIHRvIGRlYWwgd2l0aCBUeXBlUGFkIGJsb2cgYXJ0aWNsZXMuCisgICAgICAgIGJv
b2wgbV9xdWlya0NvbnRhaW5lciA6IDE7CisKKyAgICAgICAgLy8gVGhpcyBmbGFnIHRyYWNrcyB3
aGV0aGVyIHdlIGFyZSBzdGlsbCBsb29raW5nIGF0IGNoaWxkIG1hcmdpbnMgdGhhdCBjYW4gYWxs
IGNvbGxhcHNlIHRvZ2V0aGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jay4gIAorICAgICAg
ICAvLyBUaGV5IG1heSBvciBtYXkgbm90IGNvbGxhcHNlIHdpdGggdGhlIHRvcCBtYXJnaW4gb2Yg
dGhlIGJsb2NrICh8bV9jYW5Db2xsYXBzZVRvcFdpdGhDaGlsZHJlbnwgdGVsbHMgdXMgdGhhdCks
IGJ1dCB0aGV5IHdpbGwKKyAgICAgICAgLy8gYWx3YXlzIGJlIGNvbGxhcHNpbmcgd2l0aCBvbmUg
YW5vdGhlci4gIFRoaXMgdmFyaWFibGUgY2FuIHJlbWFpbiBzZXQgdG8gdHJ1ZSB0aHJvdWdoIG11
bHRpcGxlIGl0ZXJhdGlvbnMgCisgICAgICAgIC8vIGFzIGxvbmcgYXMgd2Uga2VlcCBlbmNvdW50
ZXJpbmcgc2VsZi1jb2xsYXBzaW5nIGJsb2Nrcy4KKyAgICAgICAgYm9vbCBtX2F0QmVmb3JlU2lk
ZU9mQmxvY2sgOiAxOworCisgICAgICAgIC8vIFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB3ZSBrbm93
IHdlJ3JlIGV4YW1pbmluZyBib3R0b20gbWFyZ2lucyBhbmQgd2Uga25vdyB3ZSdyZSBhdCB0aGUg
Ym90dG9tIG9mIHRoZSBibG9jay4KKyAgICAgICAgYm9vbCBtX2F0QWZ0ZXJTaWRlT2ZCbG9jayA6
IDE7CisKKyAgICAgICAgLy8gVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGRldGVjdCBxdWly
a3kgbWFyZ2lucyB0aGF0IHdlIG5lZWQgdG8gY29sbGFwc2UgYXdheSAoaW4gdGFibGUgY2VsbHMK
KyAgICAgICAgLy8gYW5kIGluIHRoZSBib2R5IGVsZW1lbnQpLgorICAgICAgICBib29sIG1faGFz
TWFyZ2luQmVmb3JlUXVpcmsgOiAxOworICAgICAgICBib29sIG1faGFzTWFyZ2luQWZ0ZXJRdWly
ayA6IDE7CisgICAgICAgIGJvb2wgbV9kZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsgOiAxOwor
CisgICAgICAgIGJvb2wgbV9kaXNjYXJkTWFyZ2luIDogMTsKKworICAgICAgICAvLyBUaGVzZSBm
bGFncyB0cmFjayB0aGUgcHJldmlvdXMgbWF4aW1hbCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgbWFy
Z2lucy4KKyAgICAgICAgTGF5b3V0VW5pdCBtX3Bvc2l0aXZlTWFyZ2luOworICAgICAgICBMYXlv
dXRVbml0IG1fbmVnYXRpdmVNYXJnaW47CisKKyAgICBwdWJsaWM6CisgICAgICAgIE1hcmdpbklu
Zm8oUmVuZGVyQmxvY2tGbG93KiwgTGF5b3V0VW5pdCBiZWZvcmVCb3JkZXJQYWRkaW5nLCBMYXlv
dXRVbml0IGFmdGVyQm9yZGVyUGFkZGluZyk7CisKKyAgICAgICAgdm9pZCBzZXRBdEJlZm9yZVNp
ZGVPZkJsb2NrKGJvb2wgYikgeyBtX2F0QmVmb3JlU2lkZU9mQmxvY2sgPSBiOyB9CisgICAgICAg
IHZvaWQgc2V0QXRBZnRlclNpZGVPZkJsb2NrKGJvb2wgYikgeyBtX2F0QWZ0ZXJTaWRlT2ZCbG9j
ayA9IGI7IH0KKyAgICAgICAgdm9pZCBjbGVhck1hcmdpbigpCisgICAgICAgIHsKKyAgICAgICAg
ICAgIG1fcG9zaXRpdmVNYXJnaW4gPSAwOworICAgICAgICAgICAgbV9uZWdhdGl2ZU1hcmdpbiA9
IDA7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRIYXNNYXJnaW5CZWZvcmVRdWlyayhib29s
IGIpIHsgbV9oYXNNYXJnaW5CZWZvcmVRdWlyayA9IGI7IH0KKyAgICAgICAgdm9pZCBzZXRIYXNN
YXJnaW5BZnRlclF1aXJrKGJvb2wgYikgeyBtX2hhc01hcmdpbkFmdGVyUXVpcmsgPSBiOyB9Cisg
ICAgICAgIHZvaWQgc2V0RGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGJvb2wgYikgeyBtX2Rl
dGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayA9IGI7IH0KKyAgICAgICAgdm9pZCBzZXRQb3NpdGl2
ZU1hcmdpbihMYXlvdXRVbml0IHApIHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX3Bvc2l0
aXZlTWFyZ2luID0gcDsgfQorICAgICAgICB2b2lkIHNldE5lZ2F0aXZlTWFyZ2luKExheW91dFVu
aXQgbikgeyBBU1NFUlQoIW1fZGlzY2FyZE1hcmdpbik7IG1fbmVnYXRpdmVNYXJnaW4gPSBuOyB9
CisgICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5JZkxhcmdlcihMYXlvdXRVbml0IHApCisg
ICAgICAgIHsKKyAgICAgICAgICAgIEFTU0VSVCghbV9kaXNjYXJkTWFyZ2luKTsKKyAgICAgICAg
ICAgIGlmIChwID4gbV9wb3NpdGl2ZU1hcmdpbikKKyAgICAgICAgICAgICAgICBtX3Bvc2l0aXZl
TWFyZ2luID0gcDsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldE5lZ2F0aXZlTWFyZ2luSWZM
YXJnZXIoTGF5b3V0VW5pdCBuKQorICAgICAgICB7CisgICAgICAgICAgICBBU1NFUlQoIW1fZGlz
Y2FyZE1hcmdpbik7CisgICAgICAgICAgICBpZiAobiA+IG1fbmVnYXRpdmVNYXJnaW4pCisgICAg
ICAgICAgICAgICAgbV9uZWdhdGl2ZU1hcmdpbiA9IG47CisgICAgICAgIH0KKworICAgICAgICB2
b2lkIHNldE1hcmdpbihMYXlvdXRVbml0IHAsIExheW91dFVuaXQgbikgeyBBU1NFUlQoIW1fZGlz
Y2FyZE1hcmdpbik7IG1fcG9zaXRpdmVNYXJnaW4gPSBwOyBtX25lZ2F0aXZlTWFyZ2luID0gbjsg
fQorICAgICAgICB2b2lkIHNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4oYm9v
bCBjb2xsYXBzZSkgeyBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4gPSBjb2xs
YXBzZTsgfQorICAgICAgICB2b2lkIHNldERpc2NhcmRNYXJnaW4oYm9vbCB2YWx1ZSkgeyBtX2Rp
c2NhcmRNYXJnaW4gPSB2YWx1ZTsgfQorCisgICAgICAgIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9j
aygpIGNvbnN0IHsgcmV0dXJuIG1fYXRCZWZvcmVTaWRlT2ZCbG9jazsgfQorICAgICAgICBib29s
IGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXRCZWZvcmVT
aWRlT2ZCbG9jayAmJiBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuOyB9Cisg
ICAgICAgIGJvb2wgY2FuQ29sbGFwc2VXaXRoTWFyZ2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBt
X2F0QWZ0ZXJTaWRlT2ZCbG9jayAmJiBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRy
ZW47IH0KKyAgICAgICAgYm9vbCBjYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigp
IGNvbnN0IHsgcmV0dXJuIG1fY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW47IH0K
KyAgICAgICAgYm9vbCBjYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKCkgY29uc3Qg
eyByZXR1cm4gbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuOyB9CisgICAgICAg
IGJvb2wgcXVpcmtDb250YWluZXIoKSBjb25zdCB7IHJldHVybiBtX3F1aXJrQ29udGFpbmVyOyB9
CisgICAgICAgIGJvb2wgZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKCkgY29uc3QgeyByZXR1
cm4gbV9kZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcms7IH0KKyAgICAgICAgYm9vbCBoYXNNYXJn
aW5CZWZvcmVRdWlyaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzTWFyZ2luQmVmb3JlUXVpcms7IH0K
KyAgICAgICAgYm9vbCBoYXNNYXJnaW5BZnRlclF1aXJrKCkgY29uc3QgeyByZXR1cm4gbV9oYXNN
YXJnaW5BZnRlclF1aXJrOyB9CisgICAgICAgIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW4oKSBj
b25zdCB7IHJldHVybiBtX3Bvc2l0aXZlTWFyZ2luOyB9CisgICAgICAgIExheW91dFVuaXQgbmVn
YXRpdmVNYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luOyB9CisgICAgICAg
IGJvb2wgZGlzY2FyZE1hcmdpbigpIGNvbnN0IHsgcmV0dXJuIG1fZGlzY2FyZE1hcmdpbjsgfQor
ICAgICAgICBMYXlvdXRVbml0IG1hcmdpbigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpdmVNYXJn
aW4gLSBtX25lZ2F0aXZlTWFyZ2luOyB9CisgICAgfTsKKworICAgIHZvaWQgbGF5b3V0QmxvY2tD
aGlsZChSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiwgTGF5b3V0VW5pdCYgcHJldmlvdXNG
bG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZsb2F0TG9naWNhbEJvdHRvbSk7Cisg
ICAgdm9pZCBhZGp1c3RQb3NpdGlvbmVkQmxvY2soUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFy
Z2luSW5mbyYpOworICAgIHZvaWQgYWRqdXN0RmxvYXRpbmdCbG9jayhjb25zdCBNYXJnaW5JbmZv
Jik7CisKKyAgICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBN
YXJnaW5JbmZvJik7CisgICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlckJv
eCogY2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRvcFBvc01hcmdpbiwgTGF5b3V0
VW5pdCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7CisgICAgTGF5b3V0VW5pdCBl
c3RpbWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5J
bmZvJiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbik7CisgICAgdm9pZCBt
YXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCosIExheW91dFVuaXQmLCBMYXlv
dXRVbml0JiwgYm9vbCYpIGNvbnN0OworICAgIHZvaWQgaGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhM
YXlvdXRVbml0IHRvcCwgTGF5b3V0VW5pdCBib3R0b20sIE1hcmdpbkluZm8mKTsKKyAgICB2b2lk
IHNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJik7CisKK3Byb3RlY3Rl
ZDoKKyAgICBMYXlvdXRVbml0IG1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1
cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9y
ZSgpIDogUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVs
dCh0aGlzKTsgfQorICAgIExheW91dFVuaXQgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSBjb25z
dCB7IHJldHVybiBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+bV9tYXJnaW5zLm5lZ2F0aXZlTWFy
Z2luQmVmb3JlKCkgOiBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KHRoaXMpOyB9CisgICAgTGF5b3V0VW5pdCBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVy
KCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5wb3Np
dGl2ZU1hcmdpbkFmdGVyKCkgOiBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQodGhpcyk7IH0KKyAgICBMYXlvdXRVbml0IG1heE5lZ2F0aXZlTWFyZ2lu
QWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+bV9tYXJnaW5z
Lm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSA6IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2
ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKTsgfQorICAgIAorICAgIHZvaWQgaW5pdE1heE1hcmdp
blZhbHVlcygpCisgICAgeworICAgICAgICBpZiAoIW1fcmFyZURhdGEpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucyA9IE1hcmdpblZhbHVlcyhSZW5k
ZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpICwg
UmVuZGVyQmxvY2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlz
KSwKKyAgICAgICAgICAgIFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkFm
dGVyRGVmYXVsdCh0aGlzKSwgUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2lu
QWZ0ZXJEZWZhdWx0KHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YS0+bV9kaXNjYXJkTWFyZ2lu
QmVmb3JlID0gZmFsc2U7CisgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVy
ID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIHZvaWQgc2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVz
KExheW91dFVuaXQgcG9zLCBMYXlvdXRVbml0IG5lZyk7CisgICAgdm9pZCBzZXRNYXhNYXJnaW5B
ZnRlclZhbHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpOworCisgICAgdm9pZCBz
ZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZShib29sID0gdHJ1ZSk7CisgICAgdm9pZCBzZXRNdXN0
RGlzY2FyZE1hcmdpbkFmdGVyKGJvb2wgPSB0cnVlKTsKKworICAgIGJvb2wgbXVzdERpc2NhcmRN
YXJnaW5CZWZvcmUoKSBjb25zdDsKKyAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSBj
b25zdDsKKworICAgIGJvb2wgbXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjb25zdCBS
ZW5kZXJCb3gqKSBjb25zdDsKKyAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQWZ0ZXJGb3JDaGls
ZChjb25zdCBSZW5kZXJCb3gqKSBjb25zdDsKKworICAgIGJvb2wgbXVzdFNlcGFyYXRlTWFyZ2lu
QmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7CisgICAgYm9vbCBtdXN0U2Vw
YXJhdGVNYXJnaW5BZnRlckZvckNoaWxkKGNvbnN0IFJlbmRlckJveCopIGNvbnN0OworCisgICAg
TGF5b3V0VW5pdCBhcHBseUJlZm9yZUJyZWFrKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQg
bG9naWNhbE9mZnNldCk7IC8vIElmIHRoZSBjaGlsZCBoYXMgYSBiZWZvcmUgYnJlYWssIHRoZW4g
cmV0dXJuIGEgbmV3IHlQb3MgdGhhdCBzaGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdl
L2NvbHVtbi4KKyAgICBMYXlvdXRVbml0IGFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxk
LCBMYXlvdXRVbml0IGxvZ2ljYWxPZmZzZXQsIE1hcmdpbkluZm8mKTsgLy8gSWYgdGhlIGNoaWxk
IGhhcyBhbiBhZnRlciBicmVhaywgdGhlbiByZXR1cm4gYSBuZXcgb2Zmc2V0IHRoYXQgc2hpZnRz
IHRvIHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZS9jb2x1bW4uCisgICAgTGF5b3V0VW5pdCBhZGp1
c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNsZWFy
LCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hpbGQs
IGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jayk7CisKK3Byb3RlY3RlZDoKKyAgICBPd25QdHI8UmVu
ZGVyQmxvY2tGbG93UmFyZURhdGE+IG1fcmFyZURhdGE7CiB9OwogCiBpbmxpbmUgUmVuZGVyQmxv
Y2tGbG93JiB0b1JlbmRlckJsb2NrRmxvdyhSZW5kZXJPYmplY3QmIG9iamVjdCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJEZXByZWNhdGVkRmxleGlibGVCb3guY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJEZXByZWNhdGVkRmxl
eGlibGVCb3guY3BwCShyZXZpc2lvbiAxNTUzNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIy
LDggKzMyMiw2IEBAIHZvaWQgUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94OjpsYXlvdXQKIAog
ICAgIG1fc3RyZXRjaGluZ0NoaWxkcmVuID0gZmFsc2U7CiAKLSAgICBpbml0TWF4TWFyZ2luVmFs
dWVzKCk7Ci0KICNpZiAhQVNTRVJUX0RJU0FCTEVECiAgICAgTGF5b3V0U2l6ZSBvbGRMYXlvdXRE
ZWx0YSA9IHZpZXcoKS5sYXlvdXREZWx0YSgpOwogI2VuZGlmCkBAIC0zNTEsMjQgKzM0OSw2IEBA
IHZvaWQgUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94OjpsYXlvdXQKIAogICAgIHVwZGF0ZVNo
YXBlc0FmdGVyQmxvY2tMYXlvdXQoKTsKIAotICAgIGlmICghaXNGbG9hdGluZ09yT3V0T2ZGbG93
UG9zaXRpb25lZCgpICYmIGhlaWdodCgpID09IDApIHsKLSAgICAgICAgLy8gV2UgYXJlIGEgYmxv
Y2sgd2l0aCBubyBib3JkZXIgYW5kIHBhZGRpbmcgYW5kIGEgY29tcHV0ZWQgaGVpZ2h0Ci0gICAg
ICAgIC8vIG9mIDAuICBUaGUgQ1NTIHNwZWMgc3RhdGVzIHRoYXQgemVyby1oZWlnaHQgYmxvY2tz
IGNvbGxhcHNlIHRoZWlyIG1hcmdpbnMKLSAgICAgICAgLy8gdG9nZXRoZXIuCi0gICAgICAgIC8v
IFdoZW4gYmxvY2tzIGFyZSBzZWxmLWNvbGxhcHNpbmcsIHdlIGp1c3QgdXNlIHRoZSB0b3AgbWFy
Z2luIHZhbHVlcyBhbmQgc2V0IHRoZQotICAgICAgICAvLyBib3R0b20gbWFyZ2luIG1heCB2YWx1
ZXMgdG8gMC4gIFRoaXMgd2F5IHdlIGRvbid0IGZhY3RvciBpbiB0aGUgdmFsdWVzCi0gICAgICAg
IC8vIHR3aWNlIHdoZW4gd2UgY29sbGFwc2Ugd2l0aCBvdXIgcHJldmlvdXMgdmVydGljYWxseSBh
ZGphY2VudCBhbmQKLSAgICAgICAgLy8gZm9sbG93aW5nIHZlcnRpY2FsbHkgYWRqYWNlbnQgYmxv
Y2tzLgotICAgICAgICBMYXlvdXRVbml0IHBvcyA9IG1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKCk7
Ci0gICAgICAgIExheW91dFVuaXQgbmVnID0gbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAg
ICAgICAgaWYgKG1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSA+IHBvcykKLSAgICAgICAgICAgIHBv
cyA9IG1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKTsKLSAgICAgICAgaWYgKG1heE5lZ2F0aXZlTWFy
Z2luQWZ0ZXIoKSA+IG5lZykKLSAgICAgICAgICAgIG5lZyA9IG1heE5lZ2F0aXZlTWFyZ2luQWZ0
ZXIoKTsKLSAgICAgICAgc2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKHBvcywgbmVnKTsKLSAgICAg
ICAgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoMCwgMCk7Ci0gICAgfQotCiAgICAgY29tcHV0ZU92
ZXJmbG93KG9sZENsaWVudEFmdGVyRWRnZSk7CiAKICAgICBzdGF0ZVB1c2hlci5wb3AoKTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcAkocmV2aXNpb24gMTU1
Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNDA4LDggKzQwOCw2IEBAIHZvaWQgUmVuZGVyVGFibGU6OmxheW91dCgpCiAg
ICAgTGF5b3V0U3RhdGVNYWludGFpbmVyIHN0YXRlUHVzaGVyKCZ2aWV3KCksIHRoaXMsIGxvY2F0
aW9uT2Zmc2V0KCksIGhhc1RyYW5zZm9ybSgpIHx8IGhhc1JlZmxlY3Rpb24oKSB8fCBzdHlsZSgp
LT5pc0ZsaXBwZWRCbG9ja3NXcml0aW5nTW9kZSgpKTsKIAogICAgIHNldExvZ2ljYWxIZWlnaHQo
MCk7Ci0KLSAgICBpbml0TWF4TWFyZ2luVmFsdWVzKCk7CiAgICAgCiAgICAgTGF5b3V0VW5pdCBv
bGRMb2dpY2FsV2lkdGggPSBsb2dpY2FsV2lkdGgoKTsKICAgICB1cGRhdGVMb2dpY2FsV2lkdGgo
KTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211091</attachid>
            <date>2013-09-09 14:53:11 -0700</date>
            <delta_ts>2013-09-09 14:57:44 -0700</delta_ts>
            <desc>New patch that should pass style queue</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>136114</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1NTM4NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExMSBAQAorMjAxMy0wOS0wOSAgRGF2aWQg
SHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBhbGwgY29sbGFwc2luZyBt
YXJnaW4gY29kZSBvdXQgb2YgUmVuZGVyQmxvY2sgYW5kIGludG8gUmVuZGVyQmxvY2tGbG93Lgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMDQ5CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRj
aCBiZWdpbnMgdGhlIG1pZ3JhdGlvbiBvZiB0aGUgcmFyZSBkYXRhIHN0cnVjdCBvZiBSZW5kZXJC
bG9jayBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gRHVyaW5nIHRoaXMgcHJvY2VzcyB3
ZSB3aWxsIHRlbXBvcmFyaWx5IGhhdmUgcmFyZSBkYXRhIHN0cnVjdHMKKyAgICAgICAgaW4gYm90
aCBwbGFjZXMsIGJ1dCB1bHRpbWF0ZWx5IGFsbCBvZiB0aGUgbWVtYmVycyBhcmUgZ29pbmcgdG8g
bW92ZSBkb3duIGludG8KKyAgICAgICAgUmVuZGVyQmxvY2tGbG93LCBhbmQgaWYgYW55IGRvbid0
LCB0aGV5IHdpbGwgZ2V0IGZvcmNlZCBpbnRvIGEgaGFzaC4KKyAgICAgICAgCisgICAgICAgIEZv
ciB0aGlzIHBhdGNoLCB0aGUgbWFyZ2luIGluZm9ybWF0aW9uIGlzIGJlaW5nIHNoaWZ0ZWQgb3V0
IG9mIFJlbmRlckJsb2NrIGFuZCBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gQW55IGZ1
bmN0aW9ucyB0aGF0IHJlZmVyIHRvIE1hcmdpblZhbHVlcyBvciB0byBNYXJnaW5JbmZvIGFsc28g
Z290CisgICAgICAgIG1vdmVkIGRvd24gaW50byBSZW5kZXJCbG9ja0Zsb3cuIE1vc3Qgb2YgYmxv
Y2sgY2hpbGQgbGF5b3V0IGlzIG5vdyBpbiBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgYWZ0ZXIg
dGhpcyBwYXRjaC4KKyAgICAgICAgCisgICAgICAgIE5vdGUgdGhhdCBpbiBtYW55IGNhc2VzIHRo
ZSBjb2RlIGRpZG4ndCBzaW1wbHkgbW92ZS4gVGhlcmUgaXMgc29tZSB0eXBlIHRpZ2h0ZW5pbmcK
KyAgICAgICAgdGhhdCBoYXBwZW5lZCBhcyB3ZWxsLCBpLmUuLCBwbGFjZXMgdGhhdCBsb29rIGZv
ciBSZW5kZXJCbG9jayBjYW4gbm93IGxvb2sgZm9yCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyBp
bnN0ZWFkIGFuZCBsZXQgUmVuZGVyQmxvY2sgZXhlY3V0ZSB0aGUgYmFzZSBSZW5kZXJCb3ggZnVu
Y3Rpb25zLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9jazo6c2V0UGFnaW5hdGlvblN0cnV0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9jazo6c2V0QnJlYWtBdExpbmVUb0F2b2lkV2lkb3cpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9jay5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnNldExpbmVHcmlk
Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzZXRTaGFwZUluc2lkZUluZm8p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OlJlbmRlckJsb2NrUmFyZURhdGE6OlJl
bmRlckJsb2NrUmFyZURhdGEpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpNYXJn
aW5JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxvY2tG
bG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGls
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdFBvc2l0aW9uZWRC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZsb2F0aW5n
QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5WYWx1ZXNG
b3JDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFy
Z2lucyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzSWZO
ZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5CZWZvcmVF
c3RpbWF0ZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZXN0
aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpoYW5kbGVBZnRlclNpZGVPZkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpzZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2FyZE1hcmdp
bkJlZm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNjYXJk
TWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlz
Y2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6bXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6bXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9yQ2hpbGQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0U2VwYXJhdGVNYXJnaW5BZnRlckZv
ckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OmluTm9ybWFsRmxvdyk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGx5QmVmb3JlQnJlYWspOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjphcHBseUFmdGVyQnJlYWspOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbik6CisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Ok1hcmdpblZhbHVlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6cG9zaXRpdmVNYXJnaW5CZWZvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Om5lZ2F0aXZl
TWFyZ2luQmVmb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2lu
VmFsdWVzOjpwb3NpdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpuZWdhdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpzZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6
c2V0TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpNYXJnaW5WYWx1ZXM6OnNldFBvc2l0aXZlTWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6OnNldE5lZ2F0aXZlTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dS
YXJlRGF0YTo6UmVuZGVyQmxvY2tGbG93UmFyZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxv
Y2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2
ZU1hcmdpbkFmdGVyRGVmYXVsdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEF0QmVmb3Jl
U2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXRBdEFmdGVyU2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpjbGVhck1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEhhc01hcmdpbkJlZm9yZVF1aXJrKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0SGFzTWFyZ2luQWZ0
ZXJRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86
OnNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldFBvc2l0aXZlTWFyZ2luKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpzZXRQb3NpdGl2
ZU1hcmdpbklmTGFyZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFy
Z2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW5JZkxhcmdlcik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldE1hcmdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJX
aXRoQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXREaXNjYXJkTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6TWFyZ2luSW5mbzo6YXRCZWZvcmVTaWRlT2ZCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxh
cHNlV2l0aE1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpjYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6cXVpcmtDb250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpkZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmspOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpoYXNNYXJnaW5CZWZvcmVR
dWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Omhh
c01hcmdpbkFmdGVyUXVpcmspOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpN
YXJnaW5JbmZvOjpwb3NpdGl2ZU1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6Ok1hcmdpbkluZm86Om5lZ2F0aXZlTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6ZGlzY2FyZE1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Om1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5BZnRl
cik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmluaXRNYXhNYXJnaW5WYWx1
ZXMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJEZXByZWNhdGVkRmxleGlibGVCb3guY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94OjpsYXlvdXRC
bG9jayk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRhYmxlOjpsYXlvdXQpOgorCiAyMDEzLTA5LTA5ICBUaGlhZ28gZGUgQmFy
cm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFtC
dWcgRml4XSBDYWxsaW5nIG1fYXVkaW9Db21wb25lbnRzLnJlbW92ZSBpbiByZW1vdmVBdWRpb0Nv
bXBvbmVudCAoTWVkaWFTdHJlYW1EZXNjcmlwdG9yKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCwxMyArOTQs
NiBAQCBzdHJ1Y3QgU2FtZVNpemVBc0Zsb2F0aW5nT2JqZWN0IHsKICAgICB1aW50MzJfdCBiaXRm
aWVsZHMgOiA4OwogfTsKIAotQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrOjpNYXJn
aW5WYWx1ZXMpID09IHNpemVvZihMYXlvdXRVbml0WzRdKSwgTWFyZ2luVmFsdWVzX3Nob3VsZF9z
dGF5X3NtYWxsKTsKLQotc3RydWN0IFNhbWVTaXplQXNNYXJnaW5JbmZvIHsKLSAgICB1aW50MzJf
dCBiaXRmaWVsZHMgOiAxNjsKLSAgICBMYXlvdXRVbml0IG1hcmdpbnNbMl07Ci19OwotCiB0eXBl
ZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBPd25QdHI8Q29sdW1uSW5mbz4gPiBD
b2x1bW5JbmZvTWFwOwogc3RhdGljIENvbHVtbkluZm9NYXAqIGdDb2x1bW5JbmZvTWFwID0gMDsK
IApAQCAtMTU4LDM5ICsxNTEsNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9oYWRWZXJ0aWNhbExh
eW91dE92ZXJmbG93OwogfTsKIAotLy8gT3VyIE1hcmdpbkluZm8gc3RhdGUgdXNlZCB3aGVuIGxh
eWluZyBvdXQgYmxvY2sgY2hpbGRyZW4uCi1SZW5kZXJCbG9jazo6TWFyZ2luSW5mbzo6TWFyZ2lu
SW5mbyhSZW5kZXJCbG9jayogYmxvY2ssIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywg
TGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpCi0gICAgOiBtX2F0QmVmb3JlU2lkZU9mQmxv
Y2sodHJ1ZSkKLSAgICAsIG1fYXRBZnRlclNpZGVPZkJsb2NrKGZhbHNlKQotICAgICwgbV9oYXNN
YXJnaW5CZWZvcmVRdWlyayhmYWxzZSkKLSAgICAsIG1faGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxz
ZSkKLSAgICAsIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKQotICAgICwgbV9k
aXNjYXJkTWFyZ2luKGZhbHNlKQotewotICAgIFJlbmRlclN0eWxlKiBibG9ja1N0eWxlID0gYmxv
Y2stPnN0eWxlKCk7Ci0gICAgQVNTRVJUKGJsb2NrLT5pc1JlbmRlclZpZXcoKSB8fCBibG9jay0+
cGFyZW50KCkpOwotICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVu
ZGVyVmlldygpICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKQotICAgICAgICAmJiAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFi
bGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkKLSAgICAgICAgJiYgIWJsb2NrLT5pc1JlbmRlckZsb3dUaHJl
YWQoKSAmJiAhYmxvY2stPmlzV3JpdGluZ01vZGVSb290KCkgJiYgIWJsb2NrLT5wYXJlbnQoKS0+
aXNGbGV4aWJsZUJveCgpCi0gICAgICAgICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5Db3Vu
dCgpICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5XaWR0aCgpICYmICFibG9ja1N0eWxlLT5j
b2x1bW5TcGFuKCk7Ci0KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVu
ID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAhYmVmb3JlQm9yZGVyUGFkZGluZyAmJiBi
bG9ja1N0eWxlLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKLQotICAgIC8v
IElmIGFueSBoZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4g
d2UgZG9uJ3QgY29sbGFwc2Ugb3VyIGJvdHRvbQotICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hp
bGRyZW4ncyBtYXJnaW5zLiAgVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZp
c3VhbAotICAgIC8vIGVmZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRo
ZSBwYXJlbnQgYmxvY2sgYW5kIHlldCBzdGlsbCBjb2xsYXBzZQotICAgIC8vIHdpdGggaXQuICBX
ZSBhbHNvIGRvbid0IGNvbGxhcHNlIGlmIHdlIGhhdmUgYW55IGJvdHRvbSBib3JkZXIvcGFkZGlu
Zy4KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxh
cHNlV2l0aENoaWxkcmVuICYmIChhZnRlckJvcmRlclBhZGRpbmcgPT0gMCkgJiYKLSAgICAgICAg
KGJsb2NrU3R5bGUtPmxvZ2ljYWxIZWlnaHQoKS5pc0F1dG8oKSAmJiAhYmxvY2tTdHlsZS0+bG9n
aWNhbEhlaWdodCgpLnZhbHVlKCkpICYmIGJsb2NrU3R5bGUtPm1hcmdpbkFmdGVyQ29sbGFwc2Uo
KSAhPSBNU0VQQVJBVEU7Ci0gICAgCi0gICAgbV9xdWlya0NvbnRhaW5lciA9IGJsb2NrLT5pc1Rh
YmxlQ2VsbCgpIHx8IGJsb2NrLT5pc0JvZHkoKTsKLQotICAgIG1fZGlzY2FyZE1hcmdpbiA9IG1f
Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgYmxvY2stPm11c3REaXNjYXJk
TWFyZ2luQmVmb3JlKCk7Ci0KLSAgICBtX3Bvc2l0aXZlTWFyZ2luID0gKG1fY2FuQ29sbGFwc2VN
YXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgIWJsb2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZSgpKSA/IGJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogTGF5b3V0VW5pdCgpOwot
ICAgIG1fbmVnYXRpdmVNYXJnaW4gPSAobV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGls
ZHJlbiAmJiAhYmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkpID8gYmxvY2stPm1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVuZGVyQmxvY2s6OlJlbmRl
ckJsb2NrKEVsZW1lbnQqIGVsZW1lbnQpCkBAIC0yMDQsNyArMTY0LDYgQEAgUmVuZGVyQmxvY2s6
OlJlbmRlckJsb2NrKEVsZW1lbnQqIGVsZW1lbgogewogICAgIHNldENoaWxkcmVuSW5saW5lKHRy
dWUpOwogICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihSZW5kZXJCbG9jazo6RmxvYXRpbmdPYmpl
Y3QpID09IHNpemVvZihTYW1lU2l6ZUFzRmxvYXRpbmdPYmplY3QpLCBGbG9hdGluZ09iamVjdF9z
aG91bGRfc3RheV9zbWFsbCk7Ci0gICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2Nr
OjpNYXJnaW5JbmZvKSA9PSBzaXplb2YoU2FtZVNpemVBc01hcmdpbkluZm8pLCBNYXJnaW5JbmZv
X3Nob3VsZF9zdGF5X3NtYWxsKTsKIH0KIAogc3RhdGljIHZvaWQgcmVtb3ZlQmxvY2tGcm9tRGVz
Y2VuZGFudEFuZENvbnRhaW5lck1hcHMoUmVuZGVyQmxvY2sqIGJsb2NrLCBUcmFja2VkRGVzY2Vu
ZGFudHNNYXAqJiBkZXNjZW5kYW50TWFwLCBUcmFja2VkQ29udGFpbmVyTWFwKiYgY29udGFpbmVy
TWFwKQpAQCAtMTc3Niw1MSArMTczNSw2IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0Vu
Y2xvc2VPdmVyaGEKICAgICAgICAgICAgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNUYWJsZUNhcHRpb24oKSB8fCBpc0ZpZWxkc2V0KCkgfHwgaXNXcml0aW5nTW9kZVJvb3Qo
KSB8fCBpc1Jvb3QoKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0UG9zaXRpb25lZEJs
b2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0g
ICAgYm9vbCBpc0hvcml6b250YWwgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpOwotICAgIGJv
b2wgaGFzU3RhdGljQmxvY2tQb3NpdGlvbiA9IGNoaWxkLT5zdHlsZSgpLT5oYXNTdGF0aWNCbG9j
a1Bvc2l0aW9uKGlzSG9yaXpvbnRhbCk7Ci0gICAgCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9w
ID0gbG9naWNhbEhlaWdodCgpOwotICAgIHVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hp
bGQoY2hpbGQsIGxvZ2ljYWxUb3ApOwotCi0gICAgaWYgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNl
V2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIC8vIFBvc2l0aW9uZWQgYmxvY2tzIGRvbid0
IGNvbGxhcHNlIG1hcmdpbnMsIHNvIGFkZCB0aGUgbWFyZ2luIHByb3ZpZGVkIGJ5Ci0gICAgICAg
IC8vIHRoZSBjb250YWluZXIgbm93LiBUaGUgY2hpbGQncyBvd24gbWFyZ2luIGlzIGFkZGVkIGxh
dGVyIHdoZW4gY2FsY3VsYXRpbmcgaXRzIGxvZ2ljYWwgdG9wLgotICAgICAgICBMYXlvdXRVbml0
IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1hcmdpbkluZm8ucG9zaXRpdmVNYXJnaW4oKTsKLSAgICAg
ICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVOZWcgPSBtYXJnaW5JbmZvLm5lZ2F0aXZlTWFy
Z2luKCk7Ci0gICAgICAgIGxvZ2ljYWxUb3AgKz0gY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFw
c2VkQmVmb3JlTmVnOwotICAgIH0KLSAgICAKLSAgICBSZW5kZXJMYXllciogY2hpbGRMYXllciA9
IGNoaWxkLT5sYXllcigpOwotICAgIGlmIChjaGlsZExheWVyLT5zdGF0aWNCbG9ja1Bvc2l0aW9u
KCkgIT0gbG9naWNhbFRvcCkgewotICAgICAgICBjaGlsZExheWVyLT5zZXRTdGF0aWNCbG9ja1Bv
c2l0aW9uKGxvZ2ljYWxUb3ApOwotICAgICAgICBpZiAoaGFzU3RhdGljQmxvY2tQb3NpdGlvbikK
LSAgICAgICAgICAgIGNoaWxkLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhp
cyk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGp1c3RGbG9hdGluZ0Jsb2NrKGNv
bnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gVGhlIGZsb2F0IHNob3VsZCBi
ZSBwb3NpdGlvbmVkIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGJvdHRvbSBtYXJnaW4KLSAgICAv
LyBvZiB0aGUgcHJldmlvdXMgZmxvdy4gIFdlIGFkZCB0aGF0IG1hcmdpbiBpbnRvIHRoZSBoZWln
aHQsIGdldCB0aGUKLSAgICAvLyBmbG9hdCBwb3NpdGlvbmVkIHByb3Blcmx5LCBhbmQgdGhlbiBz
dWJ0cmFjdCB0aGUgbWFyZ2luIG91dCBvZiB0aGUKLSAgICAvLyBoZWlnaHQgYWdhaW4uICBJbiB0
aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCB3ZSBhbHdheXMganVzdAotICAgIC8v
IHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgY29s
bGFwc2VkIGl0cwotICAgIC8vIG93biBib3R0b20gbWFyZ2luIGludG8gaXRzIHRvcCBtYXJnaW4u
Ci0gICAgLy8KLSAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGUgcHJldmlvdXMgZmxvdyBtYXkgY29s
bGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YKLSAgICAvLyBvdXIgYmxvY2suICBJZiB0
aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIGRvIG5vdCBhZGQgdGhlIG1hcmdpbiBpbiB0byBvdXIK
LSAgICAvLyBoZWlnaHQgd2hlbiBjb21wdXRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdC4g
ICBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCi0gICAgLy8gZm9yIGJ5IHNpbXBseSBjYWxs
aW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4gIFNlZQotICAgIC8vIGh0dHA6Ly93d3cu
aGl4aWUuY2gvdGVzdHMvYWRob2MvY3NzL2JveC9ibG9jay9tYXJnaW4tY29sbGFwc2UvMDQ2Lmh0
bWwgZm9yCi0gICAgLy8gYW4gZXhhbXBsZSBvZiB0aGlzIHNjZW5hcmlvLgotICAgIExheW91dFVu
aXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUo
KSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0gICAgc2V0TG9naWNhbEhl
aWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5PZmZzZXQpOwotICAgIHBvc2l0aW9uTmV3Rmxv
YXRzKCk7Ci0gICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgLSBtYXJnaW5PZmZz
ZXQpOwotfQotCiBzdGF0aWMgdm9pZCBkZXN0cm95UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3Qq
IHJ1bkluKQogewogICAgIEFTU0VSVChydW5Jbi0+aXNSdW5JbigpKTsKQEAgLTE5NTksMzI1ICsx
ODczLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6bW92ZVJ1bkluVG9PcmlnaW5hbFBvcwogICAgIHBh
cmVudCgpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJveCogY2hpbGQsIE1hcmdp
bkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUg
PSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICBib29sIGNoaWxk
RGlzY2FyZE1hcmdpbkFmdGVyID0gbXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKGNoaWxk
KTsKLSAgICBib29sIGNoaWxkSXNTZWxmQ29sbGFwc2luZyA9IGNoaWxkLT5pc1NlbGZDb2xsYXBz
aW5nQmxvY2soKTsKLQotICAgIC8vIFRoZSBjaGlsZCBkaXNjYXJkcyB0aGUgYmVmb3JlIG1hcmdp
biB3aGVuIHRoZSB0aGUgYWZ0ZXIgbWFyZ2luIGhhcyBkaXNjYXJkIGluIHRoZSBjYXNlIG9mIGEg
c2VsZiBjb2xsYXBzaW5nIGJsb2NrLgotICAgIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IGNo
aWxkRGlzY2FyZE1hcmdpbkJlZm9yZSB8fCAoY2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIgJiYgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nKTsKLQotICAgIC8vIEdldCB0aGUgZm91ciBtYXJnaW4gdmFsdWVz
IGZvciB0aGUgY2hpbGQgYW5kIGNhY2hlIHRoZW0uCi0gICAgY29uc3QgTWFyZ2luVmFsdWVzIGNo
aWxkTWFyZ2lucyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKLQotICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIExheW91dFVuaXQgcG9zVG9wID0g
Y2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBuZWdU
b3AgPSBjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLQotICAgIC8vIEZvciBz
ZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90dG9tIG1hcmdpbnMgaW50byBv
dXIKLSAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5lZ1RvcCB2YWx1ZXMuCi0gICAg
aWYgKGNoaWxkSXNTZWxmQ29sbGFwc2luZykgewotICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9w
LCBjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgbmVnVG9wID0g
bWF4KG5lZ1RvcCwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0gICAgfQot
ICAgIAotICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2Fy
ZSBpZiB0aGlzIGNoaWxkIGhhcwotICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdp
dGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGhhc01hcmdpbkJlZm9yZVF1aXJrKGNoaWxkKTsK
LQotICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0g
ICAgICAgIGlmICghY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSkgewotICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdp
dGggdGhlIHRvcCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGJsb2NrLiBJZiBpdCBoYXMgbGFyZ2Vy
IG1hcmdpbiB2YWx1ZXMsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUKLSAgICAgICAgICAgIC8vIG91
ciBvd24gbWF4aW1hbCB2YWx1ZXMuCi0gICAgICAgICAgICBpZiAoIWRvY3VtZW50KCkuaW5RdWly
a3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhdG9wUXVpcmspCi0g
ICAgICAgICAgICAgICAgc2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKG1heChwb3NUb3AsIG1heFBv
c2l0aXZlTWFyZ2luQmVmb3JlKCkpLCBtYXgobmVnVG9wLCBtYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpKSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBtaW51dGUgYW55IG9mIHRoZSBtYXJnaW5zIGlu
dm9sdmVkIGlzbid0IGEgcXVpcmssIGRvbid0Ci0gICAgICAgICAgICAvLyBjb2xsYXBzZSBpdCBh
d2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20K
LSAgICAgICAgICAgIC8vIGhhcyBhbiBleGFtcGxlIG9mIHRoaXMsIGEgPGR0PiB3aXRoIDAuOGVt
IGF1dGhvci1zcGVjaWZpZWQgaW5zaWRlCi0gICAgICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEg
PHRkPi4KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpIHsKLSAgICAgICAgICAg
ICAgICBzZXRIYXNNYXJnaW5CZWZvcmVRdWlyayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXREZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiB0b3BRdWlyayAmJiAhbWFyZ2luQmVmb3JlKCkpCi0gICAgICAgICAgICAgICAg
Ly8gV2UgaGF2ZSBubyB0b3AgbWFyZ2luIGFuZCBvdXIgdG9wIGNoaWxkIGhhcyBhIHF1aXJreSBt
YXJnaW4uCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMgcXVpcmt5IG1h
cmdpbiBhbmQgcGFzcyBpdCB0aHJvdWdoLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMg
d2l0aCB0aGUgPHRkPjxkaXY+PHA+IGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZG8g
dGhpcyBmb3IgYSBibG9jayB0aGF0IHNwbGl0IHR3byBpbmxpbmVzIHRob3VnaC4gWW91IGRvCi0g
ICAgICAgICAgICAgICAgLy8gc3RpbGwgYXBwbHkgbWFyZ2lucyBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgICAgICAgICAgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgLy8gVGhlIGJlZm9yZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB3aWxs
IGFsc28gZGlzY2FyZCBhbGwgdGhlIG1hcmdpbnMgaXQgaXMgY29sbGFwc2luZyB3aXRoLgotICAg
ICAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKTsKLSAgICB9Ci0KLSAgICAvLyBP
bmNlIHdlIGZpbmQgYSBjaGlsZCB3aXRoIGRpc2NhcmRNYXJnaW5CZWZvcmUgYWxsIHRoZSBtYXJn
aW5zIGNvbGxhcHNpbmcgd2l0aCB1cyBtdXN0IGFsc28gZGlzY2FyZC4gCi0gICAgaWYgKGNoaWxk
RGlzY2FyZE1hcmdpbkJlZm9yZSkgewotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJn
aW4odHJ1ZSk7Ci0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICB9Ci0KLSAg
ICBpZiAobWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpICYmIG1hcmdpbkluZm8uYXRCZWZvcmVT
aWRlT2ZCbG9jaygpICYmIChwb3NUb3AgLSBuZWdUb3ApKQotICAgICAgICBtYXJnaW5JbmZvLnNl
dEhhc01hcmdpbkJlZm9yZVF1aXJrKHRvcFF1aXJrKTsKLQotICAgIExheW91dFVuaXQgYmVmb3Jl
Q29sbGFwc2VMb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOwotICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcCA9IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcDsKLSAgICBpZiAoY2hpbGRJc1NlbGZD
b2xsYXBzaW5nKSB7Ci0gICAgICAgIC8vIEZvciBhIHNlbGYgY29sbGFwc2luZyBibG9jayBib3Ro
IHRoZSBiZWZvcmUgYW5kIGFmdGVyIG1hcmdpbnMgZ2V0IGRpc2NhcmRlZC4gVGhlIGJsb2NrIGRv
ZXNuJ3QgY29udHJpYnV0ZSBhbnl0aGluZyB0byB0aGUgaGVpZ2h0IG9mIHRoZSBibG9jay4KLSAg
ICAgICAgLy8gQWxzbywgdGhlIGNoaWxkJ3MgdG9wIHBvc2l0aW9uIGVxdWFscyB0aGUgbG9naWNh
bCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lci4KLSAgICAgICAgaWYgKCFjaGlsZERpc2NhcmRNYXJn
aW5CZWZvcmUgJiYgIW1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpKSB7Ci0gICAgICAgICAgICAv
LyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKLSAgICAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAotICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IGFuIGFjY3VyYXRl
IHBvc2l0aW9uIGZvciB0aGUgemVyby1oZWlnaHQgYmxvY2suCi0gICAgICAgICAgICBMYXlvdXRV
bml0IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCks
IGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIExheW91
dFVuaXQgY29sbGFwc2VkQmVmb3JlTmVnID0gbWF4KG1hcmdpbkluZm8ubmVnYXRpdmVNYXJnaW4o
KSwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkpOwotICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXRNYXJnaW4oY29sbGFwc2VkQmVmb3JlUG9zLCBjb2xsYXBzZWRCZWZvcmVOZWcp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgY29sbGFwc2UgdGhlIGNoaWxkJ3Mg
bWFyZ2lucyB0b2dldGhlciwgd2hpY2ggbWVhbnMgZXhhbWluaW5nIG91cgotICAgICAgICAgICAg
Ly8gYm90dG9tIG1hcmdpbiB2YWx1ZXMgYXMgd2VsbC4gCi0gICAgICAgICAgICBtYXJnaW5JbmZv
LnNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIoY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQWZ0
ZXIoKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ2F0aXZlTWFyZ2luSWZMYXJnZXIo
Y2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmICgh
bWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkKLSAgICAgICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZi1j
b2xsYXBzaW5nIGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCwgc2luY2UgaXQg
Y291bGQgaGF2ZSBvdmVyZmxvd2luZyBjb250ZW50Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBu
ZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0Ci0gICAg
ICAgICAgICAgICAgLy8gaGFkIGEgc3BlY2lmaWVkIGhlaWdodCBvZiAwIGJ1dCB0aGF0IGFjdHVh
bGx5IGhhZCBzdWJjb250ZW50KS4KLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gbG9naWNh
bEhlaWdodCgpICsgY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFwc2VkQmVmb3JlTmVnOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSkgewotICAgICAgICAgICAgQVNTRVJUKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSB8fCAobWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgJiYgIW1hcmdpbkluZm8u
bWFyZ2luKCkpKTsKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhdCB0aGUgYmVmb3JlIHNpZGUg
b2YgdGhlIGJsb2NrIGFuZCB3ZSBjb2xsYXBzZSwgaWdub3JlIHRoZSBjb21wdXRlZCBtYXJnaW4K
LSAgICAgICAgICAgIC8vIGFuZCBqdXN0IGFkZCB0aGUgY2hpbGQgbWFyZ2luIHRvIHRoZSBjb250
YWluZXIgaGVpZ2h0LiBUaGlzIHdpbGwgY29ycmVjdGx5IHBvc2l0aW9uCi0gICAgICAgICAgICAv
LyB0aGUgY2hpbGQgaW5zaWRlIHRoZSBjb250YWluZXIuCi0gICAgICAgICAgICBMYXlvdXRVbml0
IHNlcGFyYXRlTWFyZ2luID0gIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3Jl
KCkgPyBtYXJnaW5JbmZvLm1hcmdpbigpIDogTGF5b3V0VW5pdCgwKTsKLSAgICAgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgc2VwYXJhdGVNYXJnaW4gKyBtYXJnaW5C
ZWZvcmVGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxI
ZWlnaHQoKTsKLSAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkg
JiYgKCFtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKQotICAgICAgICAgICAgfHwgKCFt
YXJnaW5JbmZvLmNhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuKCkKLSAgICAgICAg
ICAgICYmICghZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAhbWFyZ2luSW5mby5xdWlya0Nv
bnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkpKSkpIHsKLSAg
ICAgICAgICAgIC8vIFdlJ3JlIGNvbGxhcHNpbmcgd2l0aCBhIHByZXZpb3VzIHNpYmxpbmcncyBt
YXJnaW5zIGFuZCBub3QKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIHRvcCBvZiB0aGUgYmxvY2su
Ci0gICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1heChtYXJn
aW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc1RvcCkgLSBtYXgobWFyZ2luSW5mby5uZWdhdGl2
ZU1hcmdpbigpLCBuZWdUb3ApKTsKLSAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVp
Z2h0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJnaW4o
Y2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFtYXJnaW5J
bmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NpdGl2
ZU1hcmdpbihjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgICAg
IG1hcmdpbkluZm8uc2V0TmVnYXRpdmVNYXJnaW4oY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2lu
QWZ0ZXIoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWFyZ2luSW5mby5jbGVhck1h
cmdpbigpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXRIYXNNYXJnaW5BZnRlclF1aXJrKGhhc01hcmdpbkFmdGVyUXVpcmsoY2hp
bGQpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgbWFyZ2lucyB3b3VsZCBwdWxsIHVzIHBhc3Qg
dGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBiYWNrIGFuZCBw
cmV0ZW5kIGxpa2UgdGhlIG1hcmdpbnMKLSAgICAvLyBjb2xsYXBzZWQgaW50byB0aGUgcGFnZSBl
ZGdlLgotICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgp
OwotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFn
ZUxvZ2ljYWxIZWlnaHQoKSAmJiBsb2dpY2FsVG9wID4gYmVmb3JlQ29sbGFwc2VMb2dpY2FsVG9w
Ci0gICAgICAgICYmIGhhc05leHRQYWdlKGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCkpIHsKLSAg
ICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNhbFRvcDsKLSAgICAgICAgbG9n
aWNhbFRvcCA9IG1pbihsb2dpY2FsVG9wLCBuZXh0UGFnZUxvZ2ljYWxUb3AoYmVmb3JlQ29sbGFw
c2VMb2dpY2FsVG9wKSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgp
ICsgKGxvZ2ljYWxUb3AgLSBvbGRMb2dpY2FsVG9wKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2Ug
aGF2ZSBjb2xsYXBzZWQgaW50byBhIHByZXZpb3VzIHNpYmxpbmcgYW5kIHNvIHJlZHVjZWQgdGhl
IGhlaWdodCBvZiB0aGUgcGFyZW50LCBlbnN1cmUgYW55IGZsb2F0cyB0aGF0IG5vdwotICAgIC8v
IG92ZXJoYW5nIGZyb20gdGhlIHByZXZpb3VzIHNpYmxpbmcgYXJlIGFkZGVkIHRvIG91ciBwYXJl
bnQuIElmIHRoZSBjaGlsZCdzIHByZXZpb3VzIHNpYmxpbmcgaXRzZWxmIGlzIGEgZmxvYXQgdGhl
IGNoaWxkIHdpbGwgYXZvaWQKLSAgICAvLyBvciBjbGVhciBpdCBhbnl3YXksIHNvIGRvbid0IHdv
cnJ5IGFib3V0IGFueSBmbG9hdGluZyBjaGlsZHJlbiBpdCBtYXkgY29udGFpbi4KLSAgICBMYXlv
dXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsVG9wKTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC0+cHJl
dmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJCbG9ja0Zsb3co
KSAmJiAhcHJldi0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAg
IFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7Ci0gICAgICAgIGlmIChi
bG9jay0+Y29udGFpbnNGbG9hdHMoKSAmJiAhYmxvY2stPmF2b2lkc0Zsb2F0cygpICYmIChibG9j
ay0+bG9naWNhbFRvcCgpICsgYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpKSA+IGxv
Z2ljYWxUb3ApIAotICAgICAgICAgICAgYWRkT3ZlcmhhbmdpbmdGbG9hdHMoYmxvY2ssIGZhbHNl
KTsKLSAgICB9Ci0gICAgc2V0TG9naWNhbEhlaWdodChvbGRMb2dpY2FsSGVpZ2h0KTsKLQotICAg
IHJldHVybiBsb2dpY2FsVG9wOwotfQotCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrOjpjbGVhckZs
b2F0c0lmTmVlZGVkKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExh
eW91dFVuaXQgb2xkVG9wUG9zTWFyZ2luLCBMYXlvdXRVbml0IG9sZFRvcE5lZ01hcmdpbiwgTGF5
b3V0VW5pdCB5UG9zKQotewotICAgIExheW91dFVuaXQgaGVpZ2h0SW5jcmVhc2UgPSBnZXRDbGVh
ckRlbHRhKGNoaWxkLCB5UG9zKTsKLSAgICBpZiAoIWhlaWdodEluY3JlYXNlKQotICAgICAgICBy
ZXR1cm4geVBvczsKLQotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsK
LSAgICAgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW4gPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSB8fCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGQp
OwotCi0gICAgICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgY2xlYXIsIHRo
ZXkgY2FuIHN0aWxsIGNvbGxhcHNlIHRoZWlyCi0gICAgICAgIC8vIG1hcmdpbnMgd2l0aCBmb2xs
b3dpbmcgc2libGluZ3MuICBSZXNldCB0aGUgY3VycmVudCBtYXJnaW5zIHRvIHJlcHJlc2VudAot
ICAgICAgICAvLyB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrJ3MgbWFyZ2lucyBvbmx5LgotICAg
ICAgICAvLyBJZiBESVNDQVJEIGlzIHNwZWNpZmllZCBmb3IgLXdlYmtpdC1tYXJnaW4tY29sbGFw
c2UsIHJlc2V0IHRoZSBtYXJnaW4gdmFsdWVzLgotICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1h
cmdpbikgewotICAgICAgICAgICAgTWFyZ2luVmFsdWVzIGNoaWxkTWFyZ2lucyA9IG1hcmdpblZh
bHVlc0ZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVN
YXJnaW4obWF4KGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpLCBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z2F0aXZlTWFyZ2luKG1heChjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSwgY2hp
bGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXRE
aXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbik7Ci0KLSAgICAgICAgLy8gQ1NTMi4xIHN0
YXRlczoKLSAgICAgICAgLy8gIklmIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIG9mIGFuIGVs
ZW1lbnQgd2l0aCBjbGVhcmFuY2UgYXJlIGFkam9pbmluZywgaXRzIG1hcmdpbnMgY29sbGFwc2Ug
d2l0aCAKLSAgICAgICAgLy8gdGhlIGFkam9pbmluZyBtYXJnaW5zIG9mIGZvbGxvd2luZyBzaWJs
aW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhl
IGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4iCi0gICAgICAgIC8vIFNvIHRoZSBw
YXJlbnQncyBib3R0b20gbWFyZ2luIGNhbm5vdCBjb2xsYXBzZSB0aHJvdWdoIHRoaXMgYmxvY2sg
b3IgYW55IHN1YnNlcXVlbnQgc2VsZi1jb2xsYXBzaW5nIGJsb2Nrcy4gQ2hlY2sgc3Vic2VxdWVu
dCBzaWJsaW5ncwotICAgICAgICAvLyBmb3IgYSBibG9jayB3aXRoIGhlaWdodCAtIGlmIG5vbmUg
aXMgZm91bmQgdGhlbiBkb24ndCBhbGxvdyB0aGUgbWFyZ2lucyB0byBjb2xsYXBzZSB3aXRoIHRo
ZSBwYXJlbnQuCi0gICAgICAgIGJvb2wgd291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50ID0g
bWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKCk7Ci0gICAgICAg
IGZvciAoUmVuZGVyQm94KiBjdXJyID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCk7IGN1cnIgJiYg
d291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50OyBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmdC
b3goKSkgewotICAgICAgICAgICAgaWYgKCFjdXJyLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3Np
dGlvbmVkKCkgJiYgIWN1cnItPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICAgICAg
ICAgIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIGlmICh3b3VsZENvbGxhcHNlTWFyZ2luc1dpdGhQYXJlbnQpCi0gICAgICAgICAgICBt
YXJnaW5JbmZvLnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4oZmFsc2UpOwot
Ci0gICAgICAgIC8vIENTUzIuMTogInRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCBzbyB0
aGF0IGNsZWFyYW5jZSArIG1hcmdpbi10b3AgPSBbaGVpZ2h0IG9mIGZsb2F0XSwgaS5lLiwgY2xl
YXJhbmNlID0gW2hlaWdodCBvZiBmbG9hdF0gLSBtYXJnaW4tdG9wIgotICAgICAgICAvLyBNb3Zl
IHRoZSB0b3Agb2YgdGhlIGNoaWxkIGJveCB0byB0aGUgYm90dG9tIG9mIHRoZSBmbG9hdCBpZ25v
cmluZyB0aGUgY2hpbGQncyB0b3AgbWFyZ2luLgotICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNl
ZE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChjaGlsZC0+bG9naWNhbFRvcCgpIC0gY29sbGFwc2VkTWFyZ2luKTsK
LSAgICAgICAgLy8gQSBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luLXRvcCB2YWx1ZSBjYW5jZWxz
IGl0c2VsZiBvdXQgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBmYWN0b3JlZCBpbnRvIHx5UG9zfCBh
Ym92ZS4KLSAgICAgICAgaGVpZ2h0SW5jcmVhc2UgLT0gbWF4KExheW91dFVuaXQoKSwgY29sbGFw
c2VkTWFyZ2luKTsKLSAgICB9IGVsc2UKLSAgICAgICAgLy8gSW5jcmVhc2Ugb3VyIGhlaWdodCBi
eSB0aGUgYW1vdW50IHdlIGhhZCB0byBjbGVhci4KLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBoZWlnaHRJbmNyZWFzZSk7Ci0gICAgCi0gICAgaWYgKG1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKLSAgICAgICAgLy8gV2UgY2FuIG5v
IGxvbmdlciBjb2xsYXBzZSB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrIHNpbmNlIGEgY2xlYXIK
LSAgICAgICAgLy8gb2NjdXJyZWQuICBUaGUgZW1wdHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhl
IGNsZWFyZWQgYmxvY2suCi0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJl
Y3QuICBOZWVkIGNsYXJpZmljYXRpb24gZm9yIHdoYXQgdG8gZG8KLSAgICAgICAgLy8gaWYgdGhl
IGhlaWdodCB0aGUgY2xlYXJlZCBibG9jayBpcyBvZmZzZXQgYnkgaXMgc21hbGxlciB0aGFuIHRo
ZQotICAgICAgICAvLyBtYXJnaW5zIGludm9sdmVkLgotICAgICAgICBzZXRNYXhNYXJnaW5CZWZv
cmVWYWx1ZXMob2xkVG9wUG9zTWFyZ2luLCBvbGRUb3BOZWdNYXJnaW4pOwotICAgICAgICBtYXJn
aW5JbmZvLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgICAgIC8vIEluIGNh
c2UgdGhlIGNoaWxkIGRpc2NhcmRlZCB0aGUgYmVmb3JlIG1hcmdpbiBvZiB0aGUgYmxvY2sgd2Ug
bmVlZCB0byByZXNldCB0aGUgbXVzdERpc2NhcmRNYXJnaW5CZWZvcmUgZmxhZyB0byB0aGUgaW5p
dGlhbCB2YWx1ZS4KLSAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0gICAgfQotCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wID0geVBvcyArIGhlaWdodEluY3JlYXNlOwotICAgIC8vIEFmdGVyIG1h
cmdpbiBjb2xsYXBzaW5nLCBvbmUgb2Ygb3VyIGZsb2F0cyBtYXkgbm93IGludHJ1ZGUgaW50byB0
aGUgY2hpbGQuIElmIHRoZSBjaGlsZCBkb2Vzbid0IGNvbnRhaW4gZmxvYXRzIG9mIGl0cyBvd24g
aXQKLSAgICAvLyB3b24ndCBnZXQgcGlja2VkIHVwIGZvciByZWxheW91dCBldmVuIHRob3VnaCB0
aGUgbG9naWNhbCB0b3AgZXN0aW1hdGUgd2FzIHdyb25nIC0gc28gYWRkIHRoZSBuZXdseSBpbnRy
dWRpbmcgZmxvYXQgbm93LgotICAgIGlmIChjb250YWluc0Zsb2F0cygpICYmIGNoaWxkLT5pc1Jl
bmRlckJsb2NrKCkgJiYgIXRvUmVuZGVyQmxvY2soY2hpbGQpLT5jb250YWluc0Zsb2F0cygpICYm
ICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wKQotICAgICAgICB0b1JlbmRlckJsb2NrKGNoaWxkKS0+YWRkSW50cnVkaW5nRmxv
YXRzKHRoaXMsIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudCgpLCBsb2dpY2FsVG9wKTsKLQot
ICAgIHJldHVybiBsb2dpY2FsVG9wOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjptYXJnaW5CZWZv
cmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQmIHBvc2l0aXZl
TWFyZ2luQmVmb3JlLCBMYXlvdXRVbml0JiBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgYm9vbCYgZGlz
Y2FyZE1hcmdpbkJlZm9yZSkgY29uc3QKLXsKLSAgICAvLyBHaXZlIHVwIGlmIGluIHF1aXJrcyBt
b2RlIGFuZCB3ZSdyZSBhIGJvZHkvdGFibGUgY2VsbCBhbmQgdGhlIHRvcCBtYXJnaW4gb2YgdGhl
IGNoaWxkIGJveCBpcyBxdWlya3kuCi0gICAgLy8gR2l2ZSB1cCBpZiB0aGUgY2hpbGQgc3BlY2lm
aWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlOiBzZXBhcmF0ZSB0aGF0IHByZXZlbnRzIGNvbGxh
cHNpbmcuCi0gICAgLy8gRklYTUU6IFVzZSB3cml0aW5nIG1vZGUgaW5kZXBlbmRlbnQgYWNjZXNz
b3IgZm9yIG1hcmdpbkJlZm9yZUNvbGxhcHNlLgotICAgIGlmICgoZG9jdW1lbnQoKS5pblF1aXJr
c01vZGUoKSAmJiBoYXNNYXJnaW5BZnRlclF1aXJrKGNoaWxkKSAmJiAoaXNUYWJsZUNlbGwoKSB8
fCBpc0JvZHkoKSkpIHx8IGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09
IE1TRVBBUkFURSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhlIG1hcmdpbnMgYXJlIGRp
c2NhcmRlZCBieSBhIGNoaWxkIHRoYXQgc3BlY2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNl
OiBkaXNjYXJkLgotICAgIC8vIEZJWE1FOiBVc2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFj
Y2Vzc29yIGZvciBtYXJnaW5CZWZvcmVDb2xsYXBzZS4KLSAgICBpZiAoY2hpbGQtPnN0eWxlKCkt
Pm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgcG9zaXRpdmVN
YXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7Ci0gICAg
ICAgIGRpc2NhcmRNYXJnaW5CZWZvcmUgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgTGF5b3V0VW5pdCBiZWZvcmVDaGlsZE1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxk
KGNoaWxkKTsKLSAgICBwb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IG1heChwb3NpdGl2ZU1hcmdpbkJl
Zm9yZSwgYmVmb3JlQ2hpbGRNYXJnaW4pOwotICAgIG5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4
KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCAtYmVmb3JlQ2hpbGRNYXJnaW4pOwotCi0gICAgaWYgKCFj
aGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSB0b1JlbmRlckJsb2NrKGNoaWxkKTsKLSAgICBpZiAoY2hpbGRC
bG9jay0+Y2hpbGRyZW5JbmxpbmUoKSB8fCBjaGlsZEJsb2NrLT5pc1dyaXRpbmdNb2RlUm9vdCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBNYXJnaW5JbmZvIGNoaWxkTWFyZ2luSW5mbyhjaGls
ZEJsb2NrLCBjaGlsZEJsb2NrLT5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCksIGNoaWxkQmxvY2st
PmJvcmRlckFuZFBhZGRpbmdBZnRlcigpKTsKLSAgICBpZiAoIWNoaWxkTWFyZ2luSW5mby5jYW5D
b2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBSZW5kZXJCb3gqIGdyYW5kY2hpbGRCb3ggPSBjaGlsZEJsb2NrLT5maXJzdENoaWxkQm94KCk7
Ci0gICAgZm9yICggOyBncmFuZGNoaWxkQm94OyBncmFuZGNoaWxkQm94ID0gZ3JhbmRjaGlsZEJv
eC0+bmV4dFNpYmxpbmdCb3goKSkgewotICAgICAgICBpZiAoIWdyYW5kY2hpbGRCb3gtPmlzRmxv
YXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICAKLSAgICAvLyBHaXZlIHVwIGlmIHRoZXJlIGlzIGNsZWFyYW5jZSBvbiB0aGUgYm94LCBz
aW5jZSBpdCBwcm9iYWJseSB3b24ndCBjb2xsYXBzZSBpbnRvIHVzLgotICAgIGlmICghZ3JhbmRj
aGlsZEJveCB8fCBncmFuZGNoaWxkQm94LT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBibG9jayBtYXJn
aW5zIG5vdyBmb3IgdGhlIGdyYW5kY2hpbGQgYm94IHNvIHRoYXQgd2UncmUgbG9va2luZyBhdCBj
dXJyZW50IHZhbHVlcy4KLSAgICBpZiAoZ3JhbmRjaGlsZEJveC0+bmVlZHNMYXlvdXQoKSkgewot
ICAgICAgICBncmFuZGNoaWxkQm94LT5jb21wdXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5z
KHRoaXMpOwotICAgICAgICBpZiAoZ3JhbmRjaGlsZEJveC0+aXNSZW5kZXJCbG9jaygpKSB7Ci0g
ICAgICAgICAgICBSZW5kZXJCbG9jayogZ3JhbmRjaGlsZEJsb2NrID0gdG9SZW5kZXJCbG9jayhn
cmFuZGNoaWxkQm94KTsKLSAgICAgICAgICAgIGdyYW5kY2hpbGRCbG9jay0+c2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoZ3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQmVmb3JlUXVpcmso
KSk7Ci0gICAgICAgICAgICBncmFuZGNoaWxkQmxvY2stPnNldEhhc01hcmdpbkFmdGVyUXVpcmso
Z3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQWZ0ZXJRdWlyaygpKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIENvbGxhcHNlIHRoZSBtYXJnaW4gb2YgdGhlIGdyYW5kY2hpbGQg
Ym94IHdpdGggb3VyIG93biB0byBwcm9kdWNlIGFuIGVzdGltYXRlLgotICAgIGNoaWxkQmxvY2st
Pm1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoZ3JhbmRjaGlsZEJveCwgcG9zaXRpdmVNYXJn
aW5CZWZvcmUsIG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKLX0K
LQotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6ZXN0aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24oUmVu
ZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYg
ZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbikKLXsKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBl
bGltaW5hdGUgdGhlIGVzdGltYXRpb24gb2YgdmVydGljYWwgcG9zaXRpb24sIGJlY2F1c2Ugd2hl
biBpdCdzIHdyb25nIHdlIHNvbWV0aW1lcyB0cmlnZ2VyIGEgcGF0aG9sb2dpY2FsCi0gICAgLy8g
cmVsYXlvdXQgaWYgdGhlcmUgYXJlIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgTGF5b3V0VW5pdCBs
b2dpY2FsVG9wRXN0aW1hdGUgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKCFtYXJnaW5JbmZv
LmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgcG9z
aXRpdmVNYXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2lu
QmVmb3JlID0gMDsKLSAgICAgICAgYm9vbCBkaXNjYXJkTWFyZ2luQmVmb3JlID0gZmFsc2U7Ci0g
ICAgICAgIGlmIChjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgIC8vIFRy
eSB0byBkbyBhIGJhc2ljIGVzdGltYXRpb24gb2YgaG93IHRoZSBjb2xsYXBzZSBpcyBnb2luZyB0
byBnby4KLSAgICAgICAgICAgIG1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoY2hpbGQsIHBv
c2l0aXZlTWFyZ2luQmVmb3JlLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgZGlzY2FyZE1hcmdpbkJl
Zm9yZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIGNhY2hlZCBj
b2xsYXBzZWQgbWFyZ2luIHZhbHVlcyBmcm9tIGEgcHJldmlvdXMgbGF5b3V0LiBNb3N0IG9mIHRo
ZSB0aW1lIHRoZXkKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgcmlnaHQuCi0gICAgICAgICAgICBN
YXJnaW5WYWx1ZXMgbWFyZ2luVmFsdWVzID0gbWFyZ2luVmFsdWVzRm9yQ2hpbGQoY2hpbGQpOwot
ICAgICAgICAgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSBtYXgocG9zaXRpdmVNYXJnaW5CZWZv
cmUsIG1hcmdpblZhbHVlcy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIG5l
Z2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBtYXJnaW5WYWx1
ZXMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSk7Ci0gICAgICAgICAgICBkaXNjYXJkTWFyZ2luQmVm
b3JlID0gbXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCk7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBDb2xsYXBzZSB0aGUgcmVzdWx0IHdpdGggb3VyIGN1cnJlbnQgbWFyZ2lu
cy4KLSAgICAgICAgaWYgKCFkaXNjYXJkTWFyZ2luQmVmb3JlKQotICAgICAgICAgICAgbG9naWNh
bFRvcEVzdGltYXRlICs9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc2l0aXZl
TWFyZ2luQmVmb3JlKSAtIG1heChtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCksIG5lZ2F0aXZl
TWFyZ2luQmVmb3JlKTsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgbG9naWNhbFRvcEVzdGltYXRl
IGRvd24gdG8gdGhlIG5leHQgcGFnZSBpZiB0aGUgbWFyZ2lucyBhcmUgc28gbGFyZ2UgdGhhdCB3
ZSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQKLSAgICAvLyBwYWdlLgotICAgIExheW91dFN0YXRl
KiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpOwotICAgIGlmIChsYXlvdXRTdGF0
ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFnZUxvZ2ljYWxIZWlnaHQoKSAmJiBs
b2dpY2FsVG9wRXN0aW1hdGUgPiBsb2dpY2FsSGVpZ2h0KCkKLSAgICAgICAgJiYgaGFzTmV4dFBh
Z2UobG9naWNhbEhlaWdodCgpKSkKLSAgICAgICAgbG9naWNhbFRvcEVzdGltYXRlID0gbWluKGxv
Z2ljYWxUb3BFc3RpbWF0ZSwgbmV4dFBhZ2VMb2dpY2FsVG9wKGxvZ2ljYWxIZWlnaHQoKSkpOwot
Ci0gICAgbG9naWNhbFRvcEVzdGltYXRlICs9IGdldENsZWFyRGVsdGEoY2hpbGQsIGxvZ2ljYWxU
b3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiA9IGxvZ2lj
YWxUb3BFc3RpbWF0ZTsKLQotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSkgewot
ICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29sdW1uIGJyZWFrIHZhbHVl
IG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUgdG9wIG9mIHRoZSBuZXh0
IHBhZ2UuCi0gICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IGFwcGx5QmVmb3JlQnJlYWsoY2hp
bGQsIGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgICAgIC8vIEZvciByZXBsYWNlZCBl
bGVtZW50cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0
aGUgbmV4dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICAg
ICAgbG9naWNhbFRvcEVzdGltYXRlID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGQs
IGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWNoaWxkLT5zZWxm
TmVlZHNMYXlvdXQoKSAmJiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICAgICAgbG9n
aWNhbFRvcEVzdGltYXRlICs9IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5wYWdpbmF0aW9uU3RydXQo
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9naWNhbFRvcEVzdGltYXRlOwotfQotCiBMYXlvdXRV
bml0IFJlbmRlckJsb2NrOjpjb21wdXRlU3RhcnRQb3NpdGlvbkRlbHRhRm9yQ2hpbGRBdm9pZGlu
Z0Zsb2F0cyhjb25zdCBSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGNoaWxkTWFyZ2luU3Rh
cnQsIFJlbmRlclJlZ2lvbiogcmVnaW9uKQogewogICAgIExheW91dFVuaXQgc3RhcnRQb3NpdGlv
biA9IHN0YXJ0T2Zmc2V0Rm9yQ29udGVudChyZWdpb24pOwpAQCAtMjMyMSw1MSArMTkxNiw2IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmRldGVybWluZUxvZ2ljYWxMZWZ0UG8KICAgICBzZXRMb2dpY2Fs
TGVmdEZvckNoaWxkKGNoaWxkLCBzdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBu
ZXdQb3NpdGlvbiA6IHRvdGFsQXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gbmV3UG9zaXRpb24gLSBs
b2dpY2FsV2lkdGhGb3JDaGlsZChjaGlsZCksIGFwcGx5RGVsdGEpOwogfQogCi12b2lkIFJlbmRl
ckJsb2NrOjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4oY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2lu
SW5mbykKLXsKLSAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5BZnRlcigp
ICYmICFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAg
IC8vIFVwZGF0ZSB0aGUgYWZ0ZXIgc2lkZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB0byBkaXNj
YXJkIGlmIHRoZSBhZnRlciBtYXJnaW4gb2YgdGhlIGxhc3QgY2hpbGQgYWxzbyBkaXNjYXJkcyBh
bmQgd2UgY29sbGFwc2Ugd2l0aCBpdC4KLSAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSBtYXgg
bWFyZ2luIHZhbHVlcyBiZWNhdXNlIHdlIHdvbid0IG5lZWQgdGhlbSBhbnl3YXkuCi0gICAgICAg
IGlmIChtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgc2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gVXBkYXRlIG91ciBtYXggcG9zL25lZyBib3R0b20gbWFyZ2lucywgc2luY2Ugd2Ug
Y29sbGFwc2VkIG91ciBib3R0b20gbWFyZ2lucwotICAgICAgICAvLyB3aXRoIG91ciBjaGlsZHJl
bi4KLSAgICAgICAgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMobWF4KG1heFBvc2l0aXZlTWFyZ2lu
QWZ0ZXIoKSwgbWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpKSwgbWF4KG1heE5lZ2F0aXZlTWFy
Z2luQWZ0ZXIoKSwgbWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpKSk7Ci0KLSAgICAgICAgaWYg
KCFtYXJnaW5JbmZvLmhhc01hcmdpbkFmdGVyUXVpcmsoKSkKLSAgICAgICAgICAgIHNldEhhc01h
cmdpbkFmdGVyUXVpcmsoZmFsc2UpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLmhhc01hcmdp
bkFmdGVyUXVpcmsoKSAmJiAhbWFyZ2luQWZ0ZXIoKSkKLSAgICAgICAgICAgIC8vIFdlIGhhdmUg
bm8gYm90dG9tIG1hcmdpbiBhbmQgb3VyIGxhc3QgY2hpbGQgaGFzIGEgcXVpcmt5IG1hcmdpbi4K
LSAgICAgICAgICAgIC8vIFdlIHdpbGwgcGljayB1cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBh
c3MgaXQgdGhyb3VnaC4KLSAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMgd2l0aCB0aGUgPHRkPjxk
aXY+PHA+IGNhc2UuCi0gICAgICAgICAgICBzZXRIYXNNYXJnaW5BZnRlclF1aXJrKHRydWUpOwot
ICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6aGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IGJlZm9yZVNpZGUsIExheW91dFVuaXQgYWZ0ZXJTaWRlLCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQotewotICAgIG1hcmdpbkluZm8uc2V0QXRBZnRlclNpZGVPZkJsb2NrKHRydWUpOwot
Ci0gICAgLy8gSWYgd2UgY2FuJ3QgY29sbGFwc2Ugd2l0aCBjaGlsZHJlbiB0aGVuIGdvIGFoZWFk
IGFuZCBhZGQgaW4gdGhlIGJvdHRvbSBtYXJnaW4uCi0gICAgaWYgKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQWZ0ZXIoKSAm
JiAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKQotICAgICAgICAmJiAo
IWRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIo
KSB8fCAhbWFyZ2luSW5mby5oYXNNYXJnaW5BZnRlclF1aXJrKCkpKSkKLSAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdpbigpKTsKLSAgICAg
ICAgCi0gICAgLy8gTm93IGFkZCBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nLgotICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJTaWRlKTsKLQotICAgIC8vIE5l
Z2F0aXZlIG1hcmdpbnMgY2FuIGNhdXNlIG91ciBoZWlnaHQgdG8gc2hyaW5rIGJlbG93IG91ciBt
aW5pbWFsIGhlaWdodCAoYm9yZGVyL3BhZGRpbmcpLgotICAgIC8vIElmIHRoaXMgaGFwcGVucywg
ZW5zdXJlIHRoYXQgdGhlIGNvbXB1dGVkIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gdGhlIG1pbmlt
YWwgaGVpZ2h0LgotICAgIHNldExvZ2ljYWxIZWlnaHQobWF4KGxvZ2ljYWxIZWlnaHQoKSwgYmVm
b3JlU2lkZSArIGFmdGVyU2lkZSkpOwotCi0gICAgLy8gVXBkYXRlIG91ciBib3R0b20gY29sbGFw
c2VkIG1hcmdpbiBpbmZvLgotICAgIHNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihtYXJnaW5JbmZv
KTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0TG9naWNhbExlZnRGb3JDaGlsZChSZW5kZXJC
b3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBBcHBseUxheW91dERlbHRhTW9kZSBh
cHBseURlbHRhKQogewogICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7CkBAIC0y
NDM1LDE2MCArMTk4NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRpcnR5Rm9yTGF5b3V0RnJvbVBl
cmMKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dEJsb2NrQ2hpbGQoUmVuZGVy
Qm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYgcHJldmlvdXNG
bG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZsb2F0TG9naWNhbEJvdHRvbSkKLXsK
LSAgICBMYXlvdXRVbml0IG9sZFBvc01hcmdpbkJlZm9yZSA9IG1heFBvc2l0aXZlTWFyZ2luQmVm
b3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBvbGROZWdNYXJnaW5CZWZvcmUgPSBtYXhOZWdhdGl2ZU1h
cmdpbkJlZm9yZSgpOwotCi0gICAgLy8gVGhlIGNoaWxkIGlzIGEgbm9ybWFsIGZsb3cgb2JqZWN0
LiAgQ29tcHV0ZSB0aGUgbWFyZ2lucyB3ZSB3aWxsIHVzZSBmb3IgY29sbGFwc2luZyBub3cuCi0g
ICAgY2hpbGQtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7Ci0KLSAg
ICAvLyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgbG9naWNhbCB0b3AgcG9zaXRpb24uICBJbiBt
b3N0IGNhc2VzIHRoaXMgZ3Vlc3Mgd2lsbAotICAgIC8vIGJlIGNvcnJlY3QuICBPbmx5IGlmIHdl
J3JlIHdyb25nICh3aGVuIHdlIGNvbXB1dGUgdGhlIHJlYWwgbG9naWNhbCB0b3AgcG9zaXRpb24p
Ci0gICAgLy8gd2lsbCB3ZSBoYXZlIHRvIHBvdGVudGlhbGx5IHJlbGF5b3V0LgotICAgIExheW91
dFVuaXQgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbjsKLSAgICBMYXlvdXRVbml0IGxvZ2ljYWxU
b3BFc3RpbWF0ZSA9IGVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKGNoaWxkLCBtYXJnaW5JbmZv
LCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uKTsKLQotICAgIC8vIENhY2hlIG91ciBvbGQgcmVj
dCBzbyB0aGF0IHdlIGNhbiBkaXJ0eSB0aGUgcHJvcGVyIHJlcGFpbnQgcmVjdHMgaWYgdGhlIGNo
aWxkIG1vdmVzLgotICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkLT5mcmFtZVJlY3QoKTsK
LSAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQp
OwotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEg
PSB2aWV3KCkubGF5b3V0RGVsdGEoKTsKLSNlbmRpZgotICAgIC8vIEdvIGFoZWFkIGFuZCBwb3Np
dGlvbiB0aGUgY2hpbGQgYXMgdGhvdWdoIGl0IGRpZG4ndCBjb2xsYXBzZSB3aXRoIHRoZSB0b3Au
Ci0gICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUsIEFw
cGx5TGF5b3V0RGVsdGEpOwotICAgIGVzdGltYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGlsZChjaGls
ZCk7Ci0KLSAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRl
ckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7Ci0gICAgYm9vbCBtYXJrRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzID0gZmFsc2U7Ci0gICAgaWYgKGxvZ2ljYWxUb3BFc3RpbWF0ZSAhPSBv
bGRMb2dpY2FsVG9wICYmICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9j
ayAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICBtYXJrRGVz
Y2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSNpZiBFTkFCTEUoU1VCUElYRUxfTEFZT1VUKQot
ICAgIGVsc2UgaWYgKFVOTElLRUxZKGxvZ2ljYWxUb3BFc3RpbWF0ZS5taWdodEJlU2F0dXJhdGVk
KCkpKQotICAgICAgICAvLyBsb2dpY2FsVG9wRXN0aW1hdGUsIHJldHVybmVkIGJ5IGVzdGltYXRl
TG9naWNhbFRvcFBvc2l0aW9uLCBtaWdodCBiZSBzYXR1cmF0ZWQgZm9yCi0gICAgICAgIC8vIHZl
cnkgbGFyZ2UgZWxlbWVudHMuIElmIGl0IGRvZXMgdGhlIGNvbXBhcmlzb24gd2l0aCBvbGRMb2dp
Y2FsVG9wIG1pZ2h0IHlpZWxkIGEKLSAgICAgICAgLy8gZmFsc2UgbmVnYXRpdmUgYXMgYWRkaW5n
IGFuZCByZW1vdmluZyBtYXJnaW5zLCBib3JkZXJzIGV0YyBmcm9tIGEgc2F0dXJhdGVkIG51bWJl
cgotICAgICAgICAvLyBtaWdodCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cy4gSWYgdGhpcyBpcyB0
aGUgY2FzZSBhbHdheXMgbWFyayBmb3IgbGF5b3V0LgotICAgICAgICBtYXJrRGVzY2VuZGFudHNX
aXRoRmxvYXRzID0gdHJ1ZTsKLSNlbmRpZgotICAgIGVsc2UgaWYgKCFjaGlsZC0+YXZvaWRzRmxv
YXRzKCkgfHwgY2hpbGQtPnNocmlua1RvQXZvaWRGbG9hdHMoKSkgewotICAgICAgICAvLyBJZiBh
biBlbGVtZW50IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHRo
ZW4gYWx3YXlzIG1hcmsgaXQgZm9yCi0gICAgICAgIC8vIGxheW91dC4KLSAgICAgICAgTGF5b3V0
VW5pdCBmYiA9IG1heChwcmV2aW91c0Zsb2F0TG9naWNhbEJvdHRvbSwgbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tKCkpOwotICAgICAgICBpZiAoZmIgPiBsb2dpY2FsVG9wRXN0aW1hdGUpCi0gICAg
ICAgICAgICBtYXJrRGVzY2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICBpZiAobWFya0Rlc2NlbmRhbnRzV2l0aEZs
b2F0cykKLSAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJv
b3QoKSkKLSAgICAgICAgICAgIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KHByZXZp
b3VzRmxvYXRMb2dpY2FsQm90dG9tLCBvbGRMb2dpY2FsVG9wICsgY2hpbGRSZW5kZXJCbG9jay0+
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpOwotICAgIH0KLQotICAgIGlmICghY2hpbGQtPm5l
ZWRzTGF5b3V0KCkpCi0gICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZO
ZWVkZWQoKTsKLQotICAgIGJvb2wgY2hpbGRIYWRMYXlvdXQgPSBjaGlsZC0+ZXZlckhhZExheW91
dCgpOwotICAgIGJvb2wgY2hpbGROZWVkZWRMYXlvdXQgPSBjaGlsZC0+bmVlZHNMYXlvdXQoKTsK
LSAgICBpZiAoY2hpbGROZWVkZWRMYXlvdXQpCi0gICAgICAgIGNoaWxkLT5sYXlvdXQoKTsKLQot
ICAgIC8vIENhY2hlIGlmIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayByaWdodCBub3cu
Ci0gICAgYm9vbCBhdEJlZm9yZVNpZGVPZkJsb2NrID0gbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVP
ZkJsb2NrKCk7Ci0KLSAgICAvLyBOb3cgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHlwb3MgYmFzZWQg
b2ZmIGV4YW1pbmF0aW9uIG9mIGNvbGxhcHNpbmcgbWFyZ2luCi0gICAgLy8gdmFsdWVzLgotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZUNsZWFyID0gY29sbGFwc2VNYXJnaW5zKGNoaWxk
LCBtYXJnaW5JbmZvKTsKLQotICAgIC8vIE5vdyBjaGVjayBmb3IgY2xlYXIuCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciA9IGNsZWFyRmxvYXRzSWZOZWVkZWQoY2hpbGQsIG1h
cmdpbkluZm8sIG9sZFBvc01hcmdpbkJlZm9yZSwgb2xkTmVnTWFyZ2luQmVmb3JlLCBsb2dpY2Fs
VG9wQmVmb3JlQ2xlYXIpOwotICAgIAotICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmxheW91
dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7Ci0gICAgaWYgKHBhZ2luYXRlZCkKLSAgICAgICAgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBhZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihsb2dpY2Fs
VG9wQWZ0ZXJDbGVhciwgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiwgY2hpbGQsCi0gICAgICAg
ICAgICBhdEJlZm9yZVNpZGVPZkJsb2NrICYmIGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9PSBsb2dp
Y2FsVG9wQWZ0ZXJDbGVhcik7Ci0KLSAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxv
Z2ljYWxUb3BBZnRlckNsZWFyLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIC8vIE5vdyB3ZSBo
YXZlIGEgZmluYWwgdG9wIHBvc2l0aW9uLiAgU2VlIGlmIGl0IHJlYWxseSBkb2VzIGVuZCB1cCBi
ZWluZyBkaWZmZXJlbnQgZnJvbSBvdXIgZXN0aW1hdGUuCi0gICAgLy8gY2xlYXJGbG9hdHNJZk5l
ZWRlZCBjYW4gYWxzbyBtYXJrIHRoZSBjaGlsZCBhcyBuZWVkaW5nIGEgbGF5b3V0IGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndCBtb3ZlLiBUaGlzIGhhcHBlbnMKLSAgICAvLyB3aGVuIGNvbGxhcHNlTWFy
Z2lucyBkeW5hbWljYWxseSBhZGRzIG92ZXJoYW5naW5nIGZsb2F0cyBiZWNhdXNlIG9mIGEgY2hp
bGQgd2l0aCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgIGlmIChsb2dpY2FsVG9wQWZ0ZXJDbGVhciAh
PSBsb2dpY2FsVG9wRXN0aW1hdGUgfHwgY2hpbGQtPm5lZWRzTGF5b3V0KCkgfHwgKHBhZ2luYXRl
ZCAmJiBjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxvY2stPnNob3VsZEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KCkpKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZs
b2F0cygpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRo
ZSBsaW5lIHdpZHRoLgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNs
ZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KLSAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVz
ZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCi0gICAgICAgICAgICAvLyBTbyBn
byBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGNoaWxkLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWNo
aWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygp
KQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0
KCkpCi0gICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5l
ZWRlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFr
ZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCi0gICAgICAgIGNoaWxkLT5sYXlvdXRJ
Zk5lZWRlZCgpOwotICAgIH0KLQotICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxk
KGNoaWxkKSkgewotICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSwgTWFya09ubHlU
aGlzKTsKLSAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgfQotCi0gICAgLy8g
V2UgYXJlIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIg
YSBub24tZW1wdHkgY2hpbGQuICAKLSAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGNo
ZWNraW5nIGZvciBjbGVhciwgc28gdGhhdCBtYXJnaW5zIGNhbiBiZSByZXNldCBpZiBhIGNsZWFy
IG9jY3VycmVkLgotICAgIGlmIChtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAh
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICBtYXJnaW5JbmZvLnNldEF0
QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgLy8gTm93IHBsYWNlIHRoZSBjaGlsZCBp
biB0aGUgY29ycmVjdCBsZWZ0IHBvc2l0aW9uCi0gICAgZGV0ZXJtaW5lTG9naWNhbExlZnRQb3Np
dGlvbkZvckNoaWxkKGNoaWxkLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIExheW91dFNpemUg
Y2hpbGRPZmZzZXQgPSBjaGlsZC0+bG9jYXRpb24oKSAtIG9sZFJlY3QubG9jYXRpb24oKTsKLSNp
ZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSAgICByZWxheW91dFNoYXBlRGVzY2VuZGFudElmTW92ZWQo
Y2hpbGRSZW5kZXJCbG9jaywgY2hpbGRPZmZzZXQpOwotI2VuZGlmCi0KLSAgICAvLyBVcGRhdGUg
b3VyIGhlaWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3Jy
ZWN0IHBvc2l0aW9uLgotICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbG9n
aWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7Ci0gICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkFm
dGVyRm9yQ2hpbGQoY2hpbGQpKSB7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhl
aWdodCgpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICBtYXJnaW5JbmZv
LmNsZWFyTWFyZ2luKCk7Ci0gICAgfQotICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgb3Zlcmhhbmdp
bmcgZmxvYXRzIHRoYXQgaW50cnVkZSBpbnRvIGZvbGxvd2luZyBzaWJsaW5ncyAob3IgcG9zc2li
bHkgb3V0Ci0gICAgLy8gb2YgdGhpcyBibG9jayksIHRoZW4gdGhlIHBhcmVudCBnZXRzIG5vdGlm
aWVkIG9mIHRoZSBmbG9hdHMgbm93LgotICAgIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxk
UmVuZGVyQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIG1heEZsb2F0TG9naWNhbEJv
dHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRv
UmVuZGVyQmxvY2soY2hpbGQpLCAhY2hpbGROZWVkZWRMYXlvdXQpKTsKLQotICAgIGlmIChjaGls
ZE9mZnNldC53aWR0aCgpIHx8IGNoaWxkT2Zmc2V0LmhlaWdodCgpKSB7Ci0gICAgICAgIHZpZXco
KS5hZGRMYXlvdXREZWx0YShjaGlsZE9mZnNldCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNoaWxk
IG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9z
aXRpb25lZAotICAgICAgICAvLyBkZXNjZW5kYW50cy4gIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBu
ZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvCi0gICAg
ICAgIC8vIHJlcGFpbnQgb3Vyc2VsdmVzIChhbmQgdGhlIGNoaWxkKSBhbnl3YXkuCi0gICAgICAg
IGlmIChjaGlsZEhhZExheW91dCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkgJiYgY2hpbGQtPmNoZWNr
Rm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAgY2hpbGQtPnJlcGFpbnREdXJp
bmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOwotICAgIH0KLQotICAgIGlmICghY2hpbGRIYWRMYXlv
dXQgJiYgY2hpbGQtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKSB7Ci0gICAgICAgIGNo
aWxkLT5yZXBhaW50KCk7Ci0gICAgICAgIGNoaWxkLT5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMo
dHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBhZ2luYXRlZCkgewotICAgICAgICAvLyBDaGVjayBm
b3IgYW4gYWZ0ZXIgcGFnZS9jb2x1bW4gYnJlYWsuCi0gICAgICAgIExheW91dFVuaXQgbmV3SGVp
Z2h0ID0gYXBwbHlBZnRlckJyZWFrKGNoaWxkLCBsb2dpY2FsSGVpZ2h0KCksIG1hcmdpbkluZm8p
OwotICAgICAgICBpZiAobmV3SGVpZ2h0ICE9IGhlaWdodCgpKQotICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChuZXdIZWlnaHQpOwotICAgIH0KLQotICAgIEFTU0VSVCh2aWV3KCkubGF5b3V0
RGVsdGFNYXRjaGVzKG9sZExheW91dERlbHRhKSk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNp
bXBsaWZpZWROb3JtYWxGbG93TGF5b3V0KCkKIHsKICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkg
ewpAQCAtNjg1NiwxMjcgKzYyNTIsMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJUcnVuY2F0
aW9uKCkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnNldE1heE1hcmdpbkJlZm9yZVZh
bHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVE
YXRhKSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVN
YXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpICYmIG5lZyA9PSBSZW5kZXJCbG9ja1JhcmVEYXRhOjpu
ZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcykpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlz
KSk7Ci0gICAgfQotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZShwb3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShuZWcpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhNYXJnaW5BZnRlclZhbHVl
cyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVEYXRh
KSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQodGhpcykgJiYgbmVnID09IFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0
aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRoaXMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOwot
ICAgIH0KLSAgICBtX3JhcmVEYXRhLT5tX21hcmdpbnMuc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihw
b3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkFmdGVyKG5l
Zyk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnNldE11c3REaXNjYXJkTWFyZ2luQmVmb3JlKGJv
b2wgdmFsdWUpCi17Ci0gICAgaWYgKHN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAoIW1fcmFyZURhdGEpCi0gICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihu
ZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7Ci0KLSAgICBtX3JhcmVEYXRhLT5tX2Rpc2Nh
cmRNYXJnaW5CZWZvcmUgPSB2YWx1ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6c2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcihib29sIHZhbHVlKQotewotICAgIGlmIChzdHlsZSgpLT5tYXJnaW5B
ZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbV9yYXJlRGF0YSAmJiAhdmFsdWUpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0
YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKLQotICAgIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gdmFsdWU7Ci19Ci0KLWJvb2wgUmVuZGVyQmxv
Y2s6Om11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUo
KS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBt
X3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUpOwotfQotCi1ib29sIFJlbmRlckJsb2Nr
OjptdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEIHx8IChtX3JhcmVEYXRhICYmIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyKTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVz
dERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25z
dAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAgICBpZiAoIWNo
aWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQotICAgICAgICByZXR1cm4gY2hpbGQtPmlzUmVuZGVy
QmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgp
IDogKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsK
LSAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0
b1JlbmRlckJsb2NrKGNoaWxkKS0+bXVzdERpc2NhcmRNYXJnaW5BZnRlcigpIDogKGNoaWxkLT5z
dHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwotCi0gICAgLy8gRklY
TUU6IFdlIHJldHVybiBmYWxzZSBoZXJlIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uIGlzIG5v
dCBnZW9tZXRyaWNhbGx5IGNvbXBsZXRlLiBXZSBoYXZlIHZhbHVlcyBvbmx5IGZvciBiZWZvcmUv
YWZ0ZXIsIG5vdCBzdGFydC9lbmQuCi0gICAgLy8gSW4gY2FzZSB0aGUgYm94ZXMgYXJlIHBlcnBl
bmRpY3VsYXIgd2UgYXNzdW1lIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLgotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVzdERpc2NhcmRNYXJnaW5BZnRl
ckZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFj
aGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOwotICAgIGlmICghY2hpbGQtPmlzV3JpdGluZ01vZGVS
b290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8gdG9SZW5kZXJC
bG9jayhjaGlsZCktPm11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSA6IChjaGlsZC0+c3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsKLSAgICBpZiAoY2hpbGQtPmlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAg
ICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKS0+
bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3Jl
Q29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2Fy
ZE1hcmdpbkJlZm9yZUZvckNoaWxkfCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgUmVuZGVyQmxvY2s6Om11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJl
bmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5
b3V0KCkpOwotICAgIGNvbnN0IFJlbmRlclN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxl
KCk7Ci0gICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKLSAgICAgICAgcmV0dXJu
IGNoaWxkU3R5bGUtPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlm
IChjaGlsZC0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKQotICAgICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgp
ID09IE1TRVBBUkFURTsKLQotICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVm
b3JlRm9yQ2hpbGR8IGFib3ZlLgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJC
bG9jazo6bXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNo
aWxkKSBjb25zdAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAg
ICBjb25zdCBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IGNoaWxkLT5zdHlsZSgpOwotICAgIGlm
ICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZFN0eWxl
LT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlmIChjaGlsZC0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAg
ICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNU0VQQVJB
VEU7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxk
fCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFBh
Z2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KQogewogICAgIGlmICghbV9yYXJlRGF0YSkg
ewogICAgICAgICBpZiAoIXN0cnV0KQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3Jh
cmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOworICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAg
fQogICAgIG1fcmFyZURhdGEtPm1fcGFnaW5hdGlvblN0cnV0ID0gc3RydXQ7CiB9CkBAIC02OTg2
LDcgKzYyNjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldChMCiAg
ICAgaWYgKCFtX3JhcmVEYXRhKSB7CiAgICAgICAgIGlmICghbG9naWNhbE9mZnNldCkKICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJC
bG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBS
ZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIH0KICAgICBtX3JhcmVEYXRhLT5tX3BhZ2VMb2dp
Y2FsT2Zmc2V0ID0gbG9naWNhbE9mZnNldDsKIH0KQEAgLTY5OTUsNyArNjI3Niw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnNldEJyZWFrQXRMaW5lVG9Bdm9pZFcKIHsKICAgICBBU1NFUlQobGluZVRv
QnJlYWspOwogICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0
UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9
IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIG1fcmFyZURhdGEtPm1f
c2hvdWxkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3cgPSB0cnVlOwogICAgIG1fcmFyZURhdGEtPm1f
bGluZUJyZWFrVG9Bdm9pZFdpZG93ID0gbGluZVRvQnJlYWs7CiB9CkBAIC03MTg5LDczICs2NDcw
LDExIEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2s6Om5leHRQYWdlTG9naWNhbFQKICAgICByZXR1
cm4gbG9naWNhbE9mZnNldCArIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7CiB9CiAKLXN0YXRpYyBi
b29sIGluTm9ybWFsRmxvdyhSZW5kZXJCb3gqIGNoaWxkKQotewotICAgIFJlbmRlckJsb2NrKiBj
dXJyID0gY2hpbGQtPmNvbnRhaW5pbmdCbG9jaygpOwotICAgIHdoaWxlIChjdXJyICYmIGN1cnIg
IT0gJmNoaWxkLT52aWV3KCkpIHsKLSAgICAgICAgaWYgKGN1cnItPmhhc0NvbHVtbnMoKSB8fCBj
dXJyLT5pc1JlbmRlckZsb3dUaHJlYWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICBpZiAoY3Vyci0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjdXJyID0gY3Vyci0+Y29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCiBDb2x1bW5JbmZvOjpQYWdpbmF0aW9u
VW5pdCBSZW5kZXJCbG9jazo6cGFnaW5hdGlvblVuaXQoKSBjb25zdAogewogICAgIHJldHVybiBD
b2x1bW5JbmZvOjpDb2x1bW47CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6OmFwcGx5QmVm
b3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KQotewot
ICAgIC8vIEZJWE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9y
dCBwcmludGluZy4KLSAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0
YXRlKCktPmlzUGFnaW5hdGluZ0NvbHVtbnMoKTsKLSAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9
ICFjaGVja0NvbHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNh
bEhlaWdodDsgLy8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVj
ayB0aGlzLgotICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29u
dGFpbmluZ0Jsb2NrKCk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQg
JiYgZmxvd1RocmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKLSAgICBib29sIGNoZWNr
QmVmb3JlQWx3YXlzID0gKGNoZWNrQ29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1
bW5CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxk
LT5zdHlsZSgpLT5wYWdlQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUykKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5y
ZWdpb25CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKTsKLSAgICBpZiAoY2hlY2tCZWZvcmVBbHdh
eXMgJiYgaW5Ob3JtYWxGbG93KGNoaWxkKSAmJiBoYXNOZXh0UGFnZShsb2dpY2FsT2Zmc2V0LCBJ
bmNsdWRlUGFnZUJvdW5kYXJ5KSkgewotICAgICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0g
ICAgICAgICAgICB2aWV3KCkubGF5b3V0U3RhdGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hp
bGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAg
ICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAg
ICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3JjZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9t
TG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBsb2dpY2FsT2Zmc2V0LCBjaGlsZCwgdHJ1ZSwgJm9m
ZnNldEJyZWFrQWRqdXN0bWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZz
ZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5l
eHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2s6OmFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxP
ZmZzZXQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gRklYTUU6IEFkZCBwYWdl
IGJyZWFrIGNoZWNraW5nIGhlcmUgd2hlbiB3ZSBzdXBwb3J0IHByaW50aW5nLgotICAgIGJvb2wg
Y2hlY2tDb2x1bW5CcmVha3MgPSB2aWV3KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0aW5nQ29s
dW1ucygpOwotICAgIGJvb2wgY2hlY2tQYWdlQnJlYWtzID0gIWNoZWNrQ29sdW1uQnJlYWtzICYm
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VMb2dpY2FsSGVpZ2h0OyAvLyBGSVhNRTogT25j
ZSBjb2x1bW5zIGNhbiBwcmludCB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMuCi0gICAgUmVuZGVyRmxv
d1RocmVhZCogZmxvd1RocmVhZCA9IGZsb3dUaHJlYWRDb250YWluaW5nQmxvY2soKTsKLSAgICBi
b29sIGNoZWNrUmVnaW9uQnJlYWtzID0gZmxvd1RocmVhZCAmJiBmbG93VGhyZWFkLT5pc1JlbmRl
ck5hbWVkRmxvd1RocmVhZCgpOwotICAgIGJvb2wgY2hlY2tBZnRlckFsd2F5cyA9IChjaGVja0Nv
bHVtbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+Y29sdW1uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtBZnRl
cigpID09IFBCQUxXQVlTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1Jl
Z2lvbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+cmVnaW9uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKTsKLSAgICBpZiAoY2hlY2tBZnRlckFsd2F5cyAmJiBpbk5vcm1hbEZsb3coY2hpbGQpICYm
IGhhc05leHRQYWdlKGxvZ2ljYWxPZmZzZXQsIEluY2x1ZGVQYWdlQm91bmRhcnkpKSB7Ci0gICAg
ICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhN
YXJnaW5CZWZvcmUoKSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0KLSAg
ICAgICAgLy8gU28gb3VyIG1hcmdpbiBkb2Vzbid0IHBhcnRpY2lwYXRlIGluIHRoZSBuZXh0IGNv
bGxhcHNpbmcgc3RlcHMuCi0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLQotICAg
ICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0gICAgICAgICAgICB2aWV3KCkubGF5b3V0U3Rh
dGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hpbGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAg
ICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0
QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAgICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3Jj
ZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9tTG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBs
b2dpY2FsT2Zmc2V0ICsgbWFyZ2luT2Zmc2V0LCBjaGlsZCwgZmFsc2UsICZvZmZzZXRCcmVha0Fk
anVzdG1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0ICsgbWFyZ2lu
T2Zmc2V0ICsgb2Zmc2V0QnJlYWtBZGp1c3RtZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBuZXh0UGFnZUxvZ2ljYWxUb3AobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFyeSk7
Ci0gICAgfQotICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0OwotfQotCiBMYXlvdXRVbml0IFJlbmRl
ckJsb2NrOjpwYWdlTG9naWNhbFRvcEZvck9mZnNldChMYXlvdXRVbml0IG9mZnNldCkgY29uc3QK
IHsKICAgICBMYXlvdXRVbml0IGZpcnN0UGFnZUxvZ2ljYWxUb3AgPSBpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpID8gdmlldygpLmxheW91dFN0YXRlKCktPm1fcGFnZU9mZnNldC5oZWlnaHQoKSA6
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VPZmZzZXQud2lkdGgoKTsKQEAgLTc0MzcsODcg
KzY2NTYsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RMaW5lUG9zaXRpb25Gb3JQCiAgICAg
ICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VCcmVhayh0cnVlKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5p
dCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5b3V0VW5pdCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0
aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2spCi17Ci0gICAg
UmVuZGVyQmxvY2sqIGNoaWxkUmVuZGVyQmxvY2sgPSBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8g
dG9SZW5kZXJCbG9jayhjaGlsZCkgOiAwOwotCi0gICAgaWYgKGVzdGltYXRlV2l0aG91dFBhZ2lu
YXRpb24gIT0gbG9naWNhbFRvcEFmdGVyQ2xlYXIpIHsKLSAgICAgICAgLy8gT3VyIGd1ZXNzIHBy
aW9yIHRvIHBhZ2luYXRpb24gbW92ZW1lbnQgd2FzIHdyb25nLiBCZWZvcmUgd2UgYXR0ZW1wdCB0
byBwYWdpbmF0ZSwgbGV0J3MgdHJ5IGFnYWluIGF0IHRoZSBuZXcKLSAgICAgICAgLy8gcG9zaXRp
b24uCi0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotICAg
ICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBB
cHBseUxheW91dERlbHRhKTsKLQotICAgICAgICBpZiAoY2hpbGQtPnNocmlua1RvQXZvaWRGbG9h
dHMoKSkgewotICAgICAgICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggZGVwZW5kcyBvbiB0aGUg
bGluZSB3aWR0aC4KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNoaWxkIHNoaWZ0cyB0byBjbGVh
ciBhbiBpdGVtLCBpdHMgd2lkdGggY2FuCi0gICAgICAgICAgICAvLyBjaGFuZ2UgKGJlY2F1c2Ug
aXQgaGFzIG1vcmUgYXZhaWxhYmxlIGxpbmUgd2lkdGgpLgotICAgICAgICAgICAgLy8gU28gZ28g
YWhlYWQgYW5kIG1hcmsgdGhlIGl0ZW0gYXMgZGlydHkuCi0gICAgICAgICAgICBjaGlsZC0+c2V0
Q2hpbGROZWVkc0xheW91dCh0cnVlLCBNYXJrT25seVRoaXMpOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICBpZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICAgICAgaWYgKCFjaGls
ZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkK
LSAgICAgICAgICAgICAgICBjaGlsZFJlbmRlckJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRo
RmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgp
KQotICAgICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVk
ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE91ciBndWVzcyB3YXMgd3JvbmcuIE1ha2Ug
dGhlIGNoaWxkIGxheSBpdHNlbGYgb3V0IGFnYWluLgotICAgICAgICBjaGlsZC0+bGF5b3V0SWZO
ZWVkZWQoKTsKLSAgICB9Ci0KLSAgICBMYXlvdXRVbml0IG9sZFRvcCA9IGxvZ2ljYWxUb3BBZnRl
ckNsZWFyOwotCi0gICAgLy8gSWYgdGhlIG9iamVjdCBoYXMgYSBwYWdlIG9yIGNvbHVtbiBicmVh
ayB2YWx1ZSBvZiAiYmVmb3JlIiwgdGhlbiB3ZSBzaG91bGQgc2hpZnQgdG8gdGhlIHRvcCBvZiB0
aGUgbmV4dCBwYWdlLgotICAgIExheW91dFVuaXQgcmVzdWx0ID0gYXBwbHlCZWZvcmVCcmVhayhj
aGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotCi0gICAgaWYgKHBhZ2VMb2dpY2FsSGVpZ2h0
Rm9yT2Zmc2V0KHJlc3VsdCkpIHsKLSAgICAgICAgTGF5b3V0VW5pdCByZW1haW5pbmdMb2dpY2Fs
SGVpZ2h0ID0gcGFnZVJlbWFpbmluZ0xvZ2ljYWxIZWlnaHRGb3JPZmZzZXQocmVzdWx0LCBFeGNs
dWRlUGFnZUJvdW5kYXJ5KTsKLSAgICAgICAgTGF5b3V0VW5pdCBzcGFjZVNob3J0YWdlID0gY2hp
bGQtPmxvZ2ljYWxIZWlnaHQoKSAtIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7Ci0gICAgICAgIGlm
IChzcGFjZVNob3J0YWdlID4gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGNyb3Nz
ZXMgYSBjb2x1bW4gYm91bmRhcnksIHJlcG9ydCBhIGJyZWFrLCBpbiBjYXNlIG5vdGhpbmcgaW5z
aWRlIGl0IGhhcyBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBkb25lIHNvLiBUaGUgY29sdW1uIGJh
bGFuY2VyIG5lZWRzIHRvIGtub3cgaG93IG11Y2ggaXQgaGFzIHRvIHN0cmV0Y2ggdGhlIGNvbHVt
bnMgdG8gbWFrZSBtb3JlCi0gICAgICAgICAgICAvLyBjb250ZW50IGZpdC4gSWYgbm8gYnJlYWtz
IGFyZSByZXBvcnRlZCAoYnV0IGRvIG9jY3VyKSwgdGhlIGJhbGFuY2VyIHdpbGwgaGF2ZSBubyBj
bHVlLiBGSVhNRToKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkLCB0aG91
Z2gsIGJlY2F1c2UgaGVyZSB3ZSBqdXN0IHByZXRlbmQgdGhhdCB0aGUgY2hpbGQgaXMKLSAgICAg
ICAgICAgIC8vIHVuc3BsaXR0YWJsZS4gQSBzcGxpdHRhYmxlIGNoaWxkLCBvbiB0aGUgb3RoZXIg
aGFuZCwgaGFzIGJyZWFrIG9wcG9ydHVuaXRpZXMgYXQgZXZlcnkgcG9zaXRpb24KLSAgICAgICAg
ICAgIC8vIHdoZXJlIHRoZXJlJ3Mgbm8gY2hpbGQgY29udGVudCwgYm9yZGVyIG9yIHBhZGRpbmcu
IEluIG90aGVyIHdvcmRzLCB3ZSByaXNrIHN0cmV0Y2hpbmcgbW9yZQotICAgICAgICAgICAgLy8g
dGhhbiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBzZXRQYWdlQnJlYWsocmVzdWx0LCBzcGFjZVNo
b3J0YWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZvciByZXBsYWNlZCBlbGVtZW50
cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0aGUgbmV4
dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxUb3BCZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50ID0gcmVzdWx0OwotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVudCA9IGFkanVz
dEZvclVuc3BsaXR0YWJsZUNoaWxkKGNoaWxkLCByZXN1bHQpOwotICAgIAotICAgIExheW91dFVu
aXQgcGFnaW5hdGlvblN0cnV0ID0gMDsKLSAgICBMYXlvdXRVbml0IHVuc3BsaXR0YWJsZUFkanVz
dG1lbnREZWx0YSA9IGxvZ2ljYWxUb3BBZnRlclVuc3BsaXR0YWJsZUFkanVzdG1lbnQgLSBsb2dp
Y2FsVG9wQmVmb3JlVW5zcGxpdHRhYmxlQWRqdXN0bWVudDsKLSAgICBpZiAodW5zcGxpdHRhYmxl
QWRqdXN0bWVudERlbHRhKQotICAgICAgICBwYWdpbmF0aW9uU3RydXQgPSB1bnNwbGl0dGFibGVB
ZGp1c3RtZW50RGVsdGE7Ci0gICAgZWxzZSBpZiAoY2hpbGRSZW5kZXJCbG9jayAmJiBjaGlsZFJl
bmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKSkKLSAgICAgICAgcGFnaW5hdGlvblN0cnV0ID0g
Y2hpbGRSZW5kZXJCbG9jay0+cGFnaW5hdGlvblN0cnV0KCk7Ci0KLSAgICBpZiAocGFnaW5hdGlv
blN0cnV0KSB7Ci0gICAgICAgIC8vIFdlIGFyZSB3aWxsaW5nIHRvIHByb3BhZ2F0ZSBvdXQgdG8g
b3VyIHBhcmVudCBibG9jayBhcyBsb25nIGFzIHdlIHdlcmUgYXQgdGhlIHRvcCBvZiB0aGUgYmxv
Y2sgcHJpb3IKLSAgICAgICAgLy8gdG8gY29sbGFwc2luZyBvdXIgbWFyZ2lucywgYW5kIGFzIGxv
bmcgYXMgd2UgZGlkbid0IGNsZWFyIG9yIG1vdmUgYXMgYSByZXN1bHQgb2Ygb3RoZXIgcGFnaW5h
dGlvbi4KLSAgICAgICAgaWYgKGF0QmVmb3JlU2lkZU9mQmxvY2sgJiYgb2xkVG9wID09IHJlc3Vs
dCAmJiAhaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWlzVGFibGVDZWxsKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBTaG91bGQgcmVhbGx5IGNoZWNrIGlmIHdlJ3JlIGV4Y2VlZGluZyB0
aGUgcGFnZSBoZWlnaHQgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBzdHJ1dCwgYnV0IHdlIGRvbid0
Ci0gICAgICAgICAgICAvLyBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZG8gc28gKHRoZSBz
dHJ1dCBvbmx5IGhhcyB0aGUgcmVtYWluaW5nIGFtb3VudCB0byBwdXNoKS4gR2Vja28gZ2V0cyB0
aGlzIHdyb25nIHRvbwotICAgICAgICAgICAgLy8gYW5kIHB1c2hlcyB0byB0aGUgbmV4dCBwYWdl
IGFueXdheSwgc28gbm90IHRvbyBjb25jZXJuZWQgYWJvdXQgaXQuCi0gICAgICAgICAgICBzZXRQ
YWdpbmF0aW9uU3RydXQocmVzdWx0ICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAgIGlm
IChjaGlsZFJlbmRlckJsb2NrKQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPnNl
dFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXN1bHQg
Kz0gcGFnaW5hdGlvblN0cnV0OwotICAgIH0KLQotICAgIC8vIFNpbWlsYXIgdG8gaG93IHdlIGFw
cGx5IGNsZWFyYW5jZS4gR28gYWhlYWQgYW5kIGJvb3N0IGhlaWdodCgpIHRvIGJlIHRoZSBwbGFj
ZSB3aGVyZSB3ZSdyZSBnb2luZyB0byBwb3NpdGlvbiB0aGUgY2hpbGQuCi0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyAocmVzdWx0IC0gb2xkVG9wKSk7Ci0gICAgCi0gICAg
Ly8gUmV0dXJuIHRoZSBmaW5hbCBhZGp1c3RlZCBsb2dpY2FsIHRvcC4KLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCiBib29sIFJlbmRlckJsb2NrOjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hh
bmdlZChSb290SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVy
Rmxvd1RocmVhZCogZmxvd1RocmVhZCkgY29uc3QKIHsKICAgICBpZiAoIWZsb3dUaHJlYWQpCkBA
IC03NzE4LDY2ICs2ODU2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6aGFzTWFyZ2luQWZ0ZXJRdWly
ayhjbwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotUmVuZGVyQmxvY2s6Ok1hcmdpblZhbHVlcyBS
ZW5kZXJCbG9jazo6bWFyZ2luVmFsdWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3QK
LXsKLSAgICBMYXlvdXRVbml0IGNoaWxkQmVmb3JlUG9zaXRpdmUgPSAwOwotICAgIExheW91dFVu
aXQgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IDA7Ci0gICAgTGF5b3V0VW5pdCBjaGlsZEFmdGVyUG9z
aXRpdmUgPSAwOwotICAgIExheW91dFVuaXQgY2hpbGRBZnRlck5lZ2F0aXZlID0gMDsKLQotICAg
IExheW91dFVuaXQgYmVmb3JlTWFyZ2luID0gMDsKLSAgICBMYXlvdXRVbml0IGFmdGVyTWFyZ2lu
ID0gMDsKLQotICAgIFJlbmRlckJsb2NrKiBjaGlsZFJlbmRlckJsb2NrID0gY2hpbGQtPmlzUmVu
ZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpIDogMDsKLSAgICAKLSAgICAvLyBJZiB0
aGUgY2hpbGQgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbmFsaXR5IGFzIHdlIGRvLCB0aGVuIHdlIGNh
biBqdXN0IHJldHVybiBpdHMKLSAgICAvLyBtYXJnaW5zIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4K
LSAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKSB7Ci0gICAgICAgIGlmIChjaGls
ZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBjaGlsZEJlZm9yZVBvc2l0aXZlID0gY2hpbGRS
ZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgICAgIGNoaWxk
QmVmb3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+
bWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZl
ID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgYmVmb3JlTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgp
OwotICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgewotICAgICAgICAvLyBUaGUgY2hpbGQgaGFzIGEg
ZGlmZmVyZW50IGRpcmVjdGlvbmFsaXR5LiAgSWYgdGhlIGNoaWxkIGlzIHBhcmFsbGVsLCB0aGVu
IGl0J3MganVzdAotICAgICAgICAvLyBmbGlwcGVkIHJlbGF0aXZlIHRvIHVzLiAgV2UgY2FuIHVz
ZSB0aGUgbWFyZ2lucyBmb3IgdGhlIG9wcG9zaXRlIGVkZ2VzLgotICAgICAgICBpZiAoY2hpbGRS
ZW5kZXJCbG9jaykgewotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGNoaWxkUmVu
ZGVyQmxvY2stPm1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKTsKLSAgICAgICAgICAgIGNoaWxkQmVm
b3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
Ci0gICAgICAgICAgICBjaGlsZEFmdGVyUG9zaXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhQ
b3NpdGl2ZU1hcmdpbkJlZm9yZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZlID0g
Y2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIGJlZm9yZU1hcmdpbiA9IGNoaWxkLT5tYXJnaW5BZnRlcigpOwot
ICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQmVmb3JlKCk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgY2hpbGQgaXMgcGVycGVuZGljdWxhciB0
byB1cywgd2hpY2ggbWVhbnMgaXRzIG1hcmdpbnMgZG9uJ3QgY29sbGFwc2UgYnV0IGFyZSBvbiB0
aGUKLSAgICAgICAgLy8gImxvZ2ljYWwgbGVmdC9yaWdodCIgc2lkZXMgb2YgdGhlIGNoaWxkIGJv
eC4gIFdlIGNhbiBqdXN0IHJldHVybiB0aGUgcmF3IG1hcmdpbiBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgIGJlZm9yZU1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
YWZ0ZXJNYXJnaW4gPSBtYXJnaW5BZnRlckZvckNoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICAv
LyBSZXNvbHZlIHVuY29sbGFwc2luZyBtYXJnaW5zIGludG8gdGhlaXIgcG9zaXRpdmUvbmVnYXRp
dmUgYnVja2V0cy4KLSAgICBpZiAoYmVmb3JlTWFyZ2luKSB7Ci0gICAgICAgIGlmIChiZWZvcmVN
YXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGJlZm9yZU1hcmdp
bjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IC1iZWZv
cmVNYXJnaW47Ci0gICAgfQotICAgIGlmIChhZnRlck1hcmdpbikgewotICAgICAgICBpZiAoYWZ0
ZXJNYXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gYWZ0ZXJNYXJn
aW47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IC1hZnRl
ck1hcmdpbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9z
aXRpdmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRl
ck5lZ2F0aXZlKTsKLX0KLQogY29uc3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBj
b25zdAogewogICAgIGlmIChpc0JvZHkoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDcgKzM0Miw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNldExpbmVHcmlkQm94KFJvb3RJbmxpbmVCb3gqIGJveCkKICAgICB7CiAg
ICAgICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0
cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRh
ID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIGlmIChtX3Jh
cmVEYXRhLT5tX2xpbmVHcmlkQm94KQogICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5lR3Jp
ZEJveC0+ZGVzdHJveShyZW5kZXJBcmVuYSgpKTsKICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5l
R3JpZEJveCA9IGJveDsKQEAgLTM3MSwzMyArMzcxLDYgQEAgcHVibGljOgogCiAgICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZpcnN0TGV0dGVyKCk7CiAKLSAgICBjbGFzcyBNYXJnaW5WYWx1ZXMgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgTWFyZ2luVmFsdWVzKExheW91dFVuaXQgYmVmb3JlUG9zLCBM
YXlvdXRVbml0IGJlZm9yZU5lZywgTGF5b3V0VW5pdCBhZnRlclBvcywgTGF5b3V0VW5pdCBhZnRl
ck5lZykKLSAgICAgICAgICAgIDogbV9wb3NpdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVQb3MpCi0g
ICAgICAgICAgICAsIG1fbmVnYXRpdmVNYXJnaW5CZWZvcmUoYmVmb3JlTmVnKQotICAgICAgICAg
ICAgLCBtX3Bvc2l0aXZlTWFyZ2luQWZ0ZXIoYWZ0ZXJQb3MpCi0gICAgICAgICAgICAsIG1fbmVn
YXRpdmVNYXJnaW5BZnRlcihhZnRlck5lZykKLSAgICAgICAgeyB9Ci0gICAgICAgIAotICAgICAg
ICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQmVm
b3JlKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBM
YXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aXZl
TWFyZ2luQWZ0ZXI7IH0KLSAgICAgICAgTGF5b3V0VW5pdCBuZWdhdGl2ZU1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkFmdGVyOyB9Ci0gICAgICAgIAotICAgICAg
ICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luQmVmb3JlKExheW91dFVuaXQgcG9zKSB7IG1fcG9zaXRp
dmVNYXJnaW5CZWZvcmUgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShMYXlvdXRVbml0IG5lZykgeyBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbmVnOyB9Ci0g
ICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihMYXlvdXRVbml0IHBvcykgeyBtX3Bv
c2l0aXZlTWFyZ2luQWZ0ZXIgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdp
bkFmdGVyKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5BZnRlciA9IG5lZzsgfQot
ICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkJl
Zm9yZTsKLSAgICAgICAgTGF5b3V0VW5pdCBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlOwotICAgICAg
ICBMYXlvdXRVbml0IG1fcG9zaXRpdmVNYXJnaW5BZnRlcjsKLSAgICAgICAgTGF5b3V0VW5pdCBt
X25lZ2F0aXZlTWFyZ2luQWZ0ZXI7Ci0gICAgfTsKLSAgICBNYXJnaW5WYWx1ZXMgbWFyZ2luVmFs
dWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQg
c2Nyb2xsYmFyc0NoYW5nZWQoYm9vbCAvKmhvcml6b250YWxTY3JvbGxiYXJDaGFuZ2VkKi8sIGJv
b2wgLyp2ZXJ0aWNhbFNjcm9sbGJhckNoYW5nZWQqLykgeyB9OwogCiAgICAgTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoUmVuZGVyUmVnaW9uKikgY29uc3Q7CkBAIC00Njgs
NyArNDQxLDcgQEAgcHVibGljOgogICAgIHZvaWQgc2V0U2hhcGVJbnNpZGVJbmZvKFBhc3NPd25Q
dHI8U2hhcGVJbnNpZGVJbmZvPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIGlmICghbV9yYXJlRGF0
YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJl
RGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRl
ckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIG1fcmFyZURhdGEtPm1fc2hhcGVJbnNpZGVJbmZv
ID0gdmFsdWU7CiAgICAgfQogICAgIHZvaWQgbWFya1NoYXBlSW5zaWRlRGVzY2VuZGFudHNGb3JM
YXlvdXQoKTsKQEAgLTQ4MCwzOCArNDUzLDYgQEAgcHVibGljOgogcHJvdGVjdGVkOgogICAgIHZp
cnR1YWwgdm9pZCB3aWxsQmVEZXN0cm95ZWQoKTsKIAotICAgIExheW91dFVuaXQgbWF4UG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+
bV9tYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgOiBSZW5kZXJCbG9ja1JhcmVEYXRhOjpw
b3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyk7IH0KLSAgICBMYXlvdXRVbml0IG1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURh
dGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVuZGVyQmxvY2tSYXJlRGF0
YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpOyB9Ci0gICAgTGF5b3V0VW5pdCBt
YXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFy
ZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkgOiBSZW5kZXJCbG9ja1JhcmVE
YXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKTsgfQotICAgIExheW91dFVuaXQg
bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmFyZURhdGEgPyBtX3Jh
cmVEYXRhLT5tX21hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRlcigpIDogUmVuZGVyQmxvY2tSYXJl
RGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1bHQodGhpcyk7IH0KLSAgICAKLSAgICB2b2lk
IHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcp
OwotICAgIHZvaWQgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91
dFVuaXQgbmVnKTsKLQotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCA9
IHRydWUpOwotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5BZnRlcihib29sID0gdHJ1ZSk7
Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3Q7Ci0gICAgYm9vbCBt
dXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3Q7Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFy
Z2luQmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0gICAgYm9vbCBtdXN0
RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0KLSAg
ICBib29sIG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCop
IGNvbnN0OwotICAgIGJvb2wgbXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBS
ZW5kZXJCb3gqKSBjb25zdDsKLQotICAgIHZvaWQgaW5pdE1heE1hcmdpblZhbHVlcygpCi0gICAg
ewotICAgICAgICBpZiAobV9yYXJlRGF0YSkgewotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9t
YXJnaW5zID0gTWFyZ2luVmFsdWVzKFJlbmRlckJsb2NrUmFyZURhdGE6OnBvc2l0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSAsIFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJCbG9ja1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVm
YXVsdCh0aGlzKSwgUmVuZGVyQmxvY2tSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1
bHQodGhpcykpOwotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9wYWdpbmF0aW9uU3RydXQgPSAw
OwotCi0gICAgICAgICAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUgPSBmYWxz
ZTsKLSAgICAgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7CiAKICAgICB2
b2lkIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBm
aXhlZFBvc2l0aW9uT2JqZWN0c09ubHkgPSBmYWxzZSk7CkBAIC02MzUsOSArNTc2LDYgQEAgcHJp
dmF0ZToKICAgICAKICAgICB2aXJ0dWFsIGJvb2wgaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgY29u
c3QgT1ZFUlJJREUgRklOQUw7CiAKLSAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFy
Z2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUgRklOQUwgeyByZXR1cm4gbWF4UG9zaXRpdmVNYXJn
aW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7IH0KLSAgICB2aXJ0dWFsIExh
eW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0ZXIoKSBjb25zdCBPVkVSUklERSBGSU5BTCB7IHJl
dHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgLSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
IH0KLQogICAgIHZpcnR1YWwgdm9pZCByZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWlu
dEFsbERlc2NlbmRhbnRzKSBPVkVSUklERSBGSU5BTDsKIAogICAgIEJpZGlSdW4qIGhhbmRsZVRy
YWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgQmlkaUNvbnRleHQqKTsKQEAgLTEw
MDYsMTAxICs5NDQsMTAgQEAgcHJpdmF0ZToKICAgICBSZW5kZXJCbG9jayogY29udGFpbmluZ0Nv
bHVtbnNCbG9jayhib29sIGFsbG93QW5vbnltb3VzQ29sdW1uQmxvY2sgPSB0cnVlKTsKICAgICBS
ZW5kZXJCbG9jayogY29sdW1uc0Jsb2NrRm9yU3Bhbm5pbmdFbGVtZW50KFJlbmRlck9iamVjdCog
bmV3Q2hpbGQpOwogCi0gICAgY2xhc3MgTWFyZ2luSW5mbyB7Ci0gICAgICAgIC8vIENvbGxhcHNp
bmcgZmxhZ3MgZm9yIHdoZXRoZXIgd2UgY2FuIGNvbGxhcHNlIG91ciBtYXJnaW5zIHdpdGggb3Vy
IGNoaWxkcmVuJ3MgbWFyZ2lucy4KLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRy
ZW4gOiAxOwotCi0gICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBhIHF1aXJreSBjb250
YWluZXIsIGkuZS4sIGRvIHdlIGNvbGxhcHNlIGF3YXkgdG9wIGFuZCBib3R0b20KLSAgICAgICAg
Ly8gbWFyZ2lucyBpbiBvdXIgY29udGFpbmVyLiAgVGFibGUgY2VsbHMgYW5kIHRoZSBib2R5IGFy
ZSB0aGUgY29tbW9uIGV4YW1wbGVzLiBXZQotICAgICAgICAvLyBhbHNvIGhhdmUgYSBjdXN0b20g
c3R5bGUgcHJvcGVydHkgZm9yIFNhZmFyaSBSU1MgdG8gZGVhbCB3aXRoIFR5cGVQYWQgYmxvZyBh
cnRpY2xlcy4KLSAgICAgICAgYm9vbCBtX3F1aXJrQ29udGFpbmVyIDogMTsKLQotICAgICAgICAv
LyBUaGlzIGZsYWcgdHJhY2tzIHdoZXRoZXIgd2UgYXJlIHN0aWxsIGxvb2tpbmcgYXQgY2hpbGQg
bWFyZ2lucyB0aGF0IGNhbiBhbGwgY29sbGFwc2UgdG9nZXRoZXIgYXQgdGhlIGJlZ2lubmluZyBv
ZiBhIGJsb2NrLiAgCi0gICAgICAgIC8vIFRoZXkgbWF5IG9yIG1heSBub3QgY29sbGFwc2Ugd2l0
aCB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgYmxvY2sgKHxtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxk
cmVufCB0ZWxscyB1cyB0aGF0KSwgYnV0IHRoZXkgd2lsbAotICAgICAgICAvLyBhbHdheXMgYmUg
Y29sbGFwc2luZyB3aXRoIG9uZSBhbm90aGVyLiAgVGhpcyB2YXJpYWJsZSBjYW4gcmVtYWluIHNl
dCB0byB0cnVlIHRocm91Z2ggbXVsdGlwbGUgaXRlcmF0aW9ucyAKLSAgICAgICAgLy8gYXMgbG9u
ZyBhcyB3ZSBrZWVwIGVuY291bnRlcmluZyBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLgotICAgICAg
ICBib29sIG1fYXRCZWZvcmVTaWRlT2ZCbG9jayA6IDE7Ci0KLSAgICAgICAgLy8gVGhpcyBmbGFn
IGlzIHNldCB3aGVuIHdlIGtub3cgd2UncmUgZXhhbWluaW5nIGJvdHRvbSBtYXJnaW5zIGFuZCB3
ZSBrbm93IHdlJ3JlIGF0IHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLgotICAgICAgICBib29sIG1f
YXRBZnRlclNpZGVPZkJsb2NrIDogMTsKLQotICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJl
IHVzZWQgdG8gZGV0ZWN0IHF1aXJreSBtYXJnaW5zIHRoYXQgd2UgbmVlZCB0byBjb2xsYXBzZSBh
d2F5IChpbiB0YWJsZSBjZWxscwotICAgICAgICAvLyBhbmQgaW4gdGhlIGJvZHkgZWxlbWVudCku
Ci0gICAgICAgIGJvb2wgbV9oYXNNYXJnaW5CZWZvcmVRdWlyayA6IDE7Ci0gICAgICAgIGJvb2wg
bV9oYXNNYXJnaW5BZnRlclF1aXJrIDogMTsKLSAgICAgICAgYm9vbCBtX2RldGVybWluZWRNYXJn
aW5CZWZvcmVRdWlyayA6IDE7Ci0KLSAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW4gOiAxOwot
Ci0gICAgICAgIC8vIFRoZXNlIGZsYWdzIHRyYWNrIHRoZSBwcmV2aW91cyBtYXhpbWFsIHBvc2l0
aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgICAgICBMYXlvdXRVbml0IG1fcG9zaXRpdmVN
YXJnaW47Ci0gICAgICAgIExheW91dFVuaXQgbV9uZWdhdGl2ZU1hcmdpbjsKLQotICAgIHB1Ymxp
YzoKLSAgICAgICAgTWFyZ2luSW5mbyhSZW5kZXJCbG9jayosIExheW91dFVuaXQgYmVmb3JlQm9y
ZGVyUGFkZGluZywgTGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpOwotCi0gICAgICAgIHZv
aWQgc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9hdEJlZm9yZVNpZGVPZkJsb2Nr
ID0gYjsgfQotICAgICAgICB2b2lkIHNldEF0QWZ0ZXJTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9h
dEFmdGVyU2lkZU9mQmxvY2sgPSBiOyB9Ci0gICAgICAgIHZvaWQgY2xlYXJNYXJnaW4oKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBtX3Bvc2l0aXZlTWFyZ2luID0gMDsKLSAgICAgICAgICAgIG1f
bmVnYXRpdmVNYXJnaW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoYm9vbCBiKSB7IG1faGFzTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAg
ICAgIHZvaWQgc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhib29sIGIpIHsgbV9oYXNNYXJnaW5BZnRl
clF1aXJrID0gYjsgfQotICAgICAgICB2b2lkIHNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
ayhib29sIGIpIHsgbV9kZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAgICAg
IHZvaWQgc2V0UG9zaXRpdmVNYXJnaW4oTGF5b3V0VW5pdCBwKSB7IEFTU0VSVCghbV9kaXNjYXJk
TWFyZ2luKTsgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2
ZU1hcmdpbihMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX25lZ2F0
aXZlTWFyZ2luID0gbjsgfQotICAgICAgICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIo
TGF5b3V0VW5pdCBwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fZGlzY2FyZE1h
cmdpbik7Ci0gICAgICAgICAgICBpZiAocCA+IG1fcG9zaXRpdmVNYXJnaW4pCi0gICAgICAgICAg
ICAgICAgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRO
ZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKExheW91dFVuaXQgbikKLSAgICAgICAgewotICAgICAgICAg
ICAgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOwotICAgICAgICAgICAgaWYgKG4gPiBtX25lZ2F0
aXZlTWFyZ2luKQotICAgICAgICAgICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSBuOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNYXJnaW4oTGF5b3V0VW5pdCBwLCBMYXlvdXRVbml0IG4p
IHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX3Bvc2l0aXZlTWFyZ2luID0gcDsgbV9uZWdh
dGl2ZU1hcmdpbiA9IG47IH0KLSAgICAgICAgdm9pZCBzZXRDYW5Db2xsYXBzZU1hcmdpbkFmdGVy
V2l0aENoaWxkcmVuKGJvb2wgY29sbGFwc2UpIHsgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0
aENoaWxkcmVuID0gY29sbGFwc2U7IH0KLSAgICAgICAgdm9pZCBzZXREaXNjYXJkTWFyZ2luKGJv
b2wgdmFsdWUpIHsgbV9kaXNjYXJkTWFyZ2luID0gdmFsdWU7IH0KLQotICAgICAgICBib29sIGF0
QmVmb3JlU2lkZU9mQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2s7
IH0KLSAgICAgICAgYm9vbCBjYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJl
dHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdp
dGhDaGlsZHJlbjsgfQotICAgICAgICBib29sIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9hdEFmdGVyU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5CZWZv
cmVXaXRoQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3Jl
V2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhD
aGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGls
ZHJlbjsgfQotICAgICAgICBib29sIHF1aXJrQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gbV9x
dWlya0NvbnRhaW5lcjsgfQotICAgICAgICBib29sIGRldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
aygpIGNvbnN0IHsgcmV0dXJuIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrOyB9Ci0gICAg
ICAgIGJvb2wgaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSBjb25zdCB7IHJldHVybiBtX2hhc01hcmdp
bkJlZm9yZVF1aXJrOyB9Ci0gICAgICAgIGJvb2wgaGFzTWFyZ2luQWZ0ZXJRdWlyaygpIGNvbnN0
IHsgcmV0dXJuIG1faGFzTWFyZ2luQWZ0ZXJRdWlyazsgfQotICAgICAgICBMYXlvdXRVbml0IHBv
c2l0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGl2ZU1hcmdpbjsgfQotICAgICAg
ICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1h
cmdpbjsgfQotICAgICAgICBib29sIGRpc2NhcmRNYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX2Rp
c2NhcmRNYXJnaW47IH0KLSAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW4oKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aXZlTWFyZ2luIC0gbV9uZWdhdGl2ZU1hcmdpbjsgfQotICAgIH07Ci0KLSAgICB2
b2lkIGxheW91dEJsb2NrQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYsIExheW91
dFVuaXQmIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExv
Z2ljYWxCb3R0b20pOwotICAgIHZvaWQgYWRqdXN0UG9zaXRpb25lZEJsb2NrKFJlbmRlckJveCog
Y2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIGFkanVzdEZsb2F0aW5nQmxvY2so
Y29uc3QgTWFyZ2luSW5mbyYpOwotCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNyZWF0ZVJl
cGxhY2VtZW50UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3QqIHJ1bkluKTsKICAgICB2b2lkIG1v
dmVSdW5JblVuZGVyU2libGluZ0Jsb2NrSWZOZWVkZWQoUmVuZGVyT2JqZWN0KiBydW5Jbik7CiAg
ICAgdm9pZCBtb3ZlUnVuSW5Ub09yaWdpbmFsUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBydW5Jbik7
CiAKLSAgICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJn
aW5JbmZvJik7Ci0gICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlckJveCog
Y2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRvcFBvc01hcmdpbiwgTGF5b3V0VW5p
dCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7Ci0gICAgTGF5b3V0VW5pdCBlc3Rp
bWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZv
JiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbik7Ci0gICAgdm9pZCBtYXJn
aW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCosIExheW91dFVuaXQmLCBMYXlvdXRV
bml0JiwgYm9vbCYpIGNvbnN0OwotICAgIHZvaWQgaGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IHRvcCwgTGF5b3V0VW5pdCBib3R0b20sIE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIHNl
dENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJik7Ci0gICAgLy8gRW5kIGhl
bHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCBieSBsYXlvdXRCbG9ja0NoaWxkcmVuLgot
CiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCiAgICAg
Um9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJp
ZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRz
Jik7CiAgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wg
aGFzSW5saW5lQ2hpbGQpOwpAQCAtMTEzMyw5ICs5ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2
aXJ0dWFsIENvbHVtbkluZm86OlBhZ2luYXRpb25Vbml0IHBhZ2luYXRpb25Vbml0KCkgY29uc3Q7
CiAKLSAgICBMYXlvdXRVbml0IGFwcGx5QmVmb3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5
b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KTsgLy8gSWYgdGhlIGNoaWxkIGhhcyBhIGJlZm9yZSBicmVh
aywgdGhlbiByZXR1cm4gYSBuZXcgeVBvcyB0aGF0IHNoaWZ0cyB0byB0aGUgdG9wIG9mIHRoZSBu
ZXh0IHBhZ2UvY29sdW1uLgotICAgIExheW91dFVuaXQgYXBwbHlBZnRlckJyZWFrKFJlbmRlckJv
eCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgTWFyZ2luSW5mbyYpOyAvLyBJZiB0
aGUgY2hpbGQgaGFzIGFuIGFmdGVyIGJyZWFrLCB0aGVuIHJldHVybiBhIG5ldyBvZmZzZXQgdGhh
dCBzaGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlL2NvbHVtbi4KLQogcHVibGljOgog
ICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxUb3BGb3JPZmZzZXQoTGF5b3V0VW5pdCBvZmZzZXQp
IGNvbnN0OwogICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxIZWlnaHRGb3JPZmZzZXQoTGF5b3V0
VW5pdCBvZmZzZXQpIGNvbnN0OwpAQCAtMTE1NCw4ICs5OTgsNyBAQCBwcm90ZWN0ZWQ6CiAKICAg
ICBMYXlvdXRVbml0IGFkanVzdEZvclVuc3BsaXR0YWJsZUNoaWxkKFJlbmRlckJveCogY2hpbGQs
IExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgYm9vbCBpbmNsdWRlTWFyZ2lucyA9IGZhbHNlKTsg
Ly8gSWYgdGhlIGNoaWxkIGlzIHVuc3BsaXR0YWJsZSBhbmQgY2FuJ3QgZml0IG9uIHRoZSBjdXJy
ZW50IHBhZ2UsIHJldHVybiB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgogICAgIHZv
aWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihSb290SW5saW5lQm94KiwgTGF5b3V0
VW5pdCYgZGVsdGFPZmZzZXQsIFJlbmRlckZsb3dUaHJlYWQqKTsgLy8gQ29tcHV0ZXMgYSBkZWx0
YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdl
IGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgTGF5b3V0VW5pdCBh
ZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNs
ZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hp
bGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jayk7Ci0KKyAKICAgICAvLyBBZGp1c3QgZnJvbSBw
YWludGluZyBvZmZzZXRzIHRvIHRoZSBsb2NhbCBjb29yZHMgb2YgdGhpcyByZW5kZXJlcgogICAg
IHZvaWQgb2Zmc2V0Rm9yQ29udGVudHMoTGF5b3V0UG9pbnQmKSBjb25zdDsKIApAQCAtMTI4Mywz
NiArMTEyNiwxNSBAQCBwdWJsaWM6CiAgICAgc3RydWN0IFJlbmRlckJsb2NrUmFyZURhdGEgewog
ICAgICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShSZW5kZXJCbG9ja1JhcmVEYXRhKTsgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CiAgICAgcHVibGljOgotICAgICAgICBSZW5kZXJCbG9ja1JhcmVE
YXRhKGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykgCi0gICAgICAgICAgICA6IG1fbWFyZ2lucyhw
b3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQoYmxvY2spLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZURl
ZmF1bHQoYmxvY2spLCBwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdChibG9jayksIG5lZ2F0aXZl
TWFyZ2luQWZ0ZXJEZWZhdWx0KGJsb2NrKSkKLSAgICAgICAgICAgICwgbV9wYWdpbmF0aW9uU3Ry
dXQoMCkKKyAgICAgICAgUmVuZGVyQmxvY2tSYXJlRGF0YSgpIAorICAgICAgICAgICAgOiBtX3Bh
Z2luYXRpb25TdHJ1dCgwKQogICAgICAgICAgICAgLCBtX3BhZ2VMb2dpY2FsT2Zmc2V0KDApCiAg
ICAgICAgICAgICAsIG1fbGluZUdyaWRCb3goMCkKICAgICAgICAgICAgICwgbV9saW5lQnJlYWtU
b0F2b2lkV2lkb3coLTEpCiAgICAgICAgICAgICAsIG1fc2hvdWxkQnJlYWtBdExpbmVUb0F2b2lk
V2lkb3coZmFsc2UpCi0gICAgICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkJlZm9yZShmYWxzZSkK
LSAgICAgICAgICAgICwgbV9kaXNjYXJkTWFyZ2luQWZ0ZXIoZmFsc2UpCiAgICAgICAgIHsgCiAg
ICAgICAgIH0KIAotICAgICAgICBzdGF0aWMgTGF5b3V0VW5pdCBwb3NpdGl2ZU1hcmdpbkJlZm9y
ZURlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQotICAgICAgICB7IAotICAgICAgICAg
ICAgcmV0dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KGJsb2NrLT5tYXJnaW5CZWZvcmUoKSwgMCk7
Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgbmVnYXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKLSAgICAgICAgeyAKLSAgICAgICAg
ICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PigtYmxvY2stPm1hcmdpbkJlZm9yZSgpLCAw
KTsKLSAgICAgICAgfQotICAgICAgICBzdGF0aWMgTGF5b3V0VW5pdCBwb3NpdGl2ZU1hcmdpbkFm
dGVyRGVmYXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCi0gICAgICAgIHsKLSAgICAgICAg
ICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+bWFyZ2luQWZ0ZXIoKSwgMCk7
Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgbmVnYXRpdmVNYXJnaW5BZnRl
ckRlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQotICAgICAgICB7Ci0gICAgICAgICAg
ICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2NrLT5tYXJnaW5BZnRlcigpLCAwKTsK
LSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTWFyZ2luVmFsdWVzIG1fbWFyZ2luczsKICAg
ICAgICAgTGF5b3V0VW5pdCBtX3BhZ2luYXRpb25TdHJ1dDsKICAgICAgICAgTGF5b3V0VW5pdCBt
X3BhZ2VMb2dpY2FsT2Zmc2V0OwogICAgICAgICAKQEAgLTEzMjMsOCArMTE0NSw2IEBAIHB1Ymxp
YzoKICAgICAgICAgT3duUHRyPFNoYXBlSW5zaWRlSW5mbz4gbV9zaGFwZUluc2lkZUluZm87CiAj
ZW5kaWYKICAgICAgICAgYm9vbCBtX3Nob3VsZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93IDogMTsK
LSAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW5CZWZvcmUgOiAxOwotICAgICAgICBib29sIG1f
ZGlzY2FyZE1hcmdpbkFmdGVyIDogMTsKICAgICAgfTsKIAogcHJvdGVjdGVkOgpJbmRleDogU291
cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5jcHAJKHJldmlzaW9uIDE1
NTM3NykKKysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0zMyw5ICszMyw1MCBAQCB1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKK3N0cnVjdCBTYW1lU2l6ZUFzTWFyZ2luSW5mbyB7CisgICAg
dWludDMyX3QgYml0ZmllbGRzIDogMTY7CisgICAgTGF5b3V0VW5pdCBtYXJnaW5zWzJdOworfTsK
KworQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzKSA9
PSBzaXplb2YoTGF5b3V0VW5pdFs0XSksIE1hcmdpblZhbHVlc19zaG91bGRfc3RheV9zbWFsbCk7
CisKKy8vIE91ciBNYXJnaW5JbmZvIHN0YXRlIHVzZWQgd2hlbiBsYXlpbmcgb3V0IGJsb2NrIGNo
aWxkcmVuLgorUmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpNYXJnaW5JbmZvKFJlbmRlckJs
b2NrRmxvdyogYmxvY2ssIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywgTGF5b3V0VW5p
dCBhZnRlckJvcmRlclBhZGRpbmcpCisgICAgOiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sodHJ1ZSkK
KyAgICAsIG1fYXRBZnRlclNpZGVPZkJsb2NrKGZhbHNlKQorICAgICwgbV9oYXNNYXJnaW5CZWZv
cmVRdWlyayhmYWxzZSkKKyAgICAsIG1faGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxzZSkKKyAgICAs
IG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKQorICAgICwgbV9kaXNjYXJkTWFy
Z2luKGZhbHNlKQoreworICAgIFJlbmRlclN0eWxlKiBibG9ja1N0eWxlID0gYmxvY2stPnN0eWxl
KCk7CisgICAgQVNTRVJUKGJsb2NrLT5pc1JlbmRlclZpZXcoKSB8fCBibG9jay0+cGFyZW50KCkp
OworICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVuZGVyVmlldygp
ICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc091dE9mRmxvd1Bvc2l0aW9uZWQoKQor
ICAgICAgICAmJiAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFibGVDZWxsKCkg
JiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5lQmxvY2tPcklu
bGluZVRhYmxlKCkKKyAgICAgICAgJiYgIWJsb2NrLT5pc1JlbmRlckZsb3dUaHJlYWQoKSAmJiAh
YmxvY2stPmlzV3JpdGluZ01vZGVSb290KCkgJiYgIWJsb2NrLT5wYXJlbnQoKS0+aXNGbGV4aWJs
ZUJveCgpCisgICAgICAgICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5Db3VudCgpICYmIGJs
b2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5XaWR0aCgpICYmICFibG9ja1N0eWxlLT5jb2x1bW5TcGFu
KCk7CisKKyAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuID0gbV9jYW5D
b2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAhYmVmb3JlQm9yZGVyUGFkZGluZyAmJiBibG9ja1N0eWxl
LT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKKworICAgIC8vIElmIGFueSBo
ZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4gd2UgZG9uJ3Qg
Y29sbGFwc2Ugb3VyIGJvdHRvbQorICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hpbGRyZW4ncyBt
YXJnaW5zLiBUbyBkbyBvdGhlcndpc2Ugd291bGQgYmUgdG8gcmlzayBvZGQgdmlzdWFsCisgICAg
Ly8gZWZmZWN0cyB3aGVuIHRoZSBjaGlsZHJlbiBvdmVyZmxvdyBvdXQgb2YgdGhlIHBhcmVudCBi
bG9jayBhbmQgeWV0IHN0aWxsIGNvbGxhcHNlCisgICAgLy8gd2l0aCBpdC4gV2UgYWxzbyBkb24n
dCBjb2xsYXBzZSBpZiB3ZSBoYXZlIGFueSBib3R0b20gYm9yZGVyL3BhZGRpbmcuCisgICAgbV9j
YW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuID0gbV9jYW5Db2xsYXBzZVdpdGhDaGls
ZHJlbiAmJiAoYWZ0ZXJCb3JkZXJQYWRkaW5nID09IDApCisgICAgICAgICYmIChibG9ja1N0eWxl
LT5sb2dpY2FsSGVpZ2h0KCkuaXNBdXRvKCkgJiYgIWJsb2NrU3R5bGUtPmxvZ2ljYWxIZWlnaHQo
KS52YWx1ZSgpKSAmJiBibG9ja1N0eWxlLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgIT0gTVNFUEFS
QVRFOworICAgIAorICAgIG1fcXVpcmtDb250YWluZXIgPSBibG9jay0+aXNUYWJsZUNlbGwoKSB8
fCBibG9jay0+aXNCb2R5KCk7CisKKyAgICBtX2Rpc2NhcmRNYXJnaW4gPSBtX2NhbkNvbGxhcHNl
TWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuICYmIGJsb2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZSgpOworCisgICAgbV9wb3NpdGl2ZU1hcmdpbiA9IChtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3Jl
V2l0aENoaWxkcmVuICYmICFibG9jay0+bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKSkgPyBibG9j
ay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKSA6IExheW91dFVuaXQoKTsKKyAgICBtX25lZ2F0
aXZlTWFyZ2luID0gKG1fY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgIWJs
b2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgpKSA/IGJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdp
bkJlZm9yZSgpIDogTGF5b3V0VW5pdCgpOworfQorCiBSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJs
b2NrRmxvdyhFbGVtZW50KiBlbGVtZW50KQogICAgIDogUmVuZGVyQmxvY2soZWxlbWVudCkKIHsK
KyAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoUmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvKSA9
PSBzaXplb2YoU2FtZVNpemVBc01hcmdpbkluZm8pLCBNYXJnaW5JbmZvX3Nob3VsZF9zdGF5X3Nt
YWxsKTsKIH0KIAogUmVuZGVyQmxvY2tGbG93Ojp+UmVuZGVyQmxvY2tGbG93KCkKQEAgLTQxMCw0
ICs0NTEsODg1IEBAIHZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0NoaWxkcmUKICAg
ICBoYW5kbGVBZnRlclNpZGVPZkJsb2NrKGJlZm9yZUVkZ2UsIGFmdGVyRWRnZSwgbWFyZ2luSW5m
byk7CiB9CiAKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjpsYXlvdXRCbG9ja0NoaWxkKFJlbmRlckJv
eCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExheW91dFVuaXQmIHByZXZpb3VzRmxv
YXRMb2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pCit7Cisg
ICAgTGF5b3V0VW5pdCBvbGRQb3NNYXJnaW5CZWZvcmUgPSBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9y
ZSgpOworICAgIExheW91dFVuaXQgb2xkTmVnTWFyZ2luQmVmb3JlID0gbWF4TmVnYXRpdmVNYXJn
aW5CZWZvcmUoKTsKKworICAgIC8vIFRoZSBjaGlsZCBpcyBhIG5vcm1hbCBmbG93IG9iamVjdC4g
Q29tcHV0ZSB0aGUgbWFyZ2lucyB3ZSB3aWxsIHVzZSBmb3IgY29sbGFwc2luZyBub3cuCisgICAg
Y2hpbGQtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7CisKKyAgICAv
LyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgbG9naWNhbCB0b3AgcG9zaXRpb24uIEluIG1vc3Qg
Y2FzZXMgdGhpcyBndWVzcyB3aWxsCisgICAgLy8gYmUgY29ycmVjdC4gT25seSBpZiB3ZSdyZSB3
cm9uZyAod2hlbiB3ZSBjb21wdXRlIHRoZSByZWFsIGxvZ2ljYWwgdG9wIHBvc2l0aW9uKQorICAg
IC8vIHdpbGwgd2UgaGF2ZSB0byBwb3RlbnRpYWxseSByZWxheW91dC4KKyAgICBMYXlvdXRVbml0
IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb247CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wRXN0
aW1hdGUgPSBlc3RpbWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihjaGlsZCwgbWFyZ2luSW5mbywgZXN0
aW1hdGVXaXRob3V0UGFnaW5hdGlvbik7CisKKyAgICAvLyBDYWNoZSBvdXIgb2xkIHJlY3Qgc28g
dGhhdCB3ZSBjYW4gZGlydHkgdGhlIHByb3BlciByZXBhaW50IHJlY3RzIGlmIHRoZSBjaGlsZCBt
b3Zlcy4KKyAgICBMYXlvdXRSZWN0IG9sZFJlY3QgPSBjaGlsZC0+ZnJhbWVSZWN0KCk7CisgICAg
TGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNhbFRvcEZvckNoaWxkKGNoaWxkKTsKKwor
I2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICBMYXlvdXRTaXplIG9sZExheW91dERlbHRhID0gdmll
dygpLmxheW91dERlbHRhKCk7CisjZW5kaWYKKyAgICAvLyBHbyBhaGVhZCBhbmQgcG9zaXRpb24g
dGhlIGNoaWxkIGFzIHRob3VnaCBpdCBkaWRuJ3QgY29sbGFwc2Ugd2l0aCB0aGUgdG9wLgorICAg
IHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcEVzdGltYXRlLCBBcHBseUxh
eW91dERlbHRhKTsKKyAgICBlc3RpbWF0ZVJlZ2lvblJhbmdlRm9yQm94Q2hpbGQoY2hpbGQpOwor
CisgICAgUmVuZGVyQmxvY2sqIGNoaWxkUmVuZGVyQmxvY2sgPSBjaGlsZC0+aXNSZW5kZXJCbG9j
aygpID8gdG9SZW5kZXJCbG9jayhjaGlsZCkgOiAwOworICAgIGJvb2wgbWFya0Rlc2NlbmRhbnRz
V2l0aEZsb2F0cyA9IGZhbHNlOworICAgIGlmIChsb2dpY2FsVG9wRXN0aW1hdGUgIT0gb2xkTG9n
aWNhbFRvcCAmJiAhY2hpbGQtPmF2b2lkc0Zsb2F0cygpICYmIGNoaWxkUmVuZGVyQmxvY2sgJiYg
Y2hpbGRSZW5kZXJCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkKKyAgICAgICAgbWFya0Rlc2NlbmRh
bnRzV2l0aEZsb2F0cyA9IHRydWU7CisjaWYgRU5BQkxFKFNVQlBJWEVMX0xBWU9VVCkKKyAgICBl
bHNlIGlmIChVTkxJS0VMWShsb2dpY2FsVG9wRXN0aW1hdGUubWlnaHRCZVNhdHVyYXRlZCgpKSkK
KyAgICAgICAgLy8gbG9naWNhbFRvcEVzdGltYXRlLCByZXR1cm5lZCBieSBlc3RpbWF0ZUxvZ2lj
YWxUb3BQb3NpdGlvbiwgbWlnaHQgYmUgc2F0dXJhdGVkIGZvcgorICAgICAgICAvLyB2ZXJ5IGxh
cmdlIGVsZW1lbnRzLiBJZiBpdCBkb2VzIHRoZSBjb21wYXJpc29uIHdpdGggb2xkTG9naWNhbFRv
cCBtaWdodCB5aWVsZCBhCisgICAgICAgIC8vIGZhbHNlIG5lZ2F0aXZlIGFzIGFkZGluZyBhbmQg
cmVtb3ZpbmcgbWFyZ2lucywgYm9yZGVycyBldGMgZnJvbSBhIHNhdHVyYXRlZCBudW1iZXIKKyAg
ICAgICAgLy8gbWlnaHQgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMuIElmIHRoaXMgaXMgdGhlIGNh
c2UgYWx3YXlzIG1hcmsgZm9yIGxheW91dC4KKyAgICAgICAgbWFya0Rlc2NlbmRhbnRzV2l0aEZs
b2F0cyA9IHRydWU7CisjZW5kaWYKKyAgICBlbHNlIGlmICghY2hpbGQtPmF2b2lkc0Zsb2F0cygp
IHx8IGNoaWxkLT5zaHJpbmtUb0F2b2lkRmxvYXRzKCkpIHsKKyAgICAgICAgLy8gSWYgYW4gZWxl
bWVudCBtaWdodCBiZSBhZmZlY3RlZCBieSB0aGUgcHJlc2VuY2Ugb2YgZmxvYXRzLCB0aGVuIGFs
d2F5cyBtYXJrIGl0IGZvcgorICAgICAgICAvLyBsYXlvdXQuCisgICAgICAgIExheW91dFVuaXQg
ZmIgPSBtYXgocHJldmlvdXNGbG9hdExvZ2ljYWxCb3R0b20sIGxvd2VzdEZsb2F0TG9naWNhbEJv
dHRvbSgpKTsKKyAgICAgICAgaWYgKGZiID4gbG9naWNhbFRvcEVzdGltYXRlKQorICAgICAgICAg
ICAgbWFya0Rlc2NlbmRhbnRzV2l0aEZsb2F0cyA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGNo
aWxkUmVuZGVyQmxvY2spIHsKKyAgICAgICAgaWYgKG1hcmtEZXNjZW5kYW50c1dpdGhGbG9hdHMp
CisgICAgICAgICAgICBjaGlsZFJlbmRlckJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxv
YXRzRm9yTGF5b3V0KCk7CisgICAgICAgIGlmICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkp
CisgICAgICAgICAgICBwcmV2aW91c0Zsb2F0TG9naWNhbEJvdHRvbSA9IG1heChwcmV2aW91c0Zs
b2F0TG9naWNhbEJvdHRvbSwgb2xkTG9naWNhbFRvcCArIGNoaWxkUmVuZGVyQmxvY2stPmxvd2Vz
dEZsb2F0TG9naWNhbEJvdHRvbSgpKTsKKyAgICB9CisKKyAgICBpZiAoIWNoaWxkLT5uZWVkc0xh
eW91dCgpKQorICAgICAgICBjaGlsZC0+bWFya0ZvclBhZ2luYXRpb25SZWxheW91dElmTmVlZGVk
KCk7CisKKyAgICBib29sIGNoaWxkSGFkTGF5b3V0ID0gY2hpbGQtPmV2ZXJIYWRMYXlvdXQoKTsK
KyAgICBib29sIGNoaWxkTmVlZGVkTGF5b3V0ID0gY2hpbGQtPm5lZWRzTGF5b3V0KCk7CisgICAg
aWYgKGNoaWxkTmVlZGVkTGF5b3V0KQorICAgICAgICBjaGlsZC0+bGF5b3V0KCk7CisKKyAgICAv
LyBDYWNoZSBpZiB3ZSBhcmUgYXQgdGhlIHRvcCBvZiB0aGUgYmxvY2sgcmlnaHQgbm93LgorICAg
IGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jayA9IG1hcmdpbkluZm8uYXRCZWZvcmVTaWRlT2ZCbG9j
aygpOworCisgICAgLy8gTm93IGRldGVybWluZSB0aGUgY29ycmVjdCB5cG9zIGJhc2VkIG9mZiBl
eGFtaW5hdGlvbiBvZiBjb2xsYXBzaW5nIG1hcmdpbgorICAgIC8vIHZhbHVlcy4KKyAgICBMYXlv
dXRVbml0IGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9IGNvbGxhcHNlTWFyZ2lucyhjaGlsZCwgbWFy
Z2luSW5mbyk7CisKKyAgICAvLyBOb3cgY2hlY2sgZm9yIGNsZWFyLgorICAgIExheW91dFVuaXQg
bG9naWNhbFRvcEFmdGVyQ2xlYXIgPSBjbGVhckZsb2F0c0lmTmVlZGVkKGNoaWxkLCBtYXJnaW5J
bmZvLCBvbGRQb3NNYXJnaW5CZWZvcmUsIG9sZE5lZ01hcmdpbkJlZm9yZSwgbG9naWNhbFRvcEJl
Zm9yZUNsZWFyKTsKKyAgICAKKyAgICBib29sIHBhZ2luYXRlZCA9IHZpZXcoKS5sYXlvdXRTdGF0
ZSgpLT5pc1BhZ2luYXRlZCgpOworICAgIGlmIChwYWdpbmF0ZWQpCisgICAgICAgIGxvZ2ljYWxU
b3BBZnRlckNsZWFyID0gYWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24obG9naWNhbFRvcEFm
dGVyQ2xlYXIsIGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIGNoaWxkLAorICAgICAgICAgICAg
YXRCZWZvcmVTaWRlT2ZCbG9jayAmJiBsb2dpY2FsVG9wQmVmb3JlQ2xlYXIgPT0gbG9naWNhbFRv
cEFmdGVyQ2xlYXIpOworCisgICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNoaWxkLCBsb2dpY2Fs
VG9wQWZ0ZXJDbGVhciwgQXBwbHlMYXlvdXREZWx0YSk7CisKKyAgICAvLyBOb3cgd2UgaGF2ZSBh
IGZpbmFsIHRvcCBwb3NpdGlvbi4gU2VlIGlmIGl0IHJlYWxseSBkb2VzIGVuZCB1cCBiZWluZyBk
aWZmZXJlbnQgZnJvbSBvdXIgZXN0aW1hdGUuCisgICAgLy8gY2xlYXJGbG9hdHNJZk5lZWRlZCBj
YW4gYWxzbyBtYXJrIHRoZSBjaGlsZCBhcyBuZWVkaW5nIGEgbGF5b3V0IGV2ZW4gdGhvdWdoIHdl
IGRpZG4ndCBtb3ZlLiBUaGlzIGhhcHBlbnMKKyAgICAvLyB3aGVuIGNvbGxhcHNlTWFyZ2lucyBk
eW5hbWljYWxseSBhZGRzIG92ZXJoYW5naW5nIGZsb2F0cyBiZWNhdXNlIG9mIGEgY2hpbGQgd2l0
aCBuZWdhdGl2ZSBtYXJnaW5zLgorICAgIGlmIChsb2dpY2FsVG9wQWZ0ZXJDbGVhciAhPSBsb2dp
Y2FsVG9wRXN0aW1hdGUgfHwgY2hpbGQtPm5lZWRzTGF5b3V0KCkgfHwgKHBhZ2luYXRlZCAmJiBj
aGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxvY2stPnNob3VsZEJyZWFrQXRMaW5lVG9B
dm9pZFdpZG93KCkpKSB7CisgICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZsb2F0cygp
KSB7CisgICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRoZSBsaW5l
IHdpZHRoLgorICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNsZWFyIGFu
IGl0ZW0sIGl0cyB3aWR0aCBjYW4KKyAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVzZSBpdCBo
YXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCisgICAgICAgICAgICAvLyBTbyBnbyBhaGVh
ZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KKyAgICAgICAgICAgIGNoaWxkLT5zZXRDaGls
ZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAoIWNoaWxkLT5h
dm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQorICAg
ICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9h
dHNGb3JMYXlvdXQoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0KCkpCisg
ICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFrZSB0aGUg
Y2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCisgICAgICAgIGNoaWxkLT5sYXlvdXRJZk5lZWRl
ZCgpOworICAgIH0KKworICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxk
KSkgeworICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSwgTWFya09ubHlUaGlzKTsK
KyAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7CisgICAgfQorCisgICAgLy8gV2UgYXJl
IG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIgYSBub24t
ZW1wdHkgY2hpbGQuICAKKyAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGNoZWNraW5n
IGZvciBjbGVhciwgc28gdGhhdCBtYXJnaW5zIGNhbiBiZSByZXNldCBpZiBhIGNsZWFyIG9jY3Vy
cmVkLgorICAgIGlmIChtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAhY2hpbGQt
PmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQorICAgICAgICBtYXJnaW5JbmZvLnNldEF0QmVmb3Jl
U2lkZU9mQmxvY2soZmFsc2UpOworCisgICAgLy8gTm93IHBsYWNlIHRoZSBjaGlsZCBpbiB0aGUg
Y29ycmVjdCBsZWZ0IHBvc2l0aW9uCisgICAgZGV0ZXJtaW5lTG9naWNhbExlZnRQb3NpdGlvbkZv
ckNoaWxkKGNoaWxkLCBBcHBseUxheW91dERlbHRhKTsKKworICAgIExheW91dFNpemUgY2hpbGRP
ZmZzZXQgPSBjaGlsZC0+bG9jYXRpb24oKSAtIG9sZFJlY3QubG9jYXRpb24oKTsKKyNpZiBFTkFC
TEUoQ1NTX1NIQVBFUykKKyAgICByZWxheW91dFNoYXBlRGVzY2VuZGFudElmTW92ZWQoY2hpbGRS
ZW5kZXJCbG9jaywgY2hpbGRPZmZzZXQpOworI2VuZGlmCisKKyAgICAvLyBVcGRhdGUgb3VyIGhl
aWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3JyZWN0IHBv
c2l0aW9uLgorICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbG9naWNhbEhl
aWdodEZvckNoaWxkKGNoaWxkKSk7CisgICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkFmdGVyRm9y
Q2hpbGQoY2hpbGQpKSB7CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgp
ICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCkpOworICAgICAgICBtYXJnaW5JbmZvLmNsZWFy
TWFyZ2luKCk7CisgICAgfQorICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgb3ZlcmhhbmdpbmcgZmxv
YXRzIHRoYXQgaW50cnVkZSBpbnRvIGZvbGxvd2luZyBzaWJsaW5ncyAob3IgcG9zc2libHkgb3V0
CisgICAgLy8gb2YgdGhpcyBibG9jayksIHRoZW4gdGhlIHBhcmVudCBnZXRzIG5vdGlmaWVkIG9m
IHRoZSBmbG9hdHMgbm93LgorICAgIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVy
QmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1heEZsb2F0TG9naWNhbEJvdHRvbSA9
IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRvUmVuZGVy
QmxvY2soY2hpbGQpLCAhY2hpbGROZWVkZWRMYXlvdXQpKTsKKworICAgIGlmIChjaGlsZE9mZnNl
dC53aWR0aCgpIHx8IGNoaWxkT2Zmc2V0LmhlaWdodCgpKSB7CisgICAgICAgIHZpZXcoKS5hZGRM
YXlvdXREZWx0YShjaGlsZE9mZnNldCk7CisKKyAgICAgICAgLy8gSWYgdGhlIGNoaWxkIG1vdmVk
LCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9zaXRpb25l
ZAorICAgICAgICAvLyBkZXNjZW5kYW50cy4gQW4gZXhjZXB0aW9uIGlzIGlmIHdlIG5lZWQgYSBs
YXlvdXQuICBJbiB0aGlzIGNhc2UsIHdlIGtub3cgd2UncmUgZ29pbmcgdG8KKyAgICAgICAgLy8g
cmVwYWludCBvdXJzZWx2ZXMgKGFuZCB0aGUgY2hpbGQpIGFueXdheS4KKyAgICAgICAgaWYgKGNo
aWxkSGFkTGF5b3V0ICYmICFzZWxmTmVlZHNMYXlvdXQoKSAmJiBjaGlsZC0+Y2hlY2tGb3JSZXBh
aW50RHVyaW5nTGF5b3V0KCkpCisgICAgICAgICAgICBjaGlsZC0+cmVwYWludER1cmluZ0xheW91
dElmTW92ZWQob2xkUmVjdCk7CisgICAgfQorCisgICAgaWYgKCFjaGlsZEhhZExheW91dCAmJiBj
aGlsZC0+Y2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpIHsKKyAgICAgICAgY2hpbGQtPnJl
cGFpbnQoKTsKKyAgICAgICAgY2hpbGQtPnJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyh0cnVlKTsK
KyAgICB9CisKKyAgICBpZiAocGFnaW5hdGVkKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBhbiBh
ZnRlciBwYWdlL2NvbHVtbiBicmVhay4KKyAgICAgICAgTGF5b3V0VW5pdCBuZXdIZWlnaHQgPSBh
cHBseUFmdGVyQnJlYWsoY2hpbGQsIGxvZ2ljYWxIZWlnaHQoKSwgbWFyZ2luSW5mbyk7CisgICAg
ICAgIGlmIChuZXdIZWlnaHQgIT0gaGVpZ2h0KCkpCisgICAgICAgICAgICBzZXRMb2dpY2FsSGVp
Z2h0KG5ld0hlaWdodCk7CisgICAgfQorCisgICAgQVNTRVJUKHZpZXcoKS5sYXlvdXREZWx0YU1h
dGNoZXMob2xkTGF5b3V0RGVsdGEpKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVz
dFBvc2l0aW9uZWRCbG9jayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQoreworICAgIGJvb2wgaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsV3JpdGluZ01v
ZGUoKTsKKyAgICBib29sIGhhc1N0YXRpY0Jsb2NrUG9zaXRpb24gPSBjaGlsZC0+c3R5bGUoKS0+
aGFzU3RhdGljQmxvY2tQb3NpdGlvbihpc0hvcml6b250YWwpOworICAgIAorICAgIExheW91dFVu
aXQgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQoKTsKKyAgICB1cGRhdGVTdGF0aWNJbmxpbmVQ
b3NpdGlvbkZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wKTsKKworICAgIGlmICghbWFyZ2luSW5m
by5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICAvLyBQb3NpdGlvbmVk
IGJsb2NrcyBkb24ndCBjb2xsYXBzZSBtYXJnaW5zLCBzbyBhZGQgdGhlIG1hcmdpbiBwcm92aWRl
ZCBieQorICAgICAgICAvLyB0aGUgY29udGFpbmVyIG5vdy4gVGhlIGNoaWxkJ3Mgb3duIG1hcmdp
biBpcyBhZGRlZCBsYXRlciB3aGVuIGNhbGN1bGF0aW5nIGl0cyBsb2dpY2FsIHRvcC4KKyAgICAg
ICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVQb3MgPSBtYXJnaW5JbmZvLnBvc2l0aXZlTWFy
Z2luKCk7CisgICAgICAgIExheW91dFVuaXQgY29sbGFwc2VkQmVmb3JlTmVnID0gbWFyZ2luSW5m
by5uZWdhdGl2ZU1hcmdpbigpOworICAgICAgICBsb2dpY2FsVG9wICs9IGNvbGxhcHNlZEJlZm9y
ZVBvcyAtIGNvbGxhcHNlZEJlZm9yZU5lZzsKKyAgICB9CisgICAgCisgICAgUmVuZGVyTGF5ZXIq
IGNoaWxkTGF5ZXIgPSBjaGlsZC0+bGF5ZXIoKTsKKyAgICBpZiAoY2hpbGRMYXllci0+c3RhdGlj
QmxvY2tQb3NpdGlvbigpICE9IGxvZ2ljYWxUb3ApIHsKKyAgICAgICAgY2hpbGRMYXllci0+c2V0
U3RhdGljQmxvY2tQb3NpdGlvbihsb2dpY2FsVG9wKTsKKyAgICAgICAgaWYgKGhhc1N0YXRpY0Js
b2NrUG9zaXRpb24pCisgICAgICAgICAgICBjaGlsZC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVl
LCBNYXJrT25seVRoaXMpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVz
dEZsb2F0aW5nQmxvY2soY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKK3sKKyAgICAvLyBU
aGUgZmxvYXQgc2hvdWxkIGJlIHBvc2l0aW9uZWQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgYm90
dG9tIG1hcmdpbgorICAgIC8vIG9mIHRoZSBwcmV2aW91cyBmbG93LiBXZSBhZGQgdGhhdCBtYXJn
aW4gaW50byB0aGUgaGVpZ2h0LCBnZXQgdGhlCisgICAgLy8gZmxvYXQgcG9zaXRpb25lZCBwcm9w
ZXJseSwgYW5kIHRoZW4gc3VidHJhY3QgdGhlIG1hcmdpbiBvdXQgb2YgdGhlCisgICAgLy8gaGVp
Z2h0IGFnYWluLiBJbiB0aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCB3ZSBhbHdh
eXMganVzdAorICAgIC8vIHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBzZWxmLWNvbGxh
cHNpbmcgYmxvY2sgY29sbGFwc2VkIGl0cworICAgIC8vIG93biBib3R0b20gbWFyZ2luIGludG8g
aXRzIHRvcCBtYXJnaW4uCisgICAgLy8KKyAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGUgcHJldmlv
dXMgZmxvdyBtYXkgY29sbGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YKKyAgICAvLyBv
dXIgYmxvY2suIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gd2UgZG8gbm90IGFkZCB0aGUgbWFy
Z2luIGluIHRvIG91cgorICAgIC8vIGhlaWdodCB3aGVuIGNvbXB1dGluZyB0aGUgcG9zaXRpb24g
b2YgdGhlIGZsb2F0LiBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCisgICAgLy8gZm9yIGJ5
IHNpbXBseSBjYWxsaW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4gU2VlCisgICAgLy8g
aHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9hZGhvYy9jc3MvYm94L2Jsb2NrL21hcmdpbi1jb2xs
YXBzZS8wNDYuaHRtbCBmb3IKKyAgICAvLyBhbiBleGFtcGxlIG9mIHRoaXMgc2NlbmFyaW8uCisg
ICAgTGF5b3V0VW5pdCBtYXJnaW5PZmZzZXQgPSBtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1h
cmdpbkJlZm9yZSgpID8gTGF5b3V0VW5pdCgpIDogbWFyZ2luSW5mby5tYXJnaW4oKTsKKyAgICBz
ZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1hcmdpbk9mZnNldCk7CisgICAgcG9z
aXRpb25OZXdGbG9hdHMoKTsKKyAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSAt
IG1hcmdpbk9mZnNldCk7Cit9CisKK1JlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzIFJlbmRl
ckJsb2NrRmxvdzo6bWFyZ2luVmFsdWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3QK
K3sKKyAgICBMYXlvdXRVbml0IGNoaWxkQmVmb3JlUG9zaXRpdmUgPSAwOworICAgIExheW91dFVu
aXQgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IDA7CisgICAgTGF5b3V0VW5pdCBjaGlsZEFmdGVyUG9z
aXRpdmUgPSAwOworICAgIExheW91dFVuaXQgY2hpbGRBZnRlck5lZ2F0aXZlID0gMDsKKworICAg
IExheW91dFVuaXQgYmVmb3JlTWFyZ2luID0gMDsKKyAgICBMYXlvdXRVbml0IGFmdGVyTWFyZ2lu
ID0gMDsKKworICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5p
c1JlbmRlckJsb2NrRmxvdygpID8gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpIDogMDsKKyAgICAK
KyAgICAvLyBJZiB0aGUgY2hpbGQgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbmFsaXR5IGFzIHdlIGRv
LCB0aGVuIHdlIGNhbiBqdXN0IHJldHVybiBpdHMKKyAgICAvLyBtYXJnaW5zIGluIHRoZSBzYW1l
IGRpcmVjdGlvbi4KKyAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKSB7CisgICAg
ICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBjaGlsZEJlZm9yZVBvc2l0
aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAg
ICAgICAgIGNoaWxkQmVmb3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2
ZU1hcmdpbkJlZm9yZSgpOworICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRS
ZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpOworICAgICAgICAgICAgY2hpbGRB
ZnRlck5lZ2F0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmVmb3JlTWFyZ2luID0gY2hpbGQtPm1h
cmdpbkJlZm9yZSgpOworICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0
ZXIoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRp
bmdNb2RlKCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgeworICAgICAgICAvLyBUaGUg
Y2hpbGQgaGFzIGEgZGlmZmVyZW50IGRpcmVjdGlvbmFsaXR5LiBJZiB0aGUgY2hpbGQgaXMgcGFy
YWxsZWwsIHRoZW4gaXQncyBqdXN0CisgICAgICAgIC8vIGZsaXBwZWQgcmVsYXRpdmUgdG8gdXMu
IFdlIGNhbiB1c2UgdGhlIG1hcmdpbnMgZm9yIHRoZSBvcHBvc2l0ZSBlZGdlcy4KKyAgICAgICAg
aWYgKGNoaWxkUmVuZGVyQmxvY2spIHsKKyAgICAgICAgICAgIGNoaWxkQmVmb3JlUG9zaXRpdmUg
PSBjaGlsZFJlbmRlckJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCk7CisgICAgICAgICAg
ICBjaGlsZEJlZm9yZU5lZ2F0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJn
aW5BZnRlcigpOworICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJC
bG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAgICAgICAgIGNoaWxkQWZ0ZXJO
ZWdhdGl2ZSA9IGNoaWxkUmVuZGVyQmxvY2stPm1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWZvcmVNYXJnaW4gPSBjaGlsZC0+bWFyZ2lu
QWZ0ZXIoKTsKKyAgICAgICAgICAgIGFmdGVyTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgp
OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNoaWxkIGlzIHBlcnBl
bmRpY3VsYXIgdG8gdXMsIHdoaWNoIG1lYW5zIGl0cyBtYXJnaW5zIGRvbid0IGNvbGxhcHNlIGJ1
dCBhcmUgb24gdGhlCisgICAgICAgIC8vICJsb2dpY2FsIGxlZnQvcmlnaHQiIHNpZGVzIG9mIHRo
ZSBjaGlsZCBib3guIFdlIGNhbiBqdXN0IHJldHVybiB0aGUgcmF3IG1hcmdpbiBpbiB0aGlzIGNh
c2UuCisgICAgICAgIGJlZm9yZU1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsK
KyAgICAgICAgYWZ0ZXJNYXJnaW4gPSBtYXJnaW5BZnRlckZvckNoaWxkKGNoaWxkKTsKKyAgICB9
CisKKyAgICAvLyBSZXNvbHZlIHVuY29sbGFwc2luZyBtYXJnaW5zIGludG8gdGhlaXIgcG9zaXRp
dmUvbmVnYXRpdmUgYnVja2V0cy4KKyAgICBpZiAoYmVmb3JlTWFyZ2luKSB7CisgICAgICAgIGlm
IChiZWZvcmVNYXJnaW4gPiAwKQorICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGJl
Zm9yZU1hcmdpbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2hpbGRCZWZvcmVOZWdhdGl2
ZSA9IC1iZWZvcmVNYXJnaW47CisgICAgfQorICAgIGlmIChhZnRlck1hcmdpbikgeworICAgICAg
ICBpZiAoYWZ0ZXJNYXJnaW4gPiAwKQorICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0g
YWZ0ZXJNYXJnaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2
ZSA9IC1hZnRlck1hcmdpbjsKKyAgICB9CisKKyAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxk
QmVmb3JlUG9zaXRpdmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwg
Y2hpbGRBZnRlck5lZ2F0aXZlKTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNv
bGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQor
eworICAgIGJvb2wgY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlID0gbXVzdERpc2NhcmRNYXJnaW5C
ZWZvcmVGb3JDaGlsZChjaGlsZCk7CisgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW5BZnRlciA9
IG11c3REaXNjYXJkTWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCk7CisgICAgYm9vbCBjaGlsZElz
U2VsZkNvbGxhcHNpbmcgPSBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCk7CisKKyAgICAv
LyBUaGUgY2hpbGQgZGlzY2FyZHMgdGhlIGJlZm9yZSBtYXJnaW4gd2hlbiB0aGUgdGhlIGFmdGVy
IG1hcmdpbiBoYXMgZGlzY2FyZCBpbiB0aGUgY2FzZSBvZiBhIHNlbGYgY29sbGFwc2luZyBibG9j
ay4KKyAgICBjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUgPSBjaGlsZERpc2NhcmRNYXJnaW5CZWZv
cmUgfHwgKGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyICYmIGNoaWxkSXNTZWxmQ29sbGFwc2luZyk7
CisKKyAgICAvLyBHZXQgdGhlIGZvdXIgbWFyZ2luIHZhbHVlcyBmb3IgdGhlIGNoaWxkIGFuZCBj
YWNoZSB0aGVtLgorICAgIGNvbnN0IE1hcmdpblZhbHVlcyBjaGlsZE1hcmdpbnMgPSBtYXJnaW5W
YWx1ZXNGb3JDaGlsZChjaGlsZCk7CisKKyAgICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0
b3AgbWFyZ2lucy4KKyAgICBMYXlvdXRVbml0IHBvc1RvcCA9IGNoaWxkTWFyZ2lucy5wb3NpdGl2
ZU1hcmdpbkJlZm9yZSgpOworICAgIExheW91dFVuaXQgbmVnVG9wID0gY2hpbGRNYXJnaW5zLm5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCk7CisKKyAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5nIGJsb2Nr
cywgY29sbGFwc2Ugb3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCisgICAgLy8gdG9wIHRvIGdl
dCBuZXcgcG9zVG9wIGFuZCBuZWdUb3AgdmFsdWVzLgorICAgIGlmIChjaGlsZElzU2VsZkNvbGxh
cHNpbmcpIHsKKyAgICAgICAgcG9zVG9wID0gbWF4KHBvc1RvcCwgY2hpbGRNYXJnaW5zLnBvc2l0
aXZlTWFyZ2luQWZ0ZXIoKSk7CisgICAgICAgIG5lZ1RvcCA9IG1heChuZWdUb3AsIGNoaWxkTWFy
Z2lucy5uZWdhdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBTZWUgaWYg
dGhlIHRvcCBtYXJnaW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMK
KyAgICAvLyBtYXJnaW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgorICAgIGJvb2wgdG9w
UXVpcmsgPSBoYXNNYXJnaW5CZWZvcmVRdWlyayhjaGlsZCk7CisKKyAgICBpZiAobWFyZ2luSW5m
by5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICBpZiAoIWNoaWxkRGlz
Y2FyZE1hcmdpbkJlZm9yZSAmJiAhbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkpIHsKKyAgICAg
ICAgICAgIC8vIFRoaXMgY2hpbGQgaXMgY29sbGFwc2luZyB3aXRoIHRoZSB0b3Agb2YgdGhlCisg
ICAgICAgICAgICAvLyBibG9jay4gSWYgaXQgaGFzIGxhcmdlciBtYXJnaW4gdmFsdWVzLCB0aGVu
IHdlIG5lZWQgdG8gdXBkYXRlCisgICAgICAgICAgICAvLyBvdXIgb3duIG1heGltYWwgdmFsdWVz
LgorICAgICAgICAgICAgaWYgKCFkb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFtYXJnaW5J
bmZvLnF1aXJrQ29udGFpbmVyKCkgfHwgIXRvcFF1aXJrKQorICAgICAgICAgICAgICAgIHNldE1h
eE1hcmdpbkJlZm9yZVZhbHVlcyhtYXgocG9zVG9wLCBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgp
KSwgbWF4KG5lZ1RvcCwgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSkpOworCisgICAgICAgICAg
ICAvLyBUaGUgbWludXRlIGFueSBvZiB0aGUgbWFyZ2lucyBpbnZvbHZlZCBpc24ndCBhIHF1aXJr
LCBkb24ndAorICAgICAgICAgICAgLy8gY29sbGFwc2UgaXQgYXdheSwgZXZlbiBpZiB0aGUgbWFy
Z2luIGlzIHNtYWxsZXIgKHd3dy53ZWJyZWZlcmVuY2UuY29tCisgICAgICAgICAgICAvLyBoYXMg
YW4gZXhhbXBsZSBvZiB0aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGlu
c2lkZQorICAgICAgICAgICAgLy8gYSA8ZGw+IGluc2lkZSBhIDx0ZD4uCisgICAgICAgICAgICBp
ZiAoIW1hcmdpbkluZm8uZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKCkgJiYgIXRvcFF1aXJr
ICYmIChwb3NUb3AgLSBuZWdUb3ApKSB7CisgICAgICAgICAgICAgICAgc2V0SGFzTWFyZ2luQmVm
b3JlUXVpcmsoZmFsc2UpOworICAgICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0RGV0ZXJtaW5l
ZE1hcmdpbkJlZm9yZVF1aXJrKHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBp
ZiAoIW1hcmdpbkluZm8uZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKCkgJiYgdG9wUXVpcmsg
JiYgIW1hcmdpbkJlZm9yZSgpKQorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdG9wIG1h
cmdpbiBhbmQgb3VyIHRvcCBjaGlsZCBoYXMgYSBxdWlya3kgbWFyZ2luLgorICAgICAgICAgICAg
ICAgIC8vIFdlIHdpbGwgcGljayB1cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBhc3MgaXQgdGhy
b3VnaC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGRlYWxzIHdpdGggdGhlIDx0ZD48ZGl2Pjxw
PiBjYXNlLgorICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgZm9yIGEgYmxvY2sgdGhh
dCBzcGxpdCB0d28gaW5saW5lcyB0aG91Z2guIFlvdSBkbworICAgICAgICAgICAgICAgIC8vIHN0
aWxsIGFwcGx5IG1hcmdpbnMgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIHNldEhhc01h
cmdpbkJlZm9yZVF1aXJrKHRydWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIC8vIFRo
ZSBiZWZvcmUgbWFyZ2luIG9mIHRoZSBjb250YWluZXIgd2lsbCBhbHNvIGRpc2NhcmQgYWxsIHRo
ZSBtYXJnaW5zIGl0IGlzIGNvbGxhcHNpbmcgd2l0aC4KKyAgICAgICAgICAgIHNldE11c3REaXNj
YXJkTWFyZ2luQmVmb3JlKCk7CisgICAgfQorCisgICAgLy8gT25jZSB3ZSBmaW5kIGEgY2hpbGQg
d2l0aCBkaXNjYXJkTWFyZ2luQmVmb3JlIGFsbCB0aGUgbWFyZ2lucyBjb2xsYXBzaW5nIHdpdGgg
dXMgbXVzdCBhbHNvIGRpc2NhcmQuIAorICAgIGlmIChjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUp
IHsKKyAgICAgICAgbWFyZ2luSW5mby5zZXREaXNjYXJkTWFyZ2luKHRydWUpOworICAgICAgICBt
YXJnaW5JbmZvLmNsZWFyTWFyZ2luKCk7CisgICAgfQorCisgICAgaWYgKG1hcmdpbkluZm8ucXVp
cmtDb250YWluZXIoKSAmJiBtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAocG9z
VG9wIC0gbmVnVG9wKSkKKyAgICAgICAgbWFyZ2luSW5mby5zZXRIYXNNYXJnaW5CZWZvcmVRdWly
ayh0b3BRdWlyayk7CisKKyAgICBMYXlvdXRVbml0IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCA9
IGxvZ2ljYWxIZWlnaHQoKTsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBiZWZvcmVDb2xs
YXBzZUxvZ2ljYWxUb3A7CisgICAgaWYgKGNoaWxkSXNTZWxmQ29sbGFwc2luZykgeworICAgICAg
ICAvLyBGb3IgYSBzZWxmIGNvbGxhcHNpbmcgYmxvY2sgYm90aCB0aGUgYmVmb3JlIGFuZCBhZnRl
ciBtYXJnaW5zIGdldCBkaXNjYXJkZWQuIFRoZSBibG9jayBkb2Vzbid0IGNvbnRyaWJ1dGUgYW55
dGhpbmcgdG8gdGhlIGhlaWdodCBvZiB0aGUgYmxvY2suCisgICAgICAgIC8vIEFsc28sIHRoZSBj
aGlsZCdzIHRvcCBwb3NpdGlvbiBlcXVhbHMgdGhlIGxvZ2ljYWwgaGVpZ2h0IG9mIHRoZSBjb250
YWluZXIuCisgICAgICAgIGlmICghY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5J
bmZvLmRpc2NhcmRNYXJnaW4oKSkgeworICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCBoYXMgbm8g
aGVpZ2h0LiBXZSBuZWVkIHRvIGNvbXB1dGUgb3VyCisgICAgICAgICAgICAvLyBwb3NpdGlvbiBi
ZWZvcmUgd2UgY29sbGFwc2UgdGhlIGNoaWxkJ3MgbWFyZ2lucyB0b2dldGhlciwKKyAgICAgICAg
ICAgIC8vIHNvIHRoYXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHpl
cm8taGVpZ2h0IGJsb2NrLgorICAgICAgICAgICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVQ
b3MgPSBtYXgobWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpLCBjaGlsZE1hcmdpbnMucG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNlZEJlZm9y
ZU5lZyA9IG1heChtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCksIGNoaWxkTWFyZ2lucy5uZWdh
dGl2ZU1hcmdpbkJlZm9yZSgpKTsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0TWFyZ2luKGNv
bGxhcHNlZEJlZm9yZVBvcywgY29sbGFwc2VkQmVmb3JlTmVnKTsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gTm93IGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsIHdo
aWNoIG1lYW5zIGV4YW1pbmluZyBvdXIKKyAgICAgICAgICAgIC8vIGJvdHRvbSBtYXJnaW4gdmFs
dWVzIGFzIHdlbGwuIAorICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NpdGl2ZU1hcmdpbklm
TGFyZ2VyKGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXROZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKGNoaWxkTWFyZ2lucy5uZWdhdGl2
ZU1hcmdpbkFmdGVyKCkpOworCisgICAgICAgICAgICBpZiAoIW1hcmdpbkluZm8uY2FuQ29sbGFw
c2VXaXRoTWFyZ2luQmVmb3JlKCkpCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtl
IHN1cmUgdGhhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHNlbGYtY29sbGFwc2luZyBibG9jaworICAg
ICAgICAgICAgICAgIC8vIGlzIGNvcnJlY3QsIHNpbmNlIGl0IGNvdWxkIGhhdmUgb3ZlcmZsb3dp
bmcgY29udGVudAorICAgICAgICAgICAgICAgIC8vIHRoYXQgbmVlZHMgdG8gYmUgcG9zaXRpb25l
ZCBjb3JyZWN0bHkgKGUuZy4sIGEgYmxvY2sgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhZCBh
IHNwZWNpZmllZCBoZWlnaHQgb2YgMCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCku
CisgICAgICAgICAgICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQoKSArIGNvbGxhcHNl
ZEJlZm9yZVBvcyAtIGNvbGxhcHNlZEJlZm9yZU5lZzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIGlmIChtdXN0U2VwYXJhdGVNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCkpIHsK
KyAgICAgICAgICAgIEFTU0VSVCghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgfHwgKG1hcmdp
bkluZm8uZGlzY2FyZE1hcmdpbigpICYmICFtYXJnaW5JbmZvLm1hcmdpbigpKSk7CisgICAgICAg
ICAgICAvLyBJZiB3ZSBhcmUgYXQgdGhlIGJlZm9yZSBzaWRlIG9mIHRoZSBibG9jayBhbmQgd2Ug
Y29sbGFwc2UsIGlnbm9yZSB0aGUgY29tcHV0ZWQgbWFyZ2luCisgICAgICAgICAgICAvLyBhbmQg
anVzdCBhZGQgdGhlIGNoaWxkIG1hcmdpbiB0byB0aGUgY29udGFpbmVyIGhlaWdodC4gVGhpcyB3
aWxsIGNvcnJlY3RseSBwb3NpdGlvbgorICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGluc2lkZSB0
aGUgY29udGFpbmVyLgorICAgICAgICAgICAgTGF5b3V0VW5pdCBzZXBhcmF0ZU1hcmdpbiA9ICFt
YXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpID8gbWFyZ2luSW5mby5tYXJn
aW4oKSA6IExheW91dFVuaXQoMCk7CisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2lj
YWxIZWlnaHQoKSArIHNlcGFyYXRlTWFyZ2luICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQp
KTsKKyAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgIH0g
ZWxzZSBpZiAoIW1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpICYmICghbWFyZ2luSW5mby5hdEJl
Zm9yZVNpZGVPZkJsb2NrKCkKKyAgICAgICAgICAgIHx8ICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigpCisgICAgICAgICAgICAmJiAoIWRvY3VtZW50KCku
aW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhbWFyZ2lu
SW5mby5oYXNNYXJnaW5CZWZvcmVRdWlyaygpKSkpKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBj
b2xsYXBzaW5nIHdpdGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CisgICAg
ICAgICAgICAvLyB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrLgorICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXgobWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdp
bigpLCBwb3NUb3ApIC0gbWF4KG1hcmdpbkluZm8ubmVnYXRpdmVNYXJnaW4oKSwgbmVnVG9wKSk7
CisgICAgICAgICAgICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICB9CisK
KyAgICAgICAgbWFyZ2luSW5mby5zZXREaXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbkFm
dGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkp
IHsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVNYXJnaW4oY2hpbGRNYXJnaW5z
LnBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ2F0
aXZlTWFyZ2luKGNoaWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKKworICAgICAgICBp
ZiAobWFyZ2luSW5mby5tYXJnaW4oKSkKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0SGFzTWFy
Z2luQWZ0ZXJRdWlyayhoYXNNYXJnaW5BZnRlclF1aXJrKGNoaWxkKSk7CisgICAgfQorICAgIAor
ICAgIC8vIElmIG1hcmdpbnMgd291bGQgcHVsbCB1cyBwYXN0IHRoZSB0b3Agb2YgdGhlIG5leHQg
cGFnZSwgdGhlbiB3ZSBuZWVkIHRvIHB1bGwgYmFjayBhbmQgcHJldGVuZCBsaWtlIHRoZSBtYXJn
aW5zCisgICAgLy8gY29sbGFwc2VkIGludG8gdGhlIHBhZ2UgZWRnZS4KKyAgICBMYXlvdXRTdGF0
ZSogbGF5b3V0U3RhdGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKKyAgICBpZiAobGF5b3V0U3Rh
dGUtPmlzUGFnaW5hdGVkKCkgJiYgbGF5b3V0U3RhdGUtPnBhZ2VMb2dpY2FsSGVpZ2h0KCkgJiYg
bG9naWNhbFRvcCA+IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcAorICAgICAgICAmJiBoYXNOZXh0
UGFnZShiZWZvcmVDb2xsYXBzZUxvZ2ljYWxUb3ApKSB7CisgICAgICAgIExheW91dFVuaXQgb2xk
TG9naWNhbFRvcCA9IGxvZ2ljYWxUb3A7CisgICAgICAgIGxvZ2ljYWxUb3AgPSBtaW4obG9naWNh
bFRvcCwgbmV4dFBhZ2VMb2dpY2FsVG9wKGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCkpOworICAg
ICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIChsb2dpY2FsVG9wIC0gb2xk
TG9naWNhbFRvcCkpOworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgY29sbGFwc2VkIGludG8g
YSBwcmV2aW91cyBzaWJsaW5nIGFuZCBzbyByZWR1Y2VkIHRoZSBoZWlnaHQgb2YgdGhlIHBhcmVu
dCwgZW5zdXJlIGFueSBmbG9hdHMgdGhhdCBub3cKKyAgICAvLyBvdmVyaGFuZyBmcm9tIHRoZSBw
cmV2aW91cyBzaWJsaW5nIGFyZSBhZGRlZCB0byBvdXIgcGFyZW50LiBJZiB0aGUgY2hpbGQncyBw
cmV2aW91cyBzaWJsaW5nIGl0c2VsZiBpcyBhIGZsb2F0IHRoZSBjaGlsZCB3aWxsIGF2b2lkCisg
ICAgLy8gb3IgY2xlYXIgaXQgYW55d2F5LCBzbyBkb24ndCB3b3JyeSBhYm91dCBhbnkgZmxvYXRp
bmcgY2hpbGRyZW4gaXQgbWF5IGNvbnRhaW4uCisgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVp
Z2h0ID0gbG9naWNhbEhlaWdodCgpOworICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcCk7
CisgICAgUmVuZGVyT2JqZWN0KiBwcmV2ID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOworICAg
IGlmIChwcmV2ICYmIHByZXYtPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYgIXByZXYtPmlzRmxvYXRp
bmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkgeworICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sg
PSB0b1JlbmRlckJsb2NrKHByZXYpOworICAgICAgICBpZiAoYmxvY2stPmNvbnRhaW5zRmxvYXRz
KCkgJiYgIWJsb2NrLT5hdm9pZHNGbG9hdHMoKSAmJiAoYmxvY2stPmxvZ2ljYWxUb3AoKSArIGJs
b2NrLT5sb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKSkgPiBsb2dpY2FsVG9wKSAKKyAgICAgICAg
ICAgIGFkZE92ZXJoYW5naW5nRmxvYXRzKGJsb2NrLCBmYWxzZSk7CisgICAgfQorICAgIHNldExv
Z2ljYWxIZWlnaHQob2xkTG9naWNhbEhlaWdodCk7CisKKyAgICByZXR1cm4gbG9naWNhbFRvcDsK
K30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzSWZOZWVkZWQoUmVu
ZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCBvbGRUb3BQ
b3NNYXJnaW4sIExheW91dFVuaXQgb2xkVG9wTmVnTWFyZ2luLCBMYXlvdXRVbml0IHlQb3MpCit7
CisgICAgTGF5b3V0VW5pdCBoZWlnaHRJbmNyZWFzZSA9IGdldENsZWFyRGVsdGEoY2hpbGQsIHlQ
b3MpOworICAgIGlmICghaGVpZ2h0SW5jcmVhc2UpCisgICAgICAgIHJldHVybiB5UG9zOworCisg
ICAgaWYgKGNoaWxkLT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgeworICAgICAgICBib29sIGNo
aWxkRGlzY2FyZE1hcmdpbiA9IG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQp
IHx8IG11c3REaXNjYXJkTWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCk7CisKKyAgICAgICAgLy8g
Rm9yIHNlbGYtY29sbGFwc2luZyBibG9ja3MgdGhhdCBjbGVhciwgdGhleSBjYW4gc3RpbGwgY29s
bGFwc2UgdGhlaXIKKyAgICAgICAgLy8gbWFyZ2lucyB3aXRoIGZvbGxvd2luZyBzaWJsaW5ncy4g
UmVzZXQgdGhlIGN1cnJlbnQgbWFyZ2lucyB0byByZXByZXNlbnQKKyAgICAgICAgLy8gdGhlIHNl
bGYtY29sbGFwc2luZyBibG9jaydzIG1hcmdpbnMgb25seS4KKyAgICAgICAgLy8gSWYgRElTQ0FS
RCBpcyBzcGVjaWZpZWQgZm9yIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlLCByZXNldCB0aGUgbWFy
Z2luIHZhbHVlcy4KKyAgICAgICAgaWYgKCFjaGlsZERpc2NhcmRNYXJnaW4pIHsKKyAgICAgICAg
ICAgIE1hcmdpblZhbHVlcyBjaGlsZE1hcmdpbnMgPSBtYXJnaW5WYWx1ZXNGb3JDaGlsZChjaGls
ZCk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldFBvc2l0aXZlTWFyZ2luKG1heChjaGlsZE1h
cmdpbnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKSwgY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2lu
QWZ0ZXIoKSkpOworICAgICAgICAgICAgbWFyZ2luSW5mby5zZXROZWdhdGl2ZU1hcmdpbihtYXgo
Y2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCksIGNoaWxkTWFyZ2lucy5uZWdhdGl2
ZU1hcmdpbkFmdGVyKCkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtYXJnaW5JbmZv
LmNsZWFyTWFyZ2luKCk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0RGlzY2FyZE1hcmdpbihjaGls
ZERpc2NhcmRNYXJnaW4pOworCisgICAgICAgIC8vIENTUzIuMSBzdGF0ZXM6CisgICAgICAgIC8v
ICJJZiB0aGUgdG9wIGFuZCBib3R0b20gbWFyZ2lucyBvZiBhbiBlbGVtZW50IHdpdGggY2xlYXJh
bmNlIGFyZSBhZGpvaW5pbmcsIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHdpdGggCisgICAgICAgIC8v
IHRoZSBhZGpvaW5pbmcgbWFyZ2lucyBvZiBmb2xsb3dpbmcgc2libGluZ3MgYnV0IHRoYXQgcmVz
dWx0aW5nIG1hcmdpbiBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBib3R0b20gbWFyZ2luIG9m
IHRoZSBwYXJlbnQgYmxvY2suIgorICAgICAgICAvLyBTbyB0aGUgcGFyZW50J3MgYm90dG9tIG1h
cmdpbiBjYW5ub3QgY29sbGFwc2UgdGhyb3VnaCB0aGlzIGJsb2NrIG9yIGFueSBzdWJzZXF1ZW50
IHNlbGYtY29sbGFwc2luZyBibG9ja3MuIENoZWNrIHN1YnNlcXVlbnQgc2libGluZ3MKKyAgICAg
ICAgLy8gZm9yIGEgYmxvY2sgd2l0aCBoZWlnaHQgLSBpZiBub25lIGlzIGZvdW5kIHRoZW4gZG9u
J3QgYWxsb3cgdGhlIG1hcmdpbnMgdG8gY29sbGFwc2Ugd2l0aCB0aGUgcGFyZW50LgorICAgICAg
ICBib29sIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IG1hcmdpbkluZm8uY2FuQ29s
bGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbigpOworICAgICAgICBmb3IgKFJlbmRlckJveCog
Y3VyciA9IGNoaWxkLT5uZXh0U2libGluZ0JveCgpOyBjdXJyICYmIHdvdWxkQ29sbGFwc2VNYXJn
aW5zV2l0aFBhcmVudDsgY3VyciA9IGN1cnItPm5leHRTaWJsaW5nQm94KCkpIHsKKyAgICAgICAg
ICAgIGlmICghY3Vyci0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFjdXJy
LT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICB3b3VsZENvbGxhcHNl
TWFyZ2luc1dpdGhQYXJlbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAod291bGRD
b2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50KQorICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRDYW5D
b2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKGZhbHNlKTsKKworICAgICAgICAvLyBDU1My
LjE6ICJ0aGUgYW1vdW50IG9mIGNsZWFyYW5jZSBpcyBzZXQgc28gdGhhdCBjbGVhcmFuY2UgKyBt
YXJnaW4tdG9wID0gW2hlaWdodCBvZiBmbG9hdF0sIGkuZS4sIGNsZWFyYW5jZSA9IFtoZWlnaHQg
b2YgZmxvYXRdIC0gbWFyZ2luLXRvcCIKKyAgICAgICAgLy8gTW92ZSB0aGUgdG9wIG9mIHRoZSBj
aGlsZCBib3ggdG8gdGhlIGJvdHRvbSBvZiB0aGUgZmxvYXQgaWdub3JpbmcgdGhlIGNoaWxkJ3Mg
dG9wIG1hcmdpbi4KKyAgICAgICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRNYXJnaW4gPSBjb2xsYXBz
ZWRNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCk7CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQo
Y2hpbGQtPmxvZ2ljYWxUb3AoKSAtIGNvbGxhcHNlZE1hcmdpbik7CisgICAgICAgIC8vIEEgbmVn
YXRpdmUgY29sbGFwc2VkIG1hcmdpbi10b3AgdmFsdWUgY2FuY2VscyBpdHNlbGYgb3V0IGFzIGl0
IGhhcyBhbHJlYWR5IGJlZW4gZmFjdG9yZWQgaW50byB8eVBvc3wgYWJvdmUuCisgICAgICAgIGhl
aWdodEluY3JlYXNlIC09IG1heChMYXlvdXRVbml0KCksIGNvbGxhcHNlZE1hcmdpbik7CisgICAg
fSBlbHNlCisgICAgICAgIC8vIEluY3JlYXNlIG91ciBoZWlnaHQgYnkgdGhlIGFtb3VudCB3ZSBo
YWQgdG8gY2xlYXIuCisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsg
aGVpZ2h0SW5jcmVhc2UpOworICAgIAorICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0
aE1hcmdpbkJlZm9yZSgpKSB7CisgICAgICAgIC8vIFdlIGNhbiBubyBsb25nZXIgY29sbGFwc2Ug
d2l0aCB0aGUgdG9wIG9mIHRoZSBibG9jayBzaW5jZSBhIGNsZWFyCisgICAgICAgIC8vIG9jY3Vy
cmVkLiBUaGUgZW1wdHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhlIGNsZWFyZWQgYmxvY2suCisg
ICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJlY3QuIE5lZWQgY2xhcmlmaWNh
dGlvbiBmb3Igd2hhdCB0byBkbworICAgICAgICAvLyBpZiB0aGUgaGVpZ2h0IHRoZSBjbGVhcmVk
IGJsb2NrIGlzIG9mZnNldCBieSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgIC8vIG1hcmdp
bnMgaW52b2x2ZWQuCisgICAgICAgIHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhvbGRUb3BQb3NN
YXJnaW4sIG9sZFRvcE5lZ01hcmdpbik7CisgICAgICAgIG1hcmdpbkluZm8uc2V0QXRCZWZvcmVT
aWRlT2ZCbG9jayhmYWxzZSk7CisKKyAgICAgICAgLy8gSW4gY2FzZSB0aGUgY2hpbGQgZGlzY2Fy
ZGVkIHRoZSBiZWZvcmUgbWFyZ2luIG9mIHRoZSBibG9jayB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBt
dXN0RGlzY2FyZE1hcmdpbkJlZm9yZSBmbGFnIHRvIHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAg
ICBzZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZShzdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBz
ZSgpID09IE1ESVNDQVJEKTsKKyAgICB9CisKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSB5
UG9zICsgaGVpZ2h0SW5jcmVhc2U7CisgICAgLy8gQWZ0ZXIgbWFyZ2luIGNvbGxhcHNpbmcsIG9u
ZSBvZiBvdXIgZmxvYXRzIG1heSBub3cgaW50cnVkZSBpbnRvIHRoZSBjaGlsZC4gSWYgdGhlIGNo
aWxkIGRvZXNuJ3QgY29udGFpbiBmbG9hdHMgb2YgaXRzIG93biBpdAorICAgIC8vIHdvbid0IGdl
dCBwaWNrZWQgdXAgZm9yIHJlbGF5b3V0IGV2ZW4gdGhvdWdoIHRoZSBsb2dpY2FsIHRvcCBlc3Rp
bWF0ZSB3YXMgd3JvbmcgLSBzbyBhZGQgdGhlIG5ld2x5IGludHJ1ZGluZyBmbG9hdCBub3cuCisg
ICAgaWYgKGNvbnRhaW5zRmxvYXRzKCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2soKSAmJiAhdG9S
ZW5kZXJCbG9jayhjaGlsZCktPmNvbnRhaW5zRmxvYXRzKCkgJiYgIWNoaWxkLT5hdm9pZHNGbG9h
dHMoKSAmJiBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKSA+IGxvZ2ljYWxUb3ApCisgICAgICAg
IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5hZGRJbnRydWRpbmdGbG9hdHModGhpcywgbG9naWNhbExl
ZnRPZmZzZXRGb3JDb250ZW50KCksIGxvZ2ljYWxUb3ApOworCisgICAgcmV0dXJuIGxvZ2ljYWxU
b3A7Cit9CisKK3ZvaWQgUmVuZGVyQmxvY2tGbG93OjptYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNo
aWxkKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQmIHBvc2l0aXZlTWFyZ2luQmVmb3JlLCBM
YXlvdXRVbml0JiBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgYm9vbCYgZGlzY2FyZE1hcmdpbkJlZm9y
ZSkgY29uc3QKK3sKKyAgICAvLyBHaXZlIHVwIGlmIGluIHF1aXJrcyBtb2RlIGFuZCB3ZSdyZSBh
IGJvZHkvdGFibGUgY2VsbCBhbmQgdGhlIHRvcCBtYXJnaW4gb2YgdGhlIGNoaWxkIGJveCBpcyBx
dWlya3kuCisgICAgLy8gR2l2ZSB1cCBpZiB0aGUgY2hpbGQgc3BlY2lmaWVkIC13ZWJraXQtbWFy
Z2luLWNvbGxhcHNlOiBzZXBhcmF0ZSB0aGF0IHByZXZlbnRzIGNvbGxhcHNpbmcuCisgICAgLy8g
RklYTUU6IFVzZSB3cml0aW5nIG1vZGUgaW5kZXBlbmRlbnQgYWNjZXNzb3IgZm9yIG1hcmdpbkJl
Zm9yZUNvbGxhcHNlLgorICAgIGlmICgoZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSAmJiBoYXNN
YXJnaW5BZnRlclF1aXJrKGNoaWxkKSAmJiAoaXNUYWJsZUNlbGwoKSB8fCBpc0JvZHkoKSkpIHx8
IGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1TRVBBUkFURSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlIG1hcmdpbnMgYXJlIGRpc2NhcmRlZCBieSBhIGNo
aWxkIHRoYXQgc3BlY2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlOiBkaXNjYXJkLgorICAg
IC8vIEZJWE1FOiBVc2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFjY2Vzc29yIGZvciBtYXJn
aW5CZWZvcmVDb2xsYXBzZS4KKyAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpbkJlZm9yZUNv
bGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKKyAgICAgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSAw
OworICAgICAgICBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7CisgICAgICAgIGRpc2NhcmRNYXJn
aW5CZWZvcmUgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGF5b3V0VW5p
dCBiZWZvcmVDaGlsZE1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKKyAgICBw
b3NpdGl2ZU1hcmdpbkJlZm9yZSA9IG1heChwb3NpdGl2ZU1hcmdpbkJlZm9yZSwgYmVmb3JlQ2hp
bGRNYXJnaW4pOworICAgIG5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4KG5lZ2F0aXZlTWFyZ2lu
QmVmb3JlLCAtYmVmb3JlQ2hpbGRNYXJnaW4pOworCisgICAgaWYgKCFjaGlsZC0+aXNSZW5kZXJC
bG9ja0Zsb3coKSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIFJlbmRlckJsb2NrRmxvdyog
Y2hpbGRCbG9jayA9IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKTsKKyAgICBpZiAoY2hpbGRCbG9j
ay0+Y2hpbGRyZW5JbmxpbmUoKSB8fCBjaGlsZEJsb2NrLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBNYXJnaW5JbmZvIGNoaWxkTWFyZ2luSW5mbyhjaGlsZEJs
b2NrLCBjaGlsZEJsb2NrLT5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCksIGNoaWxkQmxvY2stPmJv
cmRlckFuZFBhZGRpbmdBZnRlcigpKTsKKyAgICBpZiAoIWNoaWxkTWFyZ2luSW5mby5jYW5Db2xs
YXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBS
ZW5kZXJCb3gqIGdyYW5kY2hpbGRCb3ggPSBjaGlsZEJsb2NrLT5maXJzdENoaWxkQm94KCk7Cisg
ICAgZm9yICggOyBncmFuZGNoaWxkQm94OyBncmFuZGNoaWxkQm94ID0gZ3JhbmRjaGlsZEJveC0+
bmV4dFNpYmxpbmdCb3goKSkgeworICAgICAgICBpZiAoIWdyYW5kY2hpbGRCb3gtPmlzRmxvYXRp
bmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAg
ICAKKyAgICAvLyBHaXZlIHVwIGlmIHRoZXJlIGlzIGNsZWFyYW5jZSBvbiB0aGUgYm94LCBzaW5j
ZSBpdCBwcm9iYWJseSB3b24ndCBjb2xsYXBzZSBpbnRvIHVzLgorICAgIGlmICghZ3JhbmRjaGls
ZEJveCB8fCBncmFuZGNoaWxkQm94LT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBibG9jayBtYXJnaW5z
IG5vdyBmb3IgdGhlIGdyYW5kY2hpbGQgYm94IHNvIHRoYXQgd2UncmUgbG9va2luZyBhdCBjdXJy
ZW50IHZhbHVlcy4KKyAgICBpZiAoZ3JhbmRjaGlsZEJveC0+bmVlZHNMYXlvdXQoKSkgeworICAg
ICAgICBncmFuZGNoaWxkQm94LT5jb21wdXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5zKHRo
aXMpOworICAgICAgICBpZiAoZ3JhbmRjaGlsZEJveC0+aXNSZW5kZXJCbG9jaygpKSB7CisgICAg
ICAgICAgICBSZW5kZXJCbG9jayogZ3JhbmRjaGlsZEJsb2NrID0gdG9SZW5kZXJCbG9jayhncmFu
ZGNoaWxkQm94KTsKKyAgICAgICAgICAgIGdyYW5kY2hpbGRCbG9jay0+c2V0SGFzTWFyZ2luQmVm
b3JlUXVpcmsoZ3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQmVmb3JlUXVpcmsoKSk7
CisgICAgICAgICAgICBncmFuZGNoaWxkQmxvY2stPnNldEhhc01hcmdpbkFmdGVyUXVpcmsoZ3Jh
bmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQWZ0ZXJRdWlyaygpKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIC8vIENvbGxhcHNlIHRoZSBtYXJnaW4gb2YgdGhlIGdyYW5kY2hpbGQgYm94
IHdpdGggb3VyIG93biB0byBwcm9kdWNlIGFuIGVzdGltYXRlLgorICAgIGNoaWxkQmxvY2stPm1h
cmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoZ3JhbmRjaGlsZEJveCwgcG9zaXRpdmVNYXJnaW5C
ZWZvcmUsIG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKK30KKwor
TGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKFJl
bmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExheW91dFVuaXQm
IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24pCit7CisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8g
ZWxpbWluYXRlIHRoZSBlc3RpbWF0aW9uIG9mIHZlcnRpY2FsIHBvc2l0aW9uLCBiZWNhdXNlIHdo
ZW4gaXQncyB3cm9uZyB3ZSBzb21ldGltZXMgdHJpZ2dlciBhIHBhdGhvbG9naWNhbAorICAgIC8v
IHJlbGF5b3V0IGlmIHRoZXJlIGFyZSBpbnRydWRpbmcgZmxvYXRzLgorICAgIExheW91dFVuaXQg
bG9naWNhbFRvcEVzdGltYXRlID0gbG9naWNhbEhlaWdodCgpOworICAgIGlmICghbWFyZ2luSW5m
by5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICBMYXlvdXRVbml0IHBv
c2l0aXZlTWFyZ2luQmVmb3JlID0gMDsKKyAgICAgICAgTGF5b3V0VW5pdCBuZWdhdGl2ZU1hcmdp
bkJlZm9yZSA9IDA7CisgICAgICAgIGJvb2wgZGlzY2FyZE1hcmdpbkJlZm9yZSA9IGZhbHNlOwor
ICAgICAgICBpZiAoY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKSB7CisgICAgICAgICAgICAvLyBU
cnkgdG8gZG8gYSBiYXNpYyBlc3RpbWF0aW9uIG9mIGhvdyB0aGUgY29sbGFwc2UgaXMgZ29pbmcg
dG8gZ28uCisgICAgICAgICAgICBtYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKGNoaWxkLCBw
b3NpdGl2ZU1hcmdpbkJlZm9yZSwgbmVnYXRpdmVNYXJnaW5CZWZvcmUsIGRpc2NhcmRNYXJnaW5C
ZWZvcmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIHRoZSBjYWNoZWQg
Y29sbGFwc2VkIG1hcmdpbiB2YWx1ZXMgZnJvbSBhIHByZXZpb3VzIGxheW91dC4gTW9zdCBvZiB0
aGUgdGltZSB0aGV5CisgICAgICAgICAgICAvLyB3aWxsIGJlIHJpZ2h0LgorICAgICAgICAgICAg
TWFyZ2luVmFsdWVzIG1hcmdpblZhbHVlcyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsK
KyAgICAgICAgICAgIHBvc2l0aXZlTWFyZ2luQmVmb3JlID0gbWF4KHBvc2l0aXZlTWFyZ2luQmVm
b3JlLCBtYXJnaW5WYWx1ZXMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKSk7CisgICAgICAgICAgICBu
ZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IG1heChuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgbWFyZ2luVmFs
dWVzLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkpOworICAgICAgICAgICAgZGlzY2FyZE1hcmdpbkJl
Zm9yZSA9IG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQpOworICAgICAgICB9
CisKKyAgICAgICAgLy8gQ29sbGFwc2UgdGhlIHJlc3VsdCB3aXRoIG91ciBjdXJyZW50IG1hcmdp
bnMuCisgICAgICAgIGlmICghZGlzY2FyZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgICAgIGxvZ2lj
YWxUb3BFc3RpbWF0ZSArPSBtYXgobWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpLCBwb3NpdGl2
ZU1hcmdpbkJlZm9yZSkgLSBtYXgobWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpLCBuZWdhdGl2
ZU1hcmdpbkJlZm9yZSk7CisgICAgfQorCisgICAgLy8gQWRqdXN0IGxvZ2ljYWxUb3BFc3RpbWF0
ZSBkb3duIHRvIHRoZSBuZXh0IHBhZ2UgaWYgdGhlIG1hcmdpbnMgYXJlIHNvIGxhcmdlIHRoYXQg
d2UgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50CisgICAgLy8gcGFnZS4KKyAgICBMYXlvdXRTdGF0
ZSogbGF5b3V0U3RhdGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKKyAgICBpZiAobGF5b3V0U3Rh
dGUtPmlzUGFnaW5hdGVkKCkgJiYgbGF5b3V0U3RhdGUtPnBhZ2VMb2dpY2FsSGVpZ2h0KCkgJiYg
bG9naWNhbFRvcEVzdGltYXRlID4gbG9naWNhbEhlaWdodCgpCisgICAgICAgICYmIGhhc05leHRQ
YWdlKGxvZ2ljYWxIZWlnaHQoKSkpCisgICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IG1pbihs
b2dpY2FsVG9wRXN0aW1hdGUsIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsSGVpZ2h0KCkpKTsK
KworICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSArPSBnZXRDbGVhckRlbHRhKGNoaWxkLCBsb2dpY2Fs
VG9wRXN0aW1hdGUpOworICAgIAorICAgIGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24gPSBsb2dp
Y2FsVG9wRXN0aW1hdGU7CisKKyAgICBpZiAobGF5b3V0U3RhdGUtPmlzUGFnaW5hdGVkKCkpIHsK
KyAgICAgICAgLy8gSWYgdGhlIG9iamVjdCBoYXMgYSBwYWdlIG9yIGNvbHVtbiBicmVhayB2YWx1
ZSBvZiAiYmVmb3JlIiwgdGhlbiB3ZSBzaG91bGQgc2hpZnQgdG8gdGhlIHRvcCBvZiB0aGUgbmV4
dCBwYWdlLgorICAgICAgICBsb2dpY2FsVG9wRXN0aW1hdGUgPSBhcHBseUJlZm9yZUJyZWFrKGNo
aWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUpOworICAgIAorICAgICAgICAvLyBGb3IgcmVwbGFjZWQg
ZWxlbWVudHMgYW5kIHNjcm9sbGVkIGVsZW1lbnRzLCB3ZSB3YW50IHRvIHNoaWZ0IHRoZW0gdG8g
dGhlIG5leHQgcGFnZSBpZiB0aGV5IGRvbid0IGZpdCBvbiB0aGUgY3VycmVudCBvbmUuCisgICAg
ICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IGFkanVzdEZvclVuc3BsaXR0YWJsZUNoaWxkKGNoaWxk
LCBsb2dpY2FsVG9wRXN0aW1hdGUpOworICAgICAgICAKKyAgICAgICAgaWYgKCFjaGlsZC0+c2Vs
Zk5lZWRzTGF5b3V0KCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKKyAgICAgICAgICAgIGxv
Z2ljYWxUb3BFc3RpbWF0ZSArPSB0b1JlbmRlckJsb2NrKGNoaWxkKS0+cGFnaW5hdGlvblN0cnV0
KCk7CisgICAgfQorCisgICAgcmV0dXJuIGxvZ2ljYWxUb3BFc3RpbWF0ZTsKK30KKwordm9pZCBS
ZW5kZXJCbG9ja0Zsb3c6OnNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZv
JiBtYXJnaW5JbmZvKQoreworICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdp
bkFmdGVyKCkgJiYgIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsK
KyAgICAgICAgLy8gVXBkYXRlIHRoZSBhZnRlciBzaWRlIG1hcmdpbiBvZiB0aGUgY29udGFpbmVy
IHRvIGRpc2NhcmQgaWYgdGhlIGFmdGVyIG1hcmdpbiBvZiB0aGUgbGFzdCBjaGlsZCBhbHNvIGRp
c2NhcmRzIGFuZCB3ZSBjb2xsYXBzZSB3aXRoIGl0LgorICAgICAgICAvLyBEb24ndCB1cGRhdGUg
dGhlIG1heCBtYXJnaW4gdmFsdWVzIGJlY2F1c2Ugd2Ugd29uJ3QgbmVlZCB0aGVtIGFueXdheS4K
KyAgICAgICAgaWYgKG1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpKSB7CisgICAgICAgICAgICBz
ZXRNdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKworICAgICAgICAvLyBVcGRhdGUgb3VyIG1heCBwb3MvbmVnIGJvdHRvbSBtYXJnaW5zLCBz
aW5jZSB3ZSBjb2xsYXBzZWQgb3VyIGJvdHRvbSBtYXJnaW5zCisgICAgICAgIC8vIHdpdGggb3Vy
IGNoaWxkcmVuLgorICAgICAgICBzZXRNYXhNYXJnaW5BZnRlclZhbHVlcyhtYXgobWF4UG9zaXRp
dmVNYXJnaW5BZnRlcigpLCBtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCkpLCBtYXgobWF4TmVn
YXRpdmVNYXJnaW5BZnRlcigpLCBtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCkpKTsKKworICAg
ICAgICBpZiAoIW1hcmdpbkluZm8uaGFzTWFyZ2luQWZ0ZXJRdWlyaygpKQorICAgICAgICAgICAg
c2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxzZSk7CisKKyAgICAgICAgaWYgKG1hcmdpbkluZm8u
aGFzTWFyZ2luQWZ0ZXJRdWlyaygpICYmICFtYXJnaW5BZnRlcigpKQorICAgICAgICAgICAgLy8g
V2UgaGF2ZSBubyBib3R0b20gbWFyZ2luIGFuZCBvdXIgbGFzdCBjaGlsZCBoYXMgYSBxdWlya3kg
bWFyZ2luLgorICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMgcXVpcmt5IG1hcmdp
biBhbmQgcGFzcyBpdCB0aHJvdWdoLgorICAgICAgICAgICAgLy8gVGhpcyBkZWFscyB3aXRoIHRo
ZSA8dGQ+PGRpdj48cD4gY2FzZS4KKyAgICAgICAgICAgIHNldEhhc01hcmdpbkFmdGVyUXVpcmso
dHJ1ZSk7CisgICAgfQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6aGFuZGxlQWZ0ZXJTaWRl
T2ZCbG9jayhMYXlvdXRVbml0IGJlZm9yZVNpZGUsIExheW91dFVuaXQgYWZ0ZXJTaWRlLCBNYXJn
aW5JbmZvJiBtYXJnaW5JbmZvKQoreworICAgIG1hcmdpbkluZm8uc2V0QXRBZnRlclNpZGVPZkJs
b2NrKHRydWUpOworCisgICAgLy8gSWYgd2UgY2FuJ3QgY29sbGFwc2Ugd2l0aCBjaGlsZHJlbiB0
aGVuIGdvIGFoZWFkIGFuZCBhZGQgaW4gdGhlIGJvdHRvbSBtYXJnaW4uCisgICAgaWYgKCFtYXJn
aW5JbmZvLmRpc2NhcmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFy
Z2luQWZ0ZXIoKSAmJiAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKQor
ICAgICAgICAmJiAoIWRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVp
cmtDb250YWluZXIoKSB8fCAhbWFyZ2luSW5mby5oYXNNYXJnaW5BZnRlclF1aXJrKCkpKSkKKyAg
ICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdp
bigpKTsKKyAgICAgICAgCisgICAgLy8gTm93IGFkZCBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRk
aW5nLgorICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJTaWRlKTsK
KworICAgIC8vIE5lZ2F0aXZlIG1hcmdpbnMgY2FuIGNhdXNlIG91ciBoZWlnaHQgdG8gc2hyaW5r
IGJlbG93IG91ciBtaW5pbWFsIGhlaWdodCAoYm9yZGVyL3BhZGRpbmcpLgorICAgIC8vIElmIHRo
aXMgaGFwcGVucywgZW5zdXJlIHRoYXQgdGhlIGNvbXB1dGVkIGhlaWdodCBpcyBpbmNyZWFzZWQg
dG8gdGhlIG1pbmltYWwgaGVpZ2h0LgorICAgIHNldExvZ2ljYWxIZWlnaHQobWF4KGxvZ2ljYWxI
ZWlnaHQoKSwgYmVmb3JlU2lkZSArIGFmdGVyU2lkZSkpOworCisgICAgLy8gVXBkYXRlIG91ciBi
b3R0b20gY29sbGFwc2VkIG1hcmdpbiBpbmZvLgorICAgIHNldENvbGxhcHNlZEJvdHRvbU1hcmdp
bihtYXJnaW5JbmZvKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1heE1hcmdpbkJl
Zm9yZVZhbHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCit7CisgICAgaWYgKCFt
X3JhcmVEYXRhKSB7CisgICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6
OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKSAmJiBuZWcgPT0gUmVuZGVyQmxvY2tG
bG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKSkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9j
a0Zsb3dSYXJlRGF0YSh0aGlzKSk7CisgICAgfQorICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5z
ZXRQb3NpdGl2ZU1hcmdpbkJlZm9yZShwb3MpOworICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5z
ZXROZWdhdGl2ZU1hcmdpbkJlZm9yZShuZWcpOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6
c2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91dFVuaXQgbmVnKQor
eworICAgIGlmICghbV9yYXJlRGF0YSkgeworICAgICAgICBpZiAocG9zID09IFJlbmRlckJsb2Nr
Rmxvd1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKSAmJiBuZWcgPT0g
UmVuZGVyQmxvY2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRoaXMp
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3
IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhKHRoaXMpKTsKKyAgICB9CisgICAgbV9yYXJlRGF0YS0+
bV9tYXJnaW5zLnNldFBvc2l0aXZlTWFyZ2luQWZ0ZXIocG9zKTsKKyAgICBtX3JhcmVEYXRhLT5t
X21hcmdpbnMuc2V0TmVnYXRpdmVNYXJnaW5BZnRlcihuZWcpOworfQorCit2b2lkIFJlbmRlckJs
b2NrRmxvdzo6c2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCB2YWx1ZSkKK3sKKyAgICBp
ZiAoc3R5bGUoKS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCkgeworICAgICAg
ICBBU1NFUlQodmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmICgh
bV9yYXJlRGF0YSAmJiAhdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9yYXJl
RGF0YSkKKyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja0Zsb3dS
YXJlRGF0YSh0aGlzKSk7CisKKyAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUg
PSB2YWx1ZTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2lu
QWZ0ZXIoYm9vbCB2YWx1ZSkKK3sKKyAgICBpZiAoc3R5bGUoKS0+bWFyZ2luQWZ0ZXJDb2xsYXBz
ZSgpID09IE1ESVNDQVJEKSB7CisgICAgICAgIEFTU0VSVCh2YWx1ZSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIW1fcmFyZURhdGEpCisgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0
cihuZXcgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEodGhpcykpOworCisgICAgbV9yYXJlRGF0YS0+
bV9kaXNjYXJkTWFyZ2luQWZ0ZXIgPSB2YWx1ZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6
Om11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBtX3Jh
cmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUpOworfQorCitib29sIFJlbmRlckJsb2NrRmxv
dzo6bXVzdERpc2NhcmRNYXJnaW5BZnRlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0eWxlKCkt
Pm1hcmdpbkFmdGVyQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBtX3Jh
cmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5BZnRlcik7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93
OjptdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQp
IGNvbnN0Cit7CisgICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOworICAgIGlm
ICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkpCisgICAgICAgIHJldHVybiBjaGlsZC0+aXNS
ZW5kZXJCbG9ja0Zsb3coKSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+bXVzdERpc2NhcmRN
YXJnaW5CZWZvcmUoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9
PSBNRElTQ0FSRCk7CisgICAgaWYgKGNoaWxkLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpID09
IGlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5k
ZXJCbG9ja0Zsb3coKSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+bXVzdERpc2NhcmRNYXJn
aW5BZnRlcigpIDogKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJ
U0NBUkQpOworCisgICAgLy8gRklYTUU6IFdlIHJldHVybiBmYWxzZSBoZXJlIGJlY2F1c2UgdGhl
IGltcGxlbWVudGF0aW9uIGlzIG5vdCBnZW9tZXRyaWNhbGx5IGNvbXBsZXRlLiBXZSBoYXZlIHZh
bHVlcyBvbmx5IGZvciBiZWZvcmUvYWZ0ZXIsIG5vdCBzdGFydC9lbmQuCisgICAgLy8gSW4gY2Fz
ZSB0aGUgYm94ZXMgYXJlIHBlcnBlbmRpY3VsYXIgd2UgYXNzdW1lIHRoZSBwcm9wZXJ0eSBpcyBu
b3Qgc3BlY2lmaWVkLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zs
b3c6Om11c3REaXNjYXJkTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNoaWxk
KSBjb25zdAoreworICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKKyAgICBp
ZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICByZXR1cm4gY2hpbGQtPmlz
UmVuZGVyQmxvY2tGbG93KCkgPyB0b1JlbmRlckJsb2NrRmxvdyhjaGlsZCktPm11c3REaXNjYXJk
TWFyZ2luQWZ0ZXIoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09
IE1ESVNDQVJEKTsKKyAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRl
ckJsb2NrRmxvdygpID8gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdp
bkJlZm9yZSgpIDogKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1E
SVNDQVJEKTsKKworICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9y
Q2hpbGR8IGFib3ZlLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zs
b3c6Om11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hp
bGQpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOworICAg
IGNvbnN0IFJlbmRlclN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxlKCk7CisgICAgaWYg
KCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkU3R5bGUt
Pm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOworICAgIGlmIChjaGlsZC0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAg
ICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1TRVBBUkFU
RTsKKworICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGR8
IGFib3ZlLgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11
c3RTZXBhcmF0ZU1hcmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29u
c3QKK3sKKyAgICBBU1NFUlQoIWNoaWxkLT5zZWxmTmVlZHNMYXlvdXQoKSk7CisgICAgY29uc3Qg
UmVuZGVyU3R5bGUqIGNoaWxkU3R5bGUgPSBjaGlsZC0+c3R5bGUoKTsKKyAgICBpZiAoIWNoaWxk
LT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2lu
QWZ0ZXJDb2xsYXBzZSgpID09IE1TRVBBUkFURTsKKyAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0
dXJuIGNoaWxkU3R5bGUtPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOworCisg
ICAgLy8gRklYTUU6IFNlZSB8bXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZHwgYWJvdmUu
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpbk5vcm1hbEZsb3coUmVuZGVy
Qm94KiBjaGlsZCkKK3sKKyAgICBSZW5kZXJCbG9jayogY3VyciA9IGNoaWxkLT5jb250YWluaW5n
QmxvY2soKTsKKyAgICB3aGlsZSAoY3VyciAmJiBjdXJyICE9ICZjaGlsZC0+dmlldygpKSB7Cisg
ICAgICAgIGlmIChjdXJyLT5oYXNDb2x1bW5zKCkgfHwgY3Vyci0+aXNSZW5kZXJGbG93VGhyZWFk
KCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGN1cnItPmlzRmxvYXRp
bmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgY3VyciA9IGN1cnItPmNvbnRhaW5pbmdCbG9jaygpOworICAgIH0KKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGx5QmVmb3JlQnJlYWso
UmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KQoreworICAgIC8vIEZJ
WE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9ydCBwcmludGlu
Zy4KKyAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0YXRlKCktPmlz
UGFnaW5hdGluZ0NvbHVtbnMoKTsKKyAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9ICFjaGVja0Nv
bHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNhbEhlaWdodDsg
Ly8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVjayB0aGlzLgor
ICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29udGFpbmluZ0Js
b2NrKCk7CisgICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQgJiYgZmxvd1Ro
cmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKKyAgICBib29sIGNoZWNrQmVmb3JlQWx3
YXlzID0gKGNoZWNrQ29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1bW5CcmVha0Jl
Zm9yZSgpID09IFBCQUxXQVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgp
LT5wYWdlQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUykKKyAgICAgICAgfHwgKGNoZWNrUmVnaW9u
QnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5yZWdpb25CcmVha0JlZm9yZSgpID09IFBCQUxXQVlT
KTsKKyAgICBpZiAoY2hlY2tCZWZvcmVBbHdheXMgJiYgaW5Ob3JtYWxGbG93KGNoaWxkKSAmJiBo
YXNOZXh0UGFnZShsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KSkgeworICAgICAg
ICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCisgICAgICAgICAgICB2aWV3KCkubGF5b3V0U3RhdGUo
KS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hpbGQsIGxvZ2ljYWxPZmZzZXQpOworICAgICAgICBp
ZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKKyAgICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0QnJl
YWtBZGp1c3RtZW50ID0gMDsKKyAgICAgICAgICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3JjZWRS
ZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9tTG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBsb2dp
Y2FsT2Zmc2V0LCBjaGlsZCwgdHJ1ZSwgJm9mZnNldEJyZWFrQWRqdXN0bWVudCkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0
LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KTsKKyAgICB9CisgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7
Cit9CisKK0xheW91dFVuaXQgUmVuZGVyQmxvY2tGbG93OjphcHBseUFmdGVyQnJlYWsoUmVuZGVy
Qm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0LCBNYXJnaW5JbmZvJiBtYXJnaW5J
bmZvKQoreworICAgIC8vIEZJWE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4g
d2Ugc3VwcG9ydCBwcmludGluZy4KKyAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygp
LmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGluZ0NvbHVtbnMoKTsKKyAgICBib29sIGNoZWNrUGFn
ZUJyZWFrcyA9ICFjaGVja0NvbHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9w
YWdlTG9naWNhbEhlaWdodDsgLy8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2
ZSB0byBjaGVjayB0aGlzLgorICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93
VGhyZWFkQ29udGFpbmluZ0Jsb2NrKCk7CisgICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZs
b3dUaHJlYWQgJiYgZmxvd1RocmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKKyAgICBi
b29sIGNoZWNrQWZ0ZXJBbHdheXMgPSAoY2hlY2tDb2x1bW5CcmVha3MgJiYgY2hpbGQtPnN0eWxl
KCktPmNvbHVtbkJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUykgfHwgKGNoZWNrUGFnZUJyZWFrcyAm
JiBjaGlsZC0+c3R5bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUykKKyAgICAgICAg
fHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5yZWdpb25CcmVha0FmdGVy
KCkgPT0gUEJBTFdBWVMpOworICAgIGlmIChjaGVja0FmdGVyQWx3YXlzICYmIGluTm9ybWFsRmxv
dyhjaGlsZCkgJiYgaGFzTmV4dFBhZ2UobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFy
eSkpIHsKKyAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW5PZmZzZXQgPSBtYXJnaW5JbmZvLmNhbkNv
bGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpID8gTGF5b3V0VW5pdCgpIDogbWFyZ2luSW5mby5tYXJn
aW4oKTsKKworICAgICAgICAvLyBTbyBvdXIgbWFyZ2luIGRvZXNuJ3QgcGFydGljaXBhdGUgaW4g
dGhlIG5leHQgY29sbGFwc2luZyBzdGVwcy4KKyAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdp
bigpOworCisgICAgICAgIGlmIChjaGVja0NvbHVtbkJyZWFrcykKKyAgICAgICAgICAgIHZpZXco
KS5sYXlvdXRTdGF0ZSgpLT5hZGRGb3JjZWRDb2x1bW5CcmVhayhjaGlsZCwgbG9naWNhbE9mZnNl
dCk7CisgICAgICAgIGlmIChjaGVja1JlZ2lvbkJyZWFrcykgeworICAgICAgICAgICAgTGF5b3V0
VW5pdCBvZmZzZXRCcmVha0FkanVzdG1lbnQgPSAwOworICAgICAgICAgICAgaWYgKGZsb3dUaHJl
YWQtPmFkZEZvcmNlZFJlZ2lvbkJyZWFrKHRoaXMsIG9mZnNldEZyb21Mb2dpY2FsVG9wT2ZGaXJz
dFBhZ2UoKSArIGxvZ2ljYWxPZmZzZXQgKyBtYXJnaW5PZmZzZXQsIGNoaWxkLCBmYWxzZSwgJm9m
ZnNldEJyZWFrQWRqdXN0bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZz
ZXQgKyBtYXJnaW5PZmZzZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFn
ZUJvdW5kYXJ5KTsKKyAgICB9CisgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Cit9CisKK0xheW91
dFVuaXQgUmVuZGVyQmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlv
dXRVbml0IGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBh
Z2luYXRpb24sIFJlbmRlckJveCogY2hpbGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jaykKK3sK
KyAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRlckJsb2Nr
KCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7CisKKyAgICBpZiAoZXN0aW1hdGVXaXRob3V0
UGFnaW5hdGlvbiAhPSBsb2dpY2FsVG9wQWZ0ZXJDbGVhcikgeworICAgICAgICAvLyBPdXIgZ3Vl
c3MgcHJpb3IgdG8gcGFnaW5hdGlvbiBtb3ZlbWVudCB3YXMgd3JvbmcuIEJlZm9yZSB3ZSBhdHRl
bXB0IHRvIHBhZ2luYXRlLCBsZXQncyB0cnkgYWdhaW4gYXQgdGhlIG5ldworICAgICAgICAvLyBw
b3NpdGlvbi4KKyAgICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wQWZ0ZXJDbGVhcik7
CisgICAgICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xl
YXIsIEFwcGx5TGF5b3V0RGVsdGEpOworCisgICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9p
ZEZsb2F0cygpKSB7CisgICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9u
IHRoZSBsaW5lIHdpZHRoLgorICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRv
IGNsZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KKyAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVj
YXVzZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCisgICAgICAgICAgICAvLyBT
byBnbyBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KKyAgICAgICAgICAgIGNoaWxk
LT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAo
IWNoaWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0
cygpKQorICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50
c1dpdGhGbG9hdHNGb3JMYXlvdXQoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5
b3V0KCkpCisgICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJ
Zk5lZWRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4g
TWFrZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCisgICAgICAgIGNoaWxkLT5sYXlv
dXRJZk5lZWRlZCgpOworICAgIH0KKworICAgIExheW91dFVuaXQgb2xkVG9wID0gbG9naWNhbFRv
cEFmdGVyQ2xlYXI7CisKKyAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29sdW1u
IGJyZWFrIHZhbHVlIG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUgdG9w
IG9mIHRoZSBuZXh0IHBhZ2UuCisgICAgTGF5b3V0VW5pdCByZXN1bHQgPSBhcHBseUJlZm9yZUJy
ZWFrKGNoaWxkLCBsb2dpY2FsVG9wQWZ0ZXJDbGVhcik7CisKKyAgICBpZiAocGFnZUxvZ2ljYWxI
ZWlnaHRGb3JPZmZzZXQocmVzdWx0KSkgeworICAgICAgICBMYXlvdXRVbml0IHJlbWFpbmluZ0xv
Z2ljYWxIZWlnaHQgPSBwYWdlUmVtYWluaW5nTG9naWNhbEhlaWdodEZvck9mZnNldChyZXN1bHQs
IEV4Y2x1ZGVQYWdlQm91bmRhcnkpOworICAgICAgICBMYXlvdXRVbml0IHNwYWNlU2hvcnRhZ2Ug
PSBjaGlsZC0+bG9naWNhbEhlaWdodCgpIC0gcmVtYWluaW5nTG9naWNhbEhlaWdodDsKKyAgICAg
ICAgaWYgKHNwYWNlU2hvcnRhZ2UgPiAwKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQg
Y3Jvc3NlcyBhIGNvbHVtbiBib3VuZGFyeSwgcmVwb3J0IGEgYnJlYWssIGluIGNhc2Ugbm90aGlu
ZyBpbnNpZGUgaXQgaGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGRvbmUgc28uIFRoZSBjb2x1
bW4gYmFsYW5jZXIgbmVlZHMgdG8ga25vdyBob3cgbXVjaCBpdCBoYXMgdG8gc3RyZXRjaCB0aGUg
Y29sdW1ucyB0byBtYWtlIG1vcmUKKyAgICAgICAgICAgIC8vIGNvbnRlbnQgZml0LiBJZiBubyBi
cmVha3MgYXJlIHJlcG9ydGVkIChidXQgZG8gb2NjdXIpLCB0aGUgYmFsYW5jZXIgd2lsbCBoYXZl
IG5vIGNsdWUuIEZJWE1FOgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wcm92ZWQs
IHRob3VnaCwgYmVjYXVzZSBoZXJlIHdlIGp1c3QgcHJldGVuZCB0aGF0IHRoZSBjaGlsZCBpcwor
ICAgICAgICAgICAgLy8gdW5zcGxpdHRhYmxlLiBBIHNwbGl0dGFibGUgY2hpbGQsIG9uIHRoZSBv
dGhlciBoYW5kLCBoYXMgYnJlYWsgb3Bwb3J0dW5pdGllcyBhdCBldmVyeSBwb3NpdGlvbgorICAg
ICAgICAgICAgLy8gd2hlcmUgdGhlcmUncyBubyBjaGlsZCBjb250ZW50LCBib3JkZXIgb3IgcGFk
ZGluZy4gSW4gb3RoZXIgd29yZHMsIHdlIHJpc2sgc3RyZXRjaGluZyBtb3JlCisgICAgICAgICAg
ICAvLyB0aGFuIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgIHNldFBhZ2VCcmVhayhyZXN1bHQsIHNw
YWNlU2hvcnRhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIHJlcGxhY2VkIGVs
ZW1lbnRzIGFuZCBzY3JvbGxlZCBlbGVtZW50cywgd2Ugd2FudCB0byBzaGlmdCB0aGVtIHRvIHRo
ZSBuZXh0IHBhZ2UgaWYgdGhleSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQgb25lLgorICAgIExh
eW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZVVuc3BsaXR0YWJsZUFkanVzdG1lbnQgPSByZXN1bHQ7
CisgICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9wQWZ0ZXJVbnNwbGl0dGFibGVBZGp1c3RtZW50ID0g
YWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGQsIHJlc3VsdCk7CisgICAgCisgICAgTGF5
b3V0VW5pdCBwYWdpbmF0aW9uU3RydXQgPSAwOworICAgIExheW91dFVuaXQgdW5zcGxpdHRhYmxl
QWRqdXN0bWVudERlbHRhID0gbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVudCAt
IGxvZ2ljYWxUb3BCZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50OworICAgIGlmICh1bnNwbGl0
dGFibGVBZGp1c3RtZW50RGVsdGEpCisgICAgICAgIHBhZ2luYXRpb25TdHJ1dCA9IHVuc3BsaXR0
YWJsZUFkanVzdG1lbnREZWx0YTsKKyAgICBlbHNlIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNo
aWxkUmVuZGVyQmxvY2stPnBhZ2luYXRpb25TdHJ1dCgpKQorICAgICAgICBwYWdpbmF0aW9uU3Ry
dXQgPSBjaGlsZFJlbmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKTsKKworICAgIGlmIChwYWdp
bmF0aW9uU3RydXQpIHsKKyAgICAgICAgLy8gV2UgYXJlIHdpbGxpbmcgdG8gcHJvcGFnYXRlIG91
dCB0byBvdXIgcGFyZW50IGJsb2NrIGFzIGxvbmcgYXMgd2Ugd2VyZSBhdCB0aGUgdG9wIG9mIHRo
ZSBibG9jayBwcmlvcgorICAgICAgICAvLyB0byBjb2xsYXBzaW5nIG91ciBtYXJnaW5zLCBhbmQg
YXMgbG9uZyBhcyB3ZSBkaWRuJ3QgY2xlYXIgb3IgbW92ZSBhcyBhIHJlc3VsdCBvZiBvdGhlciBw
YWdpbmF0aW9uLgorICAgICAgICBpZiAoYXRCZWZvcmVTaWRlT2ZCbG9jayAmJiBvbGRUb3AgPT0g
cmVzdWx0ICYmICFpc091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhaXNUYWJsZUNlbGwoKSkgewor
ICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZCByZWFsbHkgY2hlY2sgaWYgd2UncmUgZXhjZWVk
aW5nIHRoZSBwYWdlIGhlaWdodCBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIHN0cnV0LCBidXQgd2Ug
ZG9uJ3QKKyAgICAgICAgICAgIC8vIGhhdmUgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBkbyBzbyAo
dGhlIHN0cnV0IG9ubHkgaGFzIHRoZSByZW1haW5pbmcgYW1vdW50IHRvIHB1c2gpLiBHZWNrbyBn
ZXRzIHRoaXMgd3JvbmcgdG9vCisgICAgICAgICAgICAvLyBhbmQgcHVzaGVzIHRvIHRoZSBuZXh0
IHBhZ2UgYW55d2F5LCBzbyBub3QgdG9vIGNvbmNlcm5lZCBhYm91dCBpdC4KKyAgICAgICAgICAg
IHNldFBhZ2luYXRpb25TdHJ1dChyZXN1bHQgKyBwYWdpbmF0aW9uU3RydXQpOworICAgICAgICAg
ICAgaWYgKGNoaWxkUmVuZGVyQmxvY2spCisgICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJCbG9j
ay0+c2V0UGFnaW5hdGlvblN0cnV0KDApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJl
c3VsdCArPSBwYWdpbmF0aW9uU3RydXQ7CisgICAgfQorCisgICAgLy8gU2ltaWxhciB0byBob3cg
d2UgYXBwbHkgY2xlYXJhbmNlLiBHbyBhaGVhZCBhbmQgYm9vc3QgaGVpZ2h0KCkgdG8gYmUgdGhl
IHBsYWNlIHdoZXJlIHdlJ3JlIGdvaW5nIHRvIHBvc2l0aW9uIHRoZSBjaGlsZC4KKyAgICBzZXRM
b2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIChyZXN1bHQgLSBvbGRUb3ApKTsKKyAgICAK
KyAgICAvLyBSZXR1cm4gdGhlIGZpbmFsIGFkanVzdGVkIGxvZ2ljYWwgdG9wLgorICAgIHJldHVy
biByZXN1bHQ7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDE1NTM3NykKKysrIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5KQpA
QCAtNDcsNiArNDcsMTk5IEBAIHByb3RlY3RlZDoKICAgICAvLyBXaGVuIHRoZSBjaGlsZHJlbiBh
cmUgYXJlIGFsbCBpbmxpbmUgKGUuZy4sIGxpbmVzKSwgd2UgY2FsbCBsYXlvdXRJbmxpbmVDaGls
ZHJlbi4KICAgICB2b2lkIGxheW91dEJsb2NrQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxkcmVu
LCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pOwogICAgIHZvaWQgbGF5b3V0SW5s
aW5lQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiByZXBhaW50TG9n
aWNhbFRvcCwgTGF5b3V0VW5pdCYgcmVwYWludExvZ2ljYWxCb3R0b20pOworICAgIAorICAgIC8v
IFJlbmRlckJsb2NrRmxvd3Mgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcywgc2luY2UgdGhleSBhcmUg
dGhlIG9ubHkgY2xhc3MgdGhhdCBzdXBwb3J0cyBtYXJnaW4gY29sbGFwc2luZy4KKyAgICB2aXJ0
dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUgRklO
QUwgeyByZXR1cm4gbWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFyZ2lu
QmVmb3JlKCk7IH0KKyAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0ZXIo
KSBjb25zdCBPVkVSUklERSBGSU5BTCB7IHJldHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkg
LSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7IH0KKworcHVibGljOgorICAgIGNsYXNzIE1hcmdp
blZhbHVlcyB7CisgICAgcHVibGljOgorICAgICAgICBNYXJnaW5WYWx1ZXMoTGF5b3V0VW5pdCBi
ZWZvcmVQb3MsIExheW91dFVuaXQgYmVmb3JlTmVnLCBMYXlvdXRVbml0IGFmdGVyUG9zLCBMYXlv
dXRVbml0IGFmdGVyTmVnKQorICAgICAgICAgICAgOiBtX3Bvc2l0aXZlTWFyZ2luQmVmb3JlKGJl
Zm9yZVBvcykKKyAgICAgICAgICAgICwgbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVOZWcp
CisgICAgICAgICAgICAsIG1fcG9zaXRpdmVNYXJnaW5BZnRlcihhZnRlclBvcykKKyAgICAgICAg
ICAgICwgbV9uZWdhdGl2ZU1hcmdpbkFmdGVyKGFmdGVyTmVnKQorICAgICAgICB7IH0KKyAgICAg
ICAgCisgICAgICAgIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJl
dHVybiBtX3Bvc2l0aXZlTWFyZ2luQmVmb3JlOyB9CisgICAgICAgIExheW91dFVuaXQgbmVnYXRp
dmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlOyB9
CisgICAgICAgIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJu
IG1fcG9zaXRpdmVNYXJnaW5BZnRlcjsgfQorICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFy
Z2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQWZ0ZXI7IH0KKyAgICAg
ICAgCisgICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5CZWZvcmUoTGF5b3V0VW5pdCBwb3Mp
IHsgbV9wb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IHBvczsgfQorICAgICAgICB2b2lkIHNldE5lZ2F0
aXZlTWFyZ2luQmVmb3JlKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5CZWZvcmUg
PSBuZWc7IH0KKyAgICAgICAgdm9pZCBzZXRQb3NpdGl2ZU1hcmdpbkFmdGVyKExheW91dFVuaXQg
cG9zKSB7IG1fcG9zaXRpdmVNYXJnaW5BZnRlciA9IHBvczsgfQorICAgICAgICB2b2lkIHNldE5l
Z2F0aXZlTWFyZ2luQWZ0ZXIoTGF5b3V0VW5pdCBuZWcpIHsgbV9uZWdhdGl2ZU1hcmdpbkFmdGVy
ID0gbmVnOyB9CisgICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgTGF5b3V0VW5pdCBtX3Bvc2l0
aXZlTWFyZ2luQmVmb3JlOworICAgICAgICBMYXlvdXRVbml0IG1fbmVnYXRpdmVNYXJnaW5CZWZv
cmU7CisgICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkFmdGVyOworICAgICAgICBM
YXlvdXRVbml0IG1fbmVnYXRpdmVNYXJnaW5BZnRlcjsKKyAgICB9OworICAgIE1hcmdpblZhbHVl
cyBtYXJnaW5WYWx1ZXNGb3JDaGlsZChSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKKworICAgIC8v
IEFsbG9jYXRlZCBvbmx5IHdoZW4gc29tZSBvZiB0aGVzZSBmaWVsZHMgaGF2ZSBub24tZGVmYXVs
dCB2YWx1ZXMKKyAgICBzdHJ1Y3QgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEgeworICAgICAgICBX
VEZfTUFLRV9OT05DT1BZQUJMRShSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YSk7IFdURl9NQUtFX0ZB
U1RfQUxMT0NBVEVEOworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyQmxvY2tGbG93UmFyZURh
dGEoY29uc3QgUmVuZGVyQmxvY2tGbG93KiBibG9jaykKKyAgICAgICAgICAgIDogbV9tYXJnaW5z
KHBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdChibG9jayksIG5lZ2F0aXZlTWFyZ2luQmVmb3Jl
RGVmYXVsdChibG9jayksIHBvc2l0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KGJsb2NrKSwgbmVnYXRp
dmVNYXJnaW5BZnRlckRlZmF1bHQoYmxvY2spKQorICAgICAgICAgICAgLCBtX2Rpc2NhcmRNYXJn
aW5CZWZvcmUoZmFsc2UpCisgICAgICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkFmdGVyKGZhbHNl
KQorICAgICAgICB7IAorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIExheW91dFVuaXQgcG9z
aXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAgICAg
ICAgeyAKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+bWFy
Z2luQmVmb3JlKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5l
Z2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCisgICAg
ICAgIHsgCisgICAgICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2NrLT5t
YXJnaW5CZWZvcmUoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIExheW91dFVuaXQg
cG9zaXRpdmVNYXJnaW5BZnRlckRlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQorICAg
ICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oYmxvY2stPm1h
cmdpbkFmdGVyKCksIDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5l
Z2F0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAgICAg
ICAgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KC1ibG9jay0+bWFy
Z2luQWZ0ZXIoKSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1hcmdpblZhbHVl
cyBtX21hcmdpbnM7CisgICAgICAgIGJvb2wgbV9kaXNjYXJkTWFyZ2luQmVmb3JlIDogMTsKKyAg
ICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW5BZnRlciA6IDE7CisgICAgfTsKKworICAgIGNsYXNz
IE1hcmdpbkluZm8geworICAgICAgICAvLyBDb2xsYXBzaW5nIGZsYWdzIGZvciB3aGV0aGVyIHdl
IGNhbiBjb2xsYXBzZSBvdXIgbWFyZ2lucyB3aXRoIG91ciBjaGlsZHJlbidzIG1hcmdpbnMuCisg
ICAgICAgIGJvb2wgbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJvb2wg
bV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJvb2wg
bV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuIDogMTsKKworICAgICAgICAvLyBX
aGV0aGVyIG9yIG5vdCB3ZSBhcmUgYSBxdWlya3kgY29udGFpbmVyLCBpLmUuLCBkbyB3ZSBjb2xs
YXBzZSBhd2F5IHRvcCBhbmQgYm90dG9tCisgICAgICAgIC8vIG1hcmdpbnMgaW4gb3VyIGNvbnRh
aW5lci4gVGFibGUgY2VsbHMgYW5kIHRoZSBib2R5IGFyZSB0aGUgY29tbW9uIGV4YW1wbGVzLiBX
ZQorICAgICAgICAvLyBhbHNvIGhhdmUgYSBjdXN0b20gc3R5bGUgcHJvcGVydHkgZm9yIFNhZmFy
aSBSU1MgdG8gZGVhbCB3aXRoIFR5cGVQYWQgYmxvZyBhcnRpY2xlcy4KKyAgICAgICAgYm9vbCBt
X3F1aXJrQ29udGFpbmVyIDogMTsKKworICAgICAgICAvLyBUaGlzIGZsYWcgdHJhY2tzIHdoZXRo
ZXIgd2UgYXJlIHN0aWxsIGxvb2tpbmcgYXQgY2hpbGQgbWFyZ2lucyB0aGF0IGNhbiBhbGwgY29s
bGFwc2UgdG9nZXRoZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrLiAgCisgICAgICAgIC8v
IFRoZXkgbWF5IG9yIG1heSBub3QgY29sbGFwc2Ugd2l0aCB0aGUgdG9wIG1hcmdpbiBvZiB0aGUg
YmxvY2sgKHxtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxkcmVufCB0ZWxscyB1cyB0aGF0KSwgYnV0
IHRoZXkgd2lsbAorICAgICAgICAvLyBhbHdheXMgYmUgY29sbGFwc2luZyB3aXRoIG9uZSBhbm90
aGVyLiBUaGlzIHZhcmlhYmxlIGNhbiByZW1haW4gc2V0IHRvIHRydWUgdGhyb3VnaCBtdWx0aXBs
ZSBpdGVyYXRpb25zIAorICAgICAgICAvLyBhcyBsb25nIGFzIHdlIGtlZXAgZW5jb3VudGVyaW5n
IHNlbGYtY29sbGFwc2luZyBibG9ja3MuCisgICAgICAgIGJvb2wgbV9hdEJlZm9yZVNpZGVPZkJs
b2NrIDogMTsKKworICAgICAgICAvLyBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gd2Uga25vdyB3ZSdy
ZSBleGFtaW5pbmcgYm90dG9tIG1hcmdpbnMgYW5kIHdlIGtub3cgd2UncmUgYXQgdGhlIGJvdHRv
bSBvZiB0aGUgYmxvY2suCisgICAgICAgIGJvb2wgbV9hdEFmdGVyU2lkZU9mQmxvY2sgOiAxOwor
CisgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBkZXRlY3QgcXVpcmt5IG1h
cmdpbnMgdGhhdCB3ZSBuZWVkIHRvIGNvbGxhcHNlIGF3YXkgKGluIHRhYmxlIGNlbGxzCisgICAg
ICAgIC8vIGFuZCBpbiB0aGUgYm9keSBlbGVtZW50KS4KKyAgICAgICAgYm9vbCBtX2hhc01hcmdp
bkJlZm9yZVF1aXJrIDogMTsKKyAgICAgICAgYm9vbCBtX2hhc01hcmdpbkFmdGVyUXVpcmsgOiAx
OworICAgICAgICBib29sIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrIDogMTsKKworICAg
ICAgICBib29sIG1fZGlzY2FyZE1hcmdpbiA6IDE7CisKKyAgICAgICAgLy8gVGhlc2UgZmxhZ3Mg
dHJhY2sgdGhlIHByZXZpb3VzIG1heGltYWwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbnMu
CisgICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbjsKKyAgICAgICAgTGF5b3V0VW5p
dCBtX25lZ2F0aXZlTWFyZ2luOworCisgICAgcHVibGljOgorICAgICAgICBNYXJnaW5JbmZvKFJl
bmRlckJsb2NrRmxvdyosIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywgTGF5b3V0VW5p
dCBhZnRlckJvcmRlclBhZGRpbmcpOworCisgICAgICAgIHZvaWQgc2V0QXRCZWZvcmVTaWRlT2ZC
bG9jayhib29sIGIpIHsgbV9hdEJlZm9yZVNpZGVPZkJsb2NrID0gYjsgfQorICAgICAgICB2b2lk
IHNldEF0QWZ0ZXJTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9hdEFmdGVyU2lkZU9mQmxvY2sgPSBi
OyB9CisgICAgICAgIHZvaWQgY2xlYXJNYXJnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBt
X3Bvc2l0aXZlTWFyZ2luID0gMDsKKyAgICAgICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSAwOwor
ICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsoYm9vbCBiKSB7
IG1faGFzTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9CisgICAgICAgIHZvaWQgc2V0SGFzTWFyZ2lu
QWZ0ZXJRdWlyayhib29sIGIpIHsgbV9oYXNNYXJnaW5BZnRlclF1aXJrID0gYjsgfQorICAgICAg
ICB2b2lkIHNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayhib29sIGIpIHsgbV9kZXRlcm1p
bmVkTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9CisgICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJn
aW4oTGF5b3V0VW5pdCBwKSB7IEFTU0VSVCghbV9kaXNjYXJkTWFyZ2luKTsgbV9wb3NpdGl2ZU1h
cmdpbiA9IHA7IH0KKyAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbihMYXlvdXRVbml0IG4p
IHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX25lZ2F0aXZlTWFyZ2luID0gbjsgfQorICAg
ICAgICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIoTGF5b3V0VW5pdCBwKQorICAgICAg
ICB7CisgICAgICAgICAgICBBU1NFUlQoIW1fZGlzY2FyZE1hcmdpbik7CisgICAgICAgICAgICBp
ZiAocCA+IG1fcG9zaXRpdmVNYXJnaW4pCisgICAgICAgICAgICAgICAgbV9wb3NpdGl2ZU1hcmdp
biA9IHA7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbklmTGFyZ2Vy
KExheW91dFVuaXQgbikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCFtX2Rpc2NhcmRN
YXJnaW4pOworICAgICAgICAgICAgaWYgKG4gPiBtX25lZ2F0aXZlTWFyZ2luKQorICAgICAgICAg
ICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSBuOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBz
ZXRNYXJnaW4oTGF5b3V0VW5pdCBwLCBMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFtX2Rpc2NhcmRN
YXJnaW4pOyBtX3Bvc2l0aXZlTWFyZ2luID0gcDsgbV9uZWdhdGl2ZU1hcmdpbiA9IG47IH0KKyAg
ICAgICAgdm9pZCBzZXRDYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKGJvb2wgY29s
bGFwc2UpIHsgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuID0gY29sbGFwc2U7
IH0KKyAgICAgICAgdm9pZCBzZXREaXNjYXJkTWFyZ2luKGJvb2wgdmFsdWUpIHsgbV9kaXNjYXJk
TWFyZ2luID0gdmFsdWU7IH0KKworICAgICAgICBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2soKSBj
b25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2s7IH0KKyAgICAgICAgYm9vbCBjYW5D
b2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9m
QmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbjsgfQorICAgICAg
ICBib29sIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkgY29uc3QgeyByZXR1cm4gbV9hdEFm
dGVyU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuOyB9
CisgICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4oKSBjb25z
dCB7IHJldHVybiBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuOyB9CisgICAg
ICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbigpIGNvbnN0IHsgcmV0
dXJuIG1fY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbjsgfQorICAgICAgICBib29s
IHF1aXJrQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gbV9xdWlya0NvbnRhaW5lcjsgfQorICAg
ICAgICBib29sIGRldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyaygpIGNvbnN0IHsgcmV0dXJuIG1f
ZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrOyB9CisgICAgICAgIGJvb2wgaGFzTWFyZ2luQmVm
b3JlUXVpcmsoKSBjb25zdCB7IHJldHVybiBtX2hhc01hcmdpbkJlZm9yZVF1aXJrOyB9CisgICAg
ICAgIGJvb2wgaGFzTWFyZ2luQWZ0ZXJRdWlyaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzTWFyZ2lu
QWZ0ZXJRdWlyazsgfQorICAgICAgICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luKCkgY29uc3Qg
eyByZXR1cm4gbV9wb3NpdGl2ZU1hcmdpbjsgfQorICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZl
TWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbjsgfQorICAgICAgICBib29s
IGRpc2NhcmRNYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX2Rpc2NhcmRNYXJnaW47IH0KKyAgICAg
ICAgTGF5b3V0VW5pdCBtYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aXZlTWFyZ2luIC0g
bV9uZWdhdGl2ZU1hcmdpbjsgfQorICAgIH07CisKKyAgICB2b2lkIGxheW91dEJsb2NrQ2hpbGQo
UmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYsIExheW91dFVuaXQmIHByZXZpb3VzRmxvYXRM
b2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pOworICAgIHZv
aWQgYWRqdXN0UG9zaXRpb25lZEJsb2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbklu
Zm8mKTsKKyAgICB2b2lkIGFkanVzdEZsb2F0aW5nQmxvY2soY29uc3QgTWFyZ2luSW5mbyYpOwor
CisgICAgTGF5b3V0VW5pdCBjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2lu
SW5mbyYpOworICAgIExheW91dFVuaXQgY2xlYXJGbG9hdHNJZk5lZWRlZChSZW5kZXJCb3gqIGNo
aWxkLCBNYXJnaW5JbmZvJiwgTGF5b3V0VW5pdCBvbGRUb3BQb3NNYXJnaW4sIExheW91dFVuaXQg
b2xkVG9wTmVnTWFyZ2luLCBMYXlvdXRVbml0IHlQb3MpOworICAgIExheW91dFVuaXQgZXN0aW1h
dGVMb2dpY2FsVG9wUG9zaXRpb24oUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYs
IExheW91dFVuaXQmIGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24pOworICAgIHZvaWQgbWFyZ2lu
QmVmb3JlRXN0aW1hdGVGb3JDaGlsZChSZW5kZXJCb3gqLCBMYXlvdXRVbml0JiwgTGF5b3V0VW5p
dCYsIGJvb2wmKSBjb25zdDsKKyAgICB2b2lkIGhhbmRsZUFmdGVyU2lkZU9mQmxvY2soTGF5b3V0
VW5pdCB0b3AsIExheW91dFVuaXQgYm90dG9tLCBNYXJnaW5JbmZvJik7CisgICAgdm9pZCBzZXRD
b2xsYXBzZWRCb3R0b21NYXJnaW4oY29uc3QgTWFyZ2luSW5mbyYpOworCitwcm90ZWN0ZWQ6Cisg
ICAgTGF5b3V0VW5pdCBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIGNvbnN0IHsgcmV0dXJuIG1f
cmFyZURhdGEgPyBtX3JhcmVEYXRhLT5tX21hcmdpbnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKSA6
IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhp
cyk7IH0KKyAgICBMYXlvdXRVbml0IG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyBy
ZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJl
Zm9yZSgpIDogUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVm
YXVsdCh0aGlzKTsgfQorICAgIExheW91dFVuaXQgbWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpIGNv
bnN0IHsgcmV0dXJuIG1fcmFyZURhdGEgPyBtX3JhcmVEYXRhLT5tX21hcmdpbnMucG9zaXRpdmVN
YXJnaW5BZnRlcigpIDogUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQWZ0
ZXJEZWZhdWx0KHRoaXMpOyB9CisgICAgTGF5b3V0VW5pdCBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVy
KCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5uZWdh
dGl2ZU1hcmdpbkFmdGVyKCkgOiBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQodGhpcyk7IH0KKyAgICAKKyAgICB2b2lkIGluaXRNYXhNYXJnaW5WYWx1
ZXMoKQorICAgIHsKKyAgICAgICAgaWYgKCFtX3JhcmVEYXRhKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBtX3JhcmVEYXRhLT5tX21hcmdpbnMgPSBNYXJnaW5WYWx1ZXMoUmVuZGVyQmxv
Y2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKSAsIFJlbmRl
ckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyksCisg
ICAgICAgICAgICBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5BZnRlckRl
ZmF1bHQodGhpcyksIFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkFmdGVy
RGVmYXVsdCh0aGlzKSk7CisgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkJlZm9y
ZSA9IGZhbHNlOworICAgICAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5BZnRlciA9IGZh
bHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhMYXlv
dXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpOworICAgIHZvaWQgc2V0TWF4TWFyZ2luQWZ0ZXJW
YWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91dFVuaXQgbmVnKTsKKworICAgIHZvaWQgc2V0TXVz
dERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCA9IHRydWUpOworICAgIHZvaWQgc2V0TXVzdERpc2Nh
cmRNYXJnaW5BZnRlcihib29sID0gdHJ1ZSk7CisKKyAgICBib29sIG11c3REaXNjYXJkTWFyZ2lu
QmVmb3JlKCkgY29uc3Q7CisgICAgYm9vbCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3Q7
CisKKyAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVy
Qm94KikgY29uc3Q7CisgICAgYm9vbCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29u
c3QgUmVuZGVyQm94KikgY29uc3Q7CisKKyAgICBib29sIG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCopIGNvbnN0OworICAgIGJvb2wgbXVzdFNlcGFyYXRl
TWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqKSBjb25zdDsKKworICAgIExheW91
dFVuaXQgYXBwbHlCZWZvcmVCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2lj
YWxPZmZzZXQpOyAvLyBJZiB0aGUgY2hpbGQgaGFzIGEgYmVmb3JlIGJyZWFrLCB0aGVuIHJldHVy
biBhIG5ldyB5UG9zIHRoYXQgc2hpZnRzIHRvIHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZS9jb2x1
bW4uCisgICAgTGF5b3V0VW5pdCBhcHBseUFmdGVyQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5
b3V0VW5pdCBsb2dpY2FsT2Zmc2V0LCBNYXJnaW5JbmZvJik7IC8vIElmIHRoZSBjaGlsZCBoYXMg
YW4gYWZ0ZXIgYnJlYWssIHRoZW4gcmV0dXJuIGEgbmV3IG9mZnNldCB0aGF0IHNoaWZ0cyB0byB0
aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgorICAgIExheW91dFVuaXQgYWRqdXN0Qmxv
Y2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5
b3V0VW5pdCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29s
IGF0QmVmb3JlU2lkZU9mQmxvY2spOworCitwcm90ZWN0ZWQ6CisgICAgT3duUHRyPFJlbmRlckJs
b2NrRmxvd1JhcmVEYXRhPiBtX3JhcmVEYXRhOwogfTsKIAogaW5saW5lIFJlbmRlckJsb2NrRmxv
dyYgdG9SZW5kZXJCbG9ja0Zsb3coUmVuZGVyT2JqZWN0JiBvYmplY3QpCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxl
Qm94LmNwcAkocmV2aXNpb24gMTU1Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1Jl
bmRlckRlcHJlY2F0ZWRGbGV4aWJsZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyMiw4ICsz
MjIsNiBAQCB2b2lkIFJlbmRlckRlcHJlY2F0ZWRGbGV4aWJsZUJveDo6bGF5b3V0CiAKICAgICBt
X3N0cmV0Y2hpbmdDaGlsZHJlbiA9IGZhbHNlOwogCi0gICAgaW5pdE1heE1hcmdpblZhbHVlcygp
OwotCiAjaWYgIUFTU0VSVF9ESVNBQkxFRAogICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEg
PSB2aWV3KCkubGF5b3V0RGVsdGEoKTsKICNlbmRpZgpAQCAtMzUxLDI0ICszNDksNiBAQCB2b2lk
IFJlbmRlckRlcHJlY2F0ZWRGbGV4aWJsZUJveDo6bGF5b3V0CiAKICAgICB1cGRhdGVTaGFwZXNB
ZnRlckJsb2NrTGF5b3V0KCk7CiAKLSAgICBpZiAoIWlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0
aW9uZWQoKSAmJiBoZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBhIGJsb2NrIHdp
dGggbm8gYm9yZGVyIGFuZCBwYWRkaW5nIGFuZCBhIGNvbXB1dGVkIGhlaWdodAotICAgICAgICAv
LyBvZiAwLiAgVGhlIENTUyBzcGVjIHN0YXRlcyB0aGF0IHplcm8taGVpZ2h0IGJsb2NrcyBjb2xs
YXBzZSB0aGVpciBtYXJnaW5zCi0gICAgICAgIC8vIHRvZ2V0aGVyLgotICAgICAgICAvLyBXaGVu
IGJsb2NrcyBhcmUgc2VsZi1jb2xsYXBzaW5nLCB3ZSBqdXN0IHVzZSB0aGUgdG9wIG1hcmdpbiB2
YWx1ZXMgYW5kIHNldCB0aGUKLSAgICAgICAgLy8gYm90dG9tIG1hcmdpbiBtYXggdmFsdWVzIHRv
IDAuICBUaGlzIHdheSB3ZSBkb24ndCBmYWN0b3IgaW4gdGhlIHZhbHVlcwotICAgICAgICAvLyB0
d2ljZSB3aGVuIHdlIGNvbGxhcHNlIHdpdGggb3VyIHByZXZpb3VzIHZlcnRpY2FsbHkgYWRqYWNl
bnQgYW5kCi0gICAgICAgIC8vIGZvbGxvd2luZyB2ZXJ0aWNhbGx5IGFkamFjZW50IGJsb2Nrcy4K
LSAgICAgICAgTGF5b3V0VW5pdCBwb3MgPSBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpOwotICAg
ICAgICBMYXlvdXRVbml0IG5lZyA9IG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7Ci0gICAgICAg
IGlmIChtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgPiBwb3MpCi0gICAgICAgICAgICBwb3MgPSBt
YXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCk7Ci0gICAgICAgIGlmIChtYXhOZWdhdGl2ZU1hcmdpbkFm
dGVyKCkgPiBuZWcpCi0gICAgICAgICAgICBuZWcgPSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
Ci0gICAgICAgIHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhwb3MsIG5lZyk7Ci0gICAgICAgIHNl
dE1heE1hcmdpbkFmdGVyVmFsdWVzKDAsIDApOwotICAgIH0KLQogICAgIGNvbXB1dGVPdmVyZmxv
dyhvbGRDbGllbnRBZnRlckVkZ2UpOwogCiAgICAgc3RhdGVQdXNoZXIucG9wKCk7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyVGFibGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAJKHJldmlzaW9uIDE1NTM3NikK
KysrIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTQwOCw4ICs0MDgsNiBAQCB2b2lkIFJlbmRlclRhYmxlOjpsYXlvdXQoKQogICAgIExh
eW91dFN0YXRlTWFpbnRhaW5lciBzdGF0ZVB1c2hlcigmdmlldygpLCB0aGlzLCBsb2NhdGlvbk9m
ZnNldCgpLCBoYXNUcmFuc2Zvcm0oKSB8fCBoYXNSZWZsZWN0aW9uKCkgfHwgc3R5bGUoKS0+aXNG
bGlwcGVkQmxvY2tzV3JpdGluZ01vZGUoKSk7CiAKICAgICBzZXRMb2dpY2FsSGVpZ2h0KDApOwot
Ci0gICAgaW5pdE1heE1hcmdpblZhbHVlcygpOwogICAgIAogICAgIExheW91dFVuaXQgb2xkTG9n
aWNhbFdpZHRoID0gbG9naWNhbFdpZHRoKCk7CiAgICAgdXBkYXRlTG9naWNhbFdpZHRoKCk7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211094</attachid>
            <date>2013-09-09 14:57:44 -0700</date>
            <delta_ts>2013-09-10 13:38:36 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>136102</size>
            <attacher name="Dave Hyatt">hyatt</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1NTM4NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDExMSBAQAorMjAxMy0wOS0wOSAgRGF2aWQg
SHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CisKKyAgICAgICAgTW92ZSBhbGwgY29sbGFwc2luZyBt
YXJnaW4gY29kZSBvdXQgb2YgUmVuZGVyQmxvY2sgYW5kIGludG8gUmVuZGVyQmxvY2tGbG93Lgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMDQ5CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRj
aCBiZWdpbnMgdGhlIG1pZ3JhdGlvbiBvZiB0aGUgcmFyZSBkYXRhIHN0cnVjdCBvZiBSZW5kZXJC
bG9jayBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gRHVyaW5nIHRoaXMgcHJvY2VzcyB3
ZSB3aWxsIHRlbXBvcmFyaWx5IGhhdmUgcmFyZSBkYXRhIHN0cnVjdHMKKyAgICAgICAgaW4gYm90
aCBwbGFjZXMsIGJ1dCB1bHRpbWF0ZWx5IGFsbCBvZiB0aGUgbWVtYmVycyBhcmUgZ29pbmcgdG8g
bW92ZSBkb3duIGludG8KKyAgICAgICAgUmVuZGVyQmxvY2tGbG93LCBhbmQgaWYgYW55IGRvbid0
LCB0aGV5IHdpbGwgZ2V0IGZvcmNlZCBpbnRvIGEgaGFzaC4KKyAgICAgICAgCisgICAgICAgIEZv
ciB0aGlzIHBhdGNoLCB0aGUgbWFyZ2luIGluZm9ybWF0aW9uIGlzIGJlaW5nIHNoaWZ0ZWQgb3V0
IG9mIFJlbmRlckJsb2NrIGFuZCBpbnRvCisgICAgICAgIFJlbmRlckJsb2NrRmxvdy4gQW55IGZ1
bmN0aW9ucyB0aGF0IHJlZmVyIHRvIE1hcmdpblZhbHVlcyBvciB0byBNYXJnaW5JbmZvIGFsc28g
Z290CisgICAgICAgIG1vdmVkIGRvd24gaW50byBSZW5kZXJCbG9ja0Zsb3cuIE1vc3Qgb2YgYmxv
Y2sgY2hpbGQgbGF5b3V0IGlzIG5vdyBpbiBSZW5kZXJCbG9ja0Zsb3cKKyAgICAgICAgYWZ0ZXIg
dGhpcyBwYXRjaC4KKyAgICAgICAgCisgICAgICAgIE5vdGUgdGhhdCBpbiBtYW55IGNhc2VzIHRo
ZSBjb2RlIGRpZG4ndCBzaW1wbHkgbW92ZS4gVGhlcmUgaXMgc29tZSB0eXBlIHRpZ2h0ZW5pbmcK
KyAgICAgICAgdGhhdCBoYXBwZW5lZCBhcyB3ZWxsLCBpLmUuLCBwbGFjZXMgdGhhdCBsb29rIGZv
ciBSZW5kZXJCbG9jayBjYW4gbm93IGxvb2sgZm9yCisgICAgICAgIFJlbmRlckJsb2NrRmxvdyBp
bnN0ZWFkIGFuZCBsZXQgUmVuZGVyQmxvY2sgZXhlY3V0ZSB0aGUgYmFzZSBSZW5kZXJCb3ggZnVu
Y3Rpb25zLgorCisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrOjpSZW5kZXJCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9jazo6c2V0UGFnaW5hdGlvblN0cnV0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
ckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJC
bG9jazo6c2V0QnJlYWtBdExpbmVUb0F2b2lkV2lkb3cpOgorICAgICAgICAqIHJlbmRlcmluZy9S
ZW5kZXJCbG9jay5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OnNldExpbmVHcmlk
Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpzZXRTaGFwZUluc2lkZUluZm8p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2s6OlJlbmRlckJsb2NrUmFyZURhdGE6OlJl
bmRlckJsb2NrUmFyZURhdGEpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpNYXJn
aW5JbmZvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxvY2tG
bG93KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGls
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdFBvc2l0aW9uZWRC
bG9jayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZsb2F0aW5n
QmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5WYWx1ZXNG
b3JDaGlsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFy
Z2lucyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzSWZO
ZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXJnaW5CZWZvcmVF
c3RpbWF0ZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6ZXN0
aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpoYW5kbGVBZnRlclNpZGVPZkJsb2NrKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMpOgorICAgICAgICAo
V2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpzZXRNdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2FyZE1hcmdp
bkJlZm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNjYXJk
TWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0RGlz
Y2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2Nr
Rmxvdzo6bXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlckJsb2NrRmxvdzo6bXVzdFNlcGFyYXRlTWFyZ2luQmVmb3JlRm9yQ2hpbGQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptdXN0U2VwYXJhdGVNYXJnaW5BZnRlckZv
ckNoaWxkKToKKyAgICAgICAgKFdlYkNvcmU6OmluTm9ybWFsRmxvdyk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmFwcGx5QmVmb3JlQnJlYWspOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyQmxvY2tGbG93OjphcHBseUFmdGVyQnJlYWspOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyQmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbik6CisgICAgICAg
ICogcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5oOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
QmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Ok1hcmdpblZhbHVlcyk6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6cG9zaXRpdmVNYXJnaW5CZWZvcmUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6Om5lZ2F0aXZl
TWFyZ2luQmVmb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2lu
VmFsdWVzOjpwb3NpdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJs
b2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpuZWdhdGl2ZU1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzOjpzZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlczo6
c2V0TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tG
bG93OjpNYXJnaW5WYWx1ZXM6OnNldFBvc2l0aXZlTWFyZ2luQWZ0ZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5WYWx1ZXM6OnNldE5lZ2F0aXZlTWFyZ2luQWZ0
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dS
YXJlRGF0YTo6UmVuZGVyQmxvY2tGbG93UmFyZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5CZWZv
cmVEZWZhdWx0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6UmVuZGVyQmxv
Y2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpwb3NpdGl2
ZU1hcmdpbkFmdGVyRGVmYXVsdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6
OlJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEF0QmVmb3Jl
U2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXRBdEFmdGVyU2lkZU9mQmxvY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpjbGVhck1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldEhhc01hcmdpbkJlZm9yZVF1aXJrKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0SGFzTWFyZ2luQWZ0
ZXJRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86
OnNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldFBvc2l0aXZlTWFyZ2luKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW4pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpzZXRQb3NpdGl2
ZU1hcmdpbklmTGFyZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6TWFy
Z2luSW5mbzo6c2V0TmVnYXRpdmVNYXJnaW5JZkxhcmdlcik6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldE1hcmdpbik6CisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJX
aXRoQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5J
bmZvOjpzZXREaXNjYXJkTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxv
dzo6TWFyZ2luSW5mbzo6YXRCZWZvcmVTaWRlT2ZCbG9jayk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86OmNhbkNvbGxh
cHNlV2l0aE1hcmdpbkFmdGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4pOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpjYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6
TWFyZ2luSW5mbzo6cXVpcmtDb250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxv
Y2tGbG93OjpNYXJnaW5JbmZvOjpkZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmspOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpNYXJnaW5JbmZvOjpoYXNNYXJnaW5CZWZvcmVR
dWlyayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Omhh
c01hcmdpbkFmdGVyUXVpcmspOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjpN
YXJnaW5JbmZvOjpwb3NpdGl2ZU1hcmdpbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9j
a0Zsb3c6Ok1hcmdpbkluZm86Om5lZ2F0aXZlTWFyZ2luKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6ZGlzY2FyZE1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpbkluZm86Om1hcmdpbik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJCbG9ja0Zsb3c6Om1heFBvc2l0aXZlTWFyZ2luQmVmb3JlKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyQmxvY2tGbG93OjptYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrRmxvdzo6bWF4TmVnYXRpdmVNYXJnaW5BZnRl
cik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJCbG9ja0Zsb3c6OmluaXRNYXhNYXJnaW5WYWx1
ZXMpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJEZXByZWNhdGVkRmxleGlibGVCb3guY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94OjpsYXlvdXRC
bG9jayk6CisgICAgICAgICogcmVuZGVyaW5nL1JlbmRlclRhYmxlLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRhYmxlOjpsYXlvdXQpOgorCiAyMDEzLTA5LTA5ICBUaGlhZ28gZGUgQmFy
cm9zIExhY2VyZGEgIDx0aGlhZ28ubGFjZXJkYUBvcGVuYm9zc2Eub3JnPgogCiAgICAgICAgIFtC
dWcgRml4XSBDYWxsaW5nIG1fYXVkaW9Db21wb25lbnRzLnJlbW92ZSBpbiByZW1vdmVBdWRpb0Nv
bXBvbmVudCAoTWVkaWFTdHJlYW1EZXNjcmlwdG9yKQpJbmRleDogU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckJsb2NrLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2suY3BwCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NCwxMyArOTQs
NiBAQCBzdHJ1Y3QgU2FtZVNpemVBc0Zsb2F0aW5nT2JqZWN0IHsKICAgICB1aW50MzJfdCBiaXRm
aWVsZHMgOiA4OwogfTsKIAotQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrOjpNYXJn
aW5WYWx1ZXMpID09IHNpemVvZihMYXlvdXRVbml0WzRdKSwgTWFyZ2luVmFsdWVzX3Nob3VsZF9z
dGF5X3NtYWxsKTsKLQotc3RydWN0IFNhbWVTaXplQXNNYXJnaW5JbmZvIHsKLSAgICB1aW50MzJf
dCBiaXRmaWVsZHMgOiAxNjsKLSAgICBMYXlvdXRVbml0IG1hcmdpbnNbMl07Ci19OwotCiB0eXBl
ZGVmIFdURjo6SGFzaE1hcDxjb25zdCBSZW5kZXJCb3gqLCBPd25QdHI8Q29sdW1uSW5mbz4gPiBD
b2x1bW5JbmZvTWFwOwogc3RhdGljIENvbHVtbkluZm9NYXAqIGdDb2x1bW5JbmZvTWFwID0gMDsK
IApAQCAtMTU4LDM5ICsxNTEsNiBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9oYWRWZXJ0aWNhbExh
eW91dE92ZXJmbG93OwogfTsKIAotLy8gT3VyIE1hcmdpbkluZm8gc3RhdGUgdXNlZCB3aGVuIGxh
eWluZyBvdXQgYmxvY2sgY2hpbGRyZW4uCi1SZW5kZXJCbG9jazo6TWFyZ2luSW5mbzo6TWFyZ2lu
SW5mbyhSZW5kZXJCbG9jayogYmxvY2ssIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywg
TGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpCi0gICAgOiBtX2F0QmVmb3JlU2lkZU9mQmxv
Y2sodHJ1ZSkKLSAgICAsIG1fYXRBZnRlclNpZGVPZkJsb2NrKGZhbHNlKQotICAgICwgbV9oYXNN
YXJnaW5CZWZvcmVRdWlyayhmYWxzZSkKLSAgICAsIG1faGFzTWFyZ2luQWZ0ZXJRdWlyayhmYWxz
ZSkKLSAgICAsIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKGZhbHNlKQotICAgICwgbV9k
aXNjYXJkTWFyZ2luKGZhbHNlKQotewotICAgIFJlbmRlclN0eWxlKiBibG9ja1N0eWxlID0gYmxv
Y2stPnN0eWxlKCk7Ci0gICAgQVNTRVJUKGJsb2NrLT5pc1JlbmRlclZpZXcoKSB8fCBibG9jay0+
cGFyZW50KCkpOwotICAgIG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4gPSAhYmxvY2stPmlzUmVu
ZGVyVmlldygpICYmICFibG9jay0+aXNSb290KCkgJiYgIWJsb2NrLT5pc091dE9mRmxvd1Bvc2l0
aW9uZWQoKQotICAgICAgICAmJiAhYmxvY2stPmlzRmxvYXRpbmcoKSAmJiAhYmxvY2stPmlzVGFi
bGVDZWxsKCkgJiYgIWJsb2NrLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhYmxvY2stPmlzSW5saW5l
QmxvY2tPcklubGluZVRhYmxlKCkKLSAgICAgICAgJiYgIWJsb2NrLT5pc1JlbmRlckZsb3dUaHJl
YWQoKSAmJiAhYmxvY2stPmlzV3JpdGluZ01vZGVSb290KCkgJiYgIWJsb2NrLT5wYXJlbnQoKS0+
aXNGbGV4aWJsZUJveCgpCi0gICAgICAgICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5Db3Vu
dCgpICYmIGJsb2NrU3R5bGUtPmhhc0F1dG9Db2x1bW5XaWR0aCgpICYmICFibG9ja1N0eWxlLT5j
b2x1bW5TcGFuKCk7Ci0KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVu
ID0gbV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiAmJiAhYmVmb3JlQm9yZGVyUGFkZGluZyAmJiBi
bG9ja1N0eWxlLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKLQotICAgIC8v
IElmIGFueSBoZWlnaHQgb3RoZXIgdGhhbiBhdXRvIGlzIHNwZWNpZmllZCBpbiBDU1MsIHRoZW4g
d2UgZG9uJ3QgY29sbGFwc2Ugb3VyIGJvdHRvbQotICAgIC8vIG1hcmdpbnMgd2l0aCBvdXIgY2hp
bGRyZW4ncyBtYXJnaW5zLiAgVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZp
c3VhbAotICAgIC8vIGVmZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRo
ZSBwYXJlbnQgYmxvY2sgYW5kIHlldCBzdGlsbCBjb2xsYXBzZQotICAgIC8vIHdpdGggaXQuICBX
ZSBhbHNvIGRvbid0IGNvbGxhcHNlIGlmIHdlIGhhdmUgYW55IGJvdHRvbSBib3JkZXIvcGFkZGlu
Zy4KLSAgICBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4gPSBtX2NhbkNvbGxh
cHNlV2l0aENoaWxkcmVuICYmIChhZnRlckJvcmRlclBhZGRpbmcgPT0gMCkgJiYKLSAgICAgICAg
KGJsb2NrU3R5bGUtPmxvZ2ljYWxIZWlnaHQoKS5pc0F1dG8oKSAmJiAhYmxvY2tTdHlsZS0+bG9n
aWNhbEhlaWdodCgpLnZhbHVlKCkpICYmIGJsb2NrU3R5bGUtPm1hcmdpbkFmdGVyQ29sbGFwc2Uo
KSAhPSBNU0VQQVJBVEU7Ci0gICAgCi0gICAgbV9xdWlya0NvbnRhaW5lciA9IGJsb2NrLT5pc1Rh
YmxlQ2VsbCgpIHx8IGJsb2NrLT5pc0JvZHkoKTsKLQotICAgIG1fZGlzY2FyZE1hcmdpbiA9IG1f
Y2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgYmxvY2stPm11c3REaXNjYXJk
TWFyZ2luQmVmb3JlKCk7Ci0KLSAgICBtX3Bvc2l0aXZlTWFyZ2luID0gKG1fY2FuQ29sbGFwc2VN
YXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4gJiYgIWJsb2NrLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZSgpKSA/IGJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIDogTGF5b3V0VW5pdCgpOwot
ICAgIG1fbmVnYXRpdmVNYXJnaW4gPSAobV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGls
ZHJlbiAmJiAhYmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkpID8gYmxvY2stPm1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7Ci19Ci0KIC8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVuZGVyQmxvY2s6OlJlbmRl
ckJsb2NrKEVsZW1lbnQqIGVsZW1lbnQpCkBAIC0yMDQsNyArMTY0LDYgQEAgUmVuZGVyQmxvY2s6
OlJlbmRlckJsb2NrKEVsZW1lbnQqIGVsZW1lbgogewogICAgIHNldENoaWxkcmVuSW5saW5lKHRy
dWUpOwogICAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihSZW5kZXJCbG9jazo6RmxvYXRpbmdPYmpl
Y3QpID09IHNpemVvZihTYW1lU2l6ZUFzRmxvYXRpbmdPYmplY3QpLCBGbG9hdGluZ09iamVjdF9z
aG91bGRfc3RheV9zbWFsbCk7Ci0gICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2Nr
OjpNYXJnaW5JbmZvKSA9PSBzaXplb2YoU2FtZVNpemVBc01hcmdpbkluZm8pLCBNYXJnaW5JbmZv
X3Nob3VsZF9zdGF5X3NtYWxsKTsKIH0KIAogc3RhdGljIHZvaWQgcmVtb3ZlQmxvY2tGcm9tRGVz
Y2VuZGFudEFuZENvbnRhaW5lck1hcHMoUmVuZGVyQmxvY2sqIGJsb2NrLCBUcmFja2VkRGVzY2Vu
ZGFudHNNYXAqJiBkZXNjZW5kYW50TWFwLCBUcmFja2VkQ29udGFpbmVyTWFwKiYgY29udGFpbmVy
TWFwKQpAQCAtMTc3Niw1MSArMTczNSw2IEBAIGJvb2wgUmVuZGVyQmxvY2s6OmV4cGFuZHNUb0Vu
Y2xvc2VPdmVyaGEKICAgICAgICAgICAgfHwgaGFzQ29sdW1ucygpIHx8IGlzVGFibGVDZWxsKCkg
fHwgaXNUYWJsZUNhcHRpb24oKSB8fCBpc0ZpZWxkc2V0KCkgfHwgaXNXcml0aW5nTW9kZVJvb3Qo
KSB8fCBpc1Jvb3QoKTsKIH0KIAotdm9pZCBSZW5kZXJCbG9jazo6YWRqdXN0UG9zaXRpb25lZEJs
b2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0g
ICAgYm9vbCBpc0hvcml6b250YWwgPSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpOwotICAgIGJv
b2wgaGFzU3RhdGljQmxvY2tQb3NpdGlvbiA9IGNoaWxkLT5zdHlsZSgpLT5oYXNTdGF0aWNCbG9j
a1Bvc2l0aW9uKGlzSG9yaXpvbnRhbCk7Ci0gICAgCi0gICAgTGF5b3V0VW5pdCBsb2dpY2FsVG9w
ID0gbG9naWNhbEhlaWdodCgpOwotICAgIHVwZGF0ZVN0YXRpY0lubGluZVBvc2l0aW9uRm9yQ2hp
bGQoY2hpbGQsIGxvZ2ljYWxUb3ApOwotCi0gICAgaWYgKCFtYXJnaW5JbmZvLmNhbkNvbGxhcHNl
V2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIC8vIFBvc2l0aW9uZWQgYmxvY2tzIGRvbid0
IGNvbGxhcHNlIG1hcmdpbnMsIHNvIGFkZCB0aGUgbWFyZ2luIHByb3ZpZGVkIGJ5Ci0gICAgICAg
IC8vIHRoZSBjb250YWluZXIgbm93LiBUaGUgY2hpbGQncyBvd24gbWFyZ2luIGlzIGFkZGVkIGxh
dGVyIHdoZW4gY2FsY3VsYXRpbmcgaXRzIGxvZ2ljYWwgdG9wLgotICAgICAgICBMYXlvdXRVbml0
IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1hcmdpbkluZm8ucG9zaXRpdmVNYXJnaW4oKTsKLSAgICAg
ICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVOZWcgPSBtYXJnaW5JbmZvLm5lZ2F0aXZlTWFy
Z2luKCk7Ci0gICAgICAgIGxvZ2ljYWxUb3AgKz0gY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFw
c2VkQmVmb3JlTmVnOwotICAgIH0KLSAgICAKLSAgICBSZW5kZXJMYXllciogY2hpbGRMYXllciA9
IGNoaWxkLT5sYXllcigpOwotICAgIGlmIChjaGlsZExheWVyLT5zdGF0aWNCbG9ja1Bvc2l0aW9u
KCkgIT0gbG9naWNhbFRvcCkgewotICAgICAgICBjaGlsZExheWVyLT5zZXRTdGF0aWNCbG9ja1Bv
c2l0aW9uKGxvZ2ljYWxUb3ApOwotICAgICAgICBpZiAoaGFzU3RhdGljQmxvY2tQb3NpdGlvbikK
LSAgICAgICAgICAgIGNoaWxkLT5zZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhp
cyk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlckJsb2NrOjphZGp1c3RGbG9hdGluZ0Jsb2NrKGNv
bnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gVGhlIGZsb2F0IHNob3VsZCBi
ZSBwb3NpdGlvbmVkIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGJvdHRvbSBtYXJnaW4KLSAgICAv
LyBvZiB0aGUgcHJldmlvdXMgZmxvdy4gIFdlIGFkZCB0aGF0IG1hcmdpbiBpbnRvIHRoZSBoZWln
aHQsIGdldCB0aGUKLSAgICAvLyBmbG9hdCBwb3NpdGlvbmVkIHByb3Blcmx5LCBhbmQgdGhlbiBz
dWJ0cmFjdCB0aGUgbWFyZ2luIG91dCBvZiB0aGUKLSAgICAvLyBoZWlnaHQgYWdhaW4uICBJbiB0
aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCB3ZSBhbHdheXMganVzdAotICAgIC8v
IHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sgY29s
bGFwc2VkIGl0cwotICAgIC8vIG93biBib3R0b20gbWFyZ2luIGludG8gaXRzIHRvcCBtYXJnaW4u
Ci0gICAgLy8KLSAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGUgcHJldmlvdXMgZmxvdyBtYXkgY29s
bGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YKLSAgICAvLyBvdXIgYmxvY2suICBJZiB0
aGlzIGlzIHRoZSBjYXNlLCB0aGVuIHdlIGRvIG5vdCBhZGQgdGhlIG1hcmdpbiBpbiB0byBvdXIK
LSAgICAvLyBoZWlnaHQgd2hlbiBjb21wdXRpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdC4g
ICBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCi0gICAgLy8gZm9yIGJ5IHNpbXBseSBjYWxs
aW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4gIFNlZQotICAgIC8vIGh0dHA6Ly93d3cu
aGl4aWUuY2gvdGVzdHMvYWRob2MvY3NzL2JveC9ibG9jay9tYXJnaW4tY29sbGFwc2UvMDQ2Lmh0
bWwgZm9yCi0gICAgLy8gYW4gZXhhbXBsZSBvZiB0aGlzIHNjZW5hcmlvLgotICAgIExheW91dFVu
aXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUo
KSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0gICAgc2V0TG9naWNhbEhl
aWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5PZmZzZXQpOwotICAgIHBvc2l0aW9uTmV3Rmxv
YXRzKCk7Ci0gICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgLSBtYXJnaW5PZmZz
ZXQpOwotfQotCiBzdGF0aWMgdm9pZCBkZXN0cm95UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3Qq
IHJ1bkluKQogewogICAgIEFTU0VSVChydW5Jbi0+aXNSdW5JbigpKTsKQEAgLTE5NTksMzI1ICsx
ODczLDYgQEAgdm9pZCBSZW5kZXJCbG9jazo6bW92ZVJ1bkluVG9PcmlnaW5hbFBvcwogICAgIHBh
cmVudCgpLT5zZXROZWVkc0xheW91dEFuZFByZWZXaWR0aHNSZWNhbGMoKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6Y29sbGFwc2VNYXJnaW5zKFJlbmRlckJveCogY2hpbGQsIE1hcmdp
bkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUg
PSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICBib29sIGNoaWxk
RGlzY2FyZE1hcmdpbkFmdGVyID0gbXVzdERpc2NhcmRNYXJnaW5BZnRlckZvckNoaWxkKGNoaWxk
KTsKLSAgICBib29sIGNoaWxkSXNTZWxmQ29sbGFwc2luZyA9IGNoaWxkLT5pc1NlbGZDb2xsYXBz
aW5nQmxvY2soKTsKLQotICAgIC8vIFRoZSBjaGlsZCBkaXNjYXJkcyB0aGUgYmVmb3JlIG1hcmdp
biB3aGVuIHRoZSB0aGUgYWZ0ZXIgbWFyZ2luIGhhcyBkaXNjYXJkIGluIHRoZSBjYXNlIG9mIGEg
c2VsZiBjb2xsYXBzaW5nIGJsb2NrLgotICAgIGNoaWxkRGlzY2FyZE1hcmdpbkJlZm9yZSA9IGNo
aWxkRGlzY2FyZE1hcmdpbkJlZm9yZSB8fCAoY2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIgJiYgY2hp
bGRJc1NlbGZDb2xsYXBzaW5nKTsKLQotICAgIC8vIEdldCB0aGUgZm91ciBtYXJnaW4gdmFsdWVz
IGZvciB0aGUgY2hpbGQgYW5kIGNhY2hlIHRoZW0uCi0gICAgY29uc3QgTWFyZ2luVmFsdWVzIGNo
aWxkTWFyZ2lucyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKLQotICAgIC8vIEdldCBv
dXIgbWF4IHBvcyBhbmQgbmVnIHRvcCBtYXJnaW5zLgotICAgIExheW91dFVuaXQgcG9zVG9wID0g
Y2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBuZWdU
b3AgPSBjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLQotICAgIC8vIEZvciBz
ZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCBjb2xsYXBzZSBvdXIgYm90dG9tIG1hcmdpbnMgaW50byBv
dXIKLSAgICAvLyB0b3AgdG8gZ2V0IG5ldyBwb3NUb3AgYW5kIG5lZ1RvcCB2YWx1ZXMuCi0gICAg
aWYgKGNoaWxkSXNTZWxmQ29sbGFwc2luZykgewotICAgICAgICBwb3NUb3AgPSBtYXgocG9zVG9w
LCBjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgbmVnVG9wID0g
bWF4KG5lZ1RvcCwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0gICAgfQot
ICAgIAotICAgIC8vIFNlZSBpZiB0aGUgdG9wIG1hcmdpbiBpcyBxdWlya3kuIFdlIG9ubHkgY2Fy
ZSBpZiB0aGlzIGNoaWxkIGhhcwotICAgIC8vIG1hcmdpbnMgdGhhdCB3aWxsIGNvbGxhcHNlIHdp
dGggdXMuCi0gICAgYm9vbCB0b3BRdWlyayA9IGhhc01hcmdpbkJlZm9yZVF1aXJrKGNoaWxkKTsK
LQotICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0g
ICAgICAgIGlmICghY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSkgewotICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCBpcyBjb2xsYXBzaW5nIHdp
dGggdGhlIHRvcCBvZiB0aGUKLSAgICAgICAgICAgIC8vIGJsb2NrLiBJZiBpdCBoYXMgbGFyZ2Vy
IG1hcmdpbiB2YWx1ZXMsIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUKLSAgICAgICAgICAgIC8vIG91
ciBvd24gbWF4aW1hbCB2YWx1ZXMuCi0gICAgICAgICAgICBpZiAoIWRvY3VtZW50KCkuaW5RdWly
a3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhdG9wUXVpcmspCi0g
ICAgICAgICAgICAgICAgc2V0TWF4TWFyZ2luQmVmb3JlVmFsdWVzKG1heChwb3NUb3AsIG1heFBv
c2l0aXZlTWFyZ2luQmVmb3JlKCkpLCBtYXgobmVnVG9wLCBtYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpKSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBtaW51dGUgYW55IG9mIHRoZSBtYXJnaW5zIGlu
dm9sdmVkIGlzbid0IGEgcXVpcmssIGRvbid0Ci0gICAgICAgICAgICAvLyBjb2xsYXBzZSBpdCBh
d2F5LCBldmVuIGlmIHRoZSBtYXJnaW4gaXMgc21hbGxlciAod3d3LndlYnJlZmVyZW5jZS5jb20K
LSAgICAgICAgICAgIC8vIGhhcyBhbiBleGFtcGxlIG9mIHRoaXMsIGEgPGR0PiB3aXRoIDAuOGVt
IGF1dGhvci1zcGVjaWZpZWQgaW5zaWRlCi0gICAgICAgICAgICAvLyBhIDxkbD4gaW5zaWRlIGEg
PHRkPi4KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiAhdG9wUXVpcmsgJiYgKHBvc1RvcCAtIG5lZ1RvcCkpIHsKLSAgICAgICAgICAg
ICAgICBzZXRIYXNNYXJnaW5CZWZvcmVRdWlyayhmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXREZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgICAg
ICB9Ci0KLSAgICAgICAgICAgIGlmICghbWFyZ2luSW5mby5kZXRlcm1pbmVkTWFyZ2luQmVmb3Jl
UXVpcmsoKSAmJiB0b3BRdWlyayAmJiAhbWFyZ2luQmVmb3JlKCkpCi0gICAgICAgICAgICAgICAg
Ly8gV2UgaGF2ZSBubyB0b3AgbWFyZ2luIGFuZCBvdXIgdG9wIGNoaWxkIGhhcyBhIHF1aXJreSBt
YXJnaW4uCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMgcXVpcmt5IG1h
cmdpbiBhbmQgcGFzcyBpdCB0aHJvdWdoLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMg
d2l0aCB0aGUgPHRkPjxkaXY+PHA+IGNhc2UuCi0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgZG8g
dGhpcyBmb3IgYSBibG9jayB0aGF0IHNwbGl0IHR3byBpbmxpbmVzIHRob3VnaC4gWW91IGRvCi0g
ICAgICAgICAgICAgICAgLy8gc3RpbGwgYXBwbHkgbWFyZ2lucyBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgICAgICAgICAgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsodHJ1ZSk7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgLy8gVGhlIGJlZm9yZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB3aWxs
IGFsc28gZGlzY2FyZCBhbGwgdGhlIG1hcmdpbnMgaXQgaXMgY29sbGFwc2luZyB3aXRoLgotICAg
ICAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKTsKLSAgICB9Ci0KLSAgICAvLyBP
bmNlIHdlIGZpbmQgYSBjaGlsZCB3aXRoIGRpc2NhcmRNYXJnaW5CZWZvcmUgYWxsIHRoZSBtYXJn
aW5zIGNvbGxhcHNpbmcgd2l0aCB1cyBtdXN0IGFsc28gZGlzY2FyZC4gCi0gICAgaWYgKGNoaWxk
RGlzY2FyZE1hcmdpbkJlZm9yZSkgewotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJn
aW4odHJ1ZSk7Ci0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICB9Ci0KLSAg
ICBpZiAobWFyZ2luSW5mby5xdWlya0NvbnRhaW5lcigpICYmIG1hcmdpbkluZm8uYXRCZWZvcmVT
aWRlT2ZCbG9jaygpICYmIChwb3NUb3AgLSBuZWdUb3ApKQotICAgICAgICBtYXJnaW5JbmZvLnNl
dEhhc01hcmdpbkJlZm9yZVF1aXJrKHRvcFF1aXJrKTsKLQotICAgIExheW91dFVuaXQgYmVmb3Jl
Q29sbGFwc2VMb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOwotICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcCA9IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcDsKLSAgICBpZiAoY2hpbGRJc1NlbGZD
b2xsYXBzaW5nKSB7Ci0gICAgICAgIC8vIEZvciBhIHNlbGYgY29sbGFwc2luZyBibG9jayBib3Ro
IHRoZSBiZWZvcmUgYW5kIGFmdGVyIG1hcmdpbnMgZ2V0IGRpc2NhcmRlZC4gVGhlIGJsb2NrIGRv
ZXNuJ3QgY29udHJpYnV0ZSBhbnl0aGluZyB0byB0aGUgaGVpZ2h0IG9mIHRoZSBibG9jay4KLSAg
ICAgICAgLy8gQWxzbywgdGhlIGNoaWxkJ3MgdG9wIHBvc2l0aW9uIGVxdWFscyB0aGUgbG9naWNh
bCBoZWlnaHQgb2YgdGhlIGNvbnRhaW5lci4KLSAgICAgICAgaWYgKCFjaGlsZERpc2NhcmRNYXJn
aW5CZWZvcmUgJiYgIW1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpKSB7Ci0gICAgICAgICAgICAv
LyBUaGlzIGNoaWxkIGhhcyBubyBoZWlnaHQuIFdlIG5lZWQgdG8gY29tcHV0ZSBvdXIKLSAgICAg
ICAgICAgIC8vIHBvc2l0aW9uIGJlZm9yZSB3ZSBjb2xsYXBzZSB0aGUgY2hpbGQncyBtYXJnaW5z
IHRvZ2V0aGVyLAotICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gZ2V0IGFuIGFjY3VyYXRl
IHBvc2l0aW9uIGZvciB0aGUgemVyby1oZWlnaHQgYmxvY2suCi0gICAgICAgICAgICBMYXlvdXRV
bml0IGNvbGxhcHNlZEJlZm9yZVBvcyA9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCks
IGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIExheW91
dFVuaXQgY29sbGFwc2VkQmVmb3JlTmVnID0gbWF4KG1hcmdpbkluZm8ubmVnYXRpdmVNYXJnaW4o
KSwgY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkpOwotICAgICAgICAgICAgbWFy
Z2luSW5mby5zZXRNYXJnaW4oY29sbGFwc2VkQmVmb3JlUG9zLCBjb2xsYXBzZWRCZWZvcmVOZWcp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBOb3cgY29sbGFwc2UgdGhlIGNoaWxkJ3Mg
bWFyZ2lucyB0b2dldGhlciwgd2hpY2ggbWVhbnMgZXhhbWluaW5nIG91cgotICAgICAgICAgICAg
Ly8gYm90dG9tIG1hcmdpbiB2YWx1ZXMgYXMgd2VsbC4gCi0gICAgICAgICAgICBtYXJnaW5JbmZv
LnNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIoY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQWZ0
ZXIoKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ2F0aXZlTWFyZ2luSWZMYXJnZXIo
Y2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSk7Ci0KLSAgICAgICAgICAgIGlmICgh
bWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSkKLSAgICAgICAgICAgICAg
ICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VsZi1j
b2xsYXBzaW5nIGJsb2NrCi0gICAgICAgICAgICAgICAgLy8gaXMgY29ycmVjdCwgc2luY2UgaXQg
Y291bGQgaGF2ZSBvdmVyZmxvd2luZyBjb250ZW50Ci0gICAgICAgICAgICAgICAgLy8gdGhhdCBu
ZWVkcyB0byBiZSBwb3NpdGlvbmVkIGNvcnJlY3RseSAoZS5nLiwgYSBibG9jayB0aGF0Ci0gICAg
ICAgICAgICAgICAgLy8gaGFkIGEgc3BlY2lmaWVkIGhlaWdodCBvZiAwIGJ1dCB0aGF0IGFjdHVh
bGx5IGhhZCBzdWJjb250ZW50KS4KLSAgICAgICAgICAgICAgICBsb2dpY2FsVG9wID0gbG9naWNh
bEhlaWdodCgpICsgY29sbGFwc2VkQmVmb3JlUG9zIC0gY29sbGFwc2VkQmVmb3JlTmVnOwotICAg
ICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSkgewotICAgICAgICAgICAgQVNTRVJUKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSB8fCAobWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgJiYgIW1hcmdpbkluZm8u
bWFyZ2luKCkpKTsKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBhdCB0aGUgYmVmb3JlIHNpZGUg
b2YgdGhlIGJsb2NrIGFuZCB3ZSBjb2xsYXBzZSwgaWdub3JlIHRoZSBjb21wdXRlZCBtYXJnaW4K
LSAgICAgICAgICAgIC8vIGFuZCBqdXN0IGFkZCB0aGUgY2hpbGQgbWFyZ2luIHRvIHRoZSBjb250
YWluZXIgaGVpZ2h0LiBUaGlzIHdpbGwgY29ycmVjdGx5IHBvc2l0aW9uCi0gICAgICAgICAgICAv
LyB0aGUgY2hpbGQgaW5zaWRlIHRoZSBjb250YWluZXIuCi0gICAgICAgICAgICBMYXlvdXRVbml0
IHNlcGFyYXRlTWFyZ2luID0gIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3Jl
KCkgPyBtYXJnaW5JbmZvLm1hcmdpbigpIDogTGF5b3V0VW5pdCgwKTsKLSAgICAgICAgICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgc2VwYXJhdGVNYXJnaW4gKyBtYXJnaW5C
ZWZvcmVGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxI
ZWlnaHQoKTsKLSAgICAgICAgfSBlbHNlIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkg
JiYgKCFtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKQotICAgICAgICAgICAgfHwgKCFt
YXJnaW5JbmZvLmNhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuKCkKLSAgICAgICAg
ICAgICYmICghZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSB8fCAhbWFyZ2luSW5mby5xdWlya0Nv
bnRhaW5lcigpIHx8ICFtYXJnaW5JbmZvLmhhc01hcmdpbkJlZm9yZVF1aXJrKCkpKSkpIHsKLSAg
ICAgICAgICAgIC8vIFdlJ3JlIGNvbGxhcHNpbmcgd2l0aCBhIHByZXZpb3VzIHNpYmxpbmcncyBt
YXJnaW5zIGFuZCBub3QKLSAgICAgICAgICAgIC8vIHdpdGggdGhlIHRvcCBvZiB0aGUgYmxvY2su
Ci0gICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1heChtYXJn
aW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc1RvcCkgLSBtYXgobWFyZ2luSW5mby5uZWdhdGl2
ZU1hcmdpbigpLCBuZWdUb3ApKTsKLSAgICAgICAgICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVp
Z2h0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYXJnaW5JbmZvLnNldERpc2NhcmRNYXJnaW4o
Y2hpbGREaXNjYXJkTWFyZ2luQWZ0ZXIpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFtYXJnaW5J
bmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NpdGl2
ZU1hcmdpbihjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKTsKLSAgICAgICAgICAg
IG1hcmdpbkluZm8uc2V0TmVnYXRpdmVNYXJnaW4oY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2lu
QWZ0ZXIoKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbWFyZ2luSW5mby5jbGVhck1h
cmdpbigpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLm1hcmdpbigpKQotICAgICAgICAgICAg
bWFyZ2luSW5mby5zZXRIYXNNYXJnaW5BZnRlclF1aXJrKGhhc01hcmdpbkFmdGVyUXVpcmsoY2hp
bGQpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gSWYgbWFyZ2lucyB3b3VsZCBwdWxsIHVzIHBhc3Qg
dGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlLCB0aGVuIHdlIG5lZWQgdG8gcHVsbCBiYWNrIGFuZCBw
cmV0ZW5kIGxpa2UgdGhlIG1hcmdpbnMKLSAgICAvLyBjb2xsYXBzZWQgaW50byB0aGUgcGFnZSBl
ZGdlLgotICAgIExheW91dFN0YXRlKiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgp
OwotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFn
ZUxvZ2ljYWxIZWlnaHQoKSAmJiBsb2dpY2FsVG9wID4gYmVmb3JlQ29sbGFwc2VMb2dpY2FsVG9w
Ci0gICAgICAgICYmIGhhc05leHRQYWdlKGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCkpIHsKLSAg
ICAgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsVG9wID0gbG9naWNhbFRvcDsKLSAgICAgICAgbG9n
aWNhbFRvcCA9IG1pbihsb2dpY2FsVG9wLCBuZXh0UGFnZUxvZ2ljYWxUb3AoYmVmb3JlQ29sbGFw
c2VMb2dpY2FsVG9wKSk7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgp
ICsgKGxvZ2ljYWxUb3AgLSBvbGRMb2dpY2FsVG9wKSk7Ci0gICAgfQotCi0gICAgLy8gSWYgd2Ug
aGF2ZSBjb2xsYXBzZWQgaW50byBhIHByZXZpb3VzIHNpYmxpbmcgYW5kIHNvIHJlZHVjZWQgdGhl
IGhlaWdodCBvZiB0aGUgcGFyZW50LCBlbnN1cmUgYW55IGZsb2F0cyB0aGF0IG5vdwotICAgIC8v
IG92ZXJoYW5nIGZyb20gdGhlIHByZXZpb3VzIHNpYmxpbmcgYXJlIGFkZGVkIHRvIG91ciBwYXJl
bnQuIElmIHRoZSBjaGlsZCdzIHByZXZpb3VzIHNpYmxpbmcgaXRzZWxmIGlzIGEgZmxvYXQgdGhl
IGNoaWxkIHdpbGwgYXZvaWQKLSAgICAvLyBvciBjbGVhciBpdCBhbnl3YXksIHNvIGRvbid0IHdv
cnJ5IGFib3V0IGFueSBmbG9hdGluZyBjaGlsZHJlbiBpdCBtYXkgY29udGFpbi4KLSAgICBMYXlv
dXRVbml0IG9sZExvZ2ljYWxIZWlnaHQgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsVG9wKTsKLSAgICBSZW5kZXJPYmplY3QqIHByZXYgPSBjaGlsZC0+cHJl
dmlvdXNTaWJsaW5nKCk7Ci0gICAgaWYgKHByZXYgJiYgcHJldi0+aXNSZW5kZXJCbG9ja0Zsb3co
KSAmJiAhcHJldi0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKSB7Ci0gICAgICAg
IFJlbmRlckJsb2NrKiBibG9jayA9IHRvUmVuZGVyQmxvY2socHJldik7Ci0gICAgICAgIGlmIChi
bG9jay0+Y29udGFpbnNGbG9hdHMoKSAmJiAhYmxvY2stPmF2b2lkc0Zsb2F0cygpICYmIChibG9j
ay0+bG9naWNhbFRvcCgpICsgYmxvY2stPmxvd2VzdEZsb2F0TG9naWNhbEJvdHRvbSgpKSA+IGxv
Z2ljYWxUb3ApIAotICAgICAgICAgICAgYWRkT3ZlcmhhbmdpbmdGbG9hdHMoYmxvY2ssIGZhbHNl
KTsKLSAgICB9Ci0gICAgc2V0TG9naWNhbEhlaWdodChvbGRMb2dpY2FsSGVpZ2h0KTsKLQotICAg
IHJldHVybiBsb2dpY2FsVG9wOwotfQotCi1MYXlvdXRVbml0IFJlbmRlckJsb2NrOjpjbGVhckZs
b2F0c0lmTmVlZGVkKFJlbmRlckJveCogY2hpbGQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExh
eW91dFVuaXQgb2xkVG9wUG9zTWFyZ2luLCBMYXlvdXRVbml0IG9sZFRvcE5lZ01hcmdpbiwgTGF5
b3V0VW5pdCB5UG9zKQotewotICAgIExheW91dFVuaXQgaGVpZ2h0SW5jcmVhc2UgPSBnZXRDbGVh
ckRlbHRhKGNoaWxkLCB5UG9zKTsKLSAgICBpZiAoIWhlaWdodEluY3JlYXNlKQotICAgICAgICBy
ZXR1cm4geVBvczsKLQotICAgIGlmIChjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkpIHsK
LSAgICAgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW4gPSBtdXN0RGlzY2FyZE1hcmdpbkJlZm9y
ZUZvckNoaWxkKGNoaWxkKSB8fCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY2hpbGQp
OwotCi0gICAgICAgIC8vIEZvciBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzIHRoYXQgY2xlYXIsIHRo
ZXkgY2FuIHN0aWxsIGNvbGxhcHNlIHRoZWlyCi0gICAgICAgIC8vIG1hcmdpbnMgd2l0aCBmb2xs
b3dpbmcgc2libGluZ3MuICBSZXNldCB0aGUgY3VycmVudCBtYXJnaW5zIHRvIHJlcHJlc2VudAot
ICAgICAgICAvLyB0aGUgc2VsZi1jb2xsYXBzaW5nIGJsb2NrJ3MgbWFyZ2lucyBvbmx5LgotICAg
ICAgICAvLyBJZiBESVNDQVJEIGlzIHNwZWNpZmllZCBmb3IgLXdlYmtpdC1tYXJnaW4tY29sbGFw
c2UsIHJlc2V0IHRoZSBtYXJnaW4gdmFsdWVzLgotICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1h
cmdpbikgewotICAgICAgICAgICAgTWFyZ2luVmFsdWVzIGNoaWxkTWFyZ2lucyA9IG1hcmdpblZh
bHVlc0ZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVN
YXJnaW4obWF4KGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpLCBjaGlsZE1hcmdp
bnMucG9zaXRpdmVNYXJnaW5BZnRlcigpKSk7Ci0gICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5l
Z2F0aXZlTWFyZ2luKG1heChjaGlsZE1hcmdpbnMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSwgY2hp
bGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSkpOwotICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLSAgICAgICAgbWFyZ2luSW5mby5zZXRE
aXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbik7Ci0KLSAgICAgICAgLy8gQ1NTMi4xIHN0
YXRlczoKLSAgICAgICAgLy8gIklmIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIG9mIGFuIGVs
ZW1lbnQgd2l0aCBjbGVhcmFuY2UgYXJlIGFkam9pbmluZywgaXRzIG1hcmdpbnMgY29sbGFwc2Ug
d2l0aCAKLSAgICAgICAgLy8gdGhlIGFkam9pbmluZyBtYXJnaW5zIG9mIGZvbGxvd2luZyBzaWJs
aW5ncyBidXQgdGhhdCByZXN1bHRpbmcgbWFyZ2luIGRvZXMgbm90IGNvbGxhcHNlIHdpdGggdGhl
IGJvdHRvbSBtYXJnaW4gb2YgdGhlIHBhcmVudCBibG9jay4iCi0gICAgICAgIC8vIFNvIHRoZSBw
YXJlbnQncyBib3R0b20gbWFyZ2luIGNhbm5vdCBjb2xsYXBzZSB0aHJvdWdoIHRoaXMgYmxvY2sg
b3IgYW55IHN1YnNlcXVlbnQgc2VsZi1jb2xsYXBzaW5nIGJsb2Nrcy4gQ2hlY2sgc3Vic2VxdWVu
dCBzaWJsaW5ncwotICAgICAgICAvLyBmb3IgYSBibG9jayB3aXRoIGhlaWdodCAtIGlmIG5vbmUg
aXMgZm91bmQgdGhlbiBkb24ndCBhbGxvdyB0aGUgbWFyZ2lucyB0byBjb2xsYXBzZSB3aXRoIHRo
ZSBwYXJlbnQuCi0gICAgICAgIGJvb2wgd291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50ID0g
bWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKCk7Ci0gICAgICAg
IGZvciAoUmVuZGVyQm94KiBjdXJyID0gY2hpbGQtPm5leHRTaWJsaW5nQm94KCk7IGN1cnIgJiYg
d291bGRDb2xsYXBzZU1hcmdpbnNXaXRoUGFyZW50OyBjdXJyID0gY3Vyci0+bmV4dFNpYmxpbmdC
b3goKSkgewotICAgICAgICAgICAgaWYgKCFjdXJyLT5pc0Zsb2F0aW5nT3JPdXRPZkZsb3dQb3Np
dGlvbmVkKCkgJiYgIWN1cnItPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICAgICAg
ICAgIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IGZhbHNlOwotICAgICAgICB9Ci0g
ICAgICAgIGlmICh3b3VsZENvbGxhcHNlTWFyZ2luc1dpdGhQYXJlbnQpCi0gICAgICAgICAgICBt
YXJnaW5JbmZvLnNldENhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRyZW4oZmFsc2UpOwot
Ci0gICAgICAgIC8vIENTUzIuMTogInRoZSBhbW91bnQgb2YgY2xlYXJhbmNlIGlzIHNldCBzbyB0
aGF0IGNsZWFyYW5jZSArIG1hcmdpbi10b3AgPSBbaGVpZ2h0IG9mIGZsb2F0XSwgaS5lLiwgY2xl
YXJhbmNlID0gW2hlaWdodCBvZiBmbG9hdF0gLSBtYXJnaW4tdG9wIgotICAgICAgICAvLyBNb3Zl
IHRoZSB0b3Agb2YgdGhlIGNoaWxkIGJveCB0byB0aGUgYm90dG9tIG9mIHRoZSBmbG9hdCBpZ25v
cmluZyB0aGUgY2hpbGQncyB0b3AgbWFyZ2luLgotICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNl
ZE1hcmdpbiA9IGNvbGxhcHNlZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
c2V0TG9naWNhbEhlaWdodChjaGlsZC0+bG9naWNhbFRvcCgpIC0gY29sbGFwc2VkTWFyZ2luKTsK
LSAgICAgICAgLy8gQSBuZWdhdGl2ZSBjb2xsYXBzZWQgbWFyZ2luLXRvcCB2YWx1ZSBjYW5jZWxz
IGl0c2VsZiBvdXQgYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBmYWN0b3JlZCBpbnRvIHx5UG9zfCBh
Ym92ZS4KLSAgICAgICAgaGVpZ2h0SW5jcmVhc2UgLT0gbWF4KExheW91dFVuaXQoKSwgY29sbGFw
c2VkTWFyZ2luKTsKLSAgICB9IGVsc2UKLSAgICAgICAgLy8gSW5jcmVhc2Ugb3VyIGhlaWdodCBi
eSB0aGUgYW1vdW50IHdlIGhhZCB0byBjbGVhci4KLSAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBoZWlnaHRJbmNyZWFzZSk7Ci0gICAgCi0gICAgaWYgKG1hcmdpbklu
Zm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKLSAgICAgICAgLy8gV2UgY2FuIG5v
IGxvbmdlciBjb2xsYXBzZSB3aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrIHNpbmNlIGEgY2xlYXIK
LSAgICAgICAgLy8gb2NjdXJyZWQuICBUaGUgZW1wdHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhl
IGNsZWFyZWQgYmxvY2suCi0gICAgICAgIC8vIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJl
Y3QuICBOZWVkIGNsYXJpZmljYXRpb24gZm9yIHdoYXQgdG8gZG8KLSAgICAgICAgLy8gaWYgdGhl
IGhlaWdodCB0aGUgY2xlYXJlZCBibG9jayBpcyBvZmZzZXQgYnkgaXMgc21hbGxlciB0aGFuIHRo
ZQotICAgICAgICAvLyBtYXJnaW5zIGludm9sdmVkLgotICAgICAgICBzZXRNYXhNYXJnaW5CZWZv
cmVWYWx1ZXMob2xkVG9wUG9zTWFyZ2luLCBvbGRUb3BOZWdNYXJnaW4pOwotICAgICAgICBtYXJn
aW5JbmZvLnNldEF0QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgICAgIC8vIEluIGNh
c2UgdGhlIGNoaWxkIGRpc2NhcmRlZCB0aGUgYmVmb3JlIG1hcmdpbiBvZiB0aGUgYmxvY2sgd2Ug
bmVlZCB0byByZXNldCB0aGUgbXVzdERpc2NhcmRNYXJnaW5CZWZvcmUgZmxhZyB0byB0aGUgaW5p
dGlhbCB2YWx1ZS4KLSAgICAgICAgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0gICAgfQotCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wID0geVBvcyArIGhlaWdodEluY3JlYXNlOwotICAgIC8vIEFmdGVyIG1h
cmdpbiBjb2xsYXBzaW5nLCBvbmUgb2Ygb3VyIGZsb2F0cyBtYXkgbm93IGludHJ1ZGUgaW50byB0
aGUgY2hpbGQuIElmIHRoZSBjaGlsZCBkb2Vzbid0IGNvbnRhaW4gZmxvYXRzIG9mIGl0cyBvd24g
aXQKLSAgICAvLyB3b24ndCBnZXQgcGlja2VkIHVwIGZvciByZWxheW91dCBldmVuIHRob3VnaCB0
aGUgbG9naWNhbCB0b3AgZXN0aW1hdGUgd2FzIHdyb25nIC0gc28gYWRkIHRoZSBuZXdseSBpbnRy
dWRpbmcgZmxvYXQgbm93LgotICAgIGlmIChjb250YWluc0Zsb2F0cygpICYmIGNoaWxkLT5pc1Jl
bmRlckJsb2NrKCkgJiYgIXRvUmVuZGVyQmxvY2soY2hpbGQpLT5jb250YWluc0Zsb2F0cygpICYm
ICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgbG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkgPiBs
b2dpY2FsVG9wKQotICAgICAgICB0b1JlbmRlckJsb2NrKGNoaWxkKS0+YWRkSW50cnVkaW5nRmxv
YXRzKHRoaXMsIGxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yQ29udGVudCgpLCBsb2dpY2FsVG9wKTsKLQot
ICAgIHJldHVybiBsb2dpY2FsVG9wOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjptYXJnaW5CZWZv
cmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCogY2hpbGQsIExheW91dFVuaXQmIHBvc2l0aXZl
TWFyZ2luQmVmb3JlLCBMYXlvdXRVbml0JiBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgYm9vbCYgZGlz
Y2FyZE1hcmdpbkJlZm9yZSkgY29uc3QKLXsKLSAgICAvLyBHaXZlIHVwIGlmIGluIHF1aXJrcyBt
b2RlIGFuZCB3ZSdyZSBhIGJvZHkvdGFibGUgY2VsbCBhbmQgdGhlIHRvcCBtYXJnaW4gb2YgdGhl
IGNoaWxkIGJveCBpcyBxdWlya3kuCi0gICAgLy8gR2l2ZSB1cCBpZiB0aGUgY2hpbGQgc3BlY2lm
aWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlOiBzZXBhcmF0ZSB0aGF0IHByZXZlbnRzIGNvbGxh
cHNpbmcuCi0gICAgLy8gRklYTUU6IFVzZSB3cml0aW5nIG1vZGUgaW5kZXBlbmRlbnQgYWNjZXNz
b3IgZm9yIG1hcmdpbkJlZm9yZUNvbGxhcHNlLgotICAgIGlmICgoZG9jdW1lbnQoKS5pblF1aXJr
c01vZGUoKSAmJiBoYXNNYXJnaW5BZnRlclF1aXJrKGNoaWxkKSAmJiAoaXNUYWJsZUNlbGwoKSB8
fCBpc0JvZHkoKSkpIHx8IGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09
IE1TRVBBUkFURSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gVGhlIG1hcmdpbnMgYXJlIGRp
c2NhcmRlZCBieSBhIGNoaWxkIHRoYXQgc3BlY2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNl
OiBkaXNjYXJkLgotICAgIC8vIEZJWE1FOiBVc2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFj
Y2Vzc29yIGZvciBtYXJnaW5CZWZvcmVDb2xsYXBzZS4KLSAgICBpZiAoY2hpbGQtPnN0eWxlKCkt
Pm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgcG9zaXRpdmVN
YXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7Ci0gICAg
ICAgIGRpc2NhcmRNYXJnaW5CZWZvcmUgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgTGF5b3V0VW5pdCBiZWZvcmVDaGlsZE1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxk
KGNoaWxkKTsKLSAgICBwb3NpdGl2ZU1hcmdpbkJlZm9yZSA9IG1heChwb3NpdGl2ZU1hcmdpbkJl
Zm9yZSwgYmVmb3JlQ2hpbGRNYXJnaW4pOwotICAgIG5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4
KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCAtYmVmb3JlQ2hpbGRNYXJnaW4pOwotCi0gICAgaWYgKCFj
aGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVuZGVy
QmxvY2sqIGNoaWxkQmxvY2sgPSB0b1JlbmRlckJsb2NrKGNoaWxkKTsKLSAgICBpZiAoY2hpbGRC
bG9jay0+Y2hpbGRyZW5JbmxpbmUoKSB8fCBjaGlsZEJsb2NrLT5pc1dyaXRpbmdNb2RlUm9vdCgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBNYXJnaW5JbmZvIGNoaWxkTWFyZ2luSW5mbyhjaGls
ZEJsb2NrLCBjaGlsZEJsb2NrLT5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCksIGNoaWxkQmxvY2st
PmJvcmRlckFuZFBhZGRpbmdBZnRlcigpKTsKLSAgICBpZiAoIWNoaWxkTWFyZ2luSW5mby5jYW5D
b2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbigpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBSZW5kZXJCb3gqIGdyYW5kY2hpbGRCb3ggPSBjaGlsZEJsb2NrLT5maXJzdENoaWxkQm94KCk7
Ci0gICAgZm9yICggOyBncmFuZGNoaWxkQm94OyBncmFuZGNoaWxkQm94ID0gZ3JhbmRjaGlsZEJv
eC0+bmV4dFNpYmxpbmdCb3goKSkgewotICAgICAgICBpZiAoIWdyYW5kY2hpbGRCb3gtPmlzRmxv
YXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICAKLSAgICAvLyBHaXZlIHVwIGlmIHRoZXJlIGlzIGNsZWFyYW5jZSBvbiB0aGUgYm94LCBz
aW5jZSBpdCBwcm9iYWJseSB3b24ndCBjb2xsYXBzZSBpbnRvIHVzLgotICAgIGlmICghZ3JhbmRj
aGlsZEJveCB8fCBncmFuZGNoaWxkQm94LT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICAvLyBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBibG9jayBtYXJn
aW5zIG5vdyBmb3IgdGhlIGdyYW5kY2hpbGQgYm94IHNvIHRoYXQgd2UncmUgbG9va2luZyBhdCBj
dXJyZW50IHZhbHVlcy4KLSAgICBpZiAoZ3JhbmRjaGlsZEJveC0+bmVlZHNMYXlvdXQoKSkgewot
ICAgICAgICBncmFuZGNoaWxkQm94LT5jb21wdXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5z
KHRoaXMpOwotICAgICAgICBpZiAoZ3JhbmRjaGlsZEJveC0+aXNSZW5kZXJCbG9jaygpKSB7Ci0g
ICAgICAgICAgICBSZW5kZXJCbG9jayogZ3JhbmRjaGlsZEJsb2NrID0gdG9SZW5kZXJCbG9jayhn
cmFuZGNoaWxkQm94KTsKLSAgICAgICAgICAgIGdyYW5kY2hpbGRCbG9jay0+c2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoZ3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQmVmb3JlUXVpcmso
KSk7Ci0gICAgICAgICAgICBncmFuZGNoaWxkQmxvY2stPnNldEhhc01hcmdpbkFmdGVyUXVpcmso
Z3JhbmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQWZ0ZXJRdWlyaygpKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIC8vIENvbGxhcHNlIHRoZSBtYXJnaW4gb2YgdGhlIGdyYW5kY2hpbGQg
Ym94IHdpdGggb3VyIG93biB0byBwcm9kdWNlIGFuIGVzdGltYXRlLgotICAgIGNoaWxkQmxvY2st
Pm1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoZ3JhbmRjaGlsZEJveCwgcG9zaXRpdmVNYXJn
aW5CZWZvcmUsIG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKLX0K
LQotTGF5b3V0VW5pdCBSZW5kZXJCbG9jazo6ZXN0aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24oUmVu
ZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYg
ZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbikKLXsKLSAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBl
bGltaW5hdGUgdGhlIGVzdGltYXRpb24gb2YgdmVydGljYWwgcG9zaXRpb24sIGJlY2F1c2Ugd2hl
biBpdCdzIHdyb25nIHdlIHNvbWV0aW1lcyB0cmlnZ2VyIGEgcGF0aG9sb2dpY2FsCi0gICAgLy8g
cmVsYXlvdXQgaWYgdGhlcmUgYXJlIGludHJ1ZGluZyBmbG9hdHMuCi0gICAgTGF5b3V0VW5pdCBs
b2dpY2FsVG9wRXN0aW1hdGUgPSBsb2dpY2FsSGVpZ2h0KCk7Ci0gICAgaWYgKCFtYXJnaW5JbmZv
LmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAgIExheW91dFVuaXQgcG9z
aXRpdmVNYXJnaW5CZWZvcmUgPSAwOwotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2lu
QmVmb3JlID0gMDsKLSAgICAgICAgYm9vbCBkaXNjYXJkTWFyZ2luQmVmb3JlID0gZmFsc2U7Ci0g
ICAgICAgIGlmIChjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpIHsKLSAgICAgICAgICAgIC8vIFRy
eSB0byBkbyBhIGJhc2ljIGVzdGltYXRpb24gb2YgaG93IHRoZSBjb2xsYXBzZSBpcyBnb2luZyB0
byBnby4KLSAgICAgICAgICAgIG1hcmdpbkJlZm9yZUVzdGltYXRlRm9yQ2hpbGQoY2hpbGQsIHBv
c2l0aXZlTWFyZ2luQmVmb3JlLCBuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgZGlzY2FyZE1hcmdpbkJl
Zm9yZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBVc2UgdGhlIGNhY2hlZCBj
b2xsYXBzZWQgbWFyZ2luIHZhbHVlcyBmcm9tIGEgcHJldmlvdXMgbGF5b3V0LiBNb3N0IG9mIHRo
ZSB0aW1lIHRoZXkKLSAgICAgICAgICAgIC8vIHdpbGwgYmUgcmlnaHQuCi0gICAgICAgICAgICBN
YXJnaW5WYWx1ZXMgbWFyZ2luVmFsdWVzID0gbWFyZ2luVmFsdWVzRm9yQ2hpbGQoY2hpbGQpOwot
ICAgICAgICAgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSBtYXgocG9zaXRpdmVNYXJnaW5CZWZv
cmUsIG1hcmdpblZhbHVlcy5wb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKTsKLSAgICAgICAgICAgIG5l
Z2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCBtYXJnaW5WYWx1
ZXMubmVnYXRpdmVNYXJnaW5CZWZvcmUoKSk7Ci0gICAgICAgICAgICBkaXNjYXJkTWFyZ2luQmVm
b3JlID0gbXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCk7Ci0gICAgICAgIH0K
LQotICAgICAgICAvLyBDb2xsYXBzZSB0aGUgcmVzdWx0IHdpdGggb3VyIGN1cnJlbnQgbWFyZ2lu
cy4KLSAgICAgICAgaWYgKCFkaXNjYXJkTWFyZ2luQmVmb3JlKQotICAgICAgICAgICAgbG9naWNh
bFRvcEVzdGltYXRlICs9IG1heChtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCksIHBvc2l0aXZl
TWFyZ2luQmVmb3JlKSAtIG1heChtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCksIG5lZ2F0aXZl
TWFyZ2luQmVmb3JlKTsKLSAgICB9Ci0KLSAgICAvLyBBZGp1c3QgbG9naWNhbFRvcEVzdGltYXRl
IGRvd24gdG8gdGhlIG5leHQgcGFnZSBpZiB0aGUgbWFyZ2lucyBhcmUgc28gbGFyZ2UgdGhhdCB3
ZSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQKLSAgICAvLyBwYWdlLgotICAgIExheW91dFN0YXRl
KiBsYXlvdXRTdGF0ZSA9IHZpZXcoKS5sYXlvdXRTdGF0ZSgpOwotICAgIGlmIChsYXlvdXRTdGF0
ZS0+aXNQYWdpbmF0ZWQoKSAmJiBsYXlvdXRTdGF0ZS0+cGFnZUxvZ2ljYWxIZWlnaHQoKSAmJiBs
b2dpY2FsVG9wRXN0aW1hdGUgPiBsb2dpY2FsSGVpZ2h0KCkKLSAgICAgICAgJiYgaGFzTmV4dFBh
Z2UobG9naWNhbEhlaWdodCgpKSkKLSAgICAgICAgbG9naWNhbFRvcEVzdGltYXRlID0gbWluKGxv
Z2ljYWxUb3BFc3RpbWF0ZSwgbmV4dFBhZ2VMb2dpY2FsVG9wKGxvZ2ljYWxIZWlnaHQoKSkpOwot
Ci0gICAgbG9naWNhbFRvcEVzdGltYXRlICs9IGdldENsZWFyRGVsdGEoY2hpbGQsIGxvZ2ljYWxU
b3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiA9IGxvZ2lj
YWxUb3BFc3RpbWF0ZTsKLQotICAgIGlmIChsYXlvdXRTdGF0ZS0+aXNQYWdpbmF0ZWQoKSkgewot
ICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29sdW1uIGJyZWFrIHZhbHVl
IG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUgdG9wIG9mIHRoZSBuZXh0
IHBhZ2UuCi0gICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IGFwcGx5QmVmb3JlQnJlYWsoY2hp
bGQsIGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgCi0gICAgICAgIC8vIEZvciByZXBsYWNlZCBl
bGVtZW50cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0
aGUgbmV4dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICAg
ICAgbG9naWNhbFRvcEVzdGltYXRlID0gYWRqdXN0Rm9yVW5zcGxpdHRhYmxlQ2hpbGQoY2hpbGQs
IGxvZ2ljYWxUb3BFc3RpbWF0ZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIWNoaWxkLT5zZWxm
TmVlZHNMYXlvdXQoKSAmJiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpKQotICAgICAgICAgICAgbG9n
aWNhbFRvcEVzdGltYXRlICs9IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5wYWdpbmF0aW9uU3RydXQo
KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9naWNhbFRvcEVzdGltYXRlOwotfQotCiBMYXlvdXRV
bml0IFJlbmRlckJsb2NrOjpjb21wdXRlU3RhcnRQb3NpdGlvbkRlbHRhRm9yQ2hpbGRBdm9pZGlu
Z0Zsb2F0cyhjb25zdCBSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGNoaWxkTWFyZ2luU3Rh
cnQsIFJlbmRlclJlZ2lvbiogcmVnaW9uKQogewogICAgIExheW91dFVuaXQgc3RhcnRQb3NpdGlv
biA9IHN0YXJ0T2Zmc2V0Rm9yQ29udGVudChyZWdpb24pOwpAQCAtMjMyMSw1MSArMTkxNiw2IEBA
IHZvaWQgUmVuZGVyQmxvY2s6OmRldGVybWluZUxvZ2ljYWxMZWZ0UG8KICAgICBzZXRMb2dpY2Fs
TGVmdEZvckNoaWxkKGNoaWxkLCBzdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyBu
ZXdQb3NpdGlvbiA6IHRvdGFsQXZhaWxhYmxlTG9naWNhbFdpZHRoIC0gbmV3UG9zaXRpb24gLSBs
b2dpY2FsV2lkdGhGb3JDaGlsZChjaGlsZCksIGFwcGx5RGVsdGEpOwogfQogCi12b2lkIFJlbmRl
ckJsb2NrOjpzZXRDb2xsYXBzZWRCb3R0b21NYXJnaW4oY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2lu
SW5mbykKLXsKLSAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5BZnRlcigp
ICYmICFtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpKSB7Ci0gICAgICAg
IC8vIFVwZGF0ZSB0aGUgYWZ0ZXIgc2lkZSBtYXJnaW4gb2YgdGhlIGNvbnRhaW5lciB0byBkaXNj
YXJkIGlmIHRoZSBhZnRlciBtYXJnaW4gb2YgdGhlIGxhc3QgY2hpbGQgYWxzbyBkaXNjYXJkcyBh
bmQgd2UgY29sbGFwc2Ugd2l0aCBpdC4KLSAgICAgICAgLy8gRG9uJ3QgdXBkYXRlIHRoZSBtYXgg
bWFyZ2luIHZhbHVlcyBiZWNhdXNlIHdlIHdvbid0IG5lZWQgdGhlbSBhbnl3YXkuCi0gICAgICAg
IGlmIChtYXJnaW5JbmZvLmRpc2NhcmRNYXJnaW4oKSkgewotICAgICAgICAgICAgc2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAg
ICAgICAgLy8gVXBkYXRlIG91ciBtYXggcG9zL25lZyBib3R0b20gbWFyZ2lucywgc2luY2Ugd2Ug
Y29sbGFwc2VkIG91ciBib3R0b20gbWFyZ2lucwotICAgICAgICAvLyB3aXRoIG91ciBjaGlsZHJl
bi4KLSAgICAgICAgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMobWF4KG1heFBvc2l0aXZlTWFyZ2lu
QWZ0ZXIoKSwgbWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpKSwgbWF4KG1heE5lZ2F0aXZlTWFy
Z2luQWZ0ZXIoKSwgbWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpKSk7Ci0KLSAgICAgICAgaWYg
KCFtYXJnaW5JbmZvLmhhc01hcmdpbkFmdGVyUXVpcmsoKSkKLSAgICAgICAgICAgIHNldEhhc01h
cmdpbkFmdGVyUXVpcmsoZmFsc2UpOwotCi0gICAgICAgIGlmIChtYXJnaW5JbmZvLmhhc01hcmdp
bkFmdGVyUXVpcmsoKSAmJiAhbWFyZ2luQWZ0ZXIoKSkKLSAgICAgICAgICAgIC8vIFdlIGhhdmUg
bm8gYm90dG9tIG1hcmdpbiBhbmQgb3VyIGxhc3QgY2hpbGQgaGFzIGEgcXVpcmt5IG1hcmdpbi4K
LSAgICAgICAgICAgIC8vIFdlIHdpbGwgcGljayB1cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBh
c3MgaXQgdGhyb3VnaC4KLSAgICAgICAgICAgIC8vIFRoaXMgZGVhbHMgd2l0aCB0aGUgPHRkPjxk
aXY+PHA+IGNhc2UuCi0gICAgICAgICAgICBzZXRIYXNNYXJnaW5BZnRlclF1aXJrKHRydWUpOwot
ICAgIH0KLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6aGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IGJlZm9yZVNpZGUsIExheW91dFVuaXQgYWZ0ZXJTaWRlLCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQotewotICAgIG1hcmdpbkluZm8uc2V0QXRBZnRlclNpZGVPZkJsb2NrKHRydWUpOwot
Ci0gICAgLy8gSWYgd2UgY2FuJ3QgY29sbGFwc2Ugd2l0aCBjaGlsZHJlbiB0aGVuIGdvIGFoZWFk
IGFuZCBhZGQgaW4gdGhlIGJvdHRvbSBtYXJnaW4uCi0gICAgaWYgKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQWZ0ZXIoKSAm
JiAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKQotICAgICAgICAmJiAo
IWRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIo
KSB8fCAhbWFyZ2luSW5mby5oYXNNYXJnaW5BZnRlclF1aXJrKCkpKSkKLSAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdpbigpKTsKLSAgICAg
ICAgCi0gICAgLy8gTm93IGFkZCBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nLgotICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJTaWRlKTsKLQotICAgIC8vIE5l
Z2F0aXZlIG1hcmdpbnMgY2FuIGNhdXNlIG91ciBoZWlnaHQgdG8gc2hyaW5rIGJlbG93IG91ciBt
aW5pbWFsIGhlaWdodCAoYm9yZGVyL3BhZGRpbmcpLgotICAgIC8vIElmIHRoaXMgaGFwcGVucywg
ZW5zdXJlIHRoYXQgdGhlIGNvbXB1dGVkIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gdGhlIG1pbmlt
YWwgaGVpZ2h0LgotICAgIHNldExvZ2ljYWxIZWlnaHQobWF4KGxvZ2ljYWxIZWlnaHQoKSwgYmVm
b3JlU2lkZSArIGFmdGVyU2lkZSkpOwotCi0gICAgLy8gVXBkYXRlIG91ciBib3R0b20gY29sbGFw
c2VkIG1hcmdpbiBpbmZvLgotICAgIHNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihtYXJnaW5JbmZv
KTsKLX0KLQogdm9pZCBSZW5kZXJCbG9jazo6c2V0TG9naWNhbExlZnRGb3JDaGlsZChSZW5kZXJC
b3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxMZWZ0LCBBcHBseUxheW91dERlbHRhTW9kZSBh
cHBseURlbHRhKQogewogICAgIGlmIChpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKSB7CkBAIC0y
NDM1LDE2MCArMTk4NSw2IEBAIHZvaWQgUmVuZGVyQmxvY2s6OmRpcnR5Rm9yTGF5b3V0RnJvbVBl
cmMKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OmxheW91dEJsb2NrQ2hpbGQoUmVuZGVy
Qm94KiBjaGlsZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCYgcHJldmlvdXNG
bG9hdExvZ2ljYWxCb3R0b20sIExheW91dFVuaXQmIG1heEZsb2F0TG9naWNhbEJvdHRvbSkKLXsK
LSAgICBMYXlvdXRVbml0IG9sZFBvc01hcmdpbkJlZm9yZSA9IG1heFBvc2l0aXZlTWFyZ2luQmVm
b3JlKCk7Ci0gICAgTGF5b3V0VW5pdCBvbGROZWdNYXJnaW5CZWZvcmUgPSBtYXhOZWdhdGl2ZU1h
cmdpbkJlZm9yZSgpOwotCi0gICAgLy8gVGhlIGNoaWxkIGlzIGEgbm9ybWFsIGZsb3cgb2JqZWN0
LiAgQ29tcHV0ZSB0aGUgbWFyZ2lucyB3ZSB3aWxsIHVzZSBmb3IgY29sbGFwc2luZyBub3cuCi0g
ICAgY2hpbGQtPmNvbXB1dGVBbmRTZXRCbG9ja0RpcmVjdGlvbk1hcmdpbnModGhpcyk7Ci0KLSAg
ICAvLyBUcnkgdG8gZ3Vlc3Mgb3VyIGNvcnJlY3QgbG9naWNhbCB0b3AgcG9zaXRpb24uICBJbiBt
b3N0IGNhc2VzIHRoaXMgZ3Vlc3Mgd2lsbAotICAgIC8vIGJlIGNvcnJlY3QuICBPbmx5IGlmIHdl
J3JlIHdyb25nICh3aGVuIHdlIGNvbXB1dGUgdGhlIHJlYWwgbG9naWNhbCB0b3AgcG9zaXRpb24p
Ci0gICAgLy8gd2lsbCB3ZSBoYXZlIHRvIHBvdGVudGlhbGx5IHJlbGF5b3V0LgotICAgIExheW91
dFVuaXQgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbjsKLSAgICBMYXlvdXRVbml0IGxvZ2ljYWxU
b3BFc3RpbWF0ZSA9IGVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKGNoaWxkLCBtYXJnaW5JbmZv
LCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uKTsKLQotICAgIC8vIENhY2hlIG91ciBvbGQgcmVj
dCBzbyB0aGF0IHdlIGNhbiBkaXJ0eSB0aGUgcHJvcGVyIHJlcGFpbnQgcmVjdHMgaWYgdGhlIGNo
aWxkIG1vdmVzLgotICAgIExheW91dFJlY3Qgb2xkUmVjdCA9IGNoaWxkLT5mcmFtZVJlY3QoKTsK
LSAgICBMYXlvdXRVbml0IG9sZExvZ2ljYWxUb3AgPSBsb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQp
OwotCi0jaWYgIUFTU0VSVF9ESVNBQkxFRAotICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEg
PSB2aWV3KCkubGF5b3V0RGVsdGEoKTsKLSNlbmRpZgotICAgIC8vIEdvIGFoZWFkIGFuZCBwb3Np
dGlvbiB0aGUgY2hpbGQgYXMgdGhvdWdoIGl0IGRpZG4ndCBjb2xsYXBzZSB3aXRoIHRoZSB0b3Au
Ci0gICAgc2V0TG9naWNhbFRvcEZvckNoaWxkKGNoaWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUsIEFw
cGx5TGF5b3V0RGVsdGEpOwotICAgIGVzdGltYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGlsZChjaGls
ZCk7Ci0KLSAgICBSZW5kZXJCbG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRl
ckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKSA6IDA7Ci0gICAgYm9vbCBtYXJrRGVzY2Vu
ZGFudHNXaXRoRmxvYXRzID0gZmFsc2U7Ci0gICAgaWYgKGxvZ2ljYWxUb3BFc3RpbWF0ZSAhPSBv
bGRMb2dpY2FsVG9wICYmICFjaGlsZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9j
ayAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQotICAgICAgICBtYXJrRGVz
Y2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSNpZiBFTkFCTEUoU1VCUElYRUxfTEFZT1VUKQot
ICAgIGVsc2UgaWYgKFVOTElLRUxZKGxvZ2ljYWxUb3BFc3RpbWF0ZS5taWdodEJlU2F0dXJhdGVk
KCkpKQotICAgICAgICAvLyBsb2dpY2FsVG9wRXN0aW1hdGUsIHJldHVybmVkIGJ5IGVzdGltYXRl
TG9naWNhbFRvcFBvc2l0aW9uLCBtaWdodCBiZSBzYXR1cmF0ZWQgZm9yCi0gICAgICAgIC8vIHZl
cnkgbGFyZ2UgZWxlbWVudHMuIElmIGl0IGRvZXMgdGhlIGNvbXBhcmlzb24gd2l0aCBvbGRMb2dp
Y2FsVG9wIG1pZ2h0IHlpZWxkIGEKLSAgICAgICAgLy8gZmFsc2UgbmVnYXRpdmUgYXMgYWRkaW5n
IGFuZCByZW1vdmluZyBtYXJnaW5zLCBib3JkZXJzIGV0YyBmcm9tIGEgc2F0dXJhdGVkIG51bWJl
cgotICAgICAgICAvLyBtaWdodCB5aWVsZCBpbmNvcnJlY3QgcmVzdWx0cy4gSWYgdGhpcyBpcyB0
aGUgY2FzZSBhbHdheXMgbWFyayBmb3IgbGF5b3V0LgotICAgICAgICBtYXJrRGVzY2VuZGFudHNX
aXRoRmxvYXRzID0gdHJ1ZTsKLSNlbmRpZgotICAgIGVsc2UgaWYgKCFjaGlsZC0+YXZvaWRzRmxv
YXRzKCkgfHwgY2hpbGQtPnNocmlua1RvQXZvaWRGbG9hdHMoKSkgewotICAgICAgICAvLyBJZiBh
biBlbGVtZW50IG1pZ2h0IGJlIGFmZmVjdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBmbG9hdHMsIHRo
ZW4gYWx3YXlzIG1hcmsgaXQgZm9yCi0gICAgICAgIC8vIGxheW91dC4KLSAgICAgICAgTGF5b3V0
VW5pdCBmYiA9IG1heChwcmV2aW91c0Zsb2F0TG9naWNhbEJvdHRvbSwgbG93ZXN0RmxvYXRMb2dp
Y2FsQm90dG9tKCkpOwotICAgICAgICBpZiAoZmIgPiBsb2dpY2FsVG9wRXN0aW1hdGUpCi0gICAg
ICAgICAgICBtYXJrRGVzY2VuZGFudHNXaXRoRmxvYXRzID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICBpZiAobWFya0Rlc2NlbmRhbnRzV2l0aEZs
b2F0cykKLSAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJv
b3QoKSkKLSAgICAgICAgICAgIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tID0gbWF4KHByZXZp
b3VzRmxvYXRMb2dpY2FsQm90dG9tLCBvbGRMb2dpY2FsVG9wICsgY2hpbGRSZW5kZXJCbG9jay0+
bG93ZXN0RmxvYXRMb2dpY2FsQm90dG9tKCkpOwotICAgIH0KLQotICAgIGlmICghY2hpbGQtPm5l
ZWRzTGF5b3V0KCkpCi0gICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZO
ZWVkZWQoKTsKLQotICAgIGJvb2wgY2hpbGRIYWRMYXlvdXQgPSBjaGlsZC0+ZXZlckhhZExheW91
dCgpOwotICAgIGJvb2wgY2hpbGROZWVkZWRMYXlvdXQgPSBjaGlsZC0+bmVlZHNMYXlvdXQoKTsK
LSAgICBpZiAoY2hpbGROZWVkZWRMYXlvdXQpCi0gICAgICAgIGNoaWxkLT5sYXlvdXQoKTsKLQot
ICAgIC8vIENhY2hlIGlmIHdlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayByaWdodCBub3cu
Ci0gICAgYm9vbCBhdEJlZm9yZVNpZGVPZkJsb2NrID0gbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVP
ZkJsb2NrKCk7Ci0KLSAgICAvLyBOb3cgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHlwb3MgYmFzZWQg
b2ZmIGV4YW1pbmF0aW9uIG9mIGNvbGxhcHNpbmcgbWFyZ2luCi0gICAgLy8gdmFsdWVzLgotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEJlZm9yZUNsZWFyID0gY29sbGFwc2VNYXJnaW5zKGNoaWxk
LCBtYXJnaW5JbmZvKTsKLQotICAgIC8vIE5vdyBjaGVjayBmb3IgY2xlYXIuCi0gICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciA9IGNsZWFyRmxvYXRzSWZOZWVkZWQoY2hpbGQsIG1h
cmdpbkluZm8sIG9sZFBvc01hcmdpbkJlZm9yZSwgb2xkTmVnTWFyZ2luQmVmb3JlLCBsb2dpY2Fs
VG9wQmVmb3JlQ2xlYXIpOwotICAgIAotICAgIGJvb2wgcGFnaW5hdGVkID0gdmlldygpLmxheW91
dFN0YXRlKCktPmlzUGFnaW5hdGVkKCk7Ci0gICAgaWYgKHBhZ2luYXRlZCkKLSAgICAgICAgbG9n
aWNhbFRvcEFmdGVyQ2xlYXIgPSBhZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihsb2dpY2Fs
VG9wQWZ0ZXJDbGVhciwgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiwgY2hpbGQsCi0gICAgICAg
ICAgICBhdEJlZm9yZVNpZGVPZkJsb2NrICYmIGxvZ2ljYWxUb3BCZWZvcmVDbGVhciA9PSBsb2dp
Y2FsVG9wQWZ0ZXJDbGVhcik7Ci0KLSAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxv
Z2ljYWxUb3BBZnRlckNsZWFyLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIC8vIE5vdyB3ZSBo
YXZlIGEgZmluYWwgdG9wIHBvc2l0aW9uLiAgU2VlIGlmIGl0IHJlYWxseSBkb2VzIGVuZCB1cCBi
ZWluZyBkaWZmZXJlbnQgZnJvbSBvdXIgZXN0aW1hdGUuCi0gICAgLy8gY2xlYXJGbG9hdHNJZk5l
ZWRlZCBjYW4gYWxzbyBtYXJrIHRoZSBjaGlsZCBhcyBuZWVkaW5nIGEgbGF5b3V0IGV2ZW4gdGhv
dWdoIHdlIGRpZG4ndCBtb3ZlLiBUaGlzIGhhcHBlbnMKLSAgICAvLyB3aGVuIGNvbGxhcHNlTWFy
Z2lucyBkeW5hbWljYWxseSBhZGRzIG92ZXJoYW5naW5nIGZsb2F0cyBiZWNhdXNlIG9mIGEgY2hp
bGQgd2l0aCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgIGlmIChsb2dpY2FsVG9wQWZ0ZXJDbGVhciAh
PSBsb2dpY2FsVG9wRXN0aW1hdGUgfHwgY2hpbGQtPm5lZWRzTGF5b3V0KCkgfHwgKHBhZ2luYXRl
ZCAmJiBjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxvY2stPnNob3VsZEJyZWFrQXRM
aW5lVG9Bdm9pZFdpZG93KCkpKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZs
b2F0cygpKSB7Ci0gICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRo
ZSBsaW5lIHdpZHRoLgotICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNs
ZWFyIGFuIGl0ZW0sIGl0cyB3aWR0aCBjYW4KLSAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVz
ZSBpdCBoYXMgbW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCi0gICAgICAgICAgICAvLyBTbyBn
byBhaGVhZCBhbmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KLSAgICAgICAgICAgIGNoaWxkLT5z
ZXRDaGlsZE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7Ci0gICAgICAgIH0KLSAgICAg
ICAgCi0gICAgICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWNo
aWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygp
KQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dp
dGhGbG9hdHNGb3JMYXlvdXQoKTsKLSAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0
KCkpCi0gICAgICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5l
ZWRlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFr
ZSB0aGUgY2hpbGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCi0gICAgICAgIGNoaWxkLT5sYXlvdXRJ
Zk5lZWRlZCgpOwotICAgIH0KLQotICAgIGlmICh1cGRhdGVSZWdpb25SYW5nZUZvckJveENoaWxk
KGNoaWxkKSkgewotICAgICAgICBjaGlsZC0+c2V0TmVlZHNMYXlvdXQodHJ1ZSwgTWFya09ubHlU
aGlzKTsKLSAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7Ci0gICAgfQotCi0gICAgLy8g
V2UgYXJlIG5vIGxvbmdlciBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBpZiB3ZSBlbmNvdW50ZXIg
YSBub24tZW1wdHkgY2hpbGQuICAKLSAgICAvLyBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIGNo
ZWNraW5nIGZvciBjbGVhciwgc28gdGhhdCBtYXJnaW5zIGNhbiBiZSByZXNldCBpZiBhIGNsZWFy
IG9jY3VycmVkLgotICAgIGlmIChtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAh
Y2hpbGQtPmlzU2VsZkNvbGxhcHNpbmdCbG9jaygpKQotICAgICAgICBtYXJnaW5JbmZvLnNldEF0
QmVmb3JlU2lkZU9mQmxvY2soZmFsc2UpOwotCi0gICAgLy8gTm93IHBsYWNlIHRoZSBjaGlsZCBp
biB0aGUgY29ycmVjdCBsZWZ0IHBvc2l0aW9uCi0gICAgZGV0ZXJtaW5lTG9naWNhbExlZnRQb3Np
dGlvbkZvckNoaWxkKGNoaWxkLCBBcHBseUxheW91dERlbHRhKTsKLQotICAgIExheW91dFNpemUg
Y2hpbGRPZmZzZXQgPSBjaGlsZC0+bG9jYXRpb24oKSAtIG9sZFJlY3QubG9jYXRpb24oKTsKLSNp
ZiBFTkFCTEUoQ1NTX1NIQVBFUykKLSAgICByZWxheW91dFNoYXBlRGVzY2VuZGFudElmTW92ZWQo
Y2hpbGRSZW5kZXJCbG9jaywgY2hpbGRPZmZzZXQpOwotI2VuZGlmCi0KLSAgICAvLyBVcGRhdGUg
b3VyIGhlaWdodCBub3cgdGhhdCB0aGUgY2hpbGQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBjb3Jy
ZWN0IHBvc2l0aW9uLgotICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgbG9n
aWNhbEhlaWdodEZvckNoaWxkKGNoaWxkKSk7Ci0gICAgaWYgKG11c3RTZXBhcmF0ZU1hcmdpbkFm
dGVyRm9yQ2hpbGQoY2hpbGQpKSB7Ci0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhl
aWdodCgpICsgbWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCkpOwotICAgICAgICBtYXJnaW5JbmZv
LmNsZWFyTWFyZ2luKCk7Ci0gICAgfQotICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgb3Zlcmhhbmdp
bmcgZmxvYXRzIHRoYXQgaW50cnVkZSBpbnRvIGZvbGxvd2luZyBzaWJsaW5ncyAob3IgcG9zc2li
bHkgb3V0Ci0gICAgLy8gb2YgdGhpcyBibG9jayksIHRoZW4gdGhlIHBhcmVudCBnZXRzIG5vdGlm
aWVkIG9mIHRoZSBmbG9hdHMgbm93LgotICAgIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxk
UmVuZGVyQmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCi0gICAgICAgIG1heEZsb2F0TG9naWNhbEJv
dHRvbSA9IG1heChtYXhGbG9hdExvZ2ljYWxCb3R0b20sIGFkZE92ZXJoYW5naW5nRmxvYXRzKHRv
UmVuZGVyQmxvY2soY2hpbGQpLCAhY2hpbGROZWVkZWRMYXlvdXQpKTsKLQotICAgIGlmIChjaGls
ZE9mZnNldC53aWR0aCgpIHx8IGNoaWxkT2Zmc2V0LmhlaWdodCgpKSB7Ci0gICAgICAgIHZpZXco
KS5hZGRMYXlvdXREZWx0YShjaGlsZE9mZnNldCk7Ci0KLSAgICAgICAgLy8gSWYgdGhlIGNoaWxk
IG1vdmVkLCB3ZSBoYXZlIHRvIHJlcGFpbnQgaXQgYXMgd2VsbCBhcyBhbnkgZmxvYXRpbmcvcG9z
aXRpb25lZAotICAgICAgICAvLyBkZXNjZW5kYW50cy4gIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBu
ZWVkIGEgbGF5b3V0LiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHdlJ3JlIGdvaW5nIHRvCi0gICAg
ICAgIC8vIHJlcGFpbnQgb3Vyc2VsdmVzIChhbmQgdGhlIGNoaWxkKSBhbnl3YXkuCi0gICAgICAg
IGlmIChjaGlsZEhhZExheW91dCAmJiAhc2VsZk5lZWRzTGF5b3V0KCkgJiYgY2hpbGQtPmNoZWNr
Rm9yUmVwYWludER1cmluZ0xheW91dCgpKQotICAgICAgICAgICAgY2hpbGQtPnJlcGFpbnREdXJp
bmdMYXlvdXRJZk1vdmVkKG9sZFJlY3QpOwotICAgIH0KLQotICAgIGlmICghY2hpbGRIYWRMYXlv
dXQgJiYgY2hpbGQtPmNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpKSB7Ci0gICAgICAgIGNo
aWxkLT5yZXBhaW50KCk7Ci0gICAgICAgIGNoaWxkLT5yZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMo
dHJ1ZSk7Ci0gICAgfQotCi0gICAgaWYgKHBhZ2luYXRlZCkgewotICAgICAgICAvLyBDaGVjayBm
b3IgYW4gYWZ0ZXIgcGFnZS9jb2x1bW4gYnJlYWsuCi0gICAgICAgIExheW91dFVuaXQgbmV3SGVp
Z2h0ID0gYXBwbHlBZnRlckJyZWFrKGNoaWxkLCBsb2dpY2FsSGVpZ2h0KCksIG1hcmdpbkluZm8p
OwotICAgICAgICBpZiAobmV3SGVpZ2h0ICE9IGhlaWdodCgpKQotICAgICAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChuZXdIZWlnaHQpOwotICAgIH0KLQotICAgIEFTU0VSVCh2aWV3KCkubGF5b3V0
RGVsdGFNYXRjaGVzKG9sZExheW91dERlbHRhKSk7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNp
bXBsaWZpZWROb3JtYWxGbG93TGF5b3V0KCkKIHsKICAgICBpZiAoY2hpbGRyZW5JbmxpbmUoKSkg
ewpAQCAtNjg1NiwxMjcgKzYyNTIsMTIgQEAgdm9pZCBSZW5kZXJCbG9jazo6Y2xlYXJUcnVuY2F0
aW9uKCkKICAgICB9CiB9CiAKLXZvaWQgUmVuZGVyQmxvY2s6OnNldE1heE1hcmdpbkJlZm9yZVZh
bHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVE
YXRhKSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVN
YXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpICYmIG5lZyA9PSBSZW5kZXJCbG9ja1JhcmVEYXRhOjpu
ZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcykpCi0gICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlz
KSk7Ci0gICAgfQotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXRQb3NpdGl2ZU1hcmdpbkJl
Zm9yZShwb3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShuZWcpOwotfQotCi12b2lkIFJlbmRlckJsb2NrOjpzZXRNYXhNYXJnaW5BZnRlclZhbHVl
cyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCi17Ci0gICAgaWYgKCFtX3JhcmVEYXRh
KSB7Ci0gICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tSYXJlRGF0YTo6cG9zaXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQodGhpcykgJiYgbmVnID09IFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0
aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRoaXMpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOwot
ICAgIH0KLSAgICBtX3JhcmVEYXRhLT5tX21hcmdpbnMuc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihw
b3MpOwotICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1hcmdpbkFmdGVyKG5l
Zyk7Ci19Ci0KLXZvaWQgUmVuZGVyQmxvY2s6OnNldE11c3REaXNjYXJkTWFyZ2luQmVmb3JlKGJv
b2wgdmFsdWUpCi17Ci0gICAgaWYgKHN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBpZiAoIW1fcmFyZURhdGEpCi0gICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihu
ZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7Ci0KLSAgICBtX3JhcmVEYXRhLT5tX2Rpc2Nh
cmRNYXJnaW5CZWZvcmUgPSB2YWx1ZTsKLX0KLQotdm9pZCBSZW5kZXJCbG9jazo6c2V0TXVzdERp
c2NhcmRNYXJnaW5BZnRlcihib29sIHZhbHVlKQotewotICAgIGlmIChzdHlsZSgpLT5tYXJnaW5B
ZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpIHsKLSAgICAgICAgQVNTRVJUKHZhbHVlKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghbV9yYXJlRGF0YSAmJiAhdmFsdWUpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0
YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKLQotICAgIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gdmFsdWU7Ci19Ci0KLWJvb2wgUmVuZGVyQmxv
Y2s6Om11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUo
KS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBt
X3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUpOwotfQotCi1ib29sIFJlbmRlckJsb2Nr
OjptdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gc3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEIHx8IChtX3JhcmVEYXRhICYmIG1fcmFy
ZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyKTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVz
dERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25z
dAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAgICBpZiAoIWNo
aWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQotICAgICAgICByZXR1cm4gY2hpbGQtPmlzUmVuZGVy
QmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgp
IDogKGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsK
LSAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKLSAgICAgICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0
b1JlbmRlckJsb2NrKGNoaWxkKS0+bXVzdERpc2NhcmRNYXJnaW5BZnRlcigpIDogKGNoaWxkLT5z
dHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOwotCi0gICAgLy8gRklY
TUU6IFdlIHJldHVybiBmYWxzZSBoZXJlIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0aW9uIGlzIG5v
dCBnZW9tZXRyaWNhbGx5IGNvbXBsZXRlLiBXZSBoYXZlIHZhbHVlcyBvbmx5IGZvciBiZWZvcmUv
YWZ0ZXIsIG5vdCBzdGFydC9lbmQuCi0gICAgLy8gSW4gY2FzZSB0aGUgYm94ZXMgYXJlIHBlcnBl
bmRpY3VsYXIgd2UgYXNzdW1lIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVkLgotICAgIHJl
dHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJCbG9jazo6bXVzdERpc2NhcmRNYXJnaW5BZnRl
ckZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFj
aGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOwotICAgIGlmICghY2hpbGQtPmlzV3JpdGluZ01vZGVS
b290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8gdG9SZW5kZXJC
bG9jayhjaGlsZCktPm11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoKSA6IChjaGlsZC0+c3R5bGUoKS0+
bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsKLSAgICBpZiAoY2hpbGQtPmlzSG9y
aXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKLSAgICAg
ICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRlckJsb2NrKGNoaWxkKS0+
bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3Jl
Q29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2Fy
ZE1hcmdpbkJlZm9yZUZvckNoaWxkfCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJv
b2wgUmVuZGVyQmxvY2s6Om11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJl
bmRlckJveCogY2hpbGQpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5
b3V0KCkpOwotICAgIGNvbnN0IFJlbmRlclN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxl
KCk7Ci0gICAgaWYgKCFjaGlsZC0+aXNXcml0aW5nTW9kZVJvb3QoKSkKLSAgICAgICAgcmV0dXJu
IGNoaWxkU3R5bGUtPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlm
IChjaGlsZC0+aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5n
TW9kZSgpKQotICAgICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgp
ID09IE1TRVBBUkFURTsKLQotICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVm
b3JlRm9yQ2hpbGR8IGFib3ZlLgotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBSZW5kZXJC
bG9jazo6bXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNo
aWxkKSBjb25zdAotewotICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKLSAg
ICBjb25zdCBSZW5kZXJTdHlsZSogY2hpbGRTdHlsZSA9IGNoaWxkLT5zdHlsZSgpOwotICAgIGlm
ICghY2hpbGQtPmlzV3JpdGluZ01vZGVSb290KCkpCi0gICAgICAgIHJldHVybiBjaGlsZFN0eWxl
LT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOwotICAgIGlmIChjaGlsZC0+aXNI
b3Jpem9udGFsV3JpdGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQotICAg
ICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNU0VQQVJB
VEU7Ci0KLSAgICAvLyBGSVhNRTogU2VlIHxtdXN0RGlzY2FyZE1hcmdpbkJlZm9yZUZvckNoaWxk
fCBhYm92ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgUmVuZGVyQmxvY2s6OnNldFBh
Z2luYXRpb25TdHJ1dChMYXlvdXRVbml0IHN0cnV0KQogewogICAgIGlmICghbV9yYXJlRGF0YSkg
ewogICAgICAgICBpZiAoIXN0cnV0KQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3Jh
cmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEodGhpcykpOworICAgICAg
ICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAg
fQogICAgIG1fcmFyZURhdGEtPm1fcGFnaW5hdGlvblN0cnV0ID0gc3RydXQ7CiB9CkBAIC02OTg2
LDcgKzYyNjcsNyBAQCB2b2lkIFJlbmRlckJsb2NrOjpzZXRQYWdlTG9naWNhbE9mZnNldChMCiAg
ICAgaWYgKCFtX3JhcmVEYXRhKSB7CiAgICAgICAgIGlmICghbG9naWNhbE9mZnNldCkKICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJC
bG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBS
ZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIH0KICAgICBtX3JhcmVEYXRhLT5tX3BhZ2VMb2dp
Y2FsT2Zmc2V0ID0gbG9naWNhbE9mZnNldDsKIH0KQEAgLTY5OTUsNyArNjI3Niw3IEBAIHZvaWQg
UmVuZGVyQmxvY2s6OnNldEJyZWFrQXRMaW5lVG9Bdm9pZFcKIHsKICAgICBBU1NFUlQobGluZVRv
QnJlYWspOwogICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0
UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKHRoaXMpKTsKKyAgICAgICAgbV9yYXJlRGF0YSA9
IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja1JhcmVEYXRhKCkpOwogICAgIG1fcmFyZURhdGEtPm1f
c2hvdWxkQnJlYWtBdExpbmVUb0F2b2lkV2lkb3cgPSB0cnVlOwogICAgIG1fcmFyZURhdGEtPm1f
bGluZUJyZWFrVG9Bdm9pZFdpZG93ID0gbGluZVRvQnJlYWs7CiB9CkBAIC03MTg5LDczICs2NDcw
LDExIEBAIExheW91dFVuaXQgUmVuZGVyQmxvY2s6Om5leHRQYWdlTG9naWNhbFQKICAgICByZXR1
cm4gbG9naWNhbE9mZnNldCArIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7CiB9CiAKLXN0YXRpYyBi
b29sIGluTm9ybWFsRmxvdyhSZW5kZXJCb3gqIGNoaWxkKQotewotICAgIFJlbmRlckJsb2NrKiBj
dXJyID0gY2hpbGQtPmNvbnRhaW5pbmdCbG9jaygpOwotICAgIHdoaWxlIChjdXJyICYmIGN1cnIg
IT0gJmNoaWxkLT52aWV3KCkpIHsKLSAgICAgICAgaWYgKGN1cnItPmhhc0NvbHVtbnMoKSB8fCBj
dXJyLT5pc1JlbmRlckZsb3dUaHJlYWQoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAg
ICAgICBpZiAoY3Vyci0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjdXJyID0gY3Vyci0+Y29udGFpbmluZ0Jsb2Nr
KCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCiBDb2x1bW5JbmZvOjpQYWdpbmF0aW9u
VW5pdCBSZW5kZXJCbG9jazo6cGFnaW5hdGlvblVuaXQoKSBjb25zdAogewogICAgIHJldHVybiBD
b2x1bW5JbmZvOjpDb2x1bW47CiB9CiAKLUxheW91dFVuaXQgUmVuZGVyQmxvY2s6OmFwcGx5QmVm
b3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KQotewot
ICAgIC8vIEZJWE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9y
dCBwcmludGluZy4KLSAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0
YXRlKCktPmlzUGFnaW5hdGluZ0NvbHVtbnMoKTsKLSAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9
ICFjaGVja0NvbHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNh
bEhlaWdodDsgLy8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVj
ayB0aGlzLgotICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29u
dGFpbmluZ0Jsb2NrKCk7Ci0gICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQg
JiYgZmxvd1RocmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKLSAgICBib29sIGNoZWNr
QmVmb3JlQWx3YXlzID0gKGNoZWNrQ29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1
bW5CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxk
LT5zdHlsZSgpLT5wYWdlQnJlYWtCZWZvcmUoKSA9PSBQQkFMV0FZUykKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5y
ZWdpb25CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKTsKLSAgICBpZiAoY2hlY2tCZWZvcmVBbHdh
eXMgJiYgaW5Ob3JtYWxGbG93KGNoaWxkKSAmJiBoYXNOZXh0UGFnZShsb2dpY2FsT2Zmc2V0LCBJ
bmNsdWRlUGFnZUJvdW5kYXJ5KSkgewotICAgICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0g
ICAgICAgICAgICB2aWV3KCkubGF5b3V0U3RhdGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hp
bGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAgICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAg
ICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAg
ICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3JjZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9t
TG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBsb2dpY2FsT2Zmc2V0LCBjaGlsZCwgdHJ1ZSwgJm9m
ZnNldEJyZWFrQWRqdXN0bWVudCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZz
ZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5l
eHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KTsKLSAg
ICB9Ci0gICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Ci19Ci0KLUxheW91dFVuaXQgUmVuZGVyQmxv
Y2s6OmFwcGx5QWZ0ZXJCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxP
ZmZzZXQsIE1hcmdpbkluZm8mIG1hcmdpbkluZm8pCi17Ci0gICAgLy8gRklYTUU6IEFkZCBwYWdl
IGJyZWFrIGNoZWNraW5nIGhlcmUgd2hlbiB3ZSBzdXBwb3J0IHByaW50aW5nLgotICAgIGJvb2wg
Y2hlY2tDb2x1bW5CcmVha3MgPSB2aWV3KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdpbmF0aW5nQ29s
dW1ucygpOwotICAgIGJvb2wgY2hlY2tQYWdlQnJlYWtzID0gIWNoZWNrQ29sdW1uQnJlYWtzICYm
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VMb2dpY2FsSGVpZ2h0OyAvLyBGSVhNRTogT25j
ZSBjb2x1bW5zIGNhbiBwcmludCB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMuCi0gICAgUmVuZGVyRmxv
d1RocmVhZCogZmxvd1RocmVhZCA9IGZsb3dUaHJlYWRDb250YWluaW5nQmxvY2soKTsKLSAgICBi
b29sIGNoZWNrUmVnaW9uQnJlYWtzID0gZmxvd1RocmVhZCAmJiBmbG93VGhyZWFkLT5pc1JlbmRl
ck5hbWVkRmxvd1RocmVhZCgpOwotICAgIGJvb2wgY2hlY2tBZnRlckFsd2F5cyA9IChjaGVja0Nv
bHVtbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+Y29sdW1uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtBZnRl
cigpID09IFBCQUxXQVlTKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1Jl
Z2lvbkJyZWFrcyAmJiBjaGlsZC0+c3R5bGUoKS0+cmVnaW9uQnJlYWtBZnRlcigpID09IFBCQUxX
QVlTKTsKLSAgICBpZiAoY2hlY2tBZnRlckFsd2F5cyAmJiBpbk5vcm1hbEZsb3coY2hpbGQpICYm
IGhhc05leHRQYWdlKGxvZ2ljYWxPZmZzZXQsIEluY2x1ZGVQYWdlQm91bmRhcnkpKSB7Ci0gICAg
ICAgIExheW91dFVuaXQgbWFyZ2luT2Zmc2V0ID0gbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhN
YXJnaW5CZWZvcmUoKSA/IExheW91dFVuaXQoKSA6IG1hcmdpbkluZm8ubWFyZ2luKCk7Ci0KLSAg
ICAgICAgLy8gU28gb3VyIG1hcmdpbiBkb2Vzbid0IHBhcnRpY2lwYXRlIGluIHRoZSBuZXh0IGNv
bGxhcHNpbmcgc3RlcHMuCi0gICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKLQotICAg
ICAgICBpZiAoY2hlY2tDb2x1bW5CcmVha3MpCi0gICAgICAgICAgICB2aWV3KCkubGF5b3V0U3Rh
dGUoKS0+YWRkRm9yY2VkQ29sdW1uQnJlYWsoY2hpbGQsIGxvZ2ljYWxPZmZzZXQpOwotICAgICAg
ICBpZiAoY2hlY2tSZWdpb25CcmVha3MpIHsKLSAgICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0
QnJlYWtBZGp1c3RtZW50ID0gMDsKLSAgICAgICAgICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3Jj
ZWRSZWdpb25CcmVhayh0aGlzLCBvZmZzZXRGcm9tTG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBs
b2dpY2FsT2Zmc2V0ICsgbWFyZ2luT2Zmc2V0LCBjaGlsZCwgZmFsc2UsICZvZmZzZXRCcmVha0Fk
anVzdG1lbnQpKQotICAgICAgICAgICAgICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0ICsgbWFyZ2lu
T2Zmc2V0ICsgb2Zmc2V0QnJlYWtBZGp1c3RtZW50OwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biBuZXh0UGFnZUxvZ2ljYWxUb3AobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFyeSk7
Ci0gICAgfQotICAgIHJldHVybiBsb2dpY2FsT2Zmc2V0OwotfQotCiBMYXlvdXRVbml0IFJlbmRl
ckJsb2NrOjpwYWdlTG9naWNhbFRvcEZvck9mZnNldChMYXlvdXRVbml0IG9mZnNldCkgY29uc3QK
IHsKICAgICBMYXlvdXRVbml0IGZpcnN0UGFnZUxvZ2ljYWxUb3AgPSBpc0hvcml6b250YWxXcml0
aW5nTW9kZSgpID8gdmlldygpLmxheW91dFN0YXRlKCktPm1fcGFnZU9mZnNldC5oZWlnaHQoKSA6
IHZpZXcoKS5sYXlvdXRTdGF0ZSgpLT5tX3BhZ2VPZmZzZXQud2lkdGgoKTsKQEAgLTc0MzcsODcg
KzY2NTYsNiBAQCB2b2lkIFJlbmRlckJsb2NrOjphZGp1c3RMaW5lUG9zaXRpb25Gb3JQCiAgICAg
ICAgIGxpbmVCb3gtPnNldElzRmlyc3RBZnRlclBhZ2VCcmVhayh0cnVlKTsKIH0KIAotTGF5b3V0
VW5pdCBSZW5kZXJCbG9jazo6YWRqdXN0QmxvY2tDaGlsZEZvclBhZ2luYXRpb24oTGF5b3V0VW5p
dCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5b3V0VW5pdCBlc3RpbWF0ZVdpdGhvdXRQYWdpbmF0
aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2spCi17Ci0gICAg
UmVuZGVyQmxvY2sqIGNoaWxkUmVuZGVyQmxvY2sgPSBjaGlsZC0+aXNSZW5kZXJCbG9jaygpID8g
dG9SZW5kZXJCbG9jayhjaGlsZCkgOiAwOwotCi0gICAgaWYgKGVzdGltYXRlV2l0aG91dFBhZ2lu
YXRpb24gIT0gbG9naWNhbFRvcEFmdGVyQ2xlYXIpIHsKLSAgICAgICAgLy8gT3VyIGd1ZXNzIHBy
aW9yIHRvIHBhZ2luYXRpb24gbW92ZW1lbnQgd2FzIHdyb25nLiBCZWZvcmUgd2UgYXR0ZW1wdCB0
byBwYWdpbmF0ZSwgbGV0J3MgdHJ5IGFnYWluIGF0IHRoZSBuZXcKLSAgICAgICAgLy8gcG9zaXRp
b24uCi0gICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotICAg
ICAgICBzZXRMb2dpY2FsVG9wRm9yQ2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBB
cHBseUxheW91dERlbHRhKTsKLQotICAgICAgICBpZiAoY2hpbGQtPnNocmlua1RvQXZvaWRGbG9h
dHMoKSkgewotICAgICAgICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggZGVwZW5kcyBvbiB0aGUg
bGluZSB3aWR0aC4KLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNoaWxkIHNoaWZ0cyB0byBjbGVh
ciBhbiBpdGVtLCBpdHMgd2lkdGggY2FuCi0gICAgICAgICAgICAvLyBjaGFuZ2UgKGJlY2F1c2Ug
aXQgaGFzIG1vcmUgYXZhaWxhYmxlIGxpbmUgd2lkdGgpLgotICAgICAgICAgICAgLy8gU28gZ28g
YWhlYWQgYW5kIG1hcmsgdGhlIGl0ZW0gYXMgZGlydHkuCi0gICAgICAgICAgICBjaGlsZC0+c2V0
Q2hpbGROZWVkc0xheW91dCh0cnVlLCBNYXJrT25seVRoaXMpOwotICAgICAgICB9Ci0gICAgICAg
IAotICAgICAgICBpZiAoY2hpbGRSZW5kZXJCbG9jaykgewotICAgICAgICAgICAgaWYgKCFjaGls
ZC0+YXZvaWRzRmxvYXRzKCkgJiYgY2hpbGRSZW5kZXJCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkK
LSAgICAgICAgICAgICAgICBjaGlsZFJlbmRlckJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRo
RmxvYXRzRm9yTGF5b3V0KCk7Ci0gICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgp
KQotICAgICAgICAgICAgICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVk
ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE91ciBndWVzcyB3YXMgd3JvbmcuIE1ha2Ug
dGhlIGNoaWxkIGxheSBpdHNlbGYgb3V0IGFnYWluLgotICAgICAgICBjaGlsZC0+bGF5b3V0SWZO
ZWVkZWQoKTsKLSAgICB9Ci0KLSAgICBMYXlvdXRVbml0IG9sZFRvcCA9IGxvZ2ljYWxUb3BBZnRl
ckNsZWFyOwotCi0gICAgLy8gSWYgdGhlIG9iamVjdCBoYXMgYSBwYWdlIG9yIGNvbHVtbiBicmVh
ayB2YWx1ZSBvZiAiYmVmb3JlIiwgdGhlbiB3ZSBzaG91bGQgc2hpZnQgdG8gdGhlIHRvcCBvZiB0
aGUgbmV4dCBwYWdlLgotICAgIExheW91dFVuaXQgcmVzdWx0ID0gYXBwbHlCZWZvcmVCcmVhayhj
aGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xlYXIpOwotCi0gICAgaWYgKHBhZ2VMb2dpY2FsSGVpZ2h0
Rm9yT2Zmc2V0KHJlc3VsdCkpIHsKLSAgICAgICAgTGF5b3V0VW5pdCByZW1haW5pbmdMb2dpY2Fs
SGVpZ2h0ID0gcGFnZVJlbWFpbmluZ0xvZ2ljYWxIZWlnaHRGb3JPZmZzZXQocmVzdWx0LCBFeGNs
dWRlUGFnZUJvdW5kYXJ5KTsKLSAgICAgICAgTGF5b3V0VW5pdCBzcGFjZVNob3J0YWdlID0gY2hp
bGQtPmxvZ2ljYWxIZWlnaHQoKSAtIHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQ7Ci0gICAgICAgIGlm
IChzcGFjZVNob3J0YWdlID4gMCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGNyb3Nz
ZXMgYSBjb2x1bW4gYm91bmRhcnksIHJlcG9ydCBhIGJyZWFrLCBpbiBjYXNlIG5vdGhpbmcgaW5z
aWRlIGl0IGhhcyBhbHJlYWR5Ci0gICAgICAgICAgICAvLyBkb25lIHNvLiBUaGUgY29sdW1uIGJh
bGFuY2VyIG5lZWRzIHRvIGtub3cgaG93IG11Y2ggaXQgaGFzIHRvIHN0cmV0Y2ggdGhlIGNvbHVt
bnMgdG8gbWFrZSBtb3JlCi0gICAgICAgICAgICAvLyBjb250ZW50IGZpdC4gSWYgbm8gYnJlYWtz
IGFyZSByZXBvcnRlZCAoYnV0IGRvIG9jY3VyKSwgdGhlIGJhbGFuY2VyIHdpbGwgaGF2ZSBubyBj
bHVlLiBGSVhNRToKLSAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIGltcHJvdmVkLCB0aG91
Z2gsIGJlY2F1c2UgaGVyZSB3ZSBqdXN0IHByZXRlbmQgdGhhdCB0aGUgY2hpbGQgaXMKLSAgICAg
ICAgICAgIC8vIHVuc3BsaXR0YWJsZS4gQSBzcGxpdHRhYmxlIGNoaWxkLCBvbiB0aGUgb3RoZXIg
aGFuZCwgaGFzIGJyZWFrIG9wcG9ydHVuaXRpZXMgYXQgZXZlcnkgcG9zaXRpb24KLSAgICAgICAg
ICAgIC8vIHdoZXJlIHRoZXJlJ3Mgbm8gY2hpbGQgY29udGVudCwgYm9yZGVyIG9yIHBhZGRpbmcu
IEluIG90aGVyIHdvcmRzLCB3ZSByaXNrIHN0cmV0Y2hpbmcgbW9yZQotICAgICAgICAgICAgLy8g
dGhhbiBuZWNlc3NhcnkuCi0gICAgICAgICAgICBzZXRQYWdlQnJlYWsocmVzdWx0LCBzcGFjZVNo
b3J0YWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZvciByZXBsYWNlZCBlbGVtZW50
cyBhbmQgc2Nyb2xsZWQgZWxlbWVudHMsIHdlIHdhbnQgdG8gc2hpZnQgdGhlbSB0byB0aGUgbmV4
dCBwYWdlIGlmIHRoZXkgZG9uJ3QgZml0IG9uIHRoZSBjdXJyZW50IG9uZS4KLSAgICBMYXlvdXRV
bml0IGxvZ2ljYWxUb3BCZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50ID0gcmVzdWx0OwotICAg
IExheW91dFVuaXQgbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVudCA9IGFkanVz
dEZvclVuc3BsaXR0YWJsZUNoaWxkKGNoaWxkLCByZXN1bHQpOwotICAgIAotICAgIExheW91dFVu
aXQgcGFnaW5hdGlvblN0cnV0ID0gMDsKLSAgICBMYXlvdXRVbml0IHVuc3BsaXR0YWJsZUFkanVz
dG1lbnREZWx0YSA9IGxvZ2ljYWxUb3BBZnRlclVuc3BsaXR0YWJsZUFkanVzdG1lbnQgLSBsb2dp
Y2FsVG9wQmVmb3JlVW5zcGxpdHRhYmxlQWRqdXN0bWVudDsKLSAgICBpZiAodW5zcGxpdHRhYmxl
QWRqdXN0bWVudERlbHRhKQotICAgICAgICBwYWdpbmF0aW9uU3RydXQgPSB1bnNwbGl0dGFibGVB
ZGp1c3RtZW50RGVsdGE7Ci0gICAgZWxzZSBpZiAoY2hpbGRSZW5kZXJCbG9jayAmJiBjaGlsZFJl
bmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKSkKLSAgICAgICAgcGFnaW5hdGlvblN0cnV0ID0g
Y2hpbGRSZW5kZXJCbG9jay0+cGFnaW5hdGlvblN0cnV0KCk7Ci0KLSAgICBpZiAocGFnaW5hdGlv
blN0cnV0KSB7Ci0gICAgICAgIC8vIFdlIGFyZSB3aWxsaW5nIHRvIHByb3BhZ2F0ZSBvdXQgdG8g
b3VyIHBhcmVudCBibG9jayBhcyBsb25nIGFzIHdlIHdlcmUgYXQgdGhlIHRvcCBvZiB0aGUgYmxv
Y2sgcHJpb3IKLSAgICAgICAgLy8gdG8gY29sbGFwc2luZyBvdXIgbWFyZ2lucywgYW5kIGFzIGxv
bmcgYXMgd2UgZGlkbid0IGNsZWFyIG9yIG1vdmUgYXMgYSByZXN1bHQgb2Ygb3RoZXIgcGFnaW5h
dGlvbi4KLSAgICAgICAgaWYgKGF0QmVmb3JlU2lkZU9mQmxvY2sgJiYgb2xkVG9wID09IHJlc3Vs
dCAmJiAhaXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkgJiYgIWlzVGFibGVDZWxsKCkpIHsKLSAgICAg
ICAgICAgIC8vIEZJWE1FOiBTaG91bGQgcmVhbGx5IGNoZWNrIGlmIHdlJ3JlIGV4Y2VlZGluZyB0
aGUgcGFnZSBoZWlnaHQgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBzdHJ1dCwgYnV0IHdlIGRvbid0
Ci0gICAgICAgICAgICAvLyBoYXZlIGFsbCB0aGUgaW5mb3JtYXRpb24gdG8gZG8gc28gKHRoZSBz
dHJ1dCBvbmx5IGhhcyB0aGUgcmVtYWluaW5nIGFtb3VudCB0byBwdXNoKS4gR2Vja28gZ2V0cyB0
aGlzIHdyb25nIHRvbwotICAgICAgICAgICAgLy8gYW5kIHB1c2hlcyB0byB0aGUgbmV4dCBwYWdl
IGFueXdheSwgc28gbm90IHRvbyBjb25jZXJuZWQgYWJvdXQgaXQuCi0gICAgICAgICAgICBzZXRQ
YWdpbmF0aW9uU3RydXQocmVzdWx0ICsgcGFnaW5hdGlvblN0cnV0KTsKLSAgICAgICAgICAgIGlm
IChjaGlsZFJlbmRlckJsb2NrKQotICAgICAgICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPnNl
dFBhZ2luYXRpb25TdHJ1dCgwKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXN1bHQg
Kz0gcGFnaW5hdGlvblN0cnV0OwotICAgIH0KLQotICAgIC8vIFNpbWlsYXIgdG8gaG93IHdlIGFw
cGx5IGNsZWFyYW5jZS4gR28gYWhlYWQgYW5kIGJvb3N0IGhlaWdodCgpIHRvIGJlIHRoZSBwbGFj
ZSB3aGVyZSB3ZSdyZSBnb2luZyB0byBwb3NpdGlvbiB0aGUgY2hpbGQuCi0gICAgc2V0TG9naWNh
bEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyAocmVzdWx0IC0gb2xkVG9wKSk7Ci0gICAgCi0gICAg
Ly8gUmV0dXJuIHRoZSBmaW5hbCBhZGp1c3RlZCBsb2dpY2FsIHRvcC4KLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCiBib29sIFJlbmRlckJsb2NrOjpsaW5lV2lkdGhGb3JQYWdpbmF0ZWRMaW5lQ2hh
bmdlZChSb290SW5saW5lQm94KiByb290Qm94LCBMYXlvdXRVbml0IGxpbmVEZWx0YSwgUmVuZGVy
Rmxvd1RocmVhZCogZmxvd1RocmVhZCkgY29uc3QKIHsKICAgICBpZiAoIWZsb3dUaHJlYWQpCkBA
IC03NzE4LDY2ICs2ODU2LDYgQEAgYm9vbCBSZW5kZXJCbG9jazo6aGFzTWFyZ2luQWZ0ZXJRdWly
ayhjbwogICAgIHJldHVybiBmYWxzZTsKIH0KIAotUmVuZGVyQmxvY2s6Ok1hcmdpblZhbHVlcyBS
ZW5kZXJCbG9jazo6bWFyZ2luVmFsdWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3QK
LXsKLSAgICBMYXlvdXRVbml0IGNoaWxkQmVmb3JlUG9zaXRpdmUgPSAwOwotICAgIExheW91dFVu
aXQgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IDA7Ci0gICAgTGF5b3V0VW5pdCBjaGlsZEFmdGVyUG9z
aXRpdmUgPSAwOwotICAgIExheW91dFVuaXQgY2hpbGRBZnRlck5lZ2F0aXZlID0gMDsKLQotICAg
IExheW91dFVuaXQgYmVmb3JlTWFyZ2luID0gMDsKLSAgICBMYXlvdXRVbml0IGFmdGVyTWFyZ2lu
ID0gMDsKLQotICAgIFJlbmRlckJsb2NrKiBjaGlsZFJlbmRlckJsb2NrID0gY2hpbGQtPmlzUmVu
ZGVyQmxvY2soKSA/IHRvUmVuZGVyQmxvY2soY2hpbGQpIDogMDsKLSAgICAKLSAgICAvLyBJZiB0
aGUgY2hpbGQgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbmFsaXR5IGFzIHdlIGRvLCB0aGVuIHdlIGNh
biBqdXN0IHJldHVybiBpdHMKLSAgICAvLyBtYXJnaW5zIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4K
LSAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKSB7Ci0gICAgICAgIGlmIChjaGls
ZFJlbmRlckJsb2NrKSB7Ci0gICAgICAgICAgICBjaGlsZEJlZm9yZVBvc2l0aXZlID0gY2hpbGRS
ZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgICAgIGNoaWxk
QmVmb3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+
bWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZl
ID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgYmVmb3JlTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgp
OwotICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKLSAgICAg
ICAgfQotICAgIH0gZWxzZSBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgewotICAgICAgICAvLyBUaGUgY2hpbGQgaGFzIGEg
ZGlmZmVyZW50IGRpcmVjdGlvbmFsaXR5LiAgSWYgdGhlIGNoaWxkIGlzIHBhcmFsbGVsLCB0aGVu
IGl0J3MganVzdAotICAgICAgICAvLyBmbGlwcGVkIHJlbGF0aXZlIHRvIHVzLiAgV2UgY2FuIHVz
ZSB0aGUgbWFyZ2lucyBmb3IgdGhlIG9wcG9zaXRlIGVkZ2VzLgotICAgICAgICBpZiAoY2hpbGRS
ZW5kZXJCbG9jaykgewotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGNoaWxkUmVu
ZGVyQmxvY2stPm1heFBvc2l0aXZlTWFyZ2luQWZ0ZXIoKTsKLSAgICAgICAgICAgIGNoaWxkQmVm
b3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
Ci0gICAgICAgICAgICBjaGlsZEFmdGVyUG9zaXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhQ
b3NpdGl2ZU1hcmdpbkJlZm9yZSgpOwotICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZlID0g
Y2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKTsKLSAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgIGJlZm9yZU1hcmdpbiA9IGNoaWxkLT5tYXJnaW5BZnRlcigpOwot
ICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQmVmb3JlKCk7Ci0gICAgICAg
IH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBUaGUgY2hpbGQgaXMgcGVycGVuZGljdWxhciB0
byB1cywgd2hpY2ggbWVhbnMgaXRzIG1hcmdpbnMgZG9uJ3QgY29sbGFwc2UgYnV0IGFyZSBvbiB0
aGUKLSAgICAgICAgLy8gImxvZ2ljYWwgbGVmdC9yaWdodCIgc2lkZXMgb2YgdGhlIGNoaWxkIGJv
eC4gIFdlIGNhbiBqdXN0IHJldHVybiB0aGUgcmF3IG1hcmdpbiBpbiB0aGlzIGNhc2UuCi0gICAg
ICAgIGJlZm9yZU1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKLSAgICAgICAg
YWZ0ZXJNYXJnaW4gPSBtYXJnaW5BZnRlckZvckNoaWxkKGNoaWxkKTsKLSAgICB9Ci0KLSAgICAv
LyBSZXNvbHZlIHVuY29sbGFwc2luZyBtYXJnaW5zIGludG8gdGhlaXIgcG9zaXRpdmUvbmVnYXRp
dmUgYnVja2V0cy4KLSAgICBpZiAoYmVmb3JlTWFyZ2luKSB7Ci0gICAgICAgIGlmIChiZWZvcmVN
YXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGJlZm9yZU1hcmdp
bjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IC1iZWZv
cmVNYXJnaW47Ci0gICAgfQotICAgIGlmIChhZnRlck1hcmdpbikgewotICAgICAgICBpZiAoYWZ0
ZXJNYXJnaW4gPiAwKQotICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gYWZ0ZXJNYXJn
aW47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IC1hZnRl
ck1hcmdpbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9z
aXRpdmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRl
ck5lZ2F0aXZlKTsKLX0KLQogY29uc3QgY2hhciogUmVuZGVyQmxvY2s6OnJlbmRlck5hbWUoKSBj
b25zdAogewogICAgIGlmIChpc0JvZHkoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9jay5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9S
ZW5kZXJCbG9jay5oCShyZXZpc2lvbiAxNTUzNzcpCisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2suaAkod29ya2luZyBjb3B5KQpAQCAtMzQyLDcgKzM0Miw3IEBAIHB1Ymxp
YzoKICAgICB2b2lkIHNldExpbmVHcmlkQm94KFJvb3RJbmxpbmVCb3gqIGJveCkKICAgICB7CiAg
ICAgICAgIGlmICghbV9yYXJlRGF0YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0
cihuZXcgUmVuZGVyQmxvY2tSYXJlRGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRh
ID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIGlmIChtX3Jh
cmVEYXRhLT5tX2xpbmVHcmlkQm94KQogICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5lR3Jp
ZEJveC0+ZGVzdHJveShyZW5kZXJBcmVuYSgpKTsKICAgICAgICAgbV9yYXJlRGF0YS0+bV9saW5l
R3JpZEJveCA9IGJveDsKQEAgLTM3MSwzMyArMzcxLDYgQEAgcHVibGljOgogCiAgICAgdmlydHVh
bCB2b2lkIHVwZGF0ZUZpcnN0TGV0dGVyKCk7CiAKLSAgICBjbGFzcyBNYXJnaW5WYWx1ZXMgewot
ICAgIHB1YmxpYzoKLSAgICAgICAgTWFyZ2luVmFsdWVzKExheW91dFVuaXQgYmVmb3JlUG9zLCBM
YXlvdXRVbml0IGJlZm9yZU5lZywgTGF5b3V0VW5pdCBhZnRlclBvcywgTGF5b3V0VW5pdCBhZnRl
ck5lZykKLSAgICAgICAgICAgIDogbV9wb3NpdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVQb3MpCi0g
ICAgICAgICAgICAsIG1fbmVnYXRpdmVNYXJnaW5CZWZvcmUoYmVmb3JlTmVnKQotICAgICAgICAg
ICAgLCBtX3Bvc2l0aXZlTWFyZ2luQWZ0ZXIoYWZ0ZXJQb3MpCi0gICAgICAgICAgICAsIG1fbmVn
YXRpdmVNYXJnaW5BZnRlcihhZnRlck5lZykKLSAgICAgICAgeyB9Ci0gICAgICAgIAotICAgICAg
ICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9wb3Np
dGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQmVm
b3JlKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZTsgfQotICAgICAgICBM
YXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aXZl
TWFyZ2luQWZ0ZXI7IH0KLSAgICAgICAgTGF5b3V0VW5pdCBuZWdhdGl2ZU1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbkFmdGVyOyB9Ci0gICAgICAgIAotICAgICAg
ICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luQmVmb3JlKExheW91dFVuaXQgcG9zKSB7IG1fcG9zaXRp
dmVNYXJnaW5CZWZvcmUgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbkJl
Zm9yZShMYXlvdXRVbml0IG5lZykgeyBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbmVnOyB9Ci0g
ICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5BZnRlcihMYXlvdXRVbml0IHBvcykgeyBtX3Bv
c2l0aXZlTWFyZ2luQWZ0ZXIgPSBwb3M7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdp
bkFmdGVyKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5BZnRlciA9IG5lZzsgfQot
ICAgIAotICAgIHByaXZhdGU6Ci0gICAgICAgIExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkJl
Zm9yZTsKLSAgICAgICAgTGF5b3V0VW5pdCBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlOwotICAgICAg
ICBMYXlvdXRVbml0IG1fcG9zaXRpdmVNYXJnaW5BZnRlcjsKLSAgICAgICAgTGF5b3V0VW5pdCBt
X25lZ2F0aXZlTWFyZ2luQWZ0ZXI7Ci0gICAgfTsKLSAgICBNYXJnaW5WYWx1ZXMgbWFyZ2luVmFs
dWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHZvaWQg
c2Nyb2xsYmFyc0NoYW5nZWQoYm9vbCAvKmhvcml6b250YWxTY3JvbGxiYXJDaGFuZ2VkKi8sIGJv
b2wgLyp2ZXJ0aWNhbFNjcm9sbGJhckNoYW5nZWQqLykgeyB9OwogCiAgICAgTGF5b3V0VW5pdCBs
b2dpY2FsTGVmdE9mZnNldEZvckNvbnRlbnQoUmVuZGVyUmVnaW9uKikgY29uc3Q7CkBAIC00Njgs
NyArNDQxLDcgQEAgcHVibGljOgogICAgIHZvaWQgc2V0U2hhcGVJbnNpZGVJbmZvKFBhc3NPd25Q
dHI8U2hhcGVJbnNpZGVJbmZvPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIGlmICghbV9yYXJlRGF0
YSkKLSAgICAgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVyQmxvY2tSYXJl
RGF0YSh0aGlzKSk7CisgICAgICAgICAgICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRl
ckJsb2NrUmFyZURhdGEoKSk7CiAgICAgICAgIG1fcmFyZURhdGEtPm1fc2hhcGVJbnNpZGVJbmZv
ID0gdmFsdWU7CiAgICAgfQogICAgIHZvaWQgbWFya1NoYXBlSW5zaWRlRGVzY2VuZGFudHNGb3JM
YXlvdXQoKTsKQEAgLTQ4MCwzOCArNDUzLDYgQEAgcHVibGljOgogcHJvdGVjdGVkOgogICAgIHZp
cnR1YWwgdm9pZCB3aWxsQmVEZXN0cm95ZWQoKTsKIAotICAgIExheW91dFVuaXQgbWF4UG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3JhcmVEYXRhID8gbV9yYXJlRGF0YS0+
bV9tYXJnaW5zLnBvc2l0aXZlTWFyZ2luQmVmb3JlKCkgOiBSZW5kZXJCbG9ja1JhcmVEYXRhOjpw
b3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyk7IH0KLSAgICBMYXlvdXRVbml0IG1heE5l
Z2F0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURh
dGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVuZGVyQmxvY2tSYXJlRGF0
YTo6bmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0KHRoaXMpOyB9Ci0gICAgTGF5b3V0VW5pdCBt
YXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgY29uc3QgeyByZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFy
ZURhdGEtPm1fbWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkgOiBSZW5kZXJCbG9ja1JhcmVE
YXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKTsgfQotICAgIExheW91dFVuaXQg
bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcmFyZURhdGEgPyBtX3Jh
cmVEYXRhLT5tX21hcmdpbnMubmVnYXRpdmVNYXJnaW5BZnRlcigpIDogUmVuZGVyQmxvY2tSYXJl
RGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1bHQodGhpcyk7IH0KLSAgICAKLSAgICB2b2lk
IHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhMYXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcp
OwotICAgIHZvaWQgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91
dFVuaXQgbmVnKTsKLQotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCA9
IHRydWUpOwotICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5BZnRlcihib29sID0gdHJ1ZSk7
Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29uc3Q7Ci0gICAgYm9vbCBt
dXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3Q7Ci0KLSAgICBib29sIG11c3REaXNjYXJkTWFy
Z2luQmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0gICAgYm9vbCBtdXN0
RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7Ci0KLSAg
ICBib29sIG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCop
IGNvbnN0OwotICAgIGJvb2wgbXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBS
ZW5kZXJCb3gqKSBjb25zdDsKLQotICAgIHZvaWQgaW5pdE1heE1hcmdpblZhbHVlcygpCi0gICAg
ewotICAgICAgICBpZiAobV9yYXJlRGF0YSkgewotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9t
YXJnaW5zID0gTWFyZ2luVmFsdWVzKFJlbmRlckJsb2NrUmFyZURhdGE6OnBvc2l0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSAsIFJlbmRlckJsb2NrUmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdCh0aGlzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBSZW5kZXJCbG9ja1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVm
YXVsdCh0aGlzKSwgUmVuZGVyQmxvY2tSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1
bHQodGhpcykpOwotICAgICAgICAgICAgbV9yYXJlRGF0YS0+bV9wYWdpbmF0aW9uU3RydXQgPSAw
OwotCi0gICAgICAgICAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUgPSBmYWxz
ZTsKLSAgICAgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkFmdGVyID0gZmFsc2U7
Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7CiAKICAgICB2
b2lkIGxheW91dFBvc2l0aW9uZWRPYmplY3RzKGJvb2wgcmVsYXlvdXRDaGlsZHJlbiwgYm9vbCBm
aXhlZFBvc2l0aW9uT2JqZWN0c09ubHkgPSBmYWxzZSk7CkBAIC02MzUsOSArNTc2LDYgQEAgcHJp
dmF0ZToKICAgICAKICAgICB2aXJ0dWFsIGJvb2wgaXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCkgY29u
c3QgT1ZFUlJJREUgRklOQUw7CiAKLSAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFy
Z2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUgRklOQUwgeyByZXR1cm4gbWF4UG9zaXRpdmVNYXJn
aW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7IH0KLSAgICB2aXJ0dWFsIExh
eW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0ZXIoKSBjb25zdCBPVkVSUklERSBGSU5BTCB7IHJl
dHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgLSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7
IH0KLQogICAgIHZpcnR1YWwgdm9pZCByZXBhaW50T3ZlcmhhbmdpbmdGbG9hdHMoYm9vbCBwYWlu
dEFsbERlc2NlbmRhbnRzKSBPVkVSUklERSBGSU5BTDsKIAogICAgIEJpZGlSdW4qIGhhbmRsZVRy
YWlsaW5nU3BhY2VzKEJpZGlSdW5MaXN0PEJpZGlSdW4+JiwgQmlkaUNvbnRleHQqKTsKQEAgLTEw
MDYsMTAxICs5NDQsMTAgQEAgcHJpdmF0ZToKICAgICBSZW5kZXJCbG9jayogY29udGFpbmluZ0Nv
bHVtbnNCbG9jayhib29sIGFsbG93QW5vbnltb3VzQ29sdW1uQmxvY2sgPSB0cnVlKTsKICAgICBS
ZW5kZXJCbG9jayogY29sdW1uc0Jsb2NrRm9yU3Bhbm5pbmdFbGVtZW50KFJlbmRlck9iamVjdCog
bmV3Q2hpbGQpOwogCi0gICAgY2xhc3MgTWFyZ2luSW5mbyB7Ci0gICAgICAgIC8vIENvbGxhcHNp
bmcgZmxhZ3MgZm9yIHdoZXRoZXIgd2UgY2FuIGNvbGxhcHNlIG91ciBtYXJnaW5zIHdpdGggb3Vy
IGNoaWxkcmVuJ3MgbWFyZ2lucy4KLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxk
cmVuIDogMTsKLSAgICAgICAgYm9vbCBtX2NhbkNvbGxhcHNlTWFyZ2luQWZ0ZXJXaXRoQ2hpbGRy
ZW4gOiAxOwotCi0gICAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBhIHF1aXJreSBjb250
YWluZXIsIGkuZS4sIGRvIHdlIGNvbGxhcHNlIGF3YXkgdG9wIGFuZCBib3R0b20KLSAgICAgICAg
Ly8gbWFyZ2lucyBpbiBvdXIgY29udGFpbmVyLiAgVGFibGUgY2VsbHMgYW5kIHRoZSBib2R5IGFy
ZSB0aGUgY29tbW9uIGV4YW1wbGVzLiBXZQotICAgICAgICAvLyBhbHNvIGhhdmUgYSBjdXN0b20g
c3R5bGUgcHJvcGVydHkgZm9yIFNhZmFyaSBSU1MgdG8gZGVhbCB3aXRoIFR5cGVQYWQgYmxvZyBh
cnRpY2xlcy4KLSAgICAgICAgYm9vbCBtX3F1aXJrQ29udGFpbmVyIDogMTsKLQotICAgICAgICAv
LyBUaGlzIGZsYWcgdHJhY2tzIHdoZXRoZXIgd2UgYXJlIHN0aWxsIGxvb2tpbmcgYXQgY2hpbGQg
bWFyZ2lucyB0aGF0IGNhbiBhbGwgY29sbGFwc2UgdG9nZXRoZXIgYXQgdGhlIGJlZ2lubmluZyBv
ZiBhIGJsb2NrLiAgCi0gICAgICAgIC8vIFRoZXkgbWF5IG9yIG1heSBub3QgY29sbGFwc2Ugd2l0
aCB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgYmxvY2sgKHxtX2NhbkNvbGxhcHNlVG9wV2l0aENoaWxk
cmVufCB0ZWxscyB1cyB0aGF0KSwgYnV0IHRoZXkgd2lsbAotICAgICAgICAvLyBhbHdheXMgYmUg
Y29sbGFwc2luZyB3aXRoIG9uZSBhbm90aGVyLiAgVGhpcyB2YXJpYWJsZSBjYW4gcmVtYWluIHNl
dCB0byB0cnVlIHRocm91Z2ggbXVsdGlwbGUgaXRlcmF0aW9ucyAKLSAgICAgICAgLy8gYXMgbG9u
ZyBhcyB3ZSBrZWVwIGVuY291bnRlcmluZyBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLgotICAgICAg
ICBib29sIG1fYXRCZWZvcmVTaWRlT2ZCbG9jayA6IDE7Ci0KLSAgICAgICAgLy8gVGhpcyBmbGFn
IGlzIHNldCB3aGVuIHdlIGtub3cgd2UncmUgZXhhbWluaW5nIGJvdHRvbSBtYXJnaW5zIGFuZCB3
ZSBrbm93IHdlJ3JlIGF0IHRoZSBib3R0b20gb2YgdGhlIGJsb2NrLgotICAgICAgICBib29sIG1f
YXRBZnRlclNpZGVPZkJsb2NrIDogMTsKLQotICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgYXJl
IHVzZWQgdG8gZGV0ZWN0IHF1aXJreSBtYXJnaW5zIHRoYXQgd2UgbmVlZCB0byBjb2xsYXBzZSBh
d2F5IChpbiB0YWJsZSBjZWxscwotICAgICAgICAvLyBhbmQgaW4gdGhlIGJvZHkgZWxlbWVudCku
Ci0gICAgICAgIGJvb2wgbV9oYXNNYXJnaW5CZWZvcmVRdWlyayA6IDE7Ci0gICAgICAgIGJvb2wg
bV9oYXNNYXJnaW5BZnRlclF1aXJrIDogMTsKLSAgICAgICAgYm9vbCBtX2RldGVybWluZWRNYXJn
aW5CZWZvcmVRdWlyayA6IDE7Ci0KLSAgICAgICAgYm9vbCBtX2Rpc2NhcmRNYXJnaW4gOiAxOwot
Ci0gICAgICAgIC8vIFRoZXNlIGZsYWdzIHRyYWNrIHRoZSBwcmV2aW91cyBtYXhpbWFsIHBvc2l0
aXZlIGFuZCBuZWdhdGl2ZSBtYXJnaW5zLgotICAgICAgICBMYXlvdXRVbml0IG1fcG9zaXRpdmVN
YXJnaW47Ci0gICAgICAgIExheW91dFVuaXQgbV9uZWdhdGl2ZU1hcmdpbjsKLQotICAgIHB1Ymxp
YzoKLSAgICAgICAgTWFyZ2luSW5mbyhSZW5kZXJCbG9jayosIExheW91dFVuaXQgYmVmb3JlQm9y
ZGVyUGFkZGluZywgTGF5b3V0VW5pdCBhZnRlckJvcmRlclBhZGRpbmcpOwotCi0gICAgICAgIHZv
aWQgc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9hdEJlZm9yZVNpZGVPZkJsb2Nr
ID0gYjsgfQotICAgICAgICB2b2lkIHNldEF0QWZ0ZXJTaWRlT2ZCbG9jayhib29sIGIpIHsgbV9h
dEFmdGVyU2lkZU9mQmxvY2sgPSBiOyB9Ci0gICAgICAgIHZvaWQgY2xlYXJNYXJnaW4oKQotICAg
ICAgICB7Ci0gICAgICAgICAgICBtX3Bvc2l0aXZlTWFyZ2luID0gMDsKLSAgICAgICAgICAgIG1f
bmVnYXRpdmVNYXJnaW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0SGFzTWFyZ2lu
QmVmb3JlUXVpcmsoYm9vbCBiKSB7IG1faGFzTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAg
ICAgIHZvaWQgc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhib29sIGIpIHsgbV9oYXNNYXJnaW5BZnRl
clF1aXJrID0gYjsgfQotICAgICAgICB2b2lkIHNldERldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
ayhib29sIGIpIHsgbV9kZXRlcm1pbmVkTWFyZ2luQmVmb3JlUXVpcmsgPSBiOyB9Ci0gICAgICAg
IHZvaWQgc2V0UG9zaXRpdmVNYXJnaW4oTGF5b3V0VW5pdCBwKSB7IEFTU0VSVCghbV9kaXNjYXJk
TWFyZ2luKTsgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7IH0KLSAgICAgICAgdm9pZCBzZXROZWdhdGl2
ZU1hcmdpbihMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX25lZ2F0
aXZlTWFyZ2luID0gbjsgfQotICAgICAgICB2b2lkIHNldFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIo
TGF5b3V0VW5pdCBwKQotICAgICAgICB7Ci0gICAgICAgICAgICBBU1NFUlQoIW1fZGlzY2FyZE1h
cmdpbik7Ci0gICAgICAgICAgICBpZiAocCA+IG1fcG9zaXRpdmVNYXJnaW4pCi0gICAgICAgICAg
ICAgICAgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7Ci0gICAgICAgIH0KLSAgICAgICAgdm9pZCBzZXRO
ZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKExheW91dFVuaXQgbikKLSAgICAgICAgewotICAgICAgICAg
ICAgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOwotICAgICAgICAgICAgaWYgKG4gPiBtX25lZ2F0
aXZlTWFyZ2luKQotICAgICAgICAgICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSBuOwotICAgICAg
ICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNYXJnaW4oTGF5b3V0VW5pdCBwLCBMYXlvdXRVbml0IG4p
IHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX3Bvc2l0aXZlTWFyZ2luID0gcDsgbV9uZWdh
dGl2ZU1hcmdpbiA9IG47IH0KLSAgICAgICAgdm9pZCBzZXRDYW5Db2xsYXBzZU1hcmdpbkFmdGVy
V2l0aENoaWxkcmVuKGJvb2wgY29sbGFwc2UpIHsgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0
aENoaWxkcmVuID0gY29sbGFwc2U7IH0KLSAgICAgICAgdm9pZCBzZXREaXNjYXJkTWFyZ2luKGJv
b2wgdmFsdWUpIHsgbV9kaXNjYXJkTWFyZ2luID0gdmFsdWU7IH0KLQotICAgICAgICBib29sIGF0
QmVmb3JlU2lkZU9mQmxvY2soKSBjb25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2s7
IH0KLSAgICAgICAgYm9vbCBjYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJl
dHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdp
dGhDaGlsZHJlbjsgfQotICAgICAgICBib29sIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkg
Y29uc3QgeyByZXR1cm4gbV9hdEFmdGVyU2lkZU9mQmxvY2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5CZWZv
cmVXaXRoQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3Jl
V2l0aENoaWxkcmVuOyB9Ci0gICAgICAgIGJvb2wgY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhD
aGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FuQ29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGls
ZHJlbjsgfQotICAgICAgICBib29sIHF1aXJrQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gbV9x
dWlya0NvbnRhaW5lcjsgfQotICAgICAgICBib29sIGRldGVybWluZWRNYXJnaW5CZWZvcmVRdWly
aygpIGNvbnN0IHsgcmV0dXJuIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrOyB9Ci0gICAg
ICAgIGJvb2wgaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSBjb25zdCB7IHJldHVybiBtX2hhc01hcmdp
bkJlZm9yZVF1aXJrOyB9Ci0gICAgICAgIGJvb2wgaGFzTWFyZ2luQWZ0ZXJRdWlyaygpIGNvbnN0
IHsgcmV0dXJuIG1faGFzTWFyZ2luQWZ0ZXJRdWlyazsgfQotICAgICAgICBMYXlvdXRVbml0IHBv
c2l0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9wb3NpdGl2ZU1hcmdpbjsgfQotICAgICAg
ICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1h
cmdpbjsgfQotICAgICAgICBib29sIGRpc2NhcmRNYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX2Rp
c2NhcmRNYXJnaW47IH0KLSAgICAgICAgTGF5b3V0VW5pdCBtYXJnaW4oKSBjb25zdCB7IHJldHVy
biBtX3Bvc2l0aXZlTWFyZ2luIC0gbV9uZWdhdGl2ZU1hcmdpbjsgfQotICAgIH07Ci0KLSAgICB2
b2lkIGxheW91dEJsb2NrQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYsIExheW91
dFVuaXQmIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tLCBMYXlvdXRVbml0JiBtYXhGbG9hdExv
Z2ljYWxCb3R0b20pOwotICAgIHZvaWQgYWRqdXN0UG9zaXRpb25lZEJsb2NrKFJlbmRlckJveCog
Y2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIGFkanVzdEZsb2F0aW5nQmxvY2so
Y29uc3QgTWFyZ2luSW5mbyYpOwotCiAgICAgUmVuZGVyQm94TW9kZWxPYmplY3QqIGNyZWF0ZVJl
cGxhY2VtZW50UnVuSW4oUmVuZGVyQm94TW9kZWxPYmplY3QqIHJ1bkluKTsKICAgICB2b2lkIG1v
dmVSdW5JblVuZGVyU2libGluZ0Jsb2NrSWZOZWVkZWQoUmVuZGVyT2JqZWN0KiBydW5Jbik7CiAg
ICAgdm9pZCBtb3ZlUnVuSW5Ub09yaWdpbmFsUG9zaXRpb24oUmVuZGVyT2JqZWN0KiBydW5Jbik7
CiAKLSAgICBMYXlvdXRVbml0IGNvbGxhcHNlTWFyZ2lucyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJn
aW5JbmZvJik7Ci0gICAgTGF5b3V0VW5pdCBjbGVhckZsb2F0c0lmTmVlZGVkKFJlbmRlckJveCog
Y2hpbGQsIE1hcmdpbkluZm8mLCBMYXlvdXRVbml0IG9sZFRvcFBvc01hcmdpbiwgTGF5b3V0VW5p
dCBvbGRUb3BOZWdNYXJnaW4sIExheW91dFVuaXQgeVBvcyk7Ci0gICAgTGF5b3V0VW5pdCBlc3Rp
bWF0ZUxvZ2ljYWxUb3BQb3NpdGlvbihSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZv
JiwgTGF5b3V0VW5pdCYgZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbik7Ci0gICAgdm9pZCBtYXJn
aW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJveCosIExheW91dFVuaXQmLCBMYXlvdXRV
bml0JiwgYm9vbCYpIGNvbnN0OwotICAgIHZvaWQgaGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IHRvcCwgTGF5b3V0VW5pdCBib3R0b20sIE1hcmdpbkluZm8mKTsKLSAgICB2b2lkIHNl
dENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJik7Ci0gICAgLy8gRW5kIGhl
bHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCBieSBsYXlvdXRCbG9ja0NoaWxkcmVuLgot
CiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBsYXlvdXRJbmxpbmVDaGlsZHJlbigpCiAgICAg
Um9vdElubGluZUJveCogY3JlYXRlTGluZUJveGVzRnJvbUJpZGlSdW5zKEJpZGlSdW5MaXN0PEJp
ZGlSdW4+JiwgY29uc3QgSW5saW5lSXRlcmF0b3ImIGVuZCwgTGluZUluZm8mLCBWZXJ0aWNhbFBv
c2l0aW9uQ2FjaGUmLCBCaWRpUnVuKiB0cmFpbGluZ1NwYWNlUnVuLCBXb3JkTWVhc3VyZW1lbnRz
Jik7CiAgICAgdm9pZCBsYXlvdXRSdW5zQW5kRmxvYXRzKExpbmVMYXlvdXRTdGF0ZSYsIGJvb2wg
aGFzSW5saW5lQ2hpbGQpOwpAQCAtMTEzMyw5ICs5ODAsNiBAQCBwcm90ZWN0ZWQ6CiAKICAgICB2
aXJ0dWFsIENvbHVtbkluZm86OlBhZ2luYXRpb25Vbml0IHBhZ2luYXRpb25Vbml0KCkgY29uc3Q7
CiAKLSAgICBMYXlvdXRVbml0IGFwcGx5QmVmb3JlQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5
b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KTsgLy8gSWYgdGhlIGNoaWxkIGhhcyBhIGJlZm9yZSBicmVh
aywgdGhlbiByZXR1cm4gYSBuZXcgeVBvcyB0aGF0IHNoaWZ0cyB0byB0aGUgdG9wIG9mIHRoZSBu
ZXh0IHBhZ2UvY29sdW1uLgotICAgIExheW91dFVuaXQgYXBwbHlBZnRlckJyZWFrKFJlbmRlckJv
eCogY2hpbGQsIExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgTWFyZ2luSW5mbyYpOyAvLyBJZiB0
aGUgY2hpbGQgaGFzIGFuIGFmdGVyIGJyZWFrLCB0aGVuIHJldHVybiBhIG5ldyBvZmZzZXQgdGhh
dCBzaGlmdHMgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlL2NvbHVtbi4KLQogcHVibGljOgog
ICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxUb3BGb3JPZmZzZXQoTGF5b3V0VW5pdCBvZmZzZXQp
IGNvbnN0OwogICAgIExheW91dFVuaXQgcGFnZUxvZ2ljYWxIZWlnaHRGb3JPZmZzZXQoTGF5b3V0
VW5pdCBvZmZzZXQpIGNvbnN0OwpAQCAtMTE1NCw3ICs5OTgsNiBAQCBwcm90ZWN0ZWQ6CiAKICAg
ICBMYXlvdXRVbml0IGFkanVzdEZvclVuc3BsaXR0YWJsZUNoaWxkKFJlbmRlckJveCogY2hpbGQs
IExheW91dFVuaXQgbG9naWNhbE9mZnNldCwgYm9vbCBpbmNsdWRlTWFyZ2lucyA9IGZhbHNlKTsg
Ly8gSWYgdGhlIGNoaWxkIGlzIHVuc3BsaXR0YWJsZSBhbmQgY2FuJ3QgZml0IG9uIHRoZSBjdXJy
ZW50IHBhZ2UsIHJldHVybiB0aGUgdG9wIG9mIHRoZSBuZXh0IHBhZ2UvY29sdW1uLgogICAgIHZv
aWQgYWRqdXN0TGluZVBvc2l0aW9uRm9yUGFnaW5hdGlvbihSb290SW5saW5lQm94KiwgTGF5b3V0
VW5pdCYgZGVsdGFPZmZzZXQsIFJlbmRlckZsb3dUaHJlYWQqKTsgLy8gQ29tcHV0ZXMgYSBkZWx0
YU9mZnNldCB2YWx1ZSB0aGF0IHB1dCBhIGxpbmUgYXQgdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdl
IGlmIGl0IGRvZXNuJ3QgZml0IG9uIHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgTGF5b3V0VW5pdCBh
ZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2ljYWxUb3BBZnRlckNs
ZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJlbmRlckJveCogY2hp
bGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jayk7CiAKICAgICAvLyBBZGp1c3QgZnJvbSBwYWlu
dGluZyBvZmZzZXRzIHRvIHRoZSBsb2NhbCBjb29yZHMgb2YgdGhpcyByZW5kZXJlcgogICAgIHZv
aWQgb2Zmc2V0Rm9yQ29udGVudHMoTGF5b3V0UG9pbnQmKSBjb25zdDsKQEAgLTEyODMsMzYgKzEx
MjYsMTUgQEAgcHVibGljOgogICAgIHN0cnVjdCBSZW5kZXJCbG9ja1JhcmVEYXRhIHsKICAgICAg
ICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoUmVuZGVyQmxvY2tSYXJlRGF0YSk7IFdURl9NQUtFX0ZB
U1RfQUxMT0NBVEVEOwogICAgIHB1YmxpYzoKLSAgICAgICAgUmVuZGVyQmxvY2tSYXJlRGF0YShj
b25zdCBSZW5kZXJCbG9jayogYmxvY2spIAotICAgICAgICAgICAgOiBtX21hcmdpbnMocG9zaXRp
dmVNYXJnaW5CZWZvcmVEZWZhdWx0KGJsb2NrKSwgbmVnYXRpdmVNYXJnaW5CZWZvcmVEZWZhdWx0
KGJsb2NrKSwgcG9zaXRpdmVNYXJnaW5BZnRlckRlZmF1bHQoYmxvY2spLCBuZWdhdGl2ZU1hcmdp
bkFmdGVyRGVmYXVsdChibG9jaykpCi0gICAgICAgICAgICAsIG1fcGFnaW5hdGlvblN0cnV0KDAp
CisgICAgICAgIFJlbmRlckJsb2NrUmFyZURhdGEoKSAKKyAgICAgICAgICAgIDogbV9wYWdpbmF0
aW9uU3RydXQoMCkKICAgICAgICAgICAgICwgbV9wYWdlTG9naWNhbE9mZnNldCgwKQogICAgICAg
ICAgICAgLCBtX2xpbmVHcmlkQm94KDApCiAgICAgICAgICAgICAsIG1fbGluZUJyZWFrVG9Bdm9p
ZFdpZG93KC0xKQogICAgICAgICAgICAgLCBtX3Nob3VsZEJyZWFrQXRMaW5lVG9Bdm9pZFdpZG93
KGZhbHNlKQotICAgICAgICAgICAgLCBtX2Rpc2NhcmRNYXJnaW5CZWZvcmUoZmFsc2UpCi0gICAg
ICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkFmdGVyKGZhbHNlKQogICAgICAgICB7IAogICAgICAg
ICB9CiAKLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5CZWZvcmVEZWZh
dWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKLSAgICAgICAgeyAKLSAgICAgICAgICAgIHJl
dHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+bWFyZ2luQmVmb3JlKCksIDApOwotICAg
ICAgICB9Ci0gICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVm
YXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCi0gICAgICAgIHsgCi0gICAgICAgICAgICBy
ZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2NrLT5tYXJnaW5CZWZvcmUoKSwgMCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgc3RhdGljIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5BZnRlckRl
ZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQotICAgICAgICB7Ci0gICAgICAgICAgICBy
ZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oYmxvY2stPm1hcmdpbkFmdGVyKCksIDApOwotICAg
ICAgICB9Ci0gICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQWZ0ZXJEZWZh
dWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0
dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KC1ibG9jay0+bWFyZ2luQWZ0ZXIoKSwgMCk7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIE1hcmdpblZhbHVlcyBtX21hcmdpbnM7CiAgICAgICAg
IExheW91dFVuaXQgbV9wYWdpbmF0aW9uU3RydXQ7CiAgICAgICAgIExheW91dFVuaXQgbV9wYWdl
TG9naWNhbE9mZnNldDsKICAgICAgICAgCkBAIC0xMzIzLDggKzExNDUsNiBAQCBwdWJsaWM6CiAg
ICAgICAgIE93blB0cjxTaGFwZUluc2lkZUluZm8+IG1fc2hhcGVJbnNpZGVJbmZvOwogI2VuZGlm
CiAgICAgICAgIGJvb2wgbV9zaG91bGRCcmVha0F0TGluZVRvQXZvaWRXaWRvdyA6IDE7Ci0gICAg
ICAgIGJvb2wgbV9kaXNjYXJkTWFyZ2luQmVmb3JlIDogMTsKLSAgICAgICAgYm9vbCBtX2Rpc2Nh
cmRNYXJnaW5BZnRlciA6IDE7CiAgICAgIH07CiAKIHByb3RlY3RlZDoKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuY3BwCShyZXZpc2lvbiAxNTUzNzcp
CisrKyBTb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzMsOSArMzMsNTAgQEAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCitzdHJ1Y3QgU2FtZVNpemVBc01hcmdpbkluZm8geworICAgIHVpbnQz
Ml90IGJpdGZpZWxkcyA6IDE2OworICAgIExheW91dFVuaXQgbWFyZ2luc1syXTsKK307CisKK0NP
TVBJTEVfQVNTRVJUKHNpemVvZihSZW5kZXJCbG9ja0Zsb3c6Ok1hcmdpblZhbHVlcykgPT0gc2l6
ZW9mKExheW91dFVuaXRbNF0pLCBNYXJnaW5WYWx1ZXNfc2hvdWxkX3N0YXlfc21hbGwpOworCisv
LyBPdXIgTWFyZ2luSW5mbyBzdGF0ZSB1c2VkIHdoZW4gbGF5aW5nIG91dCBibG9jayBjaGlsZHJl
bi4KK1JlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbzo6TWFyZ2luSW5mbyhSZW5kZXJCbG9ja0Zs
b3cqIGJsb2NrLCBMYXlvdXRVbml0IGJlZm9yZUJvcmRlclBhZGRpbmcsIExheW91dFVuaXQgYWZ0
ZXJCb3JkZXJQYWRkaW5nKQorICAgIDogbV9hdEJlZm9yZVNpZGVPZkJsb2NrKHRydWUpCisgICAg
LCBtX2F0QWZ0ZXJTaWRlT2ZCbG9jayhmYWxzZSkKKyAgICAsIG1faGFzTWFyZ2luQmVmb3JlUXVp
cmsoZmFsc2UpCisgICAgLCBtX2hhc01hcmdpbkFmdGVyUXVpcmsoZmFsc2UpCisgICAgLCBtX2Rl
dGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayhmYWxzZSkKKyAgICAsIG1fZGlzY2FyZE1hcmdpbihm
YWxzZSkKK3sKKyAgICBSZW5kZXJTdHlsZSogYmxvY2tTdHlsZSA9IGJsb2NrLT5zdHlsZSgpOwor
ICAgIEFTU0VSVChibG9jay0+aXNSZW5kZXJWaWV3KCkgfHwgYmxvY2stPnBhcmVudCgpKTsKKyAg
ICBtX2NhbkNvbGxhcHNlV2l0aENoaWxkcmVuID0gIWJsb2NrLT5pc1JlbmRlclZpZXcoKSAmJiAh
YmxvY2stPmlzUm9vdCgpICYmICFibG9jay0+aXNPdXRPZkZsb3dQb3NpdGlvbmVkKCkKKyAgICAg
ICAgJiYgIWJsb2NrLT5pc0Zsb2F0aW5nKCkgJiYgIWJsb2NrLT5pc1RhYmxlQ2VsbCgpICYmICFi
bG9jay0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIWJsb2NrLT5pc0lubGluZUJsb2NrT3JJbmxpbmVU
YWJsZSgpCisgICAgICAgICYmICFibG9jay0+aXNSZW5kZXJGbG93VGhyZWFkKCkgJiYgIWJsb2Nr
LT5pc1dyaXRpbmdNb2RlUm9vdCgpICYmICFibG9jay0+cGFyZW50KCktPmlzRmxleGlibGVCb3go
KQorICAgICAgICAmJiBibG9ja1N0eWxlLT5oYXNBdXRvQ29sdW1uQ291bnQoKSAmJiBibG9ja1N0
eWxlLT5oYXNBdXRvQ29sdW1uV2lkdGgoKSAmJiAhYmxvY2tTdHlsZS0+Y29sdW1uU3BhbigpOwor
CisgICAgbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbiA9IG1fY2FuQ29sbGFw
c2VXaXRoQ2hpbGRyZW4gJiYgIWJlZm9yZUJvcmRlclBhZGRpbmcgJiYgYmxvY2tTdHlsZS0+bWFy
Z2luQmVmb3JlQ29sbGFwc2UoKSAhPSBNU0VQQVJBVEU7CisKKyAgICAvLyBJZiBhbnkgaGVpZ2h0
IG90aGVyIHRoYW4gYXV0byBpcyBzcGVjaWZpZWQgaW4gQ1NTLCB0aGVuIHdlIGRvbid0IGNvbGxh
cHNlIG91ciBib3R0b20KKyAgICAvLyBtYXJnaW5zIHdpdGggb3VyIGNoaWxkcmVuJ3MgbWFyZ2lu
cy4gVG8gZG8gb3RoZXJ3aXNlIHdvdWxkIGJlIHRvIHJpc2sgb2RkIHZpc3VhbAorICAgIC8vIGVm
ZmVjdHMgd2hlbiB0aGUgY2hpbGRyZW4gb3ZlcmZsb3cgb3V0IG9mIHRoZSBwYXJlbnQgYmxvY2sg
YW5kIHlldCBzdGlsbCBjb2xsYXBzZQorICAgIC8vIHdpdGggaXQuIFdlIGFsc28gZG9uJ3QgY29s
bGFwc2UgaWYgd2UgaGF2ZSBhbnkgYm90dG9tIGJvcmRlci9wYWRkaW5nLgorICAgIG1fY2FuQ29s
bGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbiA9IG1fY2FuQ29sbGFwc2VXaXRoQ2hpbGRyZW4g
JiYgIWFmdGVyQm9yZGVyUGFkZGluZworICAgICAgICAmJiAoYmxvY2tTdHlsZS0+bG9naWNhbEhl
aWdodCgpLmlzQXV0bygpICYmICFibG9ja1N0eWxlLT5sb2dpY2FsSGVpZ2h0KCkudmFsdWUoKSkg
JiYgYmxvY2tTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpICE9IE1TRVBBUkFURTsKKyAgICAK
KyAgICBtX3F1aXJrQ29udGFpbmVyID0gYmxvY2stPmlzVGFibGVDZWxsKCkgfHwgYmxvY2stPmlz
Qm9keSgpOworCisgICAgbV9kaXNjYXJkTWFyZ2luID0gbV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9y
ZVdpdGhDaGlsZHJlbiAmJiBibG9jay0+bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoKTsKKworICAg
IG1fcG9zaXRpdmVNYXJnaW4gPSAobV9jYW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJl
biAmJiAhYmxvY2stPm11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkpID8gYmxvY2stPm1heFBvc2l0
aXZlTWFyZ2luQmVmb3JlKCkgOiBMYXlvdXRVbml0KCk7CisgICAgbV9uZWdhdGl2ZU1hcmdpbiA9
IChtX2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuICYmICFibG9jay0+bXVzdERp
c2NhcmRNYXJnaW5CZWZvcmUoKSkgPyBibG9jay0+bWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSA6
IExheW91dFVuaXQoKTsKK30KKwogUmVuZGVyQmxvY2tGbG93OjpSZW5kZXJCbG9ja0Zsb3coRWxl
bWVudCogZWxlbWVudCkKICAgICA6IFJlbmRlckJsb2NrKGVsZW1lbnQpCiB7CisgICAgQ09NUElM
RV9BU1NFUlQoc2l6ZW9mKFJlbmRlckJsb2NrRmxvdzo6TWFyZ2luSW5mbykgPT0gc2l6ZW9mKFNh
bWVTaXplQXNNYXJnaW5JbmZvKSwgTWFyZ2luSW5mb19zaG91bGRfc3RheV9zbWFsbCk7CiB9CiAK
IFJlbmRlckJsb2NrRmxvdzo6flJlbmRlckJsb2NrRmxvdygpCkBAIC00MTAsNCArNDUxLDg4NSBA
QCB2b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGlsZHJlCiAgICAgaGFuZGxlQWZ0
ZXJTaWRlT2ZCbG9jayhiZWZvcmVFZGdlLCBhZnRlckVkZ2UsIG1hcmdpbkluZm8pOwogfQogCit2
b2lkIFJlbmRlckJsb2NrRmxvdzo6bGF5b3V0QmxvY2tDaGlsZChSZW5kZXJCb3gqIGNoaWxkLCBN
YXJnaW5JbmZvJiBtYXJnaW5JbmZvLCBMYXlvdXRVbml0JiBwcmV2aW91c0Zsb2F0TG9naWNhbEJv
dHRvbSwgTGF5b3V0VW5pdCYgbWF4RmxvYXRMb2dpY2FsQm90dG9tKQoreworICAgIExheW91dFVu
aXQgb2xkUG9zTWFyZ2luQmVmb3JlID0gbWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICBM
YXlvdXRVbml0IG9sZE5lZ01hcmdpbkJlZm9yZSA9IG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7
CisKKyAgICAvLyBUaGUgY2hpbGQgaXMgYSBub3JtYWwgZmxvdyBvYmplY3QuIENvbXB1dGUgdGhl
IG1hcmdpbnMgd2Ugd2lsbCB1c2UgZm9yIGNvbGxhcHNpbmcgbm93LgorICAgIGNoaWxkLT5jb21w
dXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5zKHRoaXMpOworCisgICAgLy8gVHJ5IHRvIGd1
ZXNzIG91ciBjb3JyZWN0IGxvZ2ljYWwgdG9wIHBvc2l0aW9uLiBJbiBtb3N0IGNhc2VzIHRoaXMg
Z3Vlc3Mgd2lsbAorICAgIC8vIGJlIGNvcnJlY3QuIE9ubHkgaWYgd2UncmUgd3JvbmcgKHdoZW4g
d2UgY29tcHV0ZSB0aGUgcmVhbCBsb2dpY2FsIHRvcCBwb3NpdGlvbikKKyAgICAvLyB3aWxsIHdl
IGhhdmUgdG8gcG90ZW50aWFsbHkgcmVsYXlvdXQuCisgICAgTGF5b3V0VW5pdCBlc3RpbWF0ZVdp
dGhvdXRQYWdpbmF0aW9uOworICAgIExheW91dFVuaXQgbG9naWNhbFRvcEVzdGltYXRlID0gZXN0
aW1hdGVMb2dpY2FsVG9wUG9zaXRpb24oY2hpbGQsIG1hcmdpbkluZm8sIGVzdGltYXRlV2l0aG91
dFBhZ2luYXRpb24pOworCisgICAgLy8gQ2FjaGUgb3VyIG9sZCByZWN0IHNvIHRoYXQgd2UgY2Fu
IGRpcnR5IHRoZSBwcm9wZXIgcmVwYWludCByZWN0cyBpZiB0aGUgY2hpbGQgbW92ZXMuCisgICAg
TGF5b3V0UmVjdCBvbGRSZWN0ID0gY2hpbGQtPmZyYW1lUmVjdCgpOworICAgIExheW91dFVuaXQg
b2xkTG9naWNhbFRvcCA9IGxvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCk7CisKKyNpZiAhQVNTRVJU
X0RJU0FCTEVECisgICAgTGF5b3V0U2l6ZSBvbGRMYXlvdXREZWx0YSA9IHZpZXcoKS5sYXlvdXRE
ZWx0YSgpOworI2VuZGlmCisgICAgLy8gR28gYWhlYWQgYW5kIHBvc2l0aW9uIHRoZSBjaGlsZCBh
cyB0aG91Z2ggaXQgZGlkbid0IGNvbGxhcHNlIHdpdGggdGhlIHRvcC4KKyAgICBzZXRMb2dpY2Fs
VG9wRm9yQ2hpbGQoY2hpbGQsIGxvZ2ljYWxUb3BFc3RpbWF0ZSwgQXBwbHlMYXlvdXREZWx0YSk7
CisgICAgZXN0aW1hdGVSZWdpb25SYW5nZUZvckJveENoaWxkKGNoaWxkKTsKKworICAgIFJlbmRl
ckJsb2NrKiBjaGlsZFJlbmRlckJsb2NrID0gY2hpbGQtPmlzUmVuZGVyQmxvY2soKSA/IHRvUmVu
ZGVyQmxvY2soY2hpbGQpIDogMDsKKyAgICBib29sIG1hcmtEZXNjZW5kYW50c1dpdGhGbG9hdHMg
PSBmYWxzZTsKKyAgICBpZiAobG9naWNhbFRvcEVzdGltYXRlICE9IG9sZExvZ2ljYWxUb3AgJiYg
IWNoaWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVy
QmxvY2stPmNvbnRhaW5zRmxvYXRzKCkpCisgICAgICAgIG1hcmtEZXNjZW5kYW50c1dpdGhGbG9h
dHMgPSB0cnVlOworI2lmIEVOQUJMRShTVUJQSVhFTF9MQVlPVVQpCisgICAgZWxzZSBpZiAoVU5M
SUtFTFkobG9naWNhbFRvcEVzdGltYXRlLm1pZ2h0QmVTYXR1cmF0ZWQoKSkpCisgICAgICAgIC8v
IGxvZ2ljYWxUb3BFc3RpbWF0ZSwgcmV0dXJuZWQgYnkgZXN0aW1hdGVMb2dpY2FsVG9wUG9zaXRp
b24sIG1pZ2h0IGJlIHNhdHVyYXRlZCBmb3IKKyAgICAgICAgLy8gdmVyeSBsYXJnZSBlbGVtZW50
cy4gSWYgaXQgZG9lcyB0aGUgY29tcGFyaXNvbiB3aXRoIG9sZExvZ2ljYWxUb3AgbWlnaHQgeWll
bGQgYQorICAgICAgICAvLyBmYWxzZSBuZWdhdGl2ZSBhcyBhZGRpbmcgYW5kIHJlbW92aW5nIG1h
cmdpbnMsIGJvcmRlcnMgZXRjIGZyb20gYSBzYXR1cmF0ZWQgbnVtYmVyCisgICAgICAgIC8vIG1p
Z2h0IHlpZWxkIGluY29ycmVjdCByZXN1bHRzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIGFsd2F5cyBt
YXJrIGZvciBsYXlvdXQuCisgICAgICAgIG1hcmtEZXNjZW5kYW50c1dpdGhGbG9hdHMgPSB0cnVl
OworI2VuZGlmCisgICAgZWxzZSBpZiAoIWNoaWxkLT5hdm9pZHNGbG9hdHMoKSB8fCBjaGlsZC0+
c2hyaW5rVG9Bdm9pZEZsb2F0cygpKSB7CisgICAgICAgIC8vIElmIGFuIGVsZW1lbnQgbWlnaHQg
YmUgYWZmZWN0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIGZsb2F0cywgdGhlbiBhbHdheXMgbWFyayBp
dCBmb3IKKyAgICAgICAgLy8gbGF5b3V0LgorICAgICAgICBMYXlvdXRVbml0IGZiID0gbWF4KHBy
ZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9tLCBsb3dlc3RGbG9hdExvZ2ljYWxCb3R0b20oKSk7Cisg
ICAgICAgIGlmIChmYiA+IGxvZ2ljYWxUb3BFc3RpbWF0ZSkKKyAgICAgICAgICAgIG1hcmtEZXNj
ZW5kYW50c1dpdGhGbG9hdHMgPSB0cnVlOworICAgIH0KKworICAgIGlmIChjaGlsZFJlbmRlckJs
b2NrKSB7CisgICAgICAgIGlmIChtYXJrRGVzY2VuZGFudHNXaXRoRmxvYXRzKQorICAgICAgICAg
ICAgY2hpbGRSZW5kZXJCbG9jay0+bWFya0FsbERlc2NlbmRhbnRzV2l0aEZsb2F0c0ZvckxheW91
dCgpOworICAgICAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICAg
ICAgcHJldmlvdXNGbG9hdExvZ2ljYWxCb3R0b20gPSBtYXgocHJldmlvdXNGbG9hdExvZ2ljYWxC
b3R0b20sIG9sZExvZ2ljYWxUb3AgKyBjaGlsZFJlbmRlckJsb2NrLT5sb3dlc3RGbG9hdExvZ2lj
YWxCb3R0b20oKSk7CisgICAgfQorCisgICAgaWYgKCFjaGlsZC0+bmVlZHNMYXlvdXQoKSkKKyAg
ICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpOworCisgICAg
Ym9vbCBjaGlsZEhhZExheW91dCA9IGNoaWxkLT5ldmVySGFkTGF5b3V0KCk7CisgICAgYm9vbCBj
aGlsZE5lZWRlZExheW91dCA9IGNoaWxkLT5uZWVkc0xheW91dCgpOworICAgIGlmIChjaGlsZE5l
ZWRlZExheW91dCkKKyAgICAgICAgY2hpbGQtPmxheW91dCgpOworCisgICAgLy8gQ2FjaGUgaWYg
d2UgYXJlIGF0IHRoZSB0b3Agb2YgdGhlIGJsb2NrIHJpZ2h0IG5vdy4KKyAgICBib29sIGF0QmVm
b3JlU2lkZU9mQmxvY2sgPSBtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKTsKKworICAg
IC8vIE5vdyBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgeXBvcyBiYXNlZCBvZmYgZXhhbWluYXRpb24g
b2YgY29sbGFwc2luZyBtYXJnaW4KKyAgICAvLyB2YWx1ZXMuCisgICAgTGF5b3V0VW5pdCBsb2dp
Y2FsVG9wQmVmb3JlQ2xlYXIgPSBjb2xsYXBzZU1hcmdpbnMoY2hpbGQsIG1hcmdpbkluZm8pOwor
CisgICAgLy8gTm93IGNoZWNrIGZvciBjbGVhci4KKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3BB
ZnRlckNsZWFyID0gY2xlYXJGbG9hdHNJZk5lZWRlZChjaGlsZCwgbWFyZ2luSW5mbywgb2xkUG9z
TWFyZ2luQmVmb3JlLCBvbGROZWdNYXJnaW5CZWZvcmUsIGxvZ2ljYWxUb3BCZWZvcmVDbGVhcik7
CisgICAgCisgICAgYm9vbCBwYWdpbmF0ZWQgPSB2aWV3KCkubGF5b3V0U3RhdGUoKS0+aXNQYWdp
bmF0ZWQoKTsKKyAgICBpZiAocGFnaW5hdGVkKQorICAgICAgICBsb2dpY2FsVG9wQWZ0ZXJDbGVh
ciA9IGFkanVzdEJsb2NrQ2hpbGRGb3JQYWdpbmF0aW9uKGxvZ2ljYWxUb3BBZnRlckNsZWFyLCBl
c3RpbWF0ZVdpdGhvdXRQYWdpbmF0aW9uLCBjaGlsZCwKKyAgICAgICAgICAgIGF0QmVmb3JlU2lk
ZU9mQmxvY2sgJiYgbG9naWNhbFRvcEJlZm9yZUNsZWFyID09IGxvZ2ljYWxUb3BBZnRlckNsZWFy
KTsKKworICAgIHNldExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xl
YXIsIEFwcGx5TGF5b3V0RGVsdGEpOworCisgICAgLy8gTm93IHdlIGhhdmUgYSBmaW5hbCB0b3Ag
cG9zaXRpb24uIFNlZSBpZiBpdCByZWFsbHkgZG9lcyBlbmQgdXAgYmVpbmcgZGlmZmVyZW50IGZy
b20gb3VyIGVzdGltYXRlLgorICAgIC8vIGNsZWFyRmxvYXRzSWZOZWVkZWQgY2FuIGFsc28gbWFy
ayB0aGUgY2hpbGQgYXMgbmVlZGluZyBhIGxheW91dCBldmVuIHRob3VnaCB3ZSBkaWRuJ3QgbW92
ZS4gVGhpcyBoYXBwZW5zCisgICAgLy8gd2hlbiBjb2xsYXBzZU1hcmdpbnMgZHluYW1pY2FsbHkg
YWRkcyBvdmVyaGFuZ2luZyBmbG9hdHMgYmVjYXVzZSBvZiBhIGNoaWxkIHdpdGggbmVnYXRpdmUg
bWFyZ2lucy4KKyAgICBpZiAobG9naWNhbFRvcEFmdGVyQ2xlYXIgIT0gbG9naWNhbFRvcEVzdGlt
YXRlIHx8IGNoaWxkLT5uZWVkc0xheW91dCgpIHx8IChwYWdpbmF0ZWQgJiYgY2hpbGRSZW5kZXJC
bG9jayAmJiBjaGlsZFJlbmRlckJsb2NrLT5zaG91bGRCcmVha0F0TGluZVRvQXZvaWRXaWRvdygp
KSkgeworICAgICAgICBpZiAoY2hpbGQtPnNocmlua1RvQXZvaWRGbG9hdHMoKSkgeworICAgICAg
ICAgICAgLy8gVGhlIGNoaWxkJ3Mgd2lkdGggZGVwZW5kcyBvbiB0aGUgbGluZSB3aWR0aC4KKyAg
ICAgICAgICAgIC8vIFdoZW4gdGhlIGNoaWxkIHNoaWZ0cyB0byBjbGVhciBhbiBpdGVtLCBpdHMg
d2lkdGggY2FuCisgICAgICAgICAgICAvLyBjaGFuZ2UgKGJlY2F1c2UgaXQgaGFzIG1vcmUgYXZh
aWxhYmxlIGxpbmUgd2lkdGgpLgorICAgICAgICAgICAgLy8gU28gZ28gYWhlYWQgYW5kIG1hcmsg
dGhlIGl0ZW0gYXMgZGlydHkuCisgICAgICAgICAgICBjaGlsZC0+c2V0Q2hpbGROZWVkc0xheW91
dCh0cnVlLCBNYXJrT25seVRoaXMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAo
Y2hpbGRSZW5kZXJCbG9jaykgeworICAgICAgICAgICAgaWYgKCFjaGlsZC0+YXZvaWRzRmxvYXRz
KCkgJiYgY2hpbGRSZW5kZXJCbG9jay0+Y29udGFpbnNGbG9hdHMoKSkKKyAgICAgICAgICAgICAg
ICBjaGlsZFJlbmRlckJsb2NrLT5tYXJrQWxsRGVzY2VuZGFudHNXaXRoRmxvYXRzRm9yTGF5b3V0
KCk7CisgICAgICAgICAgICBpZiAoIWNoaWxkLT5uZWVkc0xheW91dCgpKQorICAgICAgICAgICAg
ICAgIGNoaWxkLT5tYXJrRm9yUGFnaW5hdGlvblJlbGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIE91ciBndWVzcyB3YXMgd3JvbmcuIE1ha2UgdGhlIGNoaWxkIGxheSBp
dHNlbGYgb3V0IGFnYWluLgorICAgICAgICBjaGlsZC0+bGF5b3V0SWZOZWVkZWQoKTsKKyAgICB9
CisKKyAgICBpZiAodXBkYXRlUmVnaW9uUmFuZ2VGb3JCb3hDaGlsZChjaGlsZCkpIHsKKyAgICAg
ICAgY2hpbGQtPnNldE5lZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIGNo
aWxkLT5sYXlvdXRJZk5lZWRlZCgpOworICAgIH0KKworICAgIC8vIFdlIGFyZSBubyBsb25nZXIg
YXQgdGhlIHRvcCBvZiB0aGUgYmxvY2sgaWYgd2UgZW5jb3VudGVyIGEgbm9uLWVtcHR5IGNoaWxk
LiAgCisgICAgLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBjaGVja2luZyBmb3IgY2xlYXIs
IHNvIHRoYXQgbWFyZ2lucyBjYW4gYmUgcmVzZXQgaWYgYSBjbGVhciBvY2N1cnJlZC4KKyAgICBp
ZiAobWFyZ2luSW5mby5hdEJlZm9yZVNpZGVPZkJsb2NrKCkgJiYgIWNoaWxkLT5pc1NlbGZDb2xs
YXBzaW5nQmxvY2soKSkKKyAgICAgICAgbWFyZ2luSW5mby5zZXRBdEJlZm9yZVNpZGVPZkJsb2Nr
KGZhbHNlKTsKKworICAgIC8vIE5vdyBwbGFjZSB0aGUgY2hpbGQgaW4gdGhlIGNvcnJlY3QgbGVm
dCBwb3NpdGlvbgorICAgIGRldGVybWluZUxvZ2ljYWxMZWZ0UG9zaXRpb25Gb3JDaGlsZChjaGls
ZCwgQXBwbHlMYXlvdXREZWx0YSk7CisKKyAgICBMYXlvdXRTaXplIGNoaWxkT2Zmc2V0ID0gY2hp
bGQtPmxvY2F0aW9uKCkgLSBvbGRSZWN0LmxvY2F0aW9uKCk7CisjaWYgRU5BQkxFKENTU19TSEFQ
RVMpCisgICAgcmVsYXlvdXRTaGFwZURlc2NlbmRhbnRJZk1vdmVkKGNoaWxkUmVuZGVyQmxvY2ss
IGNoaWxkT2Zmc2V0KTsKKyNlbmRpZgorCisgICAgLy8gVXBkYXRlIG91ciBoZWlnaHQgbm93IHRo
YXQgdGhlIGNoaWxkIGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbi4KKyAg
ICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIGxvZ2ljYWxIZWlnaHRGb3JDaGls
ZChjaGlsZCkpOworICAgIGlmIChtdXN0U2VwYXJhdGVNYXJnaW5BZnRlckZvckNoaWxkKGNoaWxk
KSkgeworICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1hcmdpbkFm
dGVyRm9yQ2hpbGQoY2hpbGQpKTsKKyAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigpOwor
ICAgIH0KKyAgICAvLyBJZiB0aGUgY2hpbGQgaGFzIG92ZXJoYW5naW5nIGZsb2F0cyB0aGF0IGlu
dHJ1ZGUgaW50byBmb2xsb3dpbmcgc2libGluZ3MgKG9yIHBvc3NpYmx5IG91dAorICAgIC8vIG9m
IHRoaXMgYmxvY2spLCB0aGVuIHRoZSBwYXJlbnQgZ2V0cyBub3RpZmllZCBvZiB0aGUgZmxvYXRz
IG5vdy4KKyAgICBpZiAoY2hpbGRSZW5kZXJCbG9jayAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250
YWluc0Zsb2F0cygpKQorICAgICAgICBtYXhGbG9hdExvZ2ljYWxCb3R0b20gPSBtYXgobWF4Rmxv
YXRMb2dpY2FsQm90dG9tLCBhZGRPdmVyaGFuZ2luZ0Zsb2F0cyh0b1JlbmRlckJsb2NrKGNoaWxk
KSwgIWNoaWxkTmVlZGVkTGF5b3V0KSk7CisKKyAgICBpZiAoY2hpbGRPZmZzZXQud2lkdGgoKSB8
fCBjaGlsZE9mZnNldC5oZWlnaHQoKSkgeworICAgICAgICB2aWV3KCkuYWRkTGF5b3V0RGVsdGEo
Y2hpbGRPZmZzZXQpOworCisgICAgICAgIC8vIElmIHRoZSBjaGlsZCBtb3ZlZCwgd2UgaGF2ZSB0
byByZXBhaW50IGl0IGFzIHdlbGwgYXMgYW55IGZsb2F0aW5nL3Bvc2l0aW9uZWQKKyAgICAgICAg
Ly8gZGVzY2VuZGFudHMuIEFuIGV4Y2VwdGlvbiBpcyBpZiB3ZSBuZWVkIGEgbGF5b3V0LiBJbiB0
aGlzIGNhc2UsIHdlIGtub3cgd2UncmUgZ29pbmcgdG8KKyAgICAgICAgLy8gcmVwYWludCBvdXJz
ZWx2ZXMgKGFuZCB0aGUgY2hpbGQpIGFueXdheS4KKyAgICAgICAgaWYgKGNoaWxkSGFkTGF5b3V0
ICYmICFzZWxmTmVlZHNMYXlvdXQoKSAmJiBjaGlsZC0+Y2hlY2tGb3JSZXBhaW50RHVyaW5nTGF5
b3V0KCkpCisgICAgICAgICAgICBjaGlsZC0+cmVwYWludER1cmluZ0xheW91dElmTW92ZWQob2xk
UmVjdCk7CisgICAgfQorCisgICAgaWYgKCFjaGlsZEhhZExheW91dCAmJiBjaGlsZC0+Y2hlY2tG
b3JSZXBhaW50RHVyaW5nTGF5b3V0KCkpIHsKKyAgICAgICAgY2hpbGQtPnJlcGFpbnQoKTsKKyAg
ICAgICAgY2hpbGQtPnJlcGFpbnRPdmVyaGFuZ2luZ0Zsb2F0cyh0cnVlKTsKKyAgICB9CisKKyAg
ICBpZiAocGFnaW5hdGVkKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBhbiBhZnRlciBwYWdlL2Nv
bHVtbiBicmVhay4KKyAgICAgICAgTGF5b3V0VW5pdCBuZXdIZWlnaHQgPSBhcHBseUFmdGVyQnJl
YWsoY2hpbGQsIGxvZ2ljYWxIZWlnaHQoKSwgbWFyZ2luSW5mbyk7CisgICAgICAgIGlmIChuZXdI
ZWlnaHQgIT0gaGVpZ2h0KCkpCisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KG5ld0hlaWdo
dCk7CisgICAgfQorCisgICAgQVNTRVJUKHZpZXcoKS5sYXlvdXREZWx0YU1hdGNoZXMob2xkTGF5
b3V0RGVsdGEpKTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdFBvc2l0aW9uZWRC
bG9jayhSZW5kZXJCb3gqIGNoaWxkLCBjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQorewor
ICAgIGJvb2wgaXNIb3Jpem9udGFsID0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKTsKKyAgICBi
b29sIGhhc1N0YXRpY0Jsb2NrUG9zaXRpb24gPSBjaGlsZC0+c3R5bGUoKS0+aGFzU3RhdGljQmxv
Y2tQb3NpdGlvbihpc0hvcml6b250YWwpOworICAgIAorICAgIExheW91dFVuaXQgbG9naWNhbFRv
cCA9IGxvZ2ljYWxIZWlnaHQoKTsKKyAgICB1cGRhdGVTdGF0aWNJbmxpbmVQb3NpdGlvbkZvckNo
aWxkKGNoaWxkLCBsb2dpY2FsVG9wKTsKKworICAgIGlmICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICAvLyBQb3NpdGlvbmVkIGJsb2NrcyBkb24n
dCBjb2xsYXBzZSBtYXJnaW5zLCBzbyBhZGQgdGhlIG1hcmdpbiBwcm92aWRlZCBieQorICAgICAg
ICAvLyB0aGUgY29udGFpbmVyIG5vdy4gVGhlIGNoaWxkJ3Mgb3duIG1hcmdpbiBpcyBhZGRlZCBs
YXRlciB3aGVuIGNhbGN1bGF0aW5nIGl0cyBsb2dpY2FsIHRvcC4KKyAgICAgICAgTGF5b3V0VW5p
dCBjb2xsYXBzZWRCZWZvcmVQb3MgPSBtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCk7CisgICAg
ICAgIExheW91dFVuaXQgY29sbGFwc2VkQmVmb3JlTmVnID0gbWFyZ2luSW5mby5uZWdhdGl2ZU1h
cmdpbigpOworICAgICAgICBsb2dpY2FsVG9wICs9IGNvbGxhcHNlZEJlZm9yZVBvcyAtIGNvbGxh
cHNlZEJlZm9yZU5lZzsKKyAgICB9CisgICAgCisgICAgUmVuZGVyTGF5ZXIqIGNoaWxkTGF5ZXIg
PSBjaGlsZC0+bGF5ZXIoKTsKKyAgICBpZiAoY2hpbGRMYXllci0+c3RhdGljQmxvY2tQb3NpdGlv
bigpICE9IGxvZ2ljYWxUb3ApIHsKKyAgICAgICAgY2hpbGRMYXllci0+c2V0U3RhdGljQmxvY2tQ
b3NpdGlvbihsb2dpY2FsVG9wKTsKKyAgICAgICAgaWYgKGhhc1N0YXRpY0Jsb2NrUG9zaXRpb24p
CisgICAgICAgICAgICBjaGlsZC0+c2V0Q2hpbGROZWVkc0xheW91dCh0cnVlLCBNYXJrT25seVRo
aXMpOworICAgIH0KK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OmFkanVzdEZsb2F0aW5nQmxv
Y2soY29uc3QgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbykKK3sKKyAgICAvLyBUaGUgZmxvYXQgc2hv
dWxkIGJlIHBvc2l0aW9uZWQgdGFraW5nIGludG8gYWNjb3VudCB0aGUgYm90dG9tIG1hcmdpbgor
ICAgIC8vIG9mIHRoZSBwcmV2aW91cyBmbG93LiBXZSBhZGQgdGhhdCBtYXJnaW4gaW50byB0aGUg
aGVpZ2h0LCBnZXQgdGhlCisgICAgLy8gZmxvYXQgcG9zaXRpb25lZCBwcm9wZXJseSwgYW5kIHRo
ZW4gc3VidHJhY3QgdGhlIG1hcmdpbiBvdXQgb2YgdGhlCisgICAgLy8gaGVpZ2h0IGFnYWluLiBJ
biB0aGUgY2FzZSBvZiBzZWxmLWNvbGxhcHNpbmcgYmxvY2tzLCB3ZSBhbHdheXMganVzdAorICAg
IC8vIHVzZSB0aGUgdG9wIG1hcmdpbnMsIHNpbmNlIHRoZSBzZWxmLWNvbGxhcHNpbmcgYmxvY2sg
Y29sbGFwc2VkIGl0cworICAgIC8vIG93biBib3R0b20gbWFyZ2luIGludG8gaXRzIHRvcCBtYXJn
aW4uCisgICAgLy8KKyAgICAvLyBOb3RlIGFsc28gdGhhdCB0aGUgcHJldmlvdXMgZmxvdyBtYXkg
Y29sbGFwc2UgaXRzIG1hcmdpbiBpbnRvIHRoZSB0b3Agb2YKKyAgICAvLyBvdXIgYmxvY2suIElm
IHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gd2UgZG8gbm90IGFkZCB0aGUgbWFyZ2luIGluIHRvIG91
cgorICAgIC8vIGhlaWdodCB3aGVuIGNvbXB1dGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIGZsb2F0
LiBUaGlzIGNvbmRpdGlvbiBjYW4gYmUgdGVzdGVkCisgICAgLy8gZm9yIGJ5IHNpbXBseSBjYWxs
aW5nIGNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZS4gU2VlCisgICAgLy8gaHR0cDovL3d3dy5o
aXhpZS5jaC90ZXN0cy9hZGhvYy9jc3MvYm94L2Jsb2NrL21hcmdpbi1jb2xsYXBzZS8wNDYuaHRt
bCBmb3IKKyAgICAvLyBhbiBleGFtcGxlIG9mIHRoaXMgc2NlbmFyaW8uCisgICAgTGF5b3V0VW5p
dCBtYXJnaW5PZmZzZXQgPSBtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgp
ID8gTGF5b3V0VW5pdCgpIDogbWFyZ2luSW5mby5tYXJnaW4oKTsKKyAgICBzZXRMb2dpY2FsSGVp
Z2h0KGxvZ2ljYWxIZWlnaHQoKSArIG1hcmdpbk9mZnNldCk7CisgICAgcG9zaXRpb25OZXdGbG9h
dHMoKTsKKyAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSAtIG1hcmdpbk9mZnNl
dCk7Cit9CisKK1JlbmRlckJsb2NrRmxvdzo6TWFyZ2luVmFsdWVzIFJlbmRlckJsb2NrRmxvdzo6
bWFyZ2luVmFsdWVzRm9yQ2hpbGQoUmVuZGVyQm94KiBjaGlsZCkgY29uc3QKK3sKKyAgICBMYXlv
dXRVbml0IGNoaWxkQmVmb3JlUG9zaXRpdmUgPSAwOworICAgIExheW91dFVuaXQgY2hpbGRCZWZv
cmVOZWdhdGl2ZSA9IDA7CisgICAgTGF5b3V0VW5pdCBjaGlsZEFmdGVyUG9zaXRpdmUgPSAwOwor
ICAgIExheW91dFVuaXQgY2hpbGRBZnRlck5lZ2F0aXZlID0gMDsKKworICAgIExheW91dFVuaXQg
YmVmb3JlTWFyZ2luID0gMDsKKyAgICBMYXlvdXRVbml0IGFmdGVyTWFyZ2luID0gMDsKKworICAg
IFJlbmRlckJsb2NrRmxvdyogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRlckJsb2Nr
RmxvdygpID8gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpIDogMDsKKyAgICAKKyAgICAvLyBJZiB0
aGUgY2hpbGQgaGFzIHRoZSBzYW1lIGRpcmVjdGlvbmFsaXR5IGFzIHdlIGRvLCB0aGVuIHdlIGNh
biBqdXN0IHJldHVybiBpdHMKKyAgICAvLyBtYXJnaW5zIGluIHRoZSBzYW1lIGRpcmVjdGlvbi4K
KyAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdNb2RlUm9vdCgpKSB7CisgICAgICAgIGlmIChjaGls
ZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBjaGlsZEJlZm9yZVBvc2l0aXZlID0gY2hpbGRS
ZW5kZXJCbG9jay0+bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAgICAgICAgIGNoaWxk
QmVmb3JlTmVnYXRpdmUgPSBjaGlsZFJlbmRlckJsb2NrLT5tYXhOZWdhdGl2ZU1hcmdpbkJlZm9y
ZSgpOworICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+
bWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpOworICAgICAgICAgICAgY2hpbGRBZnRlck5lZ2F0aXZl
ID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgYmVmb3JlTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgp
OworICAgICAgICAgICAgYWZ0ZXJNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKKyAgICAg
ICAgfQorICAgIH0gZWxzZSBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0g
aXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkgeworICAgICAgICAvLyBUaGUgY2hpbGQgaGFzIGEg
ZGlmZmVyZW50IGRpcmVjdGlvbmFsaXR5LiBJZiB0aGUgY2hpbGQgaXMgcGFyYWxsZWwsIHRoZW4g
aXQncyBqdXN0CisgICAgICAgIC8vIGZsaXBwZWQgcmVsYXRpdmUgdG8gdXMuIFdlIGNhbiB1c2Ug
dGhlIG1hcmdpbnMgZm9yIHRoZSBvcHBvc2l0ZSBlZGdlcy4KKyAgICAgICAgaWYgKGNoaWxkUmVu
ZGVyQmxvY2spIHsKKyAgICAgICAgICAgIGNoaWxkQmVmb3JlUG9zaXRpdmUgPSBjaGlsZFJlbmRl
ckJsb2NrLT5tYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCk7CisgICAgICAgICAgICBjaGlsZEJlZm9y
ZU5lZ2F0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4TmVnYXRpdmVNYXJnaW5BZnRlcigpOwor
ICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gY2hpbGRSZW5kZXJCbG9jay0+bWF4UG9z
aXRpdmVNYXJnaW5CZWZvcmUoKTsKKyAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IGNo
aWxkUmVuZGVyQmxvY2stPm1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBiZWZvcmVNYXJnaW4gPSBjaGlsZC0+bWFyZ2luQWZ0ZXIoKTsKKyAg
ICAgICAgICAgIGFmdGVyTWFyZ2luID0gY2hpbGQtPm1hcmdpbkJlZm9yZSgpOworICAgICAgICB9
CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlIGNoaWxkIGlzIHBlcnBlbmRpY3VsYXIgdG8g
dXMsIHdoaWNoIG1lYW5zIGl0cyBtYXJnaW5zIGRvbid0IGNvbGxhcHNlIGJ1dCBhcmUgb24gdGhl
CisgICAgICAgIC8vICJsb2dpY2FsIGxlZnQvcmlnaHQiIHNpZGVzIG9mIHRoZSBjaGlsZCBib3gu
IFdlIGNhbiBqdXN0IHJldHVybiB0aGUgcmF3IG1hcmdpbiBpbiB0aGlzIGNhc2UuCisgICAgICAg
IGJlZm9yZU1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKKyAgICAgICAgYWZ0
ZXJNYXJnaW4gPSBtYXJnaW5BZnRlckZvckNoaWxkKGNoaWxkKTsKKyAgICB9CisKKyAgICAvLyBS
ZXNvbHZlIHVuY29sbGFwc2luZyBtYXJnaW5zIGludG8gdGhlaXIgcG9zaXRpdmUvbmVnYXRpdmUg
YnVja2V0cy4KKyAgICBpZiAoYmVmb3JlTWFyZ2luKSB7CisgICAgICAgIGlmIChiZWZvcmVNYXJn
aW4gPiAwKQorICAgICAgICAgICAgY2hpbGRCZWZvcmVQb3NpdGl2ZSA9IGJlZm9yZU1hcmdpbjsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgY2hpbGRCZWZvcmVOZWdhdGl2ZSA9IC1iZWZvcmVN
YXJnaW47CisgICAgfQorICAgIGlmIChhZnRlck1hcmdpbikgeworICAgICAgICBpZiAoYWZ0ZXJN
YXJnaW4gPiAwKQorICAgICAgICAgICAgY2hpbGRBZnRlclBvc2l0aXZlID0gYWZ0ZXJNYXJnaW47
CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNoaWxkQWZ0ZXJOZWdhdGl2ZSA9IC1hZnRlck1h
cmdpbjsKKyAgICB9CisKKyAgICByZXR1cm4gTWFyZ2luVmFsdWVzKGNoaWxkQmVmb3JlUG9zaXRp
dmUsIGNoaWxkQmVmb3JlTmVnYXRpdmUsIGNoaWxkQWZ0ZXJQb3NpdGl2ZSwgY2hpbGRBZnRlck5l
Z2F0aXZlKTsKK30KKworTGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNvbGxhcHNlTWFyZ2lu
cyhSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQoreworICAgIGJvb2wg
Y2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlID0gbXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGls
ZChjaGlsZCk7CisgICAgYm9vbCBjaGlsZERpc2NhcmRNYXJnaW5BZnRlciA9IG11c3REaXNjYXJk
TWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCk7CisgICAgYm9vbCBjaGlsZElzU2VsZkNvbGxhcHNp
bmcgPSBjaGlsZC0+aXNTZWxmQ29sbGFwc2luZ0Jsb2NrKCk7CisKKyAgICAvLyBUaGUgY2hpbGQg
ZGlzY2FyZHMgdGhlIGJlZm9yZSBtYXJnaW4gd2hlbiB0aGUgdGhlIGFmdGVyIG1hcmdpbiBoYXMg
ZGlzY2FyZCBpbiB0aGUgY2FzZSBvZiBhIHNlbGYgY29sbGFwc2luZyBibG9jay4KKyAgICBjaGls
ZERpc2NhcmRNYXJnaW5CZWZvcmUgPSBjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUgfHwgKGNoaWxk
RGlzY2FyZE1hcmdpbkFmdGVyICYmIGNoaWxkSXNTZWxmQ29sbGFwc2luZyk7CisKKyAgICAvLyBH
ZXQgdGhlIGZvdXIgbWFyZ2luIHZhbHVlcyBmb3IgdGhlIGNoaWxkIGFuZCBjYWNoZSB0aGVtLgor
ICAgIGNvbnN0IE1hcmdpblZhbHVlcyBjaGlsZE1hcmdpbnMgPSBtYXJnaW5WYWx1ZXNGb3JDaGls
ZChjaGlsZCk7CisKKyAgICAvLyBHZXQgb3VyIG1heCBwb3MgYW5kIG5lZyB0b3AgbWFyZ2lucy4K
KyAgICBMYXlvdXRVbml0IHBvc1RvcCA9IGNoaWxkTWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkJlZm9y
ZSgpOworICAgIExheW91dFVuaXQgbmVnVG9wID0gY2hpbGRNYXJnaW5zLm5lZ2F0aXZlTWFyZ2lu
QmVmb3JlKCk7CisKKyAgICAvLyBGb3Igc2VsZi1jb2xsYXBzaW5nIGJsb2NrcywgY29sbGFwc2Ug
b3VyIGJvdHRvbSBtYXJnaW5zIGludG8gb3VyCisgICAgLy8gdG9wIHRvIGdldCBuZXcgcG9zVG9w
IGFuZCBuZWdUb3AgdmFsdWVzLgorICAgIGlmIChjaGlsZElzU2VsZkNvbGxhcHNpbmcpIHsKKyAg
ICAgICAgcG9zVG9wID0gbWF4KHBvc1RvcCwgY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQWZ0
ZXIoKSk7CisgICAgICAgIG5lZ1RvcCA9IG1heChuZWdUb3AsIGNoaWxkTWFyZ2lucy5uZWdhdGl2
ZU1hcmdpbkFmdGVyKCkpOworICAgIH0KKyAgICAKKyAgICAvLyBTZWUgaWYgdGhlIHRvcCBtYXJn
aW4gaXMgcXVpcmt5LiBXZSBvbmx5IGNhcmUgaWYgdGhpcyBjaGlsZCBoYXMKKyAgICAvLyBtYXJn
aW5zIHRoYXQgd2lsbCBjb2xsYXBzZSB3aXRoIHVzLgorICAgIGJvb2wgdG9wUXVpcmsgPSBoYXNN
YXJnaW5CZWZvcmVRdWlyayhjaGlsZCk7CisKKyAgICBpZiAobWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICBpZiAoIWNoaWxkRGlzY2FyZE1hcmdpbkJl
Zm9yZSAmJiAhbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkpIHsKKyAgICAgICAgICAgIC8vIFRo
aXMgY2hpbGQgaXMgY29sbGFwc2luZyB3aXRoIHRoZSB0b3Agb2YgdGhlCisgICAgICAgICAgICAv
LyBibG9jay4gSWYgaXQgaGFzIGxhcmdlciBtYXJnaW4gdmFsdWVzLCB0aGVuIHdlIG5lZWQgdG8g
dXBkYXRlCisgICAgICAgICAgICAvLyBvdXIgb3duIG1heGltYWwgdmFsdWVzLgorICAgICAgICAg
ICAgaWYgKCFkb2N1bWVudCgpLmluUXVpcmtzTW9kZSgpIHx8ICFtYXJnaW5JbmZvLnF1aXJrQ29u
dGFpbmVyKCkgfHwgIXRvcFF1aXJrKQorICAgICAgICAgICAgICAgIHNldE1heE1hcmdpbkJlZm9y
ZVZhbHVlcyhtYXgocG9zVG9wLCBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpKSwgbWF4KG5lZ1Rv
cCwgbWF4TmVnYXRpdmVNYXJnaW5CZWZvcmUoKSkpOworCisgICAgICAgICAgICAvLyBUaGUgbWlu
dXRlIGFueSBvZiB0aGUgbWFyZ2lucyBpbnZvbHZlZCBpc24ndCBhIHF1aXJrLCBkb24ndAorICAg
ICAgICAgICAgLy8gY29sbGFwc2UgaXQgYXdheSwgZXZlbiBpZiB0aGUgbWFyZ2luIGlzIHNtYWxs
ZXIgKHd3dy53ZWJyZWZlcmVuY2UuY29tCisgICAgICAgICAgICAvLyBoYXMgYW4gZXhhbXBsZSBv
ZiB0aGlzLCBhIDxkdD4gd2l0aCAwLjhlbSBhdXRob3Itc3BlY2lmaWVkIGluc2lkZQorICAgICAg
ICAgICAgLy8gYSA8ZGw+IGluc2lkZSBhIDx0ZD4uCisgICAgICAgICAgICBpZiAoIW1hcmdpbklu
Zm8uZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKCkgJiYgIXRvcFF1aXJrICYmIChwb3NUb3Ag
LSBuZWdUb3ApKSB7CisgICAgICAgICAgICAgICAgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsoZmFs
c2UpOworICAgICAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0RGV0ZXJtaW5lZE1hcmdpbkJlZm9y
ZVF1aXJrKHRydWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1hcmdpbklu
Zm8uZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrKCkgJiYgdG9wUXVpcmsgJiYgIW1hcmdpbkJl
Zm9yZSgpKQorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gdG9wIG1hcmdpbiBhbmQgb3Vy
IHRvcCBjaGlsZCBoYXMgYSBxdWlya3kgbWFyZ2luLgorICAgICAgICAgICAgICAgIC8vIFdlIHdp
bGwgcGljayB1cCB0aGlzIHF1aXJreSBtYXJnaW4gYW5kIHBhc3MgaXQgdGhyb3VnaC4KKyAgICAg
ICAgICAgICAgICAvLyBUaGlzIGRlYWxzIHdpdGggdGhlIDx0ZD48ZGl2PjxwPiBjYXNlLgorICAg
ICAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgZm9yIGEgYmxvY2sgdGhhdCBzcGxpdCB0d28g
aW5saW5lcyB0aG91Z2guIFlvdSBkbworICAgICAgICAgICAgICAgIC8vIHN0aWxsIGFwcGx5IG1h
cmdpbnMgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIHNldEhhc01hcmdpbkJlZm9yZVF1
aXJrKHRydWUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIC8vIFRoZSBiZWZvcmUgbWFy
Z2luIG9mIHRoZSBjb250YWluZXIgd2lsbCBhbHNvIGRpc2NhcmQgYWxsIHRoZSBtYXJnaW5zIGl0
IGlzIGNvbGxhcHNpbmcgd2l0aC4KKyAgICAgICAgICAgIHNldE11c3REaXNjYXJkTWFyZ2luQmVm
b3JlKCk7CisgICAgfQorCisgICAgLy8gT25jZSB3ZSBmaW5kIGEgY2hpbGQgd2l0aCBkaXNjYXJk
TWFyZ2luQmVmb3JlIGFsbCB0aGUgbWFyZ2lucyBjb2xsYXBzaW5nIHdpdGggdXMgbXVzdCBhbHNv
IGRpc2NhcmQuIAorICAgIGlmIChjaGlsZERpc2NhcmRNYXJnaW5CZWZvcmUpIHsKKyAgICAgICAg
bWFyZ2luSW5mby5zZXREaXNjYXJkTWFyZ2luKHRydWUpOworICAgICAgICBtYXJnaW5JbmZvLmNs
ZWFyTWFyZ2luKCk7CisgICAgfQorCisgICAgaWYgKG1hcmdpbkluZm8ucXVpcmtDb250YWluZXIo
KSAmJiBtYXJnaW5JbmZvLmF0QmVmb3JlU2lkZU9mQmxvY2soKSAmJiAocG9zVG9wIC0gbmVnVG9w
KSkKKyAgICAgICAgbWFyZ2luSW5mby5zZXRIYXNNYXJnaW5CZWZvcmVRdWlyayh0b3BRdWlyayk7
CisKKyAgICBMYXlvdXRVbml0IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCA9IGxvZ2ljYWxIZWln
aHQoKTsKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSBiZWZvcmVDb2xsYXBzZUxvZ2ljYWxU
b3A7CisgICAgaWYgKGNoaWxkSXNTZWxmQ29sbGFwc2luZykgeworICAgICAgICAvLyBGb3IgYSBz
ZWxmIGNvbGxhcHNpbmcgYmxvY2sgYm90aCB0aGUgYmVmb3JlIGFuZCBhZnRlciBtYXJnaW5zIGdl
dCBkaXNjYXJkZWQuIFRoZSBibG9jayBkb2Vzbid0IGNvbnRyaWJ1dGUgYW55dGhpbmcgdG8gdGhl
IGhlaWdodCBvZiB0aGUgYmxvY2suCisgICAgICAgIC8vIEFsc28sIHRoZSBjaGlsZCdzIHRvcCBw
b3NpdGlvbiBlcXVhbHMgdGhlIGxvZ2ljYWwgaGVpZ2h0IG9mIHRoZSBjb250YWluZXIuCisgICAg
ICAgIGlmICghY2hpbGREaXNjYXJkTWFyZ2luQmVmb3JlICYmICFtYXJnaW5JbmZvLmRpc2NhcmRN
YXJnaW4oKSkgeworICAgICAgICAgICAgLy8gVGhpcyBjaGlsZCBoYXMgbm8gaGVpZ2h0LiBXZSBu
ZWVkIHRvIGNvbXB1dGUgb3VyCisgICAgICAgICAgICAvLyBwb3NpdGlvbiBiZWZvcmUgd2UgY29s
bGFwc2UgdGhlIGNoaWxkJ3MgbWFyZ2lucyB0b2dldGhlciwKKyAgICAgICAgICAgIC8vIHNvIHRo
YXQgd2UgY2FuIGdldCBhbiBhY2N1cmF0ZSBwb3NpdGlvbiBmb3IgdGhlIHplcm8taGVpZ2h0IGJs
b2NrLgorICAgICAgICAgICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRCZWZvcmVQb3MgPSBtYXgobWFy
Z2luSW5mby5wb3NpdGl2ZU1hcmdpbigpLCBjaGlsZE1hcmdpbnMucG9zaXRpdmVNYXJnaW5CZWZv
cmUoKSk7CisgICAgICAgICAgICBMYXlvdXRVbml0IGNvbGxhcHNlZEJlZm9yZU5lZyA9IG1heCht
YXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCksIGNoaWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJl
Zm9yZSgpKTsKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0TWFyZ2luKGNvbGxhcHNlZEJlZm9y
ZVBvcywgY29sbGFwc2VkQmVmb3JlTmVnKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8g
Tm93IGNvbGxhcHNlIHRoZSBjaGlsZCdzIG1hcmdpbnMgdG9nZXRoZXIsIHdoaWNoIG1lYW5zIGV4
YW1pbmluZyBvdXIKKyAgICAgICAgICAgIC8vIGJvdHRvbSBtYXJnaW4gdmFsdWVzIGFzIHdlbGwu
IAorICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRQb3NpdGl2ZU1hcmdpbklmTGFyZ2VyKGNoaWxk
TWFyZ2lucy5wb3NpdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICAgICAgbWFyZ2luSW5mby5z
ZXROZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKGNoaWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkFmdGVy
KCkpOworCisgICAgICAgICAgICBpZiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2lu
QmVmb3JlKCkpCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0
aGUgcG9zaXRpb24gb2YgdGhlIHNlbGYtY29sbGFwc2luZyBibG9jaworICAgICAgICAgICAgICAg
IC8vIGlzIGNvcnJlY3QsIHNpbmNlIGl0IGNvdWxkIGhhdmUgb3ZlcmZsb3dpbmcgY29udGVudAor
ICAgICAgICAgICAgICAgIC8vIHRoYXQgbmVlZHMgdG8gYmUgcG9zaXRpb25lZCBjb3JyZWN0bHkg
KGUuZy4sIGEgYmxvY2sgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhZCBhIHNwZWNpZmllZCBo
ZWlnaHQgb2YgMCBidXQgdGhhdCBhY3R1YWxseSBoYWQgc3ViY29udGVudCkuCisgICAgICAgICAg
ICAgICAgbG9naWNhbFRvcCA9IGxvZ2ljYWxIZWlnaHQoKSArIGNvbGxhcHNlZEJlZm9yZVBvcyAt
IGNvbGxhcHNlZEJlZm9yZU5lZzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlm
IChtdXN0U2VwYXJhdGVNYXJnaW5CZWZvcmVGb3JDaGlsZChjaGlsZCkpIHsKKyAgICAgICAgICAg
IEFTU0VSVCghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkgfHwgKG1hcmdpbkluZm8uZGlzY2Fy
ZE1hcmdpbigpICYmICFtYXJnaW5JbmZvLm1hcmdpbigpKSk7CisgICAgICAgICAgICAvLyBJZiB3
ZSBhcmUgYXQgdGhlIGJlZm9yZSBzaWRlIG9mIHRoZSBibG9jayBhbmQgd2UgY29sbGFwc2UsIGln
bm9yZSB0aGUgY29tcHV0ZWQgbWFyZ2luCisgICAgICAgICAgICAvLyBhbmQganVzdCBhZGQgdGhl
IGNoaWxkIG1hcmdpbiB0byB0aGUgY29udGFpbmVyIGhlaWdodC4gVGhpcyB3aWxsIGNvcnJlY3Rs
eSBwb3NpdGlvbgorICAgICAgICAgICAgLy8gdGhlIGNoaWxkIGluc2lkZSB0aGUgY29udGFpbmVy
LgorICAgICAgICAgICAgTGF5b3V0VW5pdCBzZXBhcmF0ZU1hcmdpbiA9ICFtYXJnaW5JbmZvLmNh
bkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9yZSgpID8gbWFyZ2luSW5mby5tYXJnaW4oKSA6IExheW91
dFVuaXQoMCk7CisgICAgICAgICAgICBzZXRMb2dpY2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSAr
IHNlcGFyYXRlTWFyZ2luICsgbWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQpKTsKKyAgICAgICAg
ICAgIGxvZ2ljYWxUb3AgPSBsb2dpY2FsSGVpZ2h0KCk7CisgICAgICAgIH0gZWxzZSBpZiAoIW1h
cmdpbkluZm8uZGlzY2FyZE1hcmdpbigpICYmICghbWFyZ2luSW5mby5hdEJlZm9yZVNpZGVPZkJs
b2NrKCkKKyAgICAgICAgICAgIHx8ICghbWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkJlZm9y
ZVdpdGhDaGlsZHJlbigpCisgICAgICAgICAgICAmJiAoIWRvY3VtZW50KCkuaW5RdWlya3NNb2Rl
KCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIoKSB8fCAhbWFyZ2luSW5mby5oYXNNYXJn
aW5CZWZvcmVRdWlyaygpKSkpKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBjb2xsYXBzaW5nIHdp
dGggYSBwcmV2aW91cyBzaWJsaW5nJ3MgbWFyZ2lucyBhbmQgbm90CisgICAgICAgICAgICAvLyB3
aXRoIHRoZSB0b3Agb2YgdGhlIGJsb2NrLgorICAgICAgICAgICAgc2V0TG9naWNhbEhlaWdodChs
b2dpY2FsSGVpZ2h0KCkgKyBtYXgobWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpLCBwb3NUb3Ap
IC0gbWF4KG1hcmdpbkluZm8ubmVnYXRpdmVNYXJnaW4oKSwgbmVnVG9wKSk7CisgICAgICAgICAg
ICBsb2dpY2FsVG9wID0gbG9naWNhbEhlaWdodCgpOworICAgICAgICB9CisKKyAgICAgICAgbWFy
Z2luSW5mby5zZXREaXNjYXJkTWFyZ2luKGNoaWxkRGlzY2FyZE1hcmdpbkFmdGVyKTsKKyAgICAg
ICAgCisgICAgICAgIGlmICghbWFyZ2luSW5mby5kaXNjYXJkTWFyZ2luKCkpIHsKKyAgICAgICAg
ICAgIG1hcmdpbkluZm8uc2V0UG9zaXRpdmVNYXJnaW4oY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFy
Z2luQWZ0ZXIoKSk7CisgICAgICAgICAgICBtYXJnaW5JbmZvLnNldE5lZ2F0aXZlTWFyZ2luKGNo
aWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkFmdGVyKCkpOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIG1hcmdpbkluZm8uY2xlYXJNYXJnaW4oKTsKKworICAgICAgICBpZiAobWFyZ2luSW5m
by5tYXJnaW4oKSkKKyAgICAgICAgICAgIG1hcmdpbkluZm8uc2V0SGFzTWFyZ2luQWZ0ZXJRdWly
ayhoYXNNYXJnaW5BZnRlclF1aXJrKGNoaWxkKSk7CisgICAgfQorICAgIAorICAgIC8vIElmIG1h
cmdpbnMgd291bGQgcHVsbCB1cyBwYXN0IHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZSwgdGhlbiB3
ZSBuZWVkIHRvIHB1bGwgYmFjayBhbmQgcHJldGVuZCBsaWtlIHRoZSBtYXJnaW5zCisgICAgLy8g
Y29sbGFwc2VkIGludG8gdGhlIHBhZ2UgZWRnZS4KKyAgICBMYXlvdXRTdGF0ZSogbGF5b3V0U3Rh
dGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKKyAgICBpZiAobGF5b3V0U3RhdGUtPmlzUGFnaW5h
dGVkKCkgJiYgbGF5b3V0U3RhdGUtPnBhZ2VMb2dpY2FsSGVpZ2h0KCkgJiYgbG9naWNhbFRvcCA+
IGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcAorICAgICAgICAmJiBoYXNOZXh0UGFnZShiZWZvcmVD
b2xsYXBzZUxvZ2ljYWxUb3ApKSB7CisgICAgICAgIExheW91dFVuaXQgb2xkTG9naWNhbFRvcCA9
IGxvZ2ljYWxUb3A7CisgICAgICAgIGxvZ2ljYWxUb3AgPSBtaW4obG9naWNhbFRvcCwgbmV4dFBh
Z2VMb2dpY2FsVG9wKGJlZm9yZUNvbGxhcHNlTG9naWNhbFRvcCkpOworICAgICAgICBzZXRMb2dp
Y2FsSGVpZ2h0KGxvZ2ljYWxIZWlnaHQoKSArIChsb2dpY2FsVG9wIC0gb2xkTG9naWNhbFRvcCkp
OworICAgIH0KKworICAgIC8vIElmIHdlIGhhdmUgY29sbGFwc2VkIGludG8gYSBwcmV2aW91cyBz
aWJsaW5nIGFuZCBzbyByZWR1Y2VkIHRoZSBoZWlnaHQgb2YgdGhlIHBhcmVudCwgZW5zdXJlIGFu
eSBmbG9hdHMgdGhhdCBub3cKKyAgICAvLyBvdmVyaGFuZyBmcm9tIHRoZSBwcmV2aW91cyBzaWJs
aW5nIGFyZSBhZGRlZCB0byBvdXIgcGFyZW50LiBJZiB0aGUgY2hpbGQncyBwcmV2aW91cyBzaWJs
aW5nIGl0c2VsZiBpcyBhIGZsb2F0IHRoZSBjaGlsZCB3aWxsIGF2b2lkCisgICAgLy8gb3IgY2xl
YXIgaXQgYW55d2F5LCBzbyBkb24ndCB3b3JyeSBhYm91dCBhbnkgZmxvYXRpbmcgY2hpbGRyZW4g
aXQgbWF5IGNvbnRhaW4uCisgICAgTGF5b3V0VW5pdCBvbGRMb2dpY2FsSGVpZ2h0ID0gbG9naWNh
bEhlaWdodCgpOworICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbFRvcCk7CisgICAgUmVuZGVy
T2JqZWN0KiBwcmV2ID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpOworICAgIGlmIChwcmV2ICYm
IHByZXYtPmlzUmVuZGVyQmxvY2tGbG93KCkgJiYgIXByZXYtPmlzRmxvYXRpbmdPck91dE9mRmxv
d1Bvc2l0aW9uZWQoKSkgeworICAgICAgICBSZW5kZXJCbG9jayogYmxvY2sgPSB0b1JlbmRlckJs
b2NrKHByZXYpOworICAgICAgICBpZiAoYmxvY2stPmNvbnRhaW5zRmxvYXRzKCkgJiYgIWJsb2Nr
LT5hdm9pZHNGbG9hdHMoKSAmJiAoYmxvY2stPmxvZ2ljYWxUb3AoKSArIGJsb2NrLT5sb3dlc3RG
bG9hdExvZ2ljYWxCb3R0b20oKSkgPiBsb2dpY2FsVG9wKSAKKyAgICAgICAgICAgIGFkZE92ZXJo
YW5naW5nRmxvYXRzKGJsb2NrLCBmYWxzZSk7CisgICAgfQorICAgIHNldExvZ2ljYWxIZWlnaHQo
b2xkTG9naWNhbEhlaWdodCk7CisKKyAgICByZXR1cm4gbG9naWNhbFRvcDsKK30KKworTGF5b3V0
VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmNsZWFyRmxvYXRzSWZOZWVkZWQoUmVuZGVyQm94KiBjaGls
ZCwgTWFyZ2luSW5mbyYgbWFyZ2luSW5mbywgTGF5b3V0VW5pdCBvbGRUb3BQb3NNYXJnaW4sIExh
eW91dFVuaXQgb2xkVG9wTmVnTWFyZ2luLCBMYXlvdXRVbml0IHlQb3MpCit7CisgICAgTGF5b3V0
VW5pdCBoZWlnaHRJbmNyZWFzZSA9IGdldENsZWFyRGVsdGEoY2hpbGQsIHlQb3MpOworICAgIGlm
ICghaGVpZ2h0SW5jcmVhc2UpCisgICAgICAgIHJldHVybiB5UG9zOworCisgICAgaWYgKGNoaWxk
LT5pc1NlbGZDb2xsYXBzaW5nQmxvY2soKSkgeworICAgICAgICBib29sIGNoaWxkRGlzY2FyZE1h
cmdpbiA9IG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQpIHx8IG11c3REaXNj
YXJkTWFyZ2luQWZ0ZXJGb3JDaGlsZChjaGlsZCk7CisKKyAgICAgICAgLy8gRm9yIHNlbGYtY29s
bGFwc2luZyBibG9ja3MgdGhhdCBjbGVhciwgdGhleSBjYW4gc3RpbGwgY29sbGFwc2UgdGhlaXIK
KyAgICAgICAgLy8gbWFyZ2lucyB3aXRoIGZvbGxvd2luZyBzaWJsaW5ncy4gUmVzZXQgdGhlIGN1
cnJlbnQgbWFyZ2lucyB0byByZXByZXNlbnQKKyAgICAgICAgLy8gdGhlIHNlbGYtY29sbGFwc2lu
ZyBibG9jaydzIG1hcmdpbnMgb25seS4KKyAgICAgICAgLy8gSWYgRElTQ0FSRCBpcyBzcGVjaWZp
ZWQgZm9yIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlLCByZXNldCB0aGUgbWFyZ2luIHZhbHVlcy4K
KyAgICAgICAgaWYgKCFjaGlsZERpc2NhcmRNYXJnaW4pIHsKKyAgICAgICAgICAgIE1hcmdpblZh
bHVlcyBjaGlsZE1hcmdpbnMgPSBtYXJnaW5WYWx1ZXNGb3JDaGlsZChjaGlsZCk7CisgICAgICAg
ICAgICBtYXJnaW5JbmZvLnNldFBvc2l0aXZlTWFyZ2luKG1heChjaGlsZE1hcmdpbnMucG9zaXRp
dmVNYXJnaW5CZWZvcmUoKSwgY2hpbGRNYXJnaW5zLnBvc2l0aXZlTWFyZ2luQWZ0ZXIoKSkpOwor
ICAgICAgICAgICAgbWFyZ2luSW5mby5zZXROZWdhdGl2ZU1hcmdpbihtYXgoY2hpbGRNYXJnaW5z
Lm5lZ2F0aXZlTWFyZ2luQmVmb3JlKCksIGNoaWxkTWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkFmdGVy
KCkpKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtYXJnaW5JbmZvLmNsZWFyTWFyZ2lu
KCk7CisgICAgICAgIG1hcmdpbkluZm8uc2V0RGlzY2FyZE1hcmdpbihjaGlsZERpc2NhcmRNYXJn
aW4pOworCisgICAgICAgIC8vIENTUzIuMSBzdGF0ZXM6CisgICAgICAgIC8vICJJZiB0aGUgdG9w
IGFuZCBib3R0b20gbWFyZ2lucyBvZiBhbiBlbGVtZW50IHdpdGggY2xlYXJhbmNlIGFyZSBhZGpv
aW5pbmcsIGl0cyBtYXJnaW5zIGNvbGxhcHNlIHdpdGggCisgICAgICAgIC8vIHRoZSBhZGpvaW5p
bmcgbWFyZ2lucyBvZiBmb2xsb3dpbmcgc2libGluZ3MgYnV0IHRoYXQgcmVzdWx0aW5nIG1hcmdp
biBkb2VzIG5vdCBjb2xsYXBzZSB3aXRoIHRoZSBib3R0b20gbWFyZ2luIG9mIHRoZSBwYXJlbnQg
YmxvY2suIgorICAgICAgICAvLyBTbyB0aGUgcGFyZW50J3MgYm90dG9tIG1hcmdpbiBjYW5ub3Qg
Y29sbGFwc2UgdGhyb3VnaCB0aGlzIGJsb2NrIG9yIGFueSBzdWJzZXF1ZW50IHNlbGYtY29sbGFw
c2luZyBibG9ja3MuIENoZWNrIHN1YnNlcXVlbnQgc2libGluZ3MKKyAgICAgICAgLy8gZm9yIGEg
YmxvY2sgd2l0aCBoZWlnaHQgLSBpZiBub25lIGlzIGZvdW5kIHRoZW4gZG9uJ3QgYWxsb3cgdGhl
IG1hcmdpbnMgdG8gY29sbGFwc2Ugd2l0aCB0aGUgcGFyZW50LgorICAgICAgICBib29sIHdvdWxk
Q29sbGFwc2VNYXJnaW5zV2l0aFBhcmVudCA9IG1hcmdpbkluZm8uY2FuQ29sbGFwc2VNYXJnaW5B
ZnRlcldpdGhDaGlsZHJlbigpOworICAgICAgICBmb3IgKFJlbmRlckJveCogY3VyciA9IGNoaWxk
LT5uZXh0U2libGluZ0JveCgpOyBjdXJyICYmIHdvdWxkQ29sbGFwc2VNYXJnaW5zV2l0aFBhcmVu
dDsgY3VyciA9IGN1cnItPm5leHRTaWJsaW5nQm94KCkpIHsKKyAgICAgICAgICAgIGlmICghY3Vy
ci0+aXNGbG9hdGluZ09yT3V0T2ZGbG93UG9zaXRpb25lZCgpICYmICFjdXJyLT5pc1NlbGZDb2xs
YXBzaW5nQmxvY2soKSkKKyAgICAgICAgICAgICAgICB3b3VsZENvbGxhcHNlTWFyZ2luc1dpdGhQ
YXJlbnQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAod291bGRDb2xsYXBzZU1hcmdp
bnNXaXRoUGFyZW50KQorICAgICAgICAgICAgbWFyZ2luSW5mby5zZXRDYW5Db2xsYXBzZU1hcmdp
bkFmdGVyV2l0aENoaWxkcmVuKGZhbHNlKTsKKworICAgICAgICAvLyBDU1MyLjE6ICJ0aGUgYW1v
dW50IG9mIGNsZWFyYW5jZSBpcyBzZXQgc28gdGhhdCBjbGVhcmFuY2UgKyBtYXJnaW4tdG9wID0g
W2hlaWdodCBvZiBmbG9hdF0sIGkuZS4sIGNsZWFyYW5jZSA9IFtoZWlnaHQgb2YgZmxvYXRdIC0g
bWFyZ2luLXRvcCIKKyAgICAgICAgLy8gTW92ZSB0aGUgdG9wIG9mIHRoZSBjaGlsZCBib3ggdG8g
dGhlIGJvdHRvbSBvZiB0aGUgZmxvYXQgaWdub3JpbmcgdGhlIGNoaWxkJ3MgdG9wIG1hcmdpbi4K
KyAgICAgICAgTGF5b3V0VW5pdCBjb2xsYXBzZWRNYXJnaW4gPSBjb2xsYXBzZWRNYXJnaW5CZWZv
cmVGb3JDaGlsZChjaGlsZCk7CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQoY2hpbGQtPmxvZ2lj
YWxUb3AoKSAtIGNvbGxhcHNlZE1hcmdpbik7CisgICAgICAgIC8vIEEgbmVnYXRpdmUgY29sbGFw
c2VkIG1hcmdpbi10b3AgdmFsdWUgY2FuY2VscyBpdHNlbGYgb3V0IGFzIGl0IGhhcyBhbHJlYWR5
IGJlZW4gZmFjdG9yZWQgaW50byB8eVBvc3wgYWJvdmUuCisgICAgICAgIGhlaWdodEluY3JlYXNl
IC09IG1heChMYXlvdXRVbml0KCksIGNvbGxhcHNlZE1hcmdpbik7CisgICAgfSBlbHNlCisgICAg
ICAgIC8vIEluY3JlYXNlIG91ciBoZWlnaHQgYnkgdGhlIGFtb3VudCB3ZSBoYWQgdG8gY2xlYXIu
CisgICAgICAgIHNldExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgaGVpZ2h0SW5jcmVh
c2UpOworICAgIAorICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkJlZm9y
ZSgpKSB7CisgICAgICAgIC8vIFdlIGNhbiBubyBsb25nZXIgY29sbGFwc2Ugd2l0aCB0aGUgdG9w
IG9mIHRoZSBibG9jayBzaW5jZSBhIGNsZWFyCisgICAgICAgIC8vIG9jY3VycmVkLiBUaGUgZW1w
dHkgYmxvY2tzIGNvbGxhcHNlIGludG8gdGhlIGNsZWFyZWQgYmxvY2suCisgICAgICAgIC8vIEZJ
WE1FOiBUaGlzIGlzbid0IHF1aXRlIGNvcnJlY3QuIE5lZWQgY2xhcmlmaWNhdGlvbiBmb3Igd2hh
dCB0byBkbworICAgICAgICAvLyBpZiB0aGUgaGVpZ2h0IHRoZSBjbGVhcmVkIGJsb2NrIGlzIG9m
ZnNldCBieSBpcyBzbWFsbGVyIHRoYW4gdGhlCisgICAgICAgIC8vIG1hcmdpbnMgaW52b2x2ZWQu
CisgICAgICAgIHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhvbGRUb3BQb3NNYXJnaW4sIG9sZFRv
cE5lZ01hcmdpbik7CisgICAgICAgIG1hcmdpbkluZm8uc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhm
YWxzZSk7CisKKyAgICAgICAgLy8gSW4gY2FzZSB0aGUgY2hpbGQgZGlzY2FyZGVkIHRoZSBiZWZv
cmUgbWFyZ2luIG9mIHRoZSBibG9jayB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBtdXN0RGlzY2FyZE1h
cmdpbkJlZm9yZSBmbGFnIHRvIHRoZSBpbml0aWFsIHZhbHVlLgorICAgICAgICBzZXRNdXN0RGlz
Y2FyZE1hcmdpbkJlZm9yZShzdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVND
QVJEKTsKKyAgICB9CisKKyAgICBMYXlvdXRVbml0IGxvZ2ljYWxUb3AgPSB5UG9zICsgaGVpZ2h0
SW5jcmVhc2U7CisgICAgLy8gQWZ0ZXIgbWFyZ2luIGNvbGxhcHNpbmcsIG9uZSBvZiBvdXIgZmxv
YXRzIG1heSBub3cgaW50cnVkZSBpbnRvIHRoZSBjaGlsZC4gSWYgdGhlIGNoaWxkIGRvZXNuJ3Qg
Y29udGFpbiBmbG9hdHMgb2YgaXRzIG93biBpdAorICAgIC8vIHdvbid0IGdldCBwaWNrZWQgdXAg
Zm9yIHJlbGF5b3V0IGV2ZW4gdGhvdWdoIHRoZSBsb2dpY2FsIHRvcCBlc3RpbWF0ZSB3YXMgd3Jv
bmcgLSBzbyBhZGQgdGhlIG5ld2x5IGludHJ1ZGluZyBmbG9hdCBub3cuCisgICAgaWYgKGNvbnRh
aW5zRmxvYXRzKCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2soKSAmJiAhdG9SZW5kZXJCbG9jayhj
aGlsZCktPmNvbnRhaW5zRmxvYXRzKCkgJiYgIWNoaWxkLT5hdm9pZHNGbG9hdHMoKSAmJiBsb3dl
c3RGbG9hdExvZ2ljYWxCb3R0b20oKSA+IGxvZ2ljYWxUb3ApCisgICAgICAgIHRvUmVuZGVyQmxv
Y2soY2hpbGQpLT5hZGRJbnRydWRpbmdGbG9hdHModGhpcywgbG9naWNhbExlZnRPZmZzZXRGb3JD
b250ZW50KCksIGxvZ2ljYWxUb3ApOworCisgICAgcmV0dXJuIGxvZ2ljYWxUb3A7Cit9CisKK3Zv
aWQgUmVuZGVyQmxvY2tGbG93OjptYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKFJlbmRlckJv
eCogY2hpbGQsIExheW91dFVuaXQmIHBvc2l0aXZlTWFyZ2luQmVmb3JlLCBMYXlvdXRVbml0JiBu
ZWdhdGl2ZU1hcmdpbkJlZm9yZSwgYm9vbCYgZGlzY2FyZE1hcmdpbkJlZm9yZSkgY29uc3QKK3sK
KyAgICAvLyBHaXZlIHVwIGlmIGluIHF1aXJrcyBtb2RlIGFuZCB3ZSdyZSBhIGJvZHkvdGFibGUg
Y2VsbCBhbmQgdGhlIHRvcCBtYXJnaW4gb2YgdGhlIGNoaWxkIGJveCBpcyBxdWlya3kuCisgICAg
Ly8gR2l2ZSB1cCBpZiB0aGUgY2hpbGQgc3BlY2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNl
OiBzZXBhcmF0ZSB0aGF0IHByZXZlbnRzIGNvbGxhcHNpbmcuCisgICAgLy8gRklYTUU6IFVzZSB3
cml0aW5nIG1vZGUgaW5kZXBlbmRlbnQgYWNjZXNzb3IgZm9yIG1hcmdpbkJlZm9yZUNvbGxhcHNl
LgorICAgIGlmICgoZG9jdW1lbnQoKS5pblF1aXJrc01vZGUoKSAmJiBoYXNNYXJnaW5BZnRlclF1
aXJrKGNoaWxkKSAmJiAoaXNUYWJsZUNlbGwoKSB8fCBpc0JvZHkoKSkpIHx8IGNoaWxkLT5zdHls
ZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1TRVBBUkFURSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gVGhlIG1hcmdpbnMgYXJlIGRpc2NhcmRlZCBieSBhIGNoaWxkIHRoYXQgc3Bl
Y2lmaWVkIC13ZWJraXQtbWFyZ2luLWNvbGxhcHNlOiBkaXNjYXJkLgorICAgIC8vIEZJWE1FOiBV
c2Ugd3JpdGluZyBtb2RlIGluZGVwZW5kZW50IGFjY2Vzc29yIGZvciBtYXJnaW5CZWZvcmVDb2xs
YXBzZS4KKyAgICBpZiAoY2hpbGQtPnN0eWxlKCktPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0g
TURJU0NBUkQpIHsKKyAgICAgICAgcG9zaXRpdmVNYXJnaW5CZWZvcmUgPSAwOworICAgICAgICBu
ZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7CisgICAgICAgIGRpc2NhcmRNYXJnaW5CZWZvcmUgPSB0
cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGF5b3V0VW5pdCBiZWZvcmVDaGls
ZE1hcmdpbiA9IG1hcmdpbkJlZm9yZUZvckNoaWxkKGNoaWxkKTsKKyAgICBwb3NpdGl2ZU1hcmdp
bkJlZm9yZSA9IG1heChwb3NpdGl2ZU1hcmdpbkJlZm9yZSwgYmVmb3JlQ2hpbGRNYXJnaW4pOwor
ICAgIG5lZ2F0aXZlTWFyZ2luQmVmb3JlID0gbWF4KG5lZ2F0aXZlTWFyZ2luQmVmb3JlLCAtYmVm
b3JlQ2hpbGRNYXJnaW4pOworCisgICAgaWYgKCFjaGlsZC0+aXNSZW5kZXJCbG9ja0Zsb3coKSkK
KyAgICAgICAgcmV0dXJuOworICAgIAorICAgIFJlbmRlckJsb2NrRmxvdyogY2hpbGRCbG9jayA9
IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKTsKKyAgICBpZiAoY2hpbGRCbG9jay0+Y2hpbGRyZW5J
bmxpbmUoKSB8fCBjaGlsZEJsb2NrLT5pc1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBNYXJnaW5JbmZvIGNoaWxkTWFyZ2luSW5mbyhjaGlsZEJsb2NrLCBjaGlsZEJs
b2NrLT5ib3JkZXJBbmRQYWRkaW5nQmVmb3JlKCksIGNoaWxkQmxvY2stPmJvcmRlckFuZFBhZGRp
bmdBZnRlcigpKTsKKyAgICBpZiAoIWNoaWxkTWFyZ2luSW5mby5jYW5Db2xsYXBzZU1hcmdpbkJl
Zm9yZVdpdGhDaGlsZHJlbigpKQorICAgICAgICByZXR1cm47CisKKyAgICBSZW5kZXJCb3gqIGdy
YW5kY2hpbGRCb3ggPSBjaGlsZEJsb2NrLT5maXJzdENoaWxkQm94KCk7CisgICAgZm9yICggOyBn
cmFuZGNoaWxkQm94OyBncmFuZGNoaWxkQm94ID0gZ3JhbmRjaGlsZEJveC0+bmV4dFNpYmxpbmdC
b3goKSkgeworICAgICAgICBpZiAoIWdyYW5kY2hpbGRCb3gtPmlzRmxvYXRpbmdPck91dE9mRmxv
d1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAKKyAgICAvLyBH
aXZlIHVwIGlmIHRoZXJlIGlzIGNsZWFyYW5jZSBvbiB0aGUgYm94LCBzaW5jZSBpdCBwcm9iYWJs
eSB3b24ndCBjb2xsYXBzZSBpbnRvIHVzLgorICAgIGlmICghZ3JhbmRjaGlsZEJveCB8fCBncmFu
ZGNoaWxkQm94LT5zdHlsZSgpLT5jbGVhcigpICE9IENOT05FKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBNYWtlIHN1cmUgdG8gdXBkYXRlIHRoZSBibG9jayBtYXJnaW5zIG5vdyBmb3IgdGhl
IGdyYW5kY2hpbGQgYm94IHNvIHRoYXQgd2UncmUgbG9va2luZyBhdCBjdXJyZW50IHZhbHVlcy4K
KyAgICBpZiAoZ3JhbmRjaGlsZEJveC0+bmVlZHNMYXlvdXQoKSkgeworICAgICAgICBncmFuZGNo
aWxkQm94LT5jb21wdXRlQW5kU2V0QmxvY2tEaXJlY3Rpb25NYXJnaW5zKHRoaXMpOworICAgICAg
ICBpZiAoZ3JhbmRjaGlsZEJveC0+aXNSZW5kZXJCbG9jaygpKSB7CisgICAgICAgICAgICBSZW5k
ZXJCbG9jayogZ3JhbmRjaGlsZEJsb2NrID0gdG9SZW5kZXJCbG9jayhncmFuZGNoaWxkQm94KTsK
KyAgICAgICAgICAgIGdyYW5kY2hpbGRCbG9jay0+c2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsoZ3Jh
bmRjaGlsZEJveC0+c3R5bGUoKS0+aGFzTWFyZ2luQmVmb3JlUXVpcmsoKSk7CisgICAgICAgICAg
ICBncmFuZGNoaWxkQmxvY2stPnNldEhhc01hcmdpbkFmdGVyUXVpcmsoZ3JhbmRjaGlsZEJveC0+
c3R5bGUoKS0+aGFzTWFyZ2luQWZ0ZXJRdWlyaygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IC8vIENvbGxhcHNlIHRoZSBtYXJnaW4gb2YgdGhlIGdyYW5kY2hpbGQgYm94IHdpdGggb3VyIG93
biB0byBwcm9kdWNlIGFuIGVzdGltYXRlLgorICAgIGNoaWxkQmxvY2stPm1hcmdpbkJlZm9yZUVz
dGltYXRlRm9yQ2hpbGQoZ3JhbmRjaGlsZEJveCwgcG9zaXRpdmVNYXJnaW5CZWZvcmUsIG5lZ2F0
aXZlTWFyZ2luQmVmb3JlLCBkaXNjYXJkTWFyZ2luQmVmb3JlKTsKK30KKworTGF5b3V0VW5pdCBS
ZW5kZXJCbG9ja0Zsb3c6OmVzdGltYXRlTG9naWNhbFRvcFBvc2l0aW9uKFJlbmRlckJveCogY2hp
bGQsIGNvbnN0IE1hcmdpbkluZm8mIG1hcmdpbkluZm8sIExheW91dFVuaXQmIGVzdGltYXRlV2l0
aG91dFBhZ2luYXRpb24pCit7CisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gZWxpbWluYXRlIHRo
ZSBlc3RpbWF0aW9uIG9mIHZlcnRpY2FsIHBvc2l0aW9uLCBiZWNhdXNlIHdoZW4gaXQncyB3cm9u
ZyB3ZSBzb21ldGltZXMgdHJpZ2dlciBhIHBhdGhvbG9naWNhbAorICAgIC8vIHJlbGF5b3V0IGlm
IHRoZXJlIGFyZSBpbnRydWRpbmcgZmxvYXRzLgorICAgIExheW91dFVuaXQgbG9naWNhbFRvcEVz
dGltYXRlID0gbG9naWNhbEhlaWdodCgpOworICAgIGlmICghbWFyZ2luSW5mby5jYW5Db2xsYXBz
ZVdpdGhNYXJnaW5CZWZvcmUoKSkgeworICAgICAgICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2lu
QmVmb3JlID0gMDsKKyAgICAgICAgTGF5b3V0VW5pdCBuZWdhdGl2ZU1hcmdpbkJlZm9yZSA9IDA7
CisgICAgICAgIGJvb2wgZGlzY2FyZE1hcmdpbkJlZm9yZSA9IGZhbHNlOworICAgICAgICBpZiAo
Y2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZG8gYSBi
YXNpYyBlc3RpbWF0aW9uIG9mIGhvdyB0aGUgY29sbGFwc2UgaXMgZ29pbmcgdG8gZ28uCisgICAg
ICAgICAgICBtYXJnaW5CZWZvcmVFc3RpbWF0ZUZvckNoaWxkKGNoaWxkLCBwb3NpdGl2ZU1hcmdp
bkJlZm9yZSwgbmVnYXRpdmVNYXJnaW5CZWZvcmUsIGRpc2NhcmRNYXJnaW5CZWZvcmUpOworICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVXNlIHRoZSBjYWNoZWQgY29sbGFwc2VkIG1h
cmdpbiB2YWx1ZXMgZnJvbSBhIHByZXZpb3VzIGxheW91dC4gTW9zdCBvZiB0aGUgdGltZSB0aGV5
CisgICAgICAgICAgICAvLyB3aWxsIGJlIHJpZ2h0LgorICAgICAgICAgICAgTWFyZ2luVmFsdWVz
IG1hcmdpblZhbHVlcyA9IG1hcmdpblZhbHVlc0ZvckNoaWxkKGNoaWxkKTsKKyAgICAgICAgICAg
IHBvc2l0aXZlTWFyZ2luQmVmb3JlID0gbWF4KHBvc2l0aXZlTWFyZ2luQmVmb3JlLCBtYXJnaW5W
YWx1ZXMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKSk7CisgICAgICAgICAgICBuZWdhdGl2ZU1hcmdp
bkJlZm9yZSA9IG1heChuZWdhdGl2ZU1hcmdpbkJlZm9yZSwgbWFyZ2luVmFsdWVzLm5lZ2F0aXZl
TWFyZ2luQmVmb3JlKCkpOworICAgICAgICAgICAgZGlzY2FyZE1hcmdpbkJlZm9yZSA9IG11c3RE
aXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY2hpbGQpOworICAgICAgICB9CisKKyAgICAgICAg
Ly8gQ29sbGFwc2UgdGhlIHJlc3VsdCB3aXRoIG91ciBjdXJyZW50IG1hcmdpbnMuCisgICAgICAg
IGlmICghZGlzY2FyZE1hcmdpbkJlZm9yZSkKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0
ZSArPSBtYXgobWFyZ2luSW5mby5wb3NpdGl2ZU1hcmdpbigpLCBwb3NpdGl2ZU1hcmdpbkJlZm9y
ZSkgLSBtYXgobWFyZ2luSW5mby5uZWdhdGl2ZU1hcmdpbigpLCBuZWdhdGl2ZU1hcmdpbkJlZm9y
ZSk7CisgICAgfQorCisgICAgLy8gQWRqdXN0IGxvZ2ljYWxUb3BFc3RpbWF0ZSBkb3duIHRvIHRo
ZSBuZXh0IHBhZ2UgaWYgdGhlIG1hcmdpbnMgYXJlIHNvIGxhcmdlIHRoYXQgd2UgZG9uJ3QgZml0
IG9uIHRoZSBjdXJyZW50CisgICAgLy8gcGFnZS4KKyAgICBMYXlvdXRTdGF0ZSogbGF5b3V0U3Rh
dGUgPSB2aWV3KCkubGF5b3V0U3RhdGUoKTsKKyAgICBpZiAobGF5b3V0U3RhdGUtPmlzUGFnaW5h
dGVkKCkgJiYgbGF5b3V0U3RhdGUtPnBhZ2VMb2dpY2FsSGVpZ2h0KCkgJiYgbG9naWNhbFRvcEVz
dGltYXRlID4gbG9naWNhbEhlaWdodCgpCisgICAgICAgICYmIGhhc05leHRQYWdlKGxvZ2ljYWxI
ZWlnaHQoKSkpCisgICAgICAgIGxvZ2ljYWxUb3BFc3RpbWF0ZSA9IG1pbihsb2dpY2FsVG9wRXN0
aW1hdGUsIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsSGVpZ2h0KCkpKTsKKworICAgIGxvZ2lj
YWxUb3BFc3RpbWF0ZSArPSBnZXRDbGVhckRlbHRhKGNoaWxkLCBsb2dpY2FsVG9wRXN0aW1hdGUp
OworICAgIAorICAgIGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24gPSBsb2dpY2FsVG9wRXN0aW1h
dGU7CisKKyAgICBpZiAobGF5b3V0U3RhdGUtPmlzUGFnaW5hdGVkKCkpIHsKKyAgICAgICAgLy8g
SWYgdGhlIG9iamVjdCBoYXMgYSBwYWdlIG9yIGNvbHVtbiBicmVhayB2YWx1ZSBvZiAiYmVmb3Jl
IiwgdGhlbiB3ZSBzaG91bGQgc2hpZnQgdG8gdGhlIHRvcCBvZiB0aGUgbmV4dCBwYWdlLgorICAg
ICAgICBsb2dpY2FsVG9wRXN0aW1hdGUgPSBhcHBseUJlZm9yZUJyZWFrKGNoaWxkLCBsb2dpY2Fs
VG9wRXN0aW1hdGUpOworICAgIAorICAgICAgICAvLyBGb3IgcmVwbGFjZWQgZWxlbWVudHMgYW5k
IHNjcm9sbGVkIGVsZW1lbnRzLCB3ZSB3YW50IHRvIHNoaWZ0IHRoZW0gdG8gdGhlIG5leHQgcGFn
ZSBpZiB0aGV5IGRvbid0IGZpdCBvbiB0aGUgY3VycmVudCBvbmUuCisgICAgICAgIGxvZ2ljYWxU
b3BFc3RpbWF0ZSA9IGFkanVzdEZvclVuc3BsaXR0YWJsZUNoaWxkKGNoaWxkLCBsb2dpY2FsVG9w
RXN0aW1hdGUpOworICAgICAgICAKKyAgICAgICAgaWYgKCFjaGlsZC0+c2VsZk5lZWRzTGF5b3V0
KCkgJiYgY2hpbGQtPmlzUmVuZGVyQmxvY2soKSkKKyAgICAgICAgICAgIGxvZ2ljYWxUb3BFc3Rp
bWF0ZSArPSB0b1JlbmRlckJsb2NrKGNoaWxkKS0+cGFnaW5hdGlvblN0cnV0KCk7CisgICAgfQor
CisgICAgcmV0dXJuIGxvZ2ljYWxUb3BFc3RpbWF0ZTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zs
b3c6OnNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihjb25zdCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZv
KQoreworICAgIGlmIChtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkgJiYg
IW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQmVmb3JlKCkpIHsKKyAgICAgICAgLy8g
VXBkYXRlIHRoZSBhZnRlciBzaWRlIG1hcmdpbiBvZiB0aGUgY29udGFpbmVyIHRvIGRpc2NhcmQg
aWYgdGhlIGFmdGVyIG1hcmdpbiBvZiB0aGUgbGFzdCBjaGlsZCBhbHNvIGRpc2NhcmRzIGFuZCB3
ZSBjb2xsYXBzZSB3aXRoIGl0LgorICAgICAgICAvLyBEb24ndCB1cGRhdGUgdGhlIG1heCBtYXJn
aW4gdmFsdWVzIGJlY2F1c2Ugd2Ugd29uJ3QgbmVlZCB0aGVtIGFueXdheS4KKyAgICAgICAgaWYg
KG1hcmdpbkluZm8uZGlzY2FyZE1hcmdpbigpKSB7CisgICAgICAgICAgICBzZXRNdXN0RGlzY2Fy
ZE1hcmdpbkFmdGVyKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAg
ICAvLyBVcGRhdGUgb3VyIG1heCBwb3MvbmVnIGJvdHRvbSBtYXJnaW5zLCBzaW5jZSB3ZSBjb2xs
YXBzZWQgb3VyIGJvdHRvbSBtYXJnaW5zCisgICAgICAgIC8vIHdpdGggb3VyIGNoaWxkcmVuLgor
ICAgICAgICBzZXRNYXhNYXJnaW5BZnRlclZhbHVlcyhtYXgobWF4UG9zaXRpdmVNYXJnaW5BZnRl
cigpLCBtYXJnaW5JbmZvLnBvc2l0aXZlTWFyZ2luKCkpLCBtYXgobWF4TmVnYXRpdmVNYXJnaW5B
ZnRlcigpLCBtYXJnaW5JbmZvLm5lZ2F0aXZlTWFyZ2luKCkpKTsKKworICAgICAgICBpZiAoIW1h
cmdpbkluZm8uaGFzTWFyZ2luQWZ0ZXJRdWlyaygpKQorICAgICAgICAgICAgc2V0SGFzTWFyZ2lu
QWZ0ZXJRdWlyayhmYWxzZSk7CisKKyAgICAgICAgaWYgKG1hcmdpbkluZm8uaGFzTWFyZ2luQWZ0
ZXJRdWlyaygpICYmICFtYXJnaW5BZnRlcigpKQorICAgICAgICAgICAgLy8gV2UgaGF2ZSBubyBi
b3R0b20gbWFyZ2luIGFuZCBvdXIgbGFzdCBjaGlsZCBoYXMgYSBxdWlya3kgbWFyZ2luLgorICAg
ICAgICAgICAgLy8gV2Ugd2lsbCBwaWNrIHVwIHRoaXMgcXVpcmt5IG1hcmdpbiBhbmQgcGFzcyBp
dCB0aHJvdWdoLgorICAgICAgICAgICAgLy8gVGhpcyBkZWFscyB3aXRoIHRoZSA8dGQ+PGRpdj48
cD4gY2FzZS4KKyAgICAgICAgICAgIHNldEhhc01hcmdpbkFmdGVyUXVpcmsodHJ1ZSk7CisgICAg
fQorfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6aGFuZGxlQWZ0ZXJTaWRlT2ZCbG9jayhMYXlv
dXRVbml0IGJlZm9yZVNpZGUsIExheW91dFVuaXQgYWZ0ZXJTaWRlLCBNYXJnaW5JbmZvJiBtYXJn
aW5JbmZvKQoreworICAgIG1hcmdpbkluZm8uc2V0QXRBZnRlclNpZGVPZkJsb2NrKHRydWUpOwor
CisgICAgLy8gSWYgd2UgY2FuJ3QgY29sbGFwc2Ugd2l0aCBjaGlsZHJlbiB0aGVuIGdvIGFoZWFk
IGFuZCBhZGQgaW4gdGhlIGJvdHRvbSBtYXJnaW4uCisgICAgaWYgKCFtYXJnaW5JbmZvLmRpc2Nh
cmRNYXJnaW4oKSAmJiAoIW1hcmdpbkluZm8uY2FuQ29sbGFwc2VXaXRoTWFyZ2luQWZ0ZXIoKSAm
JiAhbWFyZ2luSW5mby5jYW5Db2xsYXBzZVdpdGhNYXJnaW5CZWZvcmUoKQorICAgICAgICAmJiAo
IWRvY3VtZW50KCkuaW5RdWlya3NNb2RlKCkgfHwgIW1hcmdpbkluZm8ucXVpcmtDb250YWluZXIo
KSB8fCAhbWFyZ2luSW5mby5oYXNNYXJnaW5BZnRlclF1aXJrKCkpKSkKKyAgICAgICAgc2V0TG9n
aWNhbEhlaWdodChsb2dpY2FsSGVpZ2h0KCkgKyBtYXJnaW5JbmZvLm1hcmdpbigpKTsKKyAgICAg
ICAgCisgICAgLy8gTm93IGFkZCBpbiBvdXIgYm90dG9tIGJvcmRlci9wYWRkaW5nLgorICAgIHNl
dExvZ2ljYWxIZWlnaHQobG9naWNhbEhlaWdodCgpICsgYWZ0ZXJTaWRlKTsKKworICAgIC8vIE5l
Z2F0aXZlIG1hcmdpbnMgY2FuIGNhdXNlIG91ciBoZWlnaHQgdG8gc2hyaW5rIGJlbG93IG91ciBt
aW5pbWFsIGhlaWdodCAoYm9yZGVyL3BhZGRpbmcpLgorICAgIC8vIElmIHRoaXMgaGFwcGVucywg
ZW5zdXJlIHRoYXQgdGhlIGNvbXB1dGVkIGhlaWdodCBpcyBpbmNyZWFzZWQgdG8gdGhlIG1pbmlt
YWwgaGVpZ2h0LgorICAgIHNldExvZ2ljYWxIZWlnaHQobWF4KGxvZ2ljYWxIZWlnaHQoKSwgYmVm
b3JlU2lkZSArIGFmdGVyU2lkZSkpOworCisgICAgLy8gVXBkYXRlIG91ciBib3R0b20gY29sbGFw
c2VkIG1hcmdpbiBpbmZvLgorICAgIHNldENvbGxhcHNlZEJvdHRvbU1hcmdpbihtYXJnaW5JbmZv
KTsKK30KKwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhM
YXlvdXRVbml0IHBvcywgTGF5b3V0VW5pdCBuZWcpCit7CisgICAgaWYgKCFtX3JhcmVEYXRhKSB7
CisgICAgICAgIGlmIChwb3MgPT0gUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFy
Z2luQmVmb3JlRGVmYXVsdCh0aGlzKSAmJiBuZWcgPT0gUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6
Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0
YSh0aGlzKSk7CisgICAgfQorICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXRQb3NpdGl2ZU1h
cmdpbkJlZm9yZShwb3MpOworICAgIG1fcmFyZURhdGEtPm1fbWFyZ2lucy5zZXROZWdhdGl2ZU1h
cmdpbkJlZm9yZShuZWcpOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6c2V0TWF4TWFyZ2lu
QWZ0ZXJWYWx1ZXMoTGF5b3V0VW5pdCBwb3MsIExheW91dFVuaXQgbmVnKQoreworICAgIGlmICgh
bV9yYXJlRGF0YSkgeworICAgICAgICBpZiAocG9zID09IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRh
Ojpwb3NpdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlzKSAmJiBuZWcgPT0gUmVuZGVyQmxvY2tG
bG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRoaXMpKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBtX3JhcmVEYXRhID0gYWRvcHRQdHIobmV3IFJlbmRlckJsb2Nr
Rmxvd1JhcmVEYXRhKHRoaXMpKTsKKyAgICB9CisgICAgbV9yYXJlRGF0YS0+bV9tYXJnaW5zLnNl
dFBvc2l0aXZlTWFyZ2luQWZ0ZXIocG9zKTsKKyAgICBtX3JhcmVEYXRhLT5tX21hcmdpbnMuc2V0
TmVnYXRpdmVNYXJnaW5BZnRlcihuZWcpOworfQorCit2b2lkIFJlbmRlckJsb2NrRmxvdzo6c2V0
TXVzdERpc2NhcmRNYXJnaW5CZWZvcmUoYm9vbCB2YWx1ZSkKK3sKKyAgICBpZiAoc3R5bGUoKS0+
bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCkgeworICAgICAgICBBU1NFUlQodmFs
dWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIGlmICghbV9yYXJlRGF0YSAm
JiAhdmFsdWUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbV9yYXJlRGF0YSkKKyAgICAg
ICAgbV9yYXJlRGF0YSA9IGFkb3B0UHRyKG5ldyBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YSh0aGlz
KSk7CisKKyAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5CZWZvcmUgPSB2YWx1ZTsKK30K
Kwordm9pZCBSZW5kZXJCbG9ja0Zsb3c6OnNldE11c3REaXNjYXJkTWFyZ2luQWZ0ZXIoYm9vbCB2
YWx1ZSkKK3sKKyAgICBpZiAoc3R5bGUoKS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVND
QVJEKSB7CisgICAgICAgIEFTU0VSVCh2YWx1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBpZiAoIW1fcmFyZURhdGEgJiYgIXZhbHVlKQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoIW1fcmFyZURhdGEpCisgICAgICAgIG1fcmFyZURhdGEgPSBhZG9wdFB0cihuZXcgUmVuZGVy
QmxvY2tGbG93UmFyZURhdGEodGhpcykpOworCisgICAgbV9yYXJlRGF0YS0+bV9kaXNjYXJkTWFy
Z2luQWZ0ZXIgPSB2YWx1ZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNjYXJk
TWFyZ2luQmVmb3JlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3R5bGUoKS0+bWFyZ2luQmVmb3Jl
Q29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBtX3JhcmVEYXRhLT5tX2Rp
c2NhcmRNYXJnaW5CZWZvcmUpOworfQorCitib29sIFJlbmRlckJsb2NrRmxvdzo6bXVzdERpc2Nh
cmRNYXJnaW5BZnRlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0eWxlKCktPm1hcmdpbkFmdGVy
Q29sbGFwc2UoKSA9PSBNRElTQ0FSRCB8fCAobV9yYXJlRGF0YSAmJiBtX3JhcmVEYXRhLT5tX2Rp
c2NhcmRNYXJnaW5BZnRlcik7Cit9CisKK2Jvb2wgUmVuZGVyQmxvY2tGbG93OjptdXN0RGlzY2Fy
ZE1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Cit7Cisg
ICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOworICAgIGlmICghY2hpbGQtPmlz
V3JpdGluZ01vZGVSb290KCkpCisgICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5kZXJCbG9ja0Zs
b3coKSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+bXVzdERpc2NhcmRNYXJnaW5CZWZvcmUo
KSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UoKSA9PSBNRElTQ0FSRCk7
CisgICAgaWYgKGNoaWxkLT5pc0hvcml6b250YWxXcml0aW5nTW9kZSgpID09IGlzSG9yaXpvbnRh
bFdyaXRpbmdNb2RlKCkpCisgICAgICAgIHJldHVybiBjaGlsZC0+aXNSZW5kZXJCbG9ja0Zsb3co
KSA/IHRvUmVuZGVyQmxvY2tGbG93KGNoaWxkKS0+bXVzdERpc2NhcmRNYXJnaW5BZnRlcigpIDog
KGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5BZnRlckNvbGxhcHNlKCkgPT0gTURJU0NBUkQpOworCisg
ICAgLy8gRklYTUU6IFdlIHJldHVybiBmYWxzZSBoZXJlIGJlY2F1c2UgdGhlIGltcGxlbWVudGF0
aW9uIGlzIG5vdCBnZW9tZXRyaWNhbGx5IGNvbXBsZXRlLiBXZSBoYXZlIHZhbHVlcyBvbmx5IGZv
ciBiZWZvcmUvYWZ0ZXIsIG5vdCBzdGFydC9lbmQuCisgICAgLy8gSW4gY2FzZSB0aGUgYm94ZXMg
YXJlIHBlcnBlbmRpY3VsYXIgd2UgYXNzdW1lIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc3BlY2lmaWVk
LgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11c3REaXNj
YXJkTWFyZ2luQWZ0ZXJGb3JDaGlsZChjb25zdCBSZW5kZXJCb3gqIGNoaWxkKSBjb25zdAorewor
ICAgIEFTU0VSVCghY2hpbGQtPnNlbGZOZWVkc0xheW91dCgpKTsKKyAgICBpZiAoIWNoaWxkLT5p
c1dyaXRpbmdNb2RlUm9vdCgpKQorICAgICAgICByZXR1cm4gY2hpbGQtPmlzUmVuZGVyQmxvY2tG
bG93KCkgPyB0b1JlbmRlckJsb2NrRmxvdyhjaGlsZCktPm11c3REaXNjYXJkTWFyZ2luQWZ0ZXIo
KSA6IChjaGlsZC0+c3R5bGUoKS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsK
KyAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2RlKCkgPT0gaXNIb3Jpem9udGFs
V3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkLT5pc1JlbmRlckJsb2NrRmxvdygp
ID8gdG9SZW5kZXJCbG9ja0Zsb3coY2hpbGQpLT5tdXN0RGlzY2FyZE1hcmdpbkJlZm9yZSgpIDog
KGNoaWxkLT5zdHlsZSgpLT5tYXJnaW5CZWZvcmVDb2xsYXBzZSgpID09IE1ESVNDQVJEKTsKKwor
ICAgIC8vIEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGR8IGFib3Zl
LgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11c3RTZXBh
cmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNvbnN0IFJlbmRlckJveCogY2hpbGQpIGNvbnN0Cit7
CisgICAgQVNTRVJUKCFjaGlsZC0+c2VsZk5lZWRzTGF5b3V0KCkpOworICAgIGNvbnN0IFJlbmRl
clN0eWxlKiBjaGlsZFN0eWxlID0gY2hpbGQtPnN0eWxlKCk7CisgICAgaWYgKCFjaGlsZC0+aXNX
cml0aW5nTW9kZVJvb3QoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkU3R5bGUtPm1hcmdpbkJlZm9y
ZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOworICAgIGlmIChjaGlsZC0+aXNIb3Jpem9udGFsV3Jp
dGluZ01vZGUoKSA9PSBpc0hvcml6b250YWxXcml0aW5nTW9kZSgpKQorICAgICAgICByZXR1cm4g
Y2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSgpID09IE1TRVBBUkFURTsKKworICAgIC8v
IEZJWE1FOiBTZWUgfG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGR8IGFib3ZlLgorICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJCbG9ja0Zsb3c6Om11c3RTZXBhcmF0ZU1h
cmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KiBjaGlsZCkgY29uc3QKK3sKKyAgICBB
U1NFUlQoIWNoaWxkLT5zZWxmTmVlZHNMYXlvdXQoKSk7CisgICAgY29uc3QgUmVuZGVyU3R5bGUq
IGNoaWxkU3R5bGUgPSBjaGlsZC0+c3R5bGUoKTsKKyAgICBpZiAoIWNoaWxkLT5pc1dyaXRpbmdN
b2RlUm9vdCgpKQorICAgICAgICByZXR1cm4gY2hpbGRTdHlsZS0+bWFyZ2luQWZ0ZXJDb2xsYXBz
ZSgpID09IE1TRVBBUkFURTsKKyAgICBpZiAoY2hpbGQtPmlzSG9yaXpvbnRhbFdyaXRpbmdNb2Rl
KCkgPT0gaXNIb3Jpem9udGFsV3JpdGluZ01vZGUoKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkU3R5
bGUtPm1hcmdpbkJlZm9yZUNvbGxhcHNlKCkgPT0gTVNFUEFSQVRFOworCisgICAgLy8gRklYTUU6
IFNlZSB8bXVzdERpc2NhcmRNYXJnaW5CZWZvcmVGb3JDaGlsZHwgYWJvdmUuCisgICAgcmV0dXJu
IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpbk5vcm1hbEZsb3coUmVuZGVyQm94KiBjaGlsZCkK
K3sKKyAgICBSZW5kZXJCbG9jayogY3VyciA9IGNoaWxkLT5jb250YWluaW5nQmxvY2soKTsKKyAg
ICB3aGlsZSAoY3VyciAmJiBjdXJyICE9ICZjaGlsZC0+dmlldygpKSB7CisgICAgICAgIGlmIChj
dXJyLT5oYXNDb2x1bW5zKCkgfHwgY3Vyci0+aXNSZW5kZXJGbG93VGhyZWFkKCkpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGN1cnItPmlzRmxvYXRpbmdPck91dE9mRmxv
d1Bvc2l0aW9uZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY3VyciA9
IGN1cnItPmNvbnRhaW5pbmdCbG9jaygpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwor
TGF5b3V0VW5pdCBSZW5kZXJCbG9ja0Zsb3c6OmFwcGx5QmVmb3JlQnJlYWsoUmVuZGVyQm94KiBj
aGlsZCwgTGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0KQoreworICAgIC8vIEZJWE1FOiBBZGQgcGFn
ZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9ydCBwcmludGluZy4KKyAgICBib29s
IGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0YXRlKCktPmlzUGFnaW5hdGluZ0Nv
bHVtbnMoKTsKKyAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9ICFjaGVja0NvbHVtbkJyZWFrcyAm
JiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNhbEhlaWdodDsgLy8gRklYTUU6IE9u
Y2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVjayB0aGlzLgorICAgIFJlbmRlckZs
b3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29udGFpbmluZ0Jsb2NrKCk7CisgICAg
Ym9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQgJiYgZmxvd1RocmVhZC0+aXNSZW5k
ZXJOYW1lZEZsb3dUaHJlYWQoKTsKKyAgICBib29sIGNoZWNrQmVmb3JlQWx3YXlzID0gKGNoZWNr
Q29sdW1uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5jb2x1bW5CcmVha0JlZm9yZSgpID09IFBC
QUxXQVlTKSB8fCAoY2hlY2tQYWdlQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5wYWdlQnJlYWtC
ZWZvcmUoKSA9PSBQQkFMV0FZUykKKyAgICAgICAgfHwgKGNoZWNrUmVnaW9uQnJlYWtzICYmIGNo
aWxkLT5zdHlsZSgpLT5yZWdpb25CcmVha0JlZm9yZSgpID09IFBCQUxXQVlTKTsKKyAgICBpZiAo
Y2hlY2tCZWZvcmVBbHdheXMgJiYgaW5Ob3JtYWxGbG93KGNoaWxkKSAmJiBoYXNOZXh0UGFnZShs
b2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KSkgeworICAgICAgICBpZiAoY2hlY2tD
b2x1bW5CcmVha3MpCisgICAgICAgICAgICB2aWV3KCkubGF5b3V0U3RhdGUoKS0+YWRkRm9yY2Vk
Q29sdW1uQnJlYWsoY2hpbGQsIGxvZ2ljYWxPZmZzZXQpOworICAgICAgICBpZiAoY2hlY2tSZWdp
b25CcmVha3MpIHsKKyAgICAgICAgICAgIExheW91dFVuaXQgb2Zmc2V0QnJlYWtBZGp1c3RtZW50
ID0gMDsKKyAgICAgICAgICAgIGlmIChmbG93VGhyZWFkLT5hZGRGb3JjZWRSZWdpb25CcmVhayh0
aGlzLCBvZmZzZXRGcm9tTG9naWNhbFRvcE9mRmlyc3RQYWdlKCkgKyBsb2dpY2FsT2Zmc2V0LCBj
aGlsZCwgdHJ1ZSwgJm9mZnNldEJyZWFrQWRqdXN0bWVudCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGxvZ2ljYWxPZmZzZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFn
ZUJvdW5kYXJ5KTsKKyAgICB9CisgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Cit9CisKK0xheW91
dFVuaXQgUmVuZGVyQmxvY2tGbG93OjphcHBseUFmdGVyQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwg
TGF5b3V0VW5pdCBsb2dpY2FsT2Zmc2V0LCBNYXJnaW5JbmZvJiBtYXJnaW5JbmZvKQoreworICAg
IC8vIEZJWE1FOiBBZGQgcGFnZSBicmVhayBjaGVja2luZyBoZXJlIHdoZW4gd2Ugc3VwcG9ydCBw
cmludGluZy4KKyAgICBib29sIGNoZWNrQ29sdW1uQnJlYWtzID0gdmlldygpLmxheW91dFN0YXRl
KCktPmlzUGFnaW5hdGluZ0NvbHVtbnMoKTsKKyAgICBib29sIGNoZWNrUGFnZUJyZWFrcyA9ICFj
aGVja0NvbHVtbkJyZWFrcyAmJiB2aWV3KCkubGF5b3V0U3RhdGUoKS0+bV9wYWdlTG9naWNhbEhl
aWdodDsgLy8gRklYTUU6IE9uY2UgY29sdW1ucyBjYW4gcHJpbnQgd2UgaGF2ZSB0byBjaGVjayB0
aGlzLgorICAgIFJlbmRlckZsb3dUaHJlYWQqIGZsb3dUaHJlYWQgPSBmbG93VGhyZWFkQ29udGFp
bmluZ0Jsb2NrKCk7CisgICAgYm9vbCBjaGVja1JlZ2lvbkJyZWFrcyA9IGZsb3dUaHJlYWQgJiYg
Zmxvd1RocmVhZC0+aXNSZW5kZXJOYW1lZEZsb3dUaHJlYWQoKTsKKyAgICBib29sIGNoZWNrQWZ0
ZXJBbHdheXMgPSAoY2hlY2tDb2x1bW5CcmVha3MgJiYgY2hpbGQtPnN0eWxlKCktPmNvbHVtbkJy
ZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUykgfHwgKGNoZWNrUGFnZUJyZWFrcyAmJiBjaGlsZC0+c3R5
bGUoKS0+cGFnZUJyZWFrQWZ0ZXIoKSA9PSBQQkFMV0FZUykKKyAgICAgICAgfHwgKGNoZWNrUmVn
aW9uQnJlYWtzICYmIGNoaWxkLT5zdHlsZSgpLT5yZWdpb25CcmVha0FmdGVyKCkgPT0gUEJBTFdB
WVMpOworICAgIGlmIChjaGVja0FmdGVyQWx3YXlzICYmIGluTm9ybWFsRmxvdyhjaGlsZCkgJiYg
aGFzTmV4dFBhZ2UobG9naWNhbE9mZnNldCwgSW5jbHVkZVBhZ2VCb3VuZGFyeSkpIHsKKyAgICAg
ICAgTGF5b3V0VW5pdCBtYXJnaW5PZmZzZXQgPSBtYXJnaW5JbmZvLmNhbkNvbGxhcHNlV2l0aE1h
cmdpbkJlZm9yZSgpID8gTGF5b3V0VW5pdCgpIDogbWFyZ2luSW5mby5tYXJnaW4oKTsKKworICAg
ICAgICAvLyBTbyBvdXIgbWFyZ2luIGRvZXNuJ3QgcGFydGljaXBhdGUgaW4gdGhlIG5leHQgY29s
bGFwc2luZyBzdGVwcy4KKyAgICAgICAgbWFyZ2luSW5mby5jbGVhck1hcmdpbigpOworCisgICAg
ICAgIGlmIChjaGVja0NvbHVtbkJyZWFrcykKKyAgICAgICAgICAgIHZpZXcoKS5sYXlvdXRTdGF0
ZSgpLT5hZGRGb3JjZWRDb2x1bW5CcmVhayhjaGlsZCwgbG9naWNhbE9mZnNldCk7CisgICAgICAg
IGlmIChjaGVja1JlZ2lvbkJyZWFrcykgeworICAgICAgICAgICAgTGF5b3V0VW5pdCBvZmZzZXRC
cmVha0FkanVzdG1lbnQgPSAwOworICAgICAgICAgICAgaWYgKGZsb3dUaHJlYWQtPmFkZEZvcmNl
ZFJlZ2lvbkJyZWFrKHRoaXMsIG9mZnNldEZyb21Mb2dpY2FsVG9wT2ZGaXJzdFBhZ2UoKSArIGxv
Z2ljYWxPZmZzZXQgKyBtYXJnaW5PZmZzZXQsIGNoaWxkLCBmYWxzZSwgJm9mZnNldEJyZWFrQWRq
dXN0bWVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQgKyBtYXJnaW5P
ZmZzZXQgKyBvZmZzZXRCcmVha0FkanVzdG1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IG5leHRQYWdlTG9naWNhbFRvcChsb2dpY2FsT2Zmc2V0LCBJbmNsdWRlUGFnZUJvdW5kYXJ5KTsK
KyAgICB9CisgICAgcmV0dXJuIGxvZ2ljYWxPZmZzZXQ7Cit9CisKK0xheW91dFVuaXQgUmVuZGVy
QmxvY2tGbG93OjphZGp1c3RCbG9ja0NoaWxkRm9yUGFnaW5hdGlvbihMYXlvdXRVbml0IGxvZ2lj
YWxUb3BBZnRlckNsZWFyLCBMYXlvdXRVbml0IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24sIFJl
bmRlckJveCogY2hpbGQsIGJvb2wgYXRCZWZvcmVTaWRlT2ZCbG9jaykKK3sKKyAgICBSZW5kZXJC
bG9jayogY2hpbGRSZW5kZXJCbG9jayA9IGNoaWxkLT5pc1JlbmRlckJsb2NrKCkgPyB0b1JlbmRl
ckJsb2NrKGNoaWxkKSA6IDA7CisKKyAgICBpZiAoZXN0aW1hdGVXaXRob3V0UGFnaW5hdGlvbiAh
PSBsb2dpY2FsVG9wQWZ0ZXJDbGVhcikgeworICAgICAgICAvLyBPdXIgZ3Vlc3MgcHJpb3IgdG8g
cGFnaW5hdGlvbiBtb3ZlbWVudCB3YXMgd3JvbmcuIEJlZm9yZSB3ZSBhdHRlbXB0IHRvIHBhZ2lu
YXRlLCBsZXQncyB0cnkgYWdhaW4gYXQgdGhlIG5ldworICAgICAgICAvLyBwb3NpdGlvbi4KKyAg
ICAgICAgc2V0TG9naWNhbEhlaWdodChsb2dpY2FsVG9wQWZ0ZXJDbGVhcik7CisgICAgICAgIHNl
dExvZ2ljYWxUb3BGb3JDaGlsZChjaGlsZCwgbG9naWNhbFRvcEFmdGVyQ2xlYXIsIEFwcGx5TGF5
b3V0RGVsdGEpOworCisgICAgICAgIGlmIChjaGlsZC0+c2hyaW5rVG9Bdm9pZEZsb2F0cygpKSB7
CisgICAgICAgICAgICAvLyBUaGUgY2hpbGQncyB3aWR0aCBkZXBlbmRzIG9uIHRoZSBsaW5lIHdp
ZHRoLgorICAgICAgICAgICAgLy8gV2hlbiB0aGUgY2hpbGQgc2hpZnRzIHRvIGNsZWFyIGFuIGl0
ZW0sIGl0cyB3aWR0aCBjYW4KKyAgICAgICAgICAgIC8vIGNoYW5nZSAoYmVjYXVzZSBpdCBoYXMg
bW9yZSBhdmFpbGFibGUgbGluZSB3aWR0aCkuCisgICAgICAgICAgICAvLyBTbyBnbyBhaGVhZCBh
bmQgbWFyayB0aGUgaXRlbSBhcyBkaXJ0eS4KKyAgICAgICAgICAgIGNoaWxkLT5zZXRDaGlsZE5l
ZWRzTGF5b3V0KHRydWUsIE1hcmtPbmx5VGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAg
ICAgIGlmIChjaGlsZFJlbmRlckJsb2NrKSB7CisgICAgICAgICAgICBpZiAoIWNoaWxkLT5hdm9p
ZHNGbG9hdHMoKSAmJiBjaGlsZFJlbmRlckJsb2NrLT5jb250YWluc0Zsb2F0cygpKQorICAgICAg
ICAgICAgICAgIGNoaWxkUmVuZGVyQmxvY2stPm1hcmtBbGxEZXNjZW5kYW50c1dpdGhGbG9hdHNG
b3JMYXlvdXQoKTsKKyAgICAgICAgICAgIGlmICghY2hpbGQtPm5lZWRzTGF5b3V0KCkpCisgICAg
ICAgICAgICAgICAgY2hpbGQtPm1hcmtGb3JQYWdpbmF0aW9uUmVsYXlvdXRJZk5lZWRlZCgpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gT3VyIGd1ZXNzIHdhcyB3cm9uZy4gTWFrZSB0aGUgY2hp
bGQgbGF5IGl0c2VsZiBvdXQgYWdhaW4uCisgICAgICAgIGNoaWxkLT5sYXlvdXRJZk5lZWRlZCgp
OworICAgIH0KKworICAgIExheW91dFVuaXQgb2xkVG9wID0gbG9naWNhbFRvcEFmdGVyQ2xlYXI7
CisKKyAgICAvLyBJZiB0aGUgb2JqZWN0IGhhcyBhIHBhZ2Ugb3IgY29sdW1uIGJyZWFrIHZhbHVl
IG9mICJiZWZvcmUiLCB0aGVuIHdlIHNob3VsZCBzaGlmdCB0byB0aGUgdG9wIG9mIHRoZSBuZXh0
IHBhZ2UuCisgICAgTGF5b3V0VW5pdCByZXN1bHQgPSBhcHBseUJlZm9yZUJyZWFrKGNoaWxkLCBs
b2dpY2FsVG9wQWZ0ZXJDbGVhcik7CisKKyAgICBpZiAocGFnZUxvZ2ljYWxIZWlnaHRGb3JPZmZz
ZXQocmVzdWx0KSkgeworICAgICAgICBMYXlvdXRVbml0IHJlbWFpbmluZ0xvZ2ljYWxIZWlnaHQg
PSBwYWdlUmVtYWluaW5nTG9naWNhbEhlaWdodEZvck9mZnNldChyZXN1bHQsIEV4Y2x1ZGVQYWdl
Qm91bmRhcnkpOworICAgICAgICBMYXlvdXRVbml0IHNwYWNlU2hvcnRhZ2UgPSBjaGlsZC0+bG9n
aWNhbEhlaWdodCgpIC0gcmVtYWluaW5nTG9naWNhbEhlaWdodDsKKyAgICAgICAgaWYgKHNwYWNl
U2hvcnRhZ2UgPiAwKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQgY3Jvc3NlcyBhIGNv
bHVtbiBib3VuZGFyeSwgcmVwb3J0IGEgYnJlYWssIGluIGNhc2Ugbm90aGluZyBpbnNpZGUgaXQg
aGFzIGFscmVhZHkKKyAgICAgICAgICAgIC8vIGRvbmUgc28uIFRoZSBjb2x1bW4gYmFsYW5jZXIg
bmVlZHMgdG8ga25vdyBob3cgbXVjaCBpdCBoYXMgdG8gc3RyZXRjaCB0aGUgY29sdW1ucyB0byBt
YWtlIG1vcmUKKyAgICAgICAgICAgIC8vIGNvbnRlbnQgZml0LiBJZiBubyBicmVha3MgYXJlIHJl
cG9ydGVkIChidXQgZG8gb2NjdXIpLCB0aGUgYmFsYW5jZXIgd2lsbCBoYXZlIG5vIGNsdWUuIEZJ
WE1FOgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgaW1wcm92ZWQsIHRob3VnaCwgYmVj
YXVzZSBoZXJlIHdlIGp1c3QgcHJldGVuZCB0aGF0IHRoZSBjaGlsZCBpcworICAgICAgICAgICAg
Ly8gdW5zcGxpdHRhYmxlLiBBIHNwbGl0dGFibGUgY2hpbGQsIG9uIHRoZSBvdGhlciBoYW5kLCBo
YXMgYnJlYWsgb3Bwb3J0dW5pdGllcyBhdCBldmVyeSBwb3NpdGlvbgorICAgICAgICAgICAgLy8g
d2hlcmUgdGhlcmUncyBubyBjaGlsZCBjb250ZW50LCBib3JkZXIgb3IgcGFkZGluZy4gSW4gb3Ro
ZXIgd29yZHMsIHdlIHJpc2sgc3RyZXRjaGluZyBtb3JlCisgICAgICAgICAgICAvLyB0aGFuIG5l
Y2Vzc2FyeS4KKyAgICAgICAgICAgIHNldFBhZ2VCcmVhayhyZXN1bHQsIHNwYWNlU2hvcnRhZ2Up
OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIHJlcGxhY2VkIGVsZW1lbnRzIGFuZCBz
Y3JvbGxlZCBlbGVtZW50cywgd2Ugd2FudCB0byBzaGlmdCB0aGVtIHRvIHRoZSBuZXh0IHBhZ2Ug
aWYgdGhleSBkb24ndCBmaXQgb24gdGhlIGN1cnJlbnQgb25lLgorICAgIExheW91dFVuaXQgbG9n
aWNhbFRvcEJlZm9yZVVuc3BsaXR0YWJsZUFkanVzdG1lbnQgPSByZXN1bHQ7CisgICAgTGF5b3V0
VW5pdCBsb2dpY2FsVG9wQWZ0ZXJVbnNwbGl0dGFibGVBZGp1c3RtZW50ID0gYWRqdXN0Rm9yVW5z
cGxpdHRhYmxlQ2hpbGQoY2hpbGQsIHJlc3VsdCk7CisgICAgCisgICAgTGF5b3V0VW5pdCBwYWdp
bmF0aW9uU3RydXQgPSAwOworICAgIExheW91dFVuaXQgdW5zcGxpdHRhYmxlQWRqdXN0bWVudERl
bHRhID0gbG9naWNhbFRvcEFmdGVyVW5zcGxpdHRhYmxlQWRqdXN0bWVudCAtIGxvZ2ljYWxUb3BC
ZWZvcmVVbnNwbGl0dGFibGVBZGp1c3RtZW50OworICAgIGlmICh1bnNwbGl0dGFibGVBZGp1c3Rt
ZW50RGVsdGEpCisgICAgICAgIHBhZ2luYXRpb25TdHJ1dCA9IHVuc3BsaXR0YWJsZUFkanVzdG1l
bnREZWx0YTsKKyAgICBlbHNlIGlmIChjaGlsZFJlbmRlckJsb2NrICYmIGNoaWxkUmVuZGVyQmxv
Y2stPnBhZ2luYXRpb25TdHJ1dCgpKQorICAgICAgICBwYWdpbmF0aW9uU3RydXQgPSBjaGlsZFJl
bmRlckJsb2NrLT5wYWdpbmF0aW9uU3RydXQoKTsKKworICAgIGlmIChwYWdpbmF0aW9uU3RydXQp
IHsKKyAgICAgICAgLy8gV2UgYXJlIHdpbGxpbmcgdG8gcHJvcGFnYXRlIG91dCB0byBvdXIgcGFy
ZW50IGJsb2NrIGFzIGxvbmcgYXMgd2Ugd2VyZSBhdCB0aGUgdG9wIG9mIHRoZSBibG9jayBwcmlv
cgorICAgICAgICAvLyB0byBjb2xsYXBzaW5nIG91ciBtYXJnaW5zLCBhbmQgYXMgbG9uZyBhcyB3
ZSBkaWRuJ3QgY2xlYXIgb3IgbW92ZSBhcyBhIHJlc3VsdCBvZiBvdGhlciBwYWdpbmF0aW9uLgor
ICAgICAgICBpZiAoYXRCZWZvcmVTaWRlT2ZCbG9jayAmJiBvbGRUb3AgPT0gcmVzdWx0ICYmICFp
c091dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiAhaXNUYWJsZUNlbGwoKSkgeworICAgICAgICAgICAg
Ly8gRklYTUU6IFNob3VsZCByZWFsbHkgY2hlY2sgaWYgd2UncmUgZXhjZWVkaW5nIHRoZSBwYWdl
IGhlaWdodCBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIHN0cnV0LCBidXQgd2UgZG9uJ3QKKyAgICAg
ICAgICAgIC8vIGhhdmUgYWxsIHRoZSBpbmZvcm1hdGlvbiB0byBkbyBzbyAodGhlIHN0cnV0IG9u
bHkgaGFzIHRoZSByZW1haW5pbmcgYW1vdW50IHRvIHB1c2gpLiBHZWNrbyBnZXRzIHRoaXMgd3Jv
bmcgdG9vCisgICAgICAgICAgICAvLyBhbmQgcHVzaGVzIHRvIHRoZSBuZXh0IHBhZ2UgYW55d2F5
LCBzbyBub3QgdG9vIGNvbmNlcm5lZCBhYm91dCBpdC4KKyAgICAgICAgICAgIHNldFBhZ2luYXRp
b25TdHJ1dChyZXN1bHQgKyBwYWdpbmF0aW9uU3RydXQpOworICAgICAgICAgICAgaWYgKGNoaWxk
UmVuZGVyQmxvY2spCisgICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJCbG9jay0+c2V0UGFnaW5h
dGlvblN0cnV0KDApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCArPSBwYWdp
bmF0aW9uU3RydXQ7CisgICAgfQorCisgICAgLy8gU2ltaWxhciB0byBob3cgd2UgYXBwbHkgY2xl
YXJhbmNlLiBHbyBhaGVhZCBhbmQgYm9vc3QgaGVpZ2h0KCkgdG8gYmUgdGhlIHBsYWNlIHdoZXJl
IHdlJ3JlIGdvaW5nIHRvIHBvc2l0aW9uIHRoZSBjaGlsZC4KKyAgICBzZXRMb2dpY2FsSGVpZ2h0
KGxvZ2ljYWxIZWlnaHQoKSArIChyZXN1bHQgLSBvbGRUb3ApKTsKKyAgICAKKyAgICAvLyBSZXR1
cm4gdGhlIGZpbmFsIGFkanVzdGVkIGxvZ2ljYWwgdG9wLgorICAgIHJldHVybiByZXN1bHQ7Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9SZW5kZXJCbG9ja0Zsb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9yZW5kZXJp
bmcvUmVuZGVyQmxvY2tGbG93LmgJKHJldmlzaW9uIDE1NTM3NykKKysrIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJCbG9ja0Zsb3cuaAkod29ya2luZyBjb3B5KQpAQCAtNDcsNiArNDcs
MTk5IEBAIHByb3RlY3RlZDoKICAgICAvLyBXaGVuIHRoZSBjaGlsZHJlbiBhcmUgYXJlIGFsbCBp
bmxpbmUgKGUuZy4sIGxpbmVzKSwgd2UgY2FsbCBsYXlvdXRJbmxpbmVDaGlsZHJlbi4KICAgICB2
b2lkIGxheW91dEJsb2NrQ2hpbGRyZW4oYm9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0
JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pOwogICAgIHZvaWQgbGF5b3V0SW5saW5lQ2hpbGRyZW4o
Ym9vbCByZWxheW91dENoaWxkcmVuLCBMYXlvdXRVbml0JiByZXBhaW50TG9naWNhbFRvcCwgTGF5
b3V0VW5pdCYgcmVwYWludExvZ2ljYWxCb3R0b20pOworICAgIAorICAgIC8vIFJlbmRlckJsb2Nr
Rmxvd3Mgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcywgc2luY2UgdGhleSBhcmUgdGhlIG9ubHkgY2xh
c3MgdGhhdCBzdXBwb3J0cyBtYXJnaW4gY29sbGFwc2luZy4KKyAgICB2aXJ0dWFsIExheW91dFVu
aXQgY29sbGFwc2VkTWFyZ2luQmVmb3JlKCkgY29uc3QgT1ZFUlJJREUgRklOQUwgeyByZXR1cm4g
bWF4UG9zaXRpdmVNYXJnaW5CZWZvcmUoKSAtIG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7IH0K
KyAgICB2aXJ0dWFsIExheW91dFVuaXQgY29sbGFwc2VkTWFyZ2luQWZ0ZXIoKSBjb25zdCBPVkVS
UklERSBGSU5BTCB7IHJldHVybiBtYXhQb3NpdGl2ZU1hcmdpbkFmdGVyKCkgLSBtYXhOZWdhdGl2
ZU1hcmdpbkFmdGVyKCk7IH0KKworcHVibGljOgorICAgIGNsYXNzIE1hcmdpblZhbHVlcyB7Cisg
ICAgcHVibGljOgorICAgICAgICBNYXJnaW5WYWx1ZXMoTGF5b3V0VW5pdCBiZWZvcmVQb3MsIExh
eW91dFVuaXQgYmVmb3JlTmVnLCBMYXlvdXRVbml0IGFmdGVyUG9zLCBMYXlvdXRVbml0IGFmdGVy
TmVnKQorICAgICAgICAgICAgOiBtX3Bvc2l0aXZlTWFyZ2luQmVmb3JlKGJlZm9yZVBvcykKKyAg
ICAgICAgICAgICwgbV9uZWdhdGl2ZU1hcmdpbkJlZm9yZShiZWZvcmVOZWcpCisgICAgICAgICAg
ICAsIG1fcG9zaXRpdmVNYXJnaW5BZnRlcihhZnRlclBvcykKKyAgICAgICAgICAgICwgbV9uZWdh
dGl2ZU1hcmdpbkFmdGVyKGFmdGVyTmVnKQorICAgICAgICB7IH0KKyAgICAgICAgCisgICAgICAg
IExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0
aXZlTWFyZ2luQmVmb3JlOyB9CisgICAgICAgIExheW91dFVuaXQgbmVnYXRpdmVNYXJnaW5CZWZv
cmUoKSBjb25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQmVmb3JlOyB9CisgICAgICAgIExh
eW91dFVuaXQgcG9zaXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcG9zaXRpdmVN
YXJnaW5BZnRlcjsgfQorICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luQWZ0ZXIoKSBj
b25zdCB7IHJldHVybiBtX25lZ2F0aXZlTWFyZ2luQWZ0ZXI7IH0KKyAgICAgICAgCisgICAgICAg
IHZvaWQgc2V0UG9zaXRpdmVNYXJnaW5CZWZvcmUoTGF5b3V0VW5pdCBwb3MpIHsgbV9wb3NpdGl2
ZU1hcmdpbkJlZm9yZSA9IHBvczsgfQorICAgICAgICB2b2lkIHNldE5lZ2F0aXZlTWFyZ2luQmVm
b3JlKExheW91dFVuaXQgbmVnKSB7IG1fbmVnYXRpdmVNYXJnaW5CZWZvcmUgPSBuZWc7IH0KKyAg
ICAgICAgdm9pZCBzZXRQb3NpdGl2ZU1hcmdpbkFmdGVyKExheW91dFVuaXQgcG9zKSB7IG1fcG9z
aXRpdmVNYXJnaW5BZnRlciA9IHBvczsgfQorICAgICAgICB2b2lkIHNldE5lZ2F0aXZlTWFyZ2lu
QWZ0ZXIoTGF5b3V0VW5pdCBuZWcpIHsgbV9uZWdhdGl2ZU1hcmdpbkFmdGVyID0gbmVnOyB9Cisg
ICAgCisgICAgcHJpdmF0ZToKKyAgICAgICAgTGF5b3V0VW5pdCBtX3Bvc2l0aXZlTWFyZ2luQmVm
b3JlOworICAgICAgICBMYXlvdXRVbml0IG1fbmVnYXRpdmVNYXJnaW5CZWZvcmU7CisgICAgICAg
IExheW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbkFmdGVyOworICAgICAgICBMYXlvdXRVbml0IG1f
bmVnYXRpdmVNYXJnaW5BZnRlcjsKKyAgICB9OworICAgIE1hcmdpblZhbHVlcyBtYXJnaW5WYWx1
ZXNGb3JDaGlsZChSZW5kZXJCb3gqIGNoaWxkKSBjb25zdDsKKworICAgIC8vIEFsbG9jYXRlZCBv
bmx5IHdoZW4gc29tZSBvZiB0aGVzZSBmaWVsZHMgaGF2ZSBub24tZGVmYXVsdCB2YWx1ZXMKKyAg
ICBzdHJ1Y3QgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEgeworICAgICAgICBXVEZfTUFLRV9OT05D
T1BZQUJMRShSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YSk7IFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVE
OworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyQmxvY2tGbG93UmFyZURhdGEoY29uc3QgUmVu
ZGVyQmxvY2tGbG93KiBibG9jaykKKyAgICAgICAgICAgIDogbV9tYXJnaW5zKHBvc2l0aXZlTWFy
Z2luQmVmb3JlRGVmYXVsdChibG9jayksIG5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdChibG9j
ayksIHBvc2l0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KGJsb2NrKSwgbmVnYXRpdmVNYXJnaW5BZnRl
ckRlZmF1bHQoYmxvY2spKQorICAgICAgICAgICAgLCBtX2Rpc2NhcmRNYXJnaW5CZWZvcmUoZmFs
c2UpCisgICAgICAgICAgICAsIG1fZGlzY2FyZE1hcmdpbkFmdGVyKGZhbHNlKQorICAgICAgICB7
IAorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIExheW91dFVuaXQgcG9zaXRpdmVNYXJnaW5C
ZWZvcmVEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAgICAgICAgeyAKKyAgICAg
ICAgICAgIHJldHVybiBzdGQ6Om1heDxMYXlvdXRVbml0PihibG9jay0+bWFyZ2luQmVmb3JlKCks
IDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2lu
QmVmb3JlRGVmYXVsdChjb25zdCBSZW5kZXJCbG9jayogYmxvY2spCisgICAgICAgIHsgCisgICAg
ICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oLWJsb2NrLT5tYXJnaW5CZWZvcmUo
KSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIExheW91dFVuaXQgcG9zaXRpdmVNYXJn
aW5BZnRlckRlZmF1bHQoY29uc3QgUmVuZGVyQmxvY2sqIGJsb2NrKQorICAgICAgICB7CisgICAg
ICAgICAgICByZXR1cm4gc3RkOjptYXg8TGF5b3V0VW5pdD4oYmxvY2stPm1hcmdpbkFmdGVyKCks
IDApOworICAgICAgICB9CisgICAgICAgIHN0YXRpYyBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2lu
QWZ0ZXJEZWZhdWx0KGNvbnN0IFJlbmRlckJsb2NrKiBibG9jaykKKyAgICAgICAgeworICAgICAg
ICAgICAgcmV0dXJuIHN0ZDo6bWF4PExheW91dFVuaXQ+KC1ibG9jay0+bWFyZ2luQWZ0ZXIoKSwg
MCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIE1hcmdpblZhbHVlcyBtX21hcmdpbnM7
CisgICAgICAgIGJvb2wgbV9kaXNjYXJkTWFyZ2luQmVmb3JlIDogMTsKKyAgICAgICAgYm9vbCBt
X2Rpc2NhcmRNYXJnaW5BZnRlciA6IDE7CisgICAgfTsKKworICAgIGNsYXNzIE1hcmdpbkluZm8g
eworICAgICAgICAvLyBDb2xsYXBzaW5nIGZsYWdzIGZvciB3aGV0aGVyIHdlIGNhbiBjb2xsYXBz
ZSBvdXIgbWFyZ2lucyB3aXRoIG91ciBjaGlsZHJlbidzIG1hcmdpbnMuCisgICAgICAgIGJvb2wg
bV9jYW5Db2xsYXBzZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJvb2wgbV9jYW5Db2xsYXBz
ZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbiA6IDE7CisgICAgICAgIGJvb2wgbV9jYW5Db2xsYXBz
ZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuIDogMTsKKworICAgICAgICAvLyBXaGV0aGVyIG9yIG5v
dCB3ZSBhcmUgYSBxdWlya3kgY29udGFpbmVyLCBpLmUuLCBkbyB3ZSBjb2xsYXBzZSBhd2F5IHRv
cCBhbmQgYm90dG9tCisgICAgICAgIC8vIG1hcmdpbnMgaW4gb3VyIGNvbnRhaW5lci4gVGFibGUg
Y2VsbHMgYW5kIHRoZSBib2R5IGFyZSB0aGUgY29tbW9uIGV4YW1wbGVzLiBXZQorICAgICAgICAv
LyBhbHNvIGhhdmUgYSBjdXN0b20gc3R5bGUgcHJvcGVydHkgZm9yIFNhZmFyaSBSU1MgdG8gZGVh
bCB3aXRoIFR5cGVQYWQgYmxvZyBhcnRpY2xlcy4KKyAgICAgICAgYm9vbCBtX3F1aXJrQ29udGFp
bmVyIDogMTsKKworICAgICAgICAvLyBUaGlzIGZsYWcgdHJhY2tzIHdoZXRoZXIgd2UgYXJlIHN0
aWxsIGxvb2tpbmcgYXQgY2hpbGQgbWFyZ2lucyB0aGF0IGNhbiBhbGwgY29sbGFwc2UgdG9nZXRo
ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrLiAgCisgICAgICAgIC8vIFRoZXkgbWF5IG9y
IG1heSBub3QgY29sbGFwc2Ugd2l0aCB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgYmxvY2sgKHxtX2Nh
bkNvbGxhcHNlVG9wV2l0aENoaWxkcmVufCB0ZWxscyB1cyB0aGF0KSwgYnV0IHRoZXkgd2lsbAor
ICAgICAgICAvLyBhbHdheXMgYmUgY29sbGFwc2luZyB3aXRoIG9uZSBhbm90aGVyLiBUaGlzIHZh
cmlhYmxlIGNhbiByZW1haW4gc2V0IHRvIHRydWUgdGhyb3VnaCBtdWx0aXBsZSBpdGVyYXRpb25z
IAorICAgICAgICAvLyBhcyBsb25nIGFzIHdlIGtlZXAgZW5jb3VudGVyaW5nIHNlbGYtY29sbGFw
c2luZyBibG9ja3MuCisgICAgICAgIGJvb2wgbV9hdEJlZm9yZVNpZGVPZkJsb2NrIDogMTsKKwor
ICAgICAgICAvLyBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gd2Uga25vdyB3ZSdyZSBleGFtaW5pbmcg
Ym90dG9tIG1hcmdpbnMgYW5kIHdlIGtub3cgd2UncmUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYmxv
Y2suCisgICAgICAgIGJvb2wgbV9hdEFmdGVyU2lkZU9mQmxvY2sgOiAxOworCisgICAgICAgIC8v
IFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBkZXRlY3QgcXVpcmt5IG1hcmdpbnMgdGhhdCB3
ZSBuZWVkIHRvIGNvbGxhcHNlIGF3YXkgKGluIHRhYmxlIGNlbGxzCisgICAgICAgIC8vIGFuZCBp
biB0aGUgYm9keSBlbGVtZW50KS4KKyAgICAgICAgYm9vbCBtX2hhc01hcmdpbkJlZm9yZVF1aXJr
IDogMTsKKyAgICAgICAgYm9vbCBtX2hhc01hcmdpbkFmdGVyUXVpcmsgOiAxOworICAgICAgICBi
b29sIG1fZGV0ZXJtaW5lZE1hcmdpbkJlZm9yZVF1aXJrIDogMTsKKworICAgICAgICBib29sIG1f
ZGlzY2FyZE1hcmdpbiA6IDE7CisKKyAgICAgICAgLy8gVGhlc2UgZmxhZ3MgdHJhY2sgdGhlIHBy
ZXZpb3VzIG1heGltYWwgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1hcmdpbnMuCisgICAgICAgIExh
eW91dFVuaXQgbV9wb3NpdGl2ZU1hcmdpbjsKKyAgICAgICAgTGF5b3V0VW5pdCBtX25lZ2F0aXZl
TWFyZ2luOworCisgICAgcHVibGljOgorICAgICAgICBNYXJnaW5JbmZvKFJlbmRlckJsb2NrRmxv
dyosIExheW91dFVuaXQgYmVmb3JlQm9yZGVyUGFkZGluZywgTGF5b3V0VW5pdCBhZnRlckJvcmRl
clBhZGRpbmcpOworCisgICAgICAgIHZvaWQgc2V0QXRCZWZvcmVTaWRlT2ZCbG9jayhib29sIGIp
IHsgbV9hdEJlZm9yZVNpZGVPZkJsb2NrID0gYjsgfQorICAgICAgICB2b2lkIHNldEF0QWZ0ZXJT
aWRlT2ZCbG9jayhib29sIGIpIHsgbV9hdEFmdGVyU2lkZU9mQmxvY2sgPSBiOyB9CisgICAgICAg
IHZvaWQgY2xlYXJNYXJnaW4oKQorICAgICAgICB7CisgICAgICAgICAgICBtX3Bvc2l0aXZlTWFy
Z2luID0gMDsKKyAgICAgICAgICAgIG1fbmVnYXRpdmVNYXJnaW4gPSAwOworICAgICAgICB9Cisg
ICAgICAgIHZvaWQgc2V0SGFzTWFyZ2luQmVmb3JlUXVpcmsoYm9vbCBiKSB7IG1faGFzTWFyZ2lu
QmVmb3JlUXVpcmsgPSBiOyB9CisgICAgICAgIHZvaWQgc2V0SGFzTWFyZ2luQWZ0ZXJRdWlyayhi
b29sIGIpIHsgbV9oYXNNYXJnaW5BZnRlclF1aXJrID0gYjsgfQorICAgICAgICB2b2lkIHNldERl
dGVybWluZWRNYXJnaW5CZWZvcmVRdWlyayhib29sIGIpIHsgbV9kZXRlcm1pbmVkTWFyZ2luQmVm
b3JlUXVpcmsgPSBiOyB9CisgICAgICAgIHZvaWQgc2V0UG9zaXRpdmVNYXJnaW4oTGF5b3V0VW5p
dCBwKSB7IEFTU0VSVCghbV9kaXNjYXJkTWFyZ2luKTsgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7IH0K
KyAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbihMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFt
X2Rpc2NhcmRNYXJnaW4pOyBtX25lZ2F0aXZlTWFyZ2luID0gbjsgfQorICAgICAgICB2b2lkIHNl
dFBvc2l0aXZlTWFyZ2luSWZMYXJnZXIoTGF5b3V0VW5pdCBwKQorICAgICAgICB7CisgICAgICAg
ICAgICBBU1NFUlQoIW1fZGlzY2FyZE1hcmdpbik7CisgICAgICAgICAgICBpZiAocCA+IG1fcG9z
aXRpdmVNYXJnaW4pCisgICAgICAgICAgICAgICAgbV9wb3NpdGl2ZU1hcmdpbiA9IHA7CisgICAg
ICAgIH0KKyAgICAgICAgdm9pZCBzZXROZWdhdGl2ZU1hcmdpbklmTGFyZ2VyKExheW91dFVuaXQg
bikKKyAgICAgICAgeworICAgICAgICAgICAgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOworICAg
ICAgICAgICAgaWYgKG4gPiBtX25lZ2F0aXZlTWFyZ2luKQorICAgICAgICAgICAgICAgIG1fbmVn
YXRpdmVNYXJnaW4gPSBuOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRNYXJnaW4oTGF5
b3V0VW5pdCBwLCBMYXlvdXRVbml0IG4pIHsgQVNTRVJUKCFtX2Rpc2NhcmRNYXJnaW4pOyBtX3Bv
c2l0aXZlTWFyZ2luID0gcDsgbV9uZWdhdGl2ZU1hcmdpbiA9IG47IH0KKyAgICAgICAgdm9pZCBz
ZXRDYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuKGJvb2wgY29sbGFwc2UpIHsgbV9j
YW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuID0gY29sbGFwc2U7IH0KKyAgICAgICAg
dm9pZCBzZXREaXNjYXJkTWFyZ2luKGJvb2wgdmFsdWUpIHsgbV9kaXNjYXJkTWFyZ2luID0gdmFs
dWU7IH0KKworICAgICAgICBib29sIGF0QmVmb3JlU2lkZU9mQmxvY2soKSBjb25zdCB7IHJldHVy
biBtX2F0QmVmb3JlU2lkZU9mQmxvY2s7IH0KKyAgICAgICAgYm9vbCBjYW5Db2xsYXBzZVdpdGhN
YXJnaW5CZWZvcmUoKSBjb25zdCB7IHJldHVybiBtX2F0QmVmb3JlU2lkZU9mQmxvY2sgJiYgbV9j
YW5Db2xsYXBzZU1hcmdpbkJlZm9yZVdpdGhDaGlsZHJlbjsgfQorICAgICAgICBib29sIGNhbkNv
bGxhcHNlV2l0aE1hcmdpbkFmdGVyKCkgY29uc3QgeyByZXR1cm4gbV9hdEFmdGVyU2lkZU9mQmxv
Y2sgJiYgbV9jYW5Db2xsYXBzZU1hcmdpbkFmdGVyV2l0aENoaWxkcmVuOyB9CisgICAgICAgIGJv
b2wgY2FuQ29sbGFwc2VNYXJnaW5CZWZvcmVXaXRoQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBt
X2NhbkNvbGxhcHNlTWFyZ2luQmVmb3JlV2l0aENoaWxkcmVuOyB9CisgICAgICAgIGJvb2wgY2Fu
Q29sbGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fY2FuQ29s
bGFwc2VNYXJnaW5BZnRlcldpdGhDaGlsZHJlbjsgfQorICAgICAgICBib29sIHF1aXJrQ29udGFp
bmVyKCkgY29uc3QgeyByZXR1cm4gbV9xdWlya0NvbnRhaW5lcjsgfQorICAgICAgICBib29sIGRl
dGVybWluZWRNYXJnaW5CZWZvcmVRdWlyaygpIGNvbnN0IHsgcmV0dXJuIG1fZGV0ZXJtaW5lZE1h
cmdpbkJlZm9yZVF1aXJrOyB9CisgICAgICAgIGJvb2wgaGFzTWFyZ2luQmVmb3JlUXVpcmsoKSBj
b25zdCB7IHJldHVybiBtX2hhc01hcmdpbkJlZm9yZVF1aXJrOyB9CisgICAgICAgIGJvb2wgaGFz
TWFyZ2luQWZ0ZXJRdWlyaygpIGNvbnN0IHsgcmV0dXJuIG1faGFzTWFyZ2luQWZ0ZXJRdWlyazsg
fQorICAgICAgICBMYXlvdXRVbml0IHBvc2l0aXZlTWFyZ2luKCkgY29uc3QgeyByZXR1cm4gbV9w
b3NpdGl2ZU1hcmdpbjsgfQorICAgICAgICBMYXlvdXRVbml0IG5lZ2F0aXZlTWFyZ2luKCkgY29u
c3QgeyByZXR1cm4gbV9uZWdhdGl2ZU1hcmdpbjsgfQorICAgICAgICBib29sIGRpc2NhcmRNYXJn
aW4oKSBjb25zdCB7IHJldHVybiBtX2Rpc2NhcmRNYXJnaW47IH0KKyAgICAgICAgTGF5b3V0VW5p
dCBtYXJnaW4oKSBjb25zdCB7IHJldHVybiBtX3Bvc2l0aXZlTWFyZ2luIC0gbV9uZWdhdGl2ZU1h
cmdpbjsgfQorICAgIH07CisKKyAgICB2b2lkIGxheW91dEJsb2NrQ2hpbGQoUmVuZGVyQm94KiBj
aGlsZCwgTWFyZ2luSW5mbyYsIExheW91dFVuaXQmIHByZXZpb3VzRmxvYXRMb2dpY2FsQm90dG9t
LCBMYXlvdXRVbml0JiBtYXhGbG9hdExvZ2ljYWxCb3R0b20pOworICAgIHZvaWQgYWRqdXN0UG9z
aXRpb25lZEJsb2NrKFJlbmRlckJveCogY2hpbGQsIGNvbnN0IE1hcmdpbkluZm8mKTsKKyAgICB2
b2lkIGFkanVzdEZsb2F0aW5nQmxvY2soY29uc3QgTWFyZ2luSW5mbyYpOworCisgICAgTGF5b3V0
VW5pdCBjb2xsYXBzZU1hcmdpbnMoUmVuZGVyQm94KiBjaGlsZCwgTWFyZ2luSW5mbyYpOworICAg
IExheW91dFVuaXQgY2xlYXJGbG9hdHNJZk5lZWRlZChSZW5kZXJCb3gqIGNoaWxkLCBNYXJnaW5J
bmZvJiwgTGF5b3V0VW5pdCBvbGRUb3BQb3NNYXJnaW4sIExheW91dFVuaXQgb2xkVG9wTmVnTWFy
Z2luLCBMYXlvdXRVbml0IHlQb3MpOworICAgIExheW91dFVuaXQgZXN0aW1hdGVMb2dpY2FsVG9w
UG9zaXRpb24oUmVuZGVyQm94KiBjaGlsZCwgY29uc3QgTWFyZ2luSW5mbyYsIExheW91dFVuaXQm
IGVzdGltYXRlV2l0aG91dFBhZ2luYXRpb24pOworICAgIHZvaWQgbWFyZ2luQmVmb3JlRXN0aW1h
dGVGb3JDaGlsZChSZW5kZXJCb3gqLCBMYXlvdXRVbml0JiwgTGF5b3V0VW5pdCYsIGJvb2wmKSBj
b25zdDsKKyAgICB2b2lkIGhhbmRsZUFmdGVyU2lkZU9mQmxvY2soTGF5b3V0VW5pdCB0b3AsIExh
eW91dFVuaXQgYm90dG9tLCBNYXJnaW5JbmZvJik7CisgICAgdm9pZCBzZXRDb2xsYXBzZWRCb3R0
b21NYXJnaW4oY29uc3QgTWFyZ2luSW5mbyYpOworCitwcm90ZWN0ZWQ6CisgICAgTGF5b3V0VW5p
dCBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmFyZURhdGEgPyBt
X3JhcmVEYXRhLT5tX21hcmdpbnMucG9zaXRpdmVNYXJnaW5CZWZvcmUoKSA6IFJlbmRlckJsb2Nr
Rmxvd1JhcmVEYXRhOjpwb3NpdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyk7IH0KKyAgICBM
YXlvdXRVbml0IG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCkgY29uc3QgeyByZXR1cm4gbV9yYXJl
RGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkJlZm9yZSgpIDogUmVu
ZGVyQmxvY2tGbG93UmFyZURhdGE6Om5lZ2F0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKTsg
fQorICAgIExheW91dFVuaXQgbWF4UG9zaXRpdmVNYXJnaW5BZnRlcigpIGNvbnN0IHsgcmV0dXJu
IG1fcmFyZURhdGEgPyBtX3JhcmVEYXRhLT5tX21hcmdpbnMucG9zaXRpdmVNYXJnaW5BZnRlcigp
IDogUmVuZGVyQmxvY2tGbG93UmFyZURhdGE6OnBvc2l0aXZlTWFyZ2luQWZ0ZXJEZWZhdWx0KHRo
aXMpOyB9CisgICAgTGF5b3V0VW5pdCBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCkgY29uc3QgeyBy
ZXR1cm4gbV9yYXJlRGF0YSA/IG1fcmFyZURhdGEtPm1fbWFyZ2lucy5uZWdhdGl2ZU1hcmdpbkFm
dGVyKCkgOiBSZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6bmVnYXRpdmVNYXJnaW5BZnRlckRlZmF1
bHQodGhpcyk7IH0KKyAgICAKKyAgICB2b2lkIGluaXRNYXhNYXJnaW5WYWx1ZXMoKQorICAgIHsK
KyAgICAgICAgaWYgKCFtX3JhcmVEYXRhKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBt
X3JhcmVEYXRhLT5tX21hcmdpbnMgPSBNYXJnaW5WYWx1ZXMoUmVuZGVyQmxvY2tGbG93UmFyZURh
dGE6OnBvc2l0aXZlTWFyZ2luQmVmb3JlRGVmYXVsdCh0aGlzKSAsIFJlbmRlckJsb2NrRmxvd1Jh
cmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkJlZm9yZURlZmF1bHQodGhpcyksCisgICAgICAgICAgICBS
ZW5kZXJCbG9ja0Zsb3dSYXJlRGF0YTo6cG9zaXRpdmVNYXJnaW5BZnRlckRlZmF1bHQodGhpcyks
IFJlbmRlckJsb2NrRmxvd1JhcmVEYXRhOjpuZWdhdGl2ZU1hcmdpbkFmdGVyRGVmYXVsdCh0aGlz
KSk7CisgICAgICAgIG1fcmFyZURhdGEtPm1fZGlzY2FyZE1hcmdpbkJlZm9yZSA9IGZhbHNlOwor
ICAgICAgICBtX3JhcmVEYXRhLT5tX2Rpc2NhcmRNYXJnaW5BZnRlciA9IGZhbHNlOworICAgIH0K
KyAgICAKKyAgICB2b2lkIHNldE1heE1hcmdpbkJlZm9yZVZhbHVlcyhMYXlvdXRVbml0IHBvcywg
TGF5b3V0VW5pdCBuZWcpOworICAgIHZvaWQgc2V0TWF4TWFyZ2luQWZ0ZXJWYWx1ZXMoTGF5b3V0
VW5pdCBwb3MsIExheW91dFVuaXQgbmVnKTsKKworICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJn
aW5CZWZvcmUoYm9vbCA9IHRydWUpOworICAgIHZvaWQgc2V0TXVzdERpc2NhcmRNYXJnaW5BZnRl
cihib29sID0gdHJ1ZSk7CisKKyAgICBib29sIG11c3REaXNjYXJkTWFyZ2luQmVmb3JlKCkgY29u
c3Q7CisgICAgYm9vbCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyKCkgY29uc3Q7CisKKyAgICBib29s
IG11c3REaXNjYXJkTWFyZ2luQmVmb3JlRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94KikgY29uc3Q7
CisgICAgYm9vbCBtdXN0RGlzY2FyZE1hcmdpbkFmdGVyRm9yQ2hpbGQoY29uc3QgUmVuZGVyQm94
KikgY29uc3Q7CisKKyAgICBib29sIG11c3RTZXBhcmF0ZU1hcmdpbkJlZm9yZUZvckNoaWxkKGNv
bnN0IFJlbmRlckJveCopIGNvbnN0OworICAgIGJvb2wgbXVzdFNlcGFyYXRlTWFyZ2luQWZ0ZXJG
b3JDaGlsZChjb25zdCBSZW5kZXJCb3gqKSBjb25zdDsKKworICAgIExheW91dFVuaXQgYXBwbHlC
ZWZvcmVCcmVhayhSZW5kZXJCb3gqIGNoaWxkLCBMYXlvdXRVbml0IGxvZ2ljYWxPZmZzZXQpOyAv
LyBJZiB0aGUgY2hpbGQgaGFzIGEgYmVmb3JlIGJyZWFrLCB0aGVuIHJldHVybiBhIG5ldyB5UG9z
IHRoYXQgc2hpZnRzIHRvIHRoZSB0b3Agb2YgdGhlIG5leHQgcGFnZS9jb2x1bW4uCisgICAgTGF5
b3V0VW5pdCBhcHBseUFmdGVyQnJlYWsoUmVuZGVyQm94KiBjaGlsZCwgTGF5b3V0VW5pdCBsb2dp
Y2FsT2Zmc2V0LCBNYXJnaW5JbmZvJik7IC8vIElmIHRoZSBjaGlsZCBoYXMgYW4gYWZ0ZXIgYnJl
YWssIHRoZW4gcmV0dXJuIGEgbmV3IG9mZnNldCB0aGF0IHNoaWZ0cyB0byB0aGUgdG9wIG9mIHRo
ZSBuZXh0IHBhZ2UvY29sdW1uLgorICAgIExheW91dFVuaXQgYWRqdXN0QmxvY2tDaGlsZEZvclBh
Z2luYXRpb24oTGF5b3V0VW5pdCBsb2dpY2FsVG9wQWZ0ZXJDbGVhciwgTGF5b3V0VW5pdCBlc3Rp
bWF0ZVdpdGhvdXRQYWdpbmF0aW9uLCBSZW5kZXJCb3gqIGNoaWxkLCBib29sIGF0QmVmb3JlU2lk
ZU9mQmxvY2spOworCitwcm90ZWN0ZWQ6CisgICAgT3duUHRyPFJlbmRlckJsb2NrRmxvd1JhcmVE
YXRhPiBtX3JhcmVEYXRhOwogfTsKIAogaW5saW5lIFJlbmRlckJsb2NrRmxvdyYgdG9SZW5kZXJC
bG9ja0Zsb3coUmVuZGVyT2JqZWN0JiBvYmplY3QpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94LmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRGVwcmVjYXRlZEZsZXhpYmxlQm94LmNwcAkocmV2
aXNpb24gMTU1Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckRlcHJlY2F0
ZWRGbGV4aWJsZUJveC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyMiw4ICszMjIsNiBAQCB2b2lk
IFJlbmRlckRlcHJlY2F0ZWRGbGV4aWJsZUJveDo6bGF5b3V0CiAKICAgICBtX3N0cmV0Y2hpbmdD
aGlsZHJlbiA9IGZhbHNlOwogCi0gICAgaW5pdE1heE1hcmdpblZhbHVlcygpOwotCiAjaWYgIUFT
U0VSVF9ESVNBQkxFRAogICAgIExheW91dFNpemUgb2xkTGF5b3V0RGVsdGEgPSB2aWV3KCkubGF5
b3V0RGVsdGEoKTsKICNlbmRpZgpAQCAtMzUxLDI0ICszNDksNiBAQCB2b2lkIFJlbmRlckRlcHJl
Y2F0ZWRGbGV4aWJsZUJveDo6bGF5b3V0CiAKICAgICB1cGRhdGVTaGFwZXNBZnRlckJsb2NrTGF5
b3V0KCk7CiAKLSAgICBpZiAoIWlzRmxvYXRpbmdPck91dE9mRmxvd1Bvc2l0aW9uZWQoKSAmJiBo
ZWlnaHQoKSA9PSAwKSB7Ci0gICAgICAgIC8vIFdlIGFyZSBhIGJsb2NrIHdpdGggbm8gYm9yZGVy
IGFuZCBwYWRkaW5nIGFuZCBhIGNvbXB1dGVkIGhlaWdodAotICAgICAgICAvLyBvZiAwLiAgVGhl
IENTUyBzcGVjIHN0YXRlcyB0aGF0IHplcm8taGVpZ2h0IGJsb2NrcyBjb2xsYXBzZSB0aGVpciBt
YXJnaW5zCi0gICAgICAgIC8vIHRvZ2V0aGVyLgotICAgICAgICAvLyBXaGVuIGJsb2NrcyBhcmUg
c2VsZi1jb2xsYXBzaW5nLCB3ZSBqdXN0IHVzZSB0aGUgdG9wIG1hcmdpbiB2YWx1ZXMgYW5kIHNl
dCB0aGUKLSAgICAgICAgLy8gYm90dG9tIG1hcmdpbiBtYXggdmFsdWVzIHRvIDAuICBUaGlzIHdh
eSB3ZSBkb24ndCBmYWN0b3IgaW4gdGhlIHZhbHVlcwotICAgICAgICAvLyB0d2ljZSB3aGVuIHdl
IGNvbGxhcHNlIHdpdGggb3VyIHByZXZpb3VzIHZlcnRpY2FsbHkgYWRqYWNlbnQgYW5kCi0gICAg
ICAgIC8vIGZvbGxvd2luZyB2ZXJ0aWNhbGx5IGFkamFjZW50IGJsb2Nrcy4KLSAgICAgICAgTGF5
b3V0VW5pdCBwb3MgPSBtYXhQb3NpdGl2ZU1hcmdpbkJlZm9yZSgpOwotICAgICAgICBMYXlvdXRV
bml0IG5lZyA9IG1heE5lZ2F0aXZlTWFyZ2luQmVmb3JlKCk7Ci0gICAgICAgIGlmIChtYXhQb3Np
dGl2ZU1hcmdpbkFmdGVyKCkgPiBwb3MpCi0gICAgICAgICAgICBwb3MgPSBtYXhQb3NpdGl2ZU1h
cmdpbkFmdGVyKCk7Ci0gICAgICAgIGlmIChtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCkgPiBuZWcp
Ci0gICAgICAgICAgICBuZWcgPSBtYXhOZWdhdGl2ZU1hcmdpbkFmdGVyKCk7Ci0gICAgICAgIHNl
dE1heE1hcmdpbkJlZm9yZVZhbHVlcyhwb3MsIG5lZyk7Ci0gICAgICAgIHNldE1heE1hcmdpbkFm
dGVyVmFsdWVzKDAsIDApOwotICAgIH0KLQogICAgIGNvbXB1dGVPdmVyZmxvdyhvbGRDbGllbnRB
ZnRlckVkZ2UpOwogCiAgICAgc3RhdGVQdXNoZXIucG9wKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvUmVuZGVyVGFibGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAJKHJldmlzaW9uIDE1NTM3NikKKysrIFNvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJUYWJsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwOCw4
ICs0MDgsNiBAQCB2b2lkIFJlbmRlclRhYmxlOjpsYXlvdXQoKQogICAgIExheW91dFN0YXRlTWFp
bnRhaW5lciBzdGF0ZVB1c2hlcigmdmlldygpLCB0aGlzLCBsb2NhdGlvbk9mZnNldCgpLCBoYXNU
cmFuc2Zvcm0oKSB8fCBoYXNSZWZsZWN0aW9uKCkgfHwgc3R5bGUoKS0+aXNGbGlwcGVkQmxvY2tz
V3JpdGluZ01vZGUoKSk7CiAKICAgICBzZXRMb2dpY2FsSGVpZ2h0KDApOwotCi0gICAgaW5pdE1h
eE1hcmdpblZhbHVlcygpOwogICAgIAogICAgIExheW91dFVuaXQgb2xkTG9naWNhbFdpZHRoID0g
bG9naWNhbFdpZHRoKCk7CiAgICAgdXBkYXRlTG9naWNhbFdpZHRoKCk7Cg==
</data>
<flag name="review"
          id="233147"
          type_id="1"
          status="+"
          setter="dino"
    />
          </attachment>
      

    </bug>

</bugzilla>