<?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>44383</bug_id>
          
          <creation_ts>2010-08-21 13:43:02 -0700</creation_ts>
          <short_desc>Encapsulate document marker management into DocumentMarkerController</short_desc>
          <delta_ts>2010-08-22 14:42:07 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>267602</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-08-21 13:43:02 -0700</bug_when>
    <thetext>Following up on Eric Seidel&apos;s remarks on cleaning up Document.cpp in the webkit-dev email &quot;Re: [webkit-dev] Cleaning up Document.* (was DeviceOrientation/Motion on Document rather than Page)&quot; on 08/17/2010, we should move the marker management code in Document.cpp to its own class, say DocumentMarkerController so as to encapsulate this functionality off of the Document.

Notice, the marker management code only uses the a Document instance to store the marker map, Document::m_markers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267605</commentid>
    <comment_count>1</comment_count>
      <attachid>65035</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-08-21 14:21:08 -0700</bug_when>
    <thetext>Created attachment 65035
Patch

I named the new class DocumentMarkerController and the accessor markerController() (in Document.cpp). I am open to name suggestions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267606</commentid>
    <comment_count>2</comment_count>
      <attachid>65035</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-08-21 14:35:06 -0700</bug_when>
    <thetext>Comment on attachment 65035
Patch

Yay!  Thank you Dan!

WebCore/dom/Document.h:1173
 +      mutable DocumentMarkerController m_markerController;
It&apos;s better for build times if this is an OwnPtr instead.  When its a mutable member you have to include the header in Document.h.   The only reason (I know of) to make these mutable members is to avoid the pointer indirection in hot code paths.  But I don&apos;t think DocumentMarkers are hot.  This is not a deal breaker either way.

WebCore/dom/DocumentMarkerController.h:48
 +      void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
Style.

WebCore/editing/Editor.cpp:1566
 +          frame()-&gt;document()-&gt;markerController()-&gt;removeMarkers(selectedRange.get(), DocumentMarker::Spelling);
I might have called the markerController() just markers().

LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267718</commentid>
    <comment_count>3</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-08-22 14:39:08 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 65035 [details])
&gt; Yay!  Thank you Dan!
&gt; 
&gt; WebCore/dom/Document.h:1173
&gt;  +      mutable DocumentMarkerController m_markerController;
&gt; It&apos;s better for build times if this is an OwnPtr instead.  When its a mutable member you have to include the header in Document.h.   The only reason (I know of) to make these mutable members is to avoid the pointer indirection in hot code paths.  But I don&apos;t think DocumentMarkers are hot.  This is not a deal breaker either way.
&gt;

Will change.
 
&gt; WebCore/dom/DocumentMarkerController.h:48
&gt;  +      void copyMarkers(Node *srcNode, unsigned startOffset, int length, Node *dstNode, int delta, DocumentMarker::MarkerType = DocumentMarker::AllMarkers);
&gt; Style.
&gt; 

Will fix style.

&gt; WebCore/editing/Editor.cpp:1566
&gt;  +          frame()-&gt;document()-&gt;markerController()-&gt;removeMarkers(selectedRange.get(), DocumentMarker::Spelling);
&gt; I might have called the markerController() just markers().
&gt; 

Will rename.

&gt; LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>267719</commentid>
    <comment_count>4</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2010-08-22 14:42:07 -0700</bug_when>
    <thetext>Committed r65787: &lt;http://trac.webkit.org/changeset/65787&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65035</attachid>
            <date>2010-08-21 14:21:08 -0700</date>
            <delta_ts>2010-08-21 14:35:06 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>Bug44383_mc.patch</filename>
            <type>text/plain</type>
            <size>87265</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NTc3OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsODAgQEAKKzIwMTAtMDgtMjEgIERhbmllbCBCYXRlcyAgPGRiYXRlc0ByaW0uY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEVuY2Fw
c3VsYXRlIGRvY3VtZW50IG1hcmtlciBtYW5hZ2VtZW50IGludG8gRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00
NDM4MworCisgICAgICAgIE1vdmVzIHRoZSBkb2N1bWVudCBtYXJrZXIgbWFuYWdlbWVudCBjb2Rl
IGluIERvY3VtZW50LmNwcCBpbnRvIGl0cyBvd24KKyAgICAgICAgY2xhc3MgY2FsbGVkIERvY3Vt
ZW50TWFya2VyQ29udHJvbGxlci4KKworICAgICAgICBObyBmdW5jdGlvbmFsaXR5IHdhcyBjaGFu
Z2VkLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBBbmRyb2lkLm1rOiBBZGRlZCBEb2N1
bWVudE1hcmtlckNvbnRyb2xsZXIuY3BwIAorICAgICAgICAqIENNYWtlTGlzdHMudHh0OiBEaXR0
by4KKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRkZWQgRG9jdW1lbnRNYXJrZXJDb250cm9s
bGVyLmNwcCBhbmQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmguCisgICAgICAgICogV2ViQ29y
ZS5leHAuaW46IFN1YnN0aXR1dGVkIHN5bWJvbHMgX19aTjdXZWJDb3JlMjREb2N1bWVudE1hcmtl
ckNvbnRyb2xsZXIxM3JlbW92ZU1hcmtlcnNFTlNfMTREb2N1bWVudE1hcmtlcjEwTWFya2VyVHlw
ZUUKKyAgICAgICAgYW5kIF9fWk43V2ViQ29yZTI0RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyMjNy
ZW5kZXJlZFJlY3RzRm9yTWFya2Vyc0VOU18xNERvY3VtZW50TWFya2VyMTBNYXJrZXJUeXBlRSBm
b3IKKyAgICAgICAgX19aTjdXZWJDb3JlOERvY3VtZW50MTNyZW1vdmVNYXJrZXJzRU5TXzE0RG9j
dW1lbnRNYXJrZXIxME1hcmtlclR5cGVFIGFuZCAKKyAgICAgICAgX19aTjdXZWJDb3JlOERvY3Vt
ZW50MjNyZW5kZXJlZFJlY3RzRm9yTWFya2Vyc0VOU18xNERvY3VtZW50TWFya2VyMTBNYXJrZXJU
eXBlRSwgcmVzcGVjdGl2ZWx5LgorICAgICAgICAqIFdlYkNvcmUuZ3lwaTogQWRkZWQgRG9jdW1l
bnRNYXJrZXJDb250cm9sbGVyLmNwcCBhbmQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmguCisg
ICAgICAgICogV2ViQ29yZS5wcm86IERpdHRvLgorICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dl
YkNvcmUudmNwcm9qOiBEaXR0by4KKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0
LnBieHByb2o6IERpdHRvLgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpEb2N1bWVudDo6cmVtb3ZlZExhc3RSZWYpOiBNb2RpZmllZCB0byBjYWxsIERvY3Vt
ZW50TWFya2VyQ29udHJvbGxlcjo6Y2xlYXIoKS4KKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
Ojp+RG9jdW1lbnQpOiBSZW1vdmVkICJkZWxldGVBbGxWYWx1ZXMobV9tYXJrZXJzKSIgYXMgRG9j
dW1lbnRNYXJrZXJDb250cm9sbGVyCisgICAgICAgIGlzIHN0YWNrLWFsbG9jYXRlZCBzbyBpdCB3
aWxsIGJlIGRlc3Ryb3llZCBhdXRvbWF0aWNhbGx5LgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6OnRleHRJbnNlcnRlZCk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6dGV4dFJlbW92
ZWQpOgorICAgICAgICAqIGRvbS9Eb2N1bWVudC5oOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1l
bnQ6Om1hcmtlcik6CisgICAgICAgICogZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6cGxhY2Vob2xkZXJSZWN0Rm9yTWFya2VyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRvY3VtZW50TWFya2VyQ29udHJvbGxlcjo6Y2xlYXIpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjphZGRNYXJrZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjpyZW1vdmVNYXJrZXJzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkRvY3VtZW50TWFya2VyQ29udHJvbGxlcjo6Y29weU1hcmtlcnMpOgor
ICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjptYXJrZXJDb250YWlu
aW5nUG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjpt
YXJrZXJzRm9yTm9kZSk6CisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudE1hcmtlckNvbnRyb2xs
ZXI6OnJlbmRlcmVkUmVjdHNGb3JNYXJrZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkRvY3VtZW50
TWFya2VyQ29udHJvbGxlcjo6cmVwYWludE1hcmtlcnMpOgorICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnRNYXJrZXJDb250cm9sbGVyOjpzZXRSZW5kZXJlZFJlY3RGb3JNYXJrZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjppbnZhbGlkYXRlUmVuZGVyZWRS
ZWN0c0Zvck1hcmtlcnNJblJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJrZXJD
b250cm9sbGVyOjpzaGlmdE1hcmtlcnMpOgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJr
ZXJDb250cm9sbGVyOjpzZXRNYXJrZXJzQWN0aXZlKToKKyAgICAgICAgKiBkb20vRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnRNYXJr
ZXJDb250cm9sbGVyOjp+RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyKToKKyAgICAgICAgKiBlZGl0
aW5nL0VkaXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0b3I6Omlnbm9yZVNwZWxsaW5n
KTogTW9kaWZpZWQgdG8gdXNlIG1hcmtlciBjb250cm9sbGVyLgorICAgICAgICAoV2ViQ29yZTo6
ZmluZEZpcnN0TWlzc3BlbGxpbmdJblJhbmdlKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpm
aW5kRmlyc3RHcmFtbWFyRGV0YWlsSW5SYW5nZSk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6
RWRpdG9yOjphZHZhbmNlVG9OZXh0TWlzc3BlbGxpbmcpOiBEaXR0by4KKyAgICAgICAgKFdlYkNv
cmU6OkVkaXRvcjo6bWFya0FsbE1pc3NwZWxsaW5nc0FuZEJhZEdyYW1tYXJJblJhbmdlcyk6IERp
dHRvLgorICAgICAgICAoV2ViQ29yZTo6RWRpdG9yOjpjaGFuZ2VCYWNrVG9SZXBsYWNlZFN0cmlu
Zyk6IERpdHRvLgorICAgICAgICAqIGVkaXRpbmcvU3BsaXRUZXh0Tm9kZUNvbW1hbmQuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6U3BsaXRUZXh0Tm9kZUNvbW1hbmQ6OmRvQXBwbHkpOiBEaXR0by4K
KyAgICAgICAgKFdlYkNvcmU6OlNwbGl0VGV4dE5vZGVDb21tYW5kOjpkb1VuYXBwbHkpOiBEaXR0
by4KKyAgICAgICAgKiBwYWdlL0ZyYW1lLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjpt
YXJrQWxsTWF0Y2hlc0ZvclRleHQpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lOjpz
ZXRNYXJrZWRUZXh0TWF0Y2hlc0FyZUhpZ2hsaWdodGVkKTogRGl0dG8uCisgICAgICAgIChXZWJD
b3JlOjpGcmFtZTo6cmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbik6IERpdHRvLgorICAgICAgICAq
IHBhZ2UvRnJhbWVWaWV3LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZyYW1lVmlldzo6Z2V0VGlj
a21hcmtzKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpGcmFtZVZpZXc6OnBhaW50Q29udGVu
dHMpOiBEaXR0by4KKyAgICAgICAgKiBwYWdlL1BhZ2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
UGFnZTo6dW5tYXJrQWxsVGV4dE1hdGNoZXMpOiBEaXR0by4KKyAgICAgICAgKiByZW5kZXJpbmcv
SGl0VGVzdFJlc3VsdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpIaXRUZXN0UmVzdWx0OjpzcGVs
bGluZ1Rvb2xUaXApOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OkhpdFRlc3RSZXN1bHQ6OnJl
cGxhY2VkU3RyaW5nKTogRGl0dG8uCisgICAgICAgICogcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6cGFpbnRTcGVsbGluZ09yR3Jh
bW1hck1hcmtlcik6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6SW5saW5lVGV4dEJveDo6cGFp
bnRUZXh0TWF0Y2hNYXJrZXIpOiBEaXR0by4KKyAgICAgICAgKFdlYkNvcmU6OklubGluZVRleHRC
b3g6OmNvbXB1dGVSZWN0Rm9yUmVwbGFjZW1lbnRNYXJrZXIpOiBEaXR0by4KKyAgICAgICAgKFdl
YkNvcmU6OklubGluZVRleHRCb3g6OnBhaW50RG9jdW1lbnRNYXJrZXJzKTogRGl0dG8uCisgICAg
ICAgICogcmVuZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwOgorICAgICAgICAoV2ViQ29yZTo6
U1ZHSW5saW5lVGV4dEJveDo6Y29tcHV0ZVRleHRNYXRjaE1hcmtlclJlY3QpOiBEaXR0by4KKwog
MjAxMC0wOC0yMSAgRXJpYyBDYXJsc29uICA8ZXJpYy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWluLgpJbmRleDogV2ViQ29yZS9BbmRyb2lkLm1r
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQW5kcm9pZC5tawkocmV2aXNpb24gNjU3NzgpCisrKyBX
ZWJDb3JlL0FuZHJvaWQubWsJKHdvcmtpbmcgY29weSkKQEAgLTEyMyw2ICsxMjMsNyBAQCBMT0NB
TF9TUkNfRklMRVMgOj0gJChMT0NBTF9TUkNfRklMRVMpIFwKIAlkb20vRGV2aWNlTW90aW9uRXZl
bnQuY3BwIFwKIAlkb20vRG9jdW1lbnQuY3BwIFwKIAlkb20vRG9jdW1lbnRGcmFnbWVudC5jcHAg
XAorCWRvbS9Eb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuY3BwIFwKIAlkb20vRG9jdW1lbnRQYXJz
ZXIuY3BwIFwKIAlkb20vRG9jdW1lbnRUeXBlLmNwcCBcCiAJZG9tL0R5bmFtaWNOb2RlTGlzdC5j
cHAgXApJbmRleDogV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L0NNYWtlTGlzdHMudHh0CShyZXZpc2lvbiA2NTc3OCkKKysrIFdlYkNvcmUvQ01ha2VMaXN0cy50
eHQJKHdvcmtpbmcgY29weSkKQEAgLTgxMCw2ICs4MTAsNyBAQCBTRVQoV2ViQ29yZV9TT1VSQ0VT
CiAgICAgZG9tL0RldmljZU9yaWVudGF0aW9uQ29udHJvbGxlci5jcHAKICAgICBkb20vRGV2aWNl
T3JpZW50YXRpb25FdmVudC5jcHAKICAgICBkb20vRG9jdW1lbnQuY3BwCisgICAgZG9tL0RvY3Vt
ZW50TWFya2VyQ29udHJvbGxlci5jcHAKICAgICBkb20vRG9jdW1lbnRGcmFnbWVudC5jcHAKICAg
ICBkb20vRG9jdW1lbnRQYXJzZXIuY3BwCiAgICAgZG9tL0RvY3VtZW50VHlwZS5jcHAKSW5kZXg6
IFdlYkNvcmUvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9HTlVtYWtlZmls
ZS5hbQkocmV2aXNpb24gNjU3NzgpCisrKyBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5n
IGNvcHkpCkBAIC0xMDQyLDExICsxMDQyLDEzIEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2Vi
Q29yZS9kb20vRGV2aWNlT3JpZW50YXRpb25FdmVudC5jcHAgXAogCVdlYkNvcmUvZG9tL0Rldmlj
ZU9yaWVudGF0aW9uRXZlbnQuaCBcCiAJV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwIFwKLQlXZWJD
b3JlL2RvbS9Eb2N1bWVudFBhcnNlci5jcHAgXAogCVdlYkNvcmUvZG9tL0RvY3VtZW50LmggXAog
CVdlYkNvcmUvZG9tL0RvY3VtZW50RnJhZ21lbnQuY3BwIFwKIAlXZWJDb3JlL2RvbS9Eb2N1bWVu
dEZyYWdtZW50LmggXAogCVdlYkNvcmUvZG9tL0RvY3VtZW50TWFya2VyLmggXAorCVdlYkNvcmUv
ZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5jcHAgXAorCVdlYkNvcmUvZG9tL0RvY3VtZW50
TWFya2VyQ29udHJvbGxlci5oIFwKKwlXZWJDb3JlL2RvbS9Eb2N1bWVudFBhcnNlci5jcHAgXAog
CVdlYkNvcmUvZG9tL0RvY3VtZW50VHlwZS5jcHAgXAogCVdlYkNvcmUvZG9tL0RvY3VtZW50VHlw
ZS5oIFwKIAlXZWJDb3JlL2RvbS9EeW5hbWljTm9kZUxpc3QuY3BwIFwKSW5kZXg6IFdlYkNvcmUv
V2ViQ29yZS5leHAuaW4KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmV4cC5pbgkocmV2
aXNpb24gNjU3NzgpCisrKyBXZWJDb3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBA
IC00NjUsNiArNDY1LDggQEAgX19aTjdXZWJDb3JlMjRjb250ZXh0TWVudUl0ZW1UYWdJdGFsaWNF
dgogX19aTjdXZWJDb3JlMjRjb250ZXh0TWVudUl0ZW1UYWdTdHlsZXNFdgogX19aTjdXZWJDb3Jl
MjRjcmVhdGVGcmFnbWVudEZyb21NYXJrdXBFUE5TXzhEb2N1bWVudEVSS04zV1RGNlN0cmluZ0VT
NV9OU18yN0ZyYWdtZW50U2NyaXB0aW5nUGVybWlzc2lvbkUKIF9fWk43V2ViQ29yZTI0ZGVjb2Rl
VVJMRXNjYXBlU2VxdWVuY2VzRVJLTjNXVEY2U3RyaW5nRQorX19aTjdXZWJDb3JlMjREb2N1bWVu
dE1hcmtlckNvbnRyb2xsZXIxM3JlbW92ZU1hcmtlcnNFTlNfMTREb2N1bWVudE1hcmtlcjEwTWFy
a2VyVHlwZUUKK19fWk43V2ViQ29yZTI0RG9jdW1lbnRNYXJrZXJDb250cm9sbGVyMjNyZW5kZXJl
ZFJlY3RzRm9yTWFya2Vyc0VOU18xNERvY3VtZW50TWFya2VyMTBNYXJrZXJUeXBlRQogX19aTjdX
ZWJDb3JlMjRub3RpZnlIaXN0b3J5SXRlbUNoYW5nZWRFCiBfX1pON1dlYkNvcmUyNHJhbmdlQ29t
cGxpYW50RXF1aXZhbGVudEVSS05TXzhQb3NpdGlvbkUKIF9fWk43V2ViQ29yZTI1SGlzdG9yeVBy
b3BlcnR5TGlzdFdyaXRlcjExcmVsZWFzZURhdGFFdgpAQCAtNjYwLDcgKzY2Miw2IEBAIF9fWk43
V2ViQ29yZTdJbnRTaXplQzFFUks3X05TU2l6ZQogX19aTjdXZWJDb3JlN2Nvb2tpZXNFUEtOU184
RG9jdW1lbnRFUktOU180S1VSTEUKIF9fWk43V2ViQ29yZTduc0NvbG9yRVJLTlNfNUNvbG9yRQog
X19aTjdXZWJDb3JlOERvY3VtZW50MTFjcmVhdGVSYW5nZUV2Ci1fX1pON1dlYkNvcmU4RG9jdW1l
bnQxM3JlbW92ZU1hcmtlcnNFTlNfMTREb2N1bWVudE1hcmtlcjEwTWFya2VyVHlwZUUKIF9fWk43
V2ViQ29yZThEb2N1bWVudDEzc3ZnRXh0ZW5zaW9uc0V2CiBfX1pON1dlYkNvcmU4RG9jdW1lbnQx
NHNldEZvY3VzZWROb2RlRU4zV1RGMTBQYXNzUmVmUHRySU5TXzROb2RlRUVFCiBfX1pON1dlYkNv
cmU4RG9jdW1lbnQxNmlzUGFnZUJveFZpc2libGVFaQpAQCAtNjY4LDcgKzY2OSw2IEBAIF9fWk43
V2ViQ29yZThEb2N1bWVudDE3Z2V0Rm9jdXNhYmxlTm9kZXMKIF9fWk43V2ViQ29yZThEb2N1bWVu
dDE4Y3JlYXRlV3JhcHBlckNhY2hlRVBOU18xNURPTVdyYXBwZXJXb3JsZEUKIF9fWk43V2ViQ29y
ZThEb2N1bWVudDE5YWNjZXNzU1ZHRXh0ZW5zaW9uc0V2CiBfX1pON1dlYkNvcmU4RG9jdW1lbnQy
MmNyZWF0ZURvY3VtZW50RnJhZ21lbnRFdgotX19aTjdXZWJDb3JlOERvY3VtZW50MjNyZW5kZXJl
ZFJlY3RzRm9yTWFya2Vyc0VOU18xNERvY3VtZW50TWFya2VyMTBNYXJrZXJUeXBlRQogX19aTjdX
ZWJDb3JlOERvY3VtZW50MjRhZGRNZWRpYUNhblN0YXJ0TGlzdGVuZXJFUE5TXzIxTWVkaWFDYW5T
dGFydExpc3RlbmVyRQogX19aTjdXZWJDb3JlOERvY3VtZW50MjRzZXRTaG91bGRDcmVhdGVSZW5k
ZXJlcnNFYgogX19aTjdXZWJDb3JlOERvY3VtZW50MjZwYWdlU2l6ZUFuZE1hcmdpbnNJblBpeGVs
c0VpUk5TXzdJbnRTaXplRVJpUzNfUzNfUzNfCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUuZ3lwaQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gNjU3NzgpCisrKyBX
ZWJDb3JlL1dlYkNvcmUuZ3lwaQkod29ya2luZyBjb3B5KQpAQCAtMTE1MSw2ICsxMTUxLDggQEAK
ICAgICAgICAgICAgICdkb20vRG9jdW1lbnRGcmFnbWVudC5jcHAnLAogICAgICAgICAgICAgJ2Rv
bS9Eb2N1bWVudEZyYWdtZW50LmgnLAogICAgICAgICAgICAgJ2RvbS9Eb2N1bWVudE1hcmtlci5o
JywKKyAgICAgICAgICAgICdkb20vRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmNwcCcsCisgICAg
ICAgICAgICAnZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5oJywKICAgICAgICAgICAgICdk
b20vRG9jdW1lbnRQYXJzZXIuY3BwJywKICAgICAgICAgICAgICdkb20vRG9jdW1lbnRQYXJzZXIu
aCcsCiAgICAgICAgICAgICAnZG9tL0RvY3VtZW50VHlwZS5jcHAnLApJbmRleDogV2ViQ29yZS9X
ZWJDb3JlLnBybwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUucHJvCShyZXZpc2lvbiA2
NTc3OCkKKysrIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHdvcmtpbmcgY29weSkKQEAgLTQ5NSw2ICs0
OTUsNyBAQCBTT1VSQ0VTICs9IFwKICAgICBkb20vRGV2aWNlT3JpZW50YXRpb25FdmVudC5jcHAg
XAogICAgIGRvbS9Eb2N1bWVudC5jcHAgXAogICAgIGRvbS9Eb2N1bWVudEZyYWdtZW50LmNwcCBc
CisgICAgZG9tL0RvY3VtZW50TWFya2VyQ29udHJvbGxlci5jcHAgXAogICAgIGRvbS9Eb2N1bWVu
dFBhcnNlci5jcHAgXAogICAgIGRvbS9Eb2N1bWVudFR5cGUuY3BwIFwKICAgICBkb20vRE9NSW1w
bGVtZW50YXRpb24uY3BwIFwKQEAgLTEyNjYsMTUgKzEyNjcsMTcgQEAgSEVBREVSUyArPSBcCiAg
ICAgZG9tL0N1c3RvbUV2ZW50LmggXAogICAgIGRvbS9kZWZhdWx0L1BsYXRmb3JtTWVzc2FnZVBv
cnRDaGFubmVsLmggXAogICAgIGRvbS9EZXZpY2VNb3Rpb25DbGllbnQuaCBcCi0gICAgZG9tL0Rl
dmljZU1vdGlvbkRhdGEuaCBcCiAgICAgZG9tL0RldmljZU1vdGlvbkNvbnRyb2xsZXIuaCBcCisg
ICAgZG9tL0RldmljZU1vdGlvbkRhdGEuaCBcCiAgICAgZG9tL0RldmljZU1vdGlvbkV2ZW50Lmgg
XAogICAgIGRvbS9EZXZpY2VPcmllbnRhdGlvbi5oIFwKICAgICBkb20vRGV2aWNlT3JpZW50YXRp
b25DbGllbnQuaCBcCiAgICAgZG9tL0RldmljZU9yaWVudGF0aW9uQ29udHJvbGxlci5oIFwKICAg
ICBkb20vRGV2aWNlT3JpZW50YXRpb25FdmVudC5oIFwKLSAgICBkb20vRG9jdW1lbnRGcmFnbWVu
dC5oIFwKICAgICBkb20vRG9jdW1lbnQuaCBcCisgICAgZG9tL0RvY3VtZW50RnJhZ21lbnQuaCBc
CisgICAgZG9tL0RvY3VtZW50TWFya2VyLmggXAorICAgIGRvbS9Eb2N1bWVudE1hcmtlckNvbnRy
b2xsZXIuaCBcCiAgICAgZG9tL0RvY3VtZW50VHlwZS5oIFwKICAgICBkb20vRE9NSW1wbGVtZW50
YXRpb24uaCBcCiAgICAgZG9tL0RPTVN0cmluZ0xpc3QuaCBcCkluZGV4OiBXZWJDb3JlL1dlYkNv
cmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDY1Nzc4KQorKysgV2ViQ29yZS9XZWJDb3Jl
LnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMzM1NzMsNiArMzM1NzMs
MTQgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0i
Li5cZG9tXERvY3VtZW50TWFya2VyQ29udHJvbGxlci5jcHAiDQorCQkJCT4NCisJCQk8L0ZpbGU+
DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxkb21cRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyLmgiDQorCQkJCT4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCiAJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxkb21cRG9jdW1lbnRQYXJzZXIuY3BwIg0KIAkJCQk+DQogCQkJPC9GaWxlPg0KSW5k
ZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA2
NTc3OCkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3Jr
aW5nIGNvcHkpCkBAIC01MTAzLDYgKzUxMDMsOCBAQAogCQlDNkQ3NEFENTA5QUEyODJFMDAwQjBB
NTIgLyogTW9kaWZ5U2VsZWN0aW9uTGlzdExldmVsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDNkQ3NEFEMzA5QUEyODJFMDAwQjBBNTIgLyogTW9kaWZ5
U2VsZWN0aW9uTGlzdExldmVsLmggKi87IH07CiAJCUM2RDc0QUU0MDlBQTI5MEEwMDBCMEE1MiAv
KiBNb2RpZnlTZWxlY3Rpb25MaXN0TGV2ZWwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQzZENzRBRTMwOUFBMjkwQTAwMEIwQTUyIC8qIE1vZGlmeVNl
bGVjdGlvbkxpc3RMZXZlbC5jcHAgKi87IH07CiAJCUNFMDJGMEM0MTFFODNBREQwMEM2Njg0QSAv
KiBTY3JpcHRDb250cm9sbGVyQmFzZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQ0UwMkYwQzMxMUU4M0FERDAwQzY2ODRBIC8qIFNjcmlwdENvbnRyb2xs
ZXJCYXNlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsK
KwkJQ0UwNTdGQTUxMjIwNzMxMTAwQTQ3NkQ1IC8qIERvY3VtZW50TWFya2VyQ29udHJvbGxlci5j
cHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDRTA1N0ZB
MzEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmNwcCAqLzsgfTsK
KwkJQ0UwNTdGQTYxMjIwNzMxMTAwQTQ3NkQ1IC8qIERvY3VtZW50TWFya2VyQ29udHJvbGxlci5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0UwNTdGQTQx
MjIwNzMxMTAwQTQ3NkQ1IC8qIERvY3VtZW50TWFya2VyQ29udHJvbGxlci5oICovOyBzZXR0aW5n
cyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCUNFMTcyRTAxMTEzNkU4Q0Uw
MDYyQTUzMyAvKiBab29tTW9kZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQ0UxNzJFMDAxMTM2RThDRTAwNjJBNTMzIC8qIFpvb21Nb2RlLmggKi87IHNl
dHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQ0U0QzAwRTQxMEY2
RjdCQTAwQ0EzOEY1IC8qIEhUTUxOb1NjcmlwdEVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0U0QzAwRTMxMEY2RjdCQTAwQ0EzOEY1IC8q
IEhUTUxOb1NjcmlwdEVsZW1lbnQuY3BwICovOyB9OwogCQlDRTRDMDBFNjEwRjZGN0MxMDBDQTM4
RjUgLyogSFRNTE5vU2NyaXB0RWxlbWVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQ0U0QzAwRTUxMEY2RjdDMTAwQ0EzOEY1IC8qIEhUTUxOb1Njcmlw
dEVsZW1lbnQuaCAqLzsgfTsKQEAgLTEwOTE5LDYgKzEwOTIxLDggQEAKIAkJQzZENzRBRDMwOUFB
MjgyRTAwMEIwQTUyIC8qIE1vZGlmeVNlbGVjdGlvbkxpc3RMZXZlbC5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBNb2RpZnlTZWxlY3Rpb25MaXN0TGV2ZWwuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQzZENzRBRTMwOUFBMjkwQTAwMEIwQTUyIC8qIE1vZGlmeVNl
bGVjdGlvbkxpc3RMZXZlbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBNb2RpZnlTZWxlY3Rpb25MaXN0TGV2ZWwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlDRTAyRjBDMzExRTgzQUREMDBDNjY4NEEgLyogU2NyaXB0Q29udHJvbGxlckJhc2UuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU2NyaXB0Q29udHJvbGxlckJhc2UuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQ0UwNTdGQTMxMjIwNzMxMTAwQTQ3NkQ1IC8q
IERvY3VtZW50TWFya2VyQ29udHJvbGxlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5j
cHA7IHBhdGggPSBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQlDRTA1N0ZBNDEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJD
b250cm9sbGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERvY3VtZW50TWFy
a2VyQ29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDRTE3MkUwMDEx
MzZFOENFMDA2MkE1MzMgLyogWm9vbU1vZGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gWm9vbU1vZGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQ0U0QzAwRTMx
MEY2RjdCQTAwQ0EzOEY1IC8qIEhUTUxOb1NjcmlwdEVsZW1lbnQuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gSFRNTE5vU2NyaXB0RWxlbWVudC5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUNFNEMwMEU1MTBGNkY3QzEwMENBMzhGNSAvKiBIVE1MTm9T
Y3JpcHRFbGVtZW50LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEhUTUxOb1Nj
cmlwdEVsZW1lbnQuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE3MzczLDYgKzE3
Mzc3LDggQEAKIAkJCQlBODE4NUYzNTA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVu
dC5oICovLAogCQkJCTFBNDk0RUQ1MEExMjNGMUEwMEZEQUZDMSAvKiBEb2N1bWVudEZyYWdtZW50
LmlkbCAqLywKIAkJCQlFRDJCQTgzQjA5QTI0QjkxMDA2QzBBQzQgLyogRG9jdW1lbnRNYXJrZXIu
aCAqLywKKwkJCQlDRTA1N0ZBMzEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyLmNwcCAqLywKKwkJCQlDRTA1N0ZBNDEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyLmggKi8sCiAJCQkJQThDMjI4MEQxMUQ0QTU5NzAwRDVBN0QzIC8qIERv
Y3VtZW50UGFyc2VyLmNwcCAqLywKIAkJCQlCQ0NGQkFFNzBCNTE1MkVEMDAwMUYxRDcgLyogRG9j
dW1lbnRQYXJzZXIuaCAqLywKIAkJCQlBODE4NUYzMjA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1l
bnRUeXBlLmNwcCAqLywKQEAgLTIwMzQwLDYgKzIwMzQ2LDcgQEAKIAkJCQkyRUYxQkZGNzEyMUNC
MEJEMDBDMjc2MjcgLyogQXN5bmNGaWxlU3RyZWFtLmggaW4gSGVhZGVycyAqLywKIAkJCQkyRUYx
QkZGOTEyMUNCMENFMDBDMjc2MjcgLyogRmlsZVN0cmVhbUNsaWVudC5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJODlDMEREN0IxMjFGMEM2OTAwOUUxN0NBIC8qIEZpbGVTeXN0ZW1DYWxsYmFja3MuaCBp
biBIZWFkZXJzICovLAorCQkJCUNFMDU3RkE2MTIyMDczMTEwMEE0NzZENSAvKiBEb2N1bWVudE1h
cmtlckNvbnRyb2xsZXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBs
b3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMjI3OTIsNiArMjI3OTksNyBAQAog
CQkJCTJFRjFCRkVBMTIxQzlGNDIwMEMyNzYyNyAvKiBGaWxlU3RyZWFtLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTQ2QTI2OTA1MTIxQjZCNDMwMEM0MUYzQSAvKiBGaWxlV3JpdGVyLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJCTg5QzBERDdBMTIxRjBDNjkwMDlFMTdDQSAvKiBGaWxlU3lzdGVtQ2Fs
bGJhY2tzLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUNFMDU3RkE1MTIyMDczMTEwMEE0NzZENSAv
KiBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJ
cnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJD
b3JlL2RvbS9Eb2N1bWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnQu
Y3BwCShyZXZpc2lvbiA2NTc3OCkKKysrIFdlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTIzLDcgKzEyMyw2IEBACiAjaW5jbHVkZSAiU3RhdGljSGFzaFNldE5vZGVM
aXN0LmgiCiAjaW5jbHVkZSAiU3R5bGVTaGVldExpc3QuaCIKICNpbmNsdWRlICJUZXh0RXZlbnQu
aCIKLSNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJUZXh0UmVzb3VyY2VEZWNv
ZGVyLmgiCiAjaW5jbHVkZSAiVGltZXIuaCIKICNpbmNsdWRlICJUcmFuc2Zvcm1Tb3VyY2UuaCIK
QEAgLTQ5NSw4ICs0OTQsNyBAQCB2b2lkIERvY3VtZW50OjpyZW1vdmVkTGFzdFJlZigpCiAKICAg
ICAgICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsKIAotICAgICAgICBkZWxldGVBbGxWYWx1ZXMobV9t
YXJrZXJzKTsKLSAgICAgICAgbV9tYXJrZXJzLmNsZWFyKCk7CisgICAgICAgIG1fbWFya2VyQ29u
dHJvbGxlci5jbGVhcigpOwogCiAgICAgICAgIGRldGFjaFBhcnNlcigpOwogCkBAIC01NDgsOCAr
NTQ2LDYgQEAgRG9jdW1lbnQ6On5Eb2N1bWVudCgpCiAgICAgbV9iaW5kaW5nTWFuYWdlci5jbGVh
cigpOwogI2VuZGlmCiAKLSAgICBkZWxldGVBbGxWYWx1ZXMobV9tYXJrZXJzKTsKLQogICAgIGNs
ZWFyQVhPYmplY3RDYWNoZSgpOwogCiAgICAgbV9kZWNvZGVyID0gMDsKQEAgLTMxODksNyArMzE4
NSw3IEBAIHZvaWQgRG9jdW1lbnQ6OnRleHRJbnNlcnRlZChOb2RlKiB0ZXh0LCAKICAgICB9CiAK
ICAgICAvLyBVcGRhdGUgdGhlIG1hcmtlcnMgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNr
aW5nLgotICAgIHNoaWZ0TWFya2Vycyh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7CisgICAgbV9tYXJr
ZXJDb250cm9sbGVyLnNoaWZ0TWFya2Vycyh0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7CiB9CiAKIHZv
aWQgRG9jdW1lbnQ6OnRleHRSZW1vdmVkKE5vZGUqIHRleHQsIHVuc2lnbmVkIG9mZnNldCwgdW5z
aWduZWQgbGVuZ3RoKQpAQCAtMzIwMSw4ICszMTk3LDggQEAgdm9pZCBEb2N1bWVudDo6dGV4dFJl
bW92ZWQoTm9kZSogdGV4dCwgdQogICAgIH0KIAogICAgIC8vIFVwZGF0ZSB0aGUgbWFya2VycyBm
b3Igc3BlbGxpbmcgYW5kIGdyYW1tYXIgY2hlY2tpbmcuCi0gICAgcmVtb3ZlTWFya2Vycyh0ZXh0
LCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgc2hpZnRNYXJrZXJzKHRleHQsIG9mZnNldCArIGxlbmd0
aCwgMCAtIGxlbmd0aCk7CisgICAgbV9tYXJrZXJDb250cm9sbGVyLnJlbW92ZU1hcmtlcnModGV4
dCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIG1fbWFya2VyQ29udHJvbGxlci5zaGlmdE1hcmtlcnMo
dGV4dCwgb2Zmc2V0ICsgbGVuZ3RoLCAwIC0gbGVuZ3RoKTsKIH0KIAogdm9pZCBEb2N1bWVudDo6
dGV4dE5vZGVzTWVyZ2VkKFRleHQqIG9sZE5vZGUsIHVuc2lnbmVkIG9mZnNldCkKQEAgLTM4MTUs
NDg5ICszODExLDYgQEAgU3RyaW5nIERvY3VtZW50OjpxdWVyeUNvbW1hbmRWYWx1ZShjb25zdAog
ICAgIHJldHVybiBjb21tYW5kKHRoaXMsIGNvbW1hbmROYW1lKS52YWx1ZSgpOwogfQogCi1zdGF0
aWMgSW50UmVjdCBwbGFjZWhvbGRlclJlY3RGb3JNYXJrZXIoKQotewotICAgIHJldHVybiBJbnRS
ZWN0KC0xLCAtMSwgLTEsIC0xKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6YWRkTWFya2VyKFJhbmdl
KiByYW5nZSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgdHlwZSwgU3RyaW5nIGRlc2NyaXB0
aW9uKQotewotICAgIC8vIFVzZSBhIFRleHRJdGVyYXRvciB0byB2aXNpdCB0aGUgcG90ZW50aWFs
bHkgbXVsdGlwbGUgbm9kZXMgdGhlIHJhbmdlIGNvdmVycy4KLSAgICBmb3IgKFRleHRJdGVyYXRv
ciBtYXJrZWRUZXh0KHJhbmdlKTsgIW1hcmtlZFRleHQuYXRFbmQoKTsgbWFya2VkVGV4dC5hZHZh
bmNlKCkpIHsKLSAgICAgICAgUmVmUHRyPFJhbmdlPiB0ZXh0UGllY2UgPSBtYXJrZWRUZXh0LnJh
bmdlKCk7Ci0gICAgICAgIGludCBleGNlcHRpb24gPSAwOwotICAgICAgICBEb2N1bWVudE1hcmtl
ciBtYXJrZXIgPSB7dHlwZSwgdGV4dFBpZWNlLT5zdGFydE9mZnNldChleGNlcHRpb24pLCB0ZXh0
UGllY2UtPmVuZE9mZnNldChleGNlcHRpb24pLCBkZXNjcmlwdGlvbiwgZmFsc2V9OwotICAgICAg
ICBhZGRNYXJrZXIodGV4dFBpZWNlLT5zdGFydENvbnRhaW5lcihleGNlcHRpb24pLCBtYXJrZXIp
OwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6cmVtb3ZlTWFya2VycyhSYW5nZSogcmFuZ2Us
IERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgaWYgKG1fbWFy
a2Vycy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgIE5vZGUqIHN0YXJ0Q29udGFpbmVyID0gcmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVj
KTsKLSAgICBOb2RlKiBlbmRDb250YWluZXIgPSByYW5nZS0+ZW5kQ29udGFpbmVyKGVjKTsKLQot
ICAgIE5vZGUqIHBhc3RMYXN0Tm9kZSA9IHJhbmdlLT5wYXN0TGFzdE5vZGUoKTsKLSAgICBmb3Ig
KE5vZGUqIG5vZGUgPSByYW5nZS0+Zmlyc3ROb2RlKCk7IG5vZGUgIT0gcGFzdExhc3ROb2RlOyBu
b2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgICAgIGludCBzdGFydE9mZnNl
dCA9IG5vZGUgPT0gc3RhcnRDb250YWluZXIgPyByYW5nZS0+c3RhcnRPZmZzZXQoZWMpIDogMDsK
LSAgICAgICAgaW50IGVuZE9mZnNldCA9IG5vZGUgPT0gZW5kQ29udGFpbmVyID8gcmFuZ2UtPmVu
ZE9mZnNldChlYykgOiBJTlRfTUFYOwotICAgICAgICBpbnQgbGVuZ3RoID0gZW5kT2Zmc2V0IC0g
c3RhcnRPZmZzZXQ7Ci0gICAgICAgIHJlbW92ZU1hcmtlcnMobm9kZSwgc3RhcnRPZmZzZXQsIGxl
bmd0aCwgbWFya2VyVHlwZSk7Ci0gICAgfQotfQotCi0vLyBNYXJrZXJzIGFyZSBzdG9yZWQgaW4g
b3JkZXIgc29ydGVkIGJ5IHRoZWlyIHN0YXJ0IG9mZnNldC4KLS8vIE1hcmtlcnMgb2YgdGhlIHNh
bWUgdHlwZSBkbyBub3Qgb3ZlcmxhcCBlYWNoIG90aGVyLgotCi12b2lkIERvY3VtZW50OjphZGRN
YXJrZXIoTm9kZSogbm9kZSwgRG9jdW1lbnRNYXJrZXIgbmV3TWFya2VyKSAKLXsKLSAgICBBU1NF
UlQobmV3TWFya2VyLmVuZE9mZnNldCA+PSBuZXdNYXJrZXIuc3RhcnRPZmZzZXQpOwotICAgIGlm
IChuZXdNYXJrZXIuZW5kT2Zmc2V0ID09IG5ld01hcmtlci5zdGFydE9mZnNldCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgTWFya2VyTWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG1fbWFya2Vy
cy5nZXQobm9kZSk7Ci0KLSAgICBpZiAoIXZlY3RvclBhaXIpIHsKLSAgICAgICAgdmVjdG9yUGFp
ciA9IG5ldyBNYXJrZXJNYXBWZWN0b3JQYWlyOwotICAgICAgICB2ZWN0b3JQYWlyLT5maXJzdC5h
cHBlbmQobmV3TWFya2VyKTsKLSAgICAgICAgdmVjdG9yUGFpci0+c2Vjb25kLmFwcGVuZChwbGFj
ZWhvbGRlclJlY3RGb3JNYXJrZXIoKSk7Ci0gICAgICAgIG1fbWFya2Vycy5zZXQobm9kZSwgdmVj
dG9yUGFpcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYg
bWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0OwotICAgICAgICBWZWN0b3I8SW50UmVjdD4mIHJl
Y3RzID0gdmVjdG9yUGFpci0+c2Vjb25kOwotICAgICAgICBzaXplX3QgbnVtTWFya2VycyA9IG1h
cmtlcnMuc2l6ZSgpOwotICAgICAgICBBU1NFUlQobnVtTWFya2VycyA9PSByZWN0cy5zaXplKCkp
OwotICAgICAgICBzaXplX3QgaTsKLSAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBtYXJrZXJz
IHdob3NlIHN0YXJ0IG9mZnNldCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG5ldyBtYXJr
ZXIncy4KLSAgICAgICAgLy8gSWYgb25lIG9mIHRoZW0gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0
aGUgbmV3IG1hcmtlciBhbmQgdG91Y2hlcyBpdCBvciBpbnRlcnNlY3RzIHdpdGggaXQKLSAgICAg
ICAgLy8gKHRoZXJlIGlzIGF0IG1vc3Qgb25lKSwgcmVtb3ZlIGl0IGFuZCBhZGp1c3QgdGhlIG5l
dyBtYXJrZXIncyBzdGFydCBvZmZzZXQgdG8gZW5jb21wYXNzIGl0LgotICAgICAgICBmb3IgKGkg
PSAwOyBpIDwgbnVtTWFya2VyczsgKytpKSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBt
YXJrZXIgPSBtYXJrZXJzW2ldOwotICAgICAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+
IG5ld01hcmtlci5zdGFydE9mZnNldCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIGlmIChtYXJrZXIudHlwZSA9PSBuZXdNYXJrZXIudHlwZSAmJiBtYXJrZXIuZW5kT2Zmc2V0
ID49IG5ld01hcmtlci5zdGFydE9mZnNldCkgewotICAgICAgICAgICAgICAgIG5ld01hcmtlci5z
dGFydE9mZnNldCA9IG1hcmtlci5zdGFydE9mZnNldDsKLSAgICAgICAgICAgICAgICBtYXJrZXJz
LnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICByZWN0cy5yZW1vdmUoaSk7Ci0gICAgICAgICAg
ICAgICAgbnVtTWFya2Vycy0tOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg
fQotICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBqID0gaTsKLSAgICAgICAgLy8gSXRlcmF0ZSBv
dmVyIGFsbCBtYXJrZXJzIHdob3NlIGVuZCBvZmZzZXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRv
IHRoZSBuZXcgbWFya2VyJ3MsCi0gICAgICAgIC8vIHJlbW92aW5nIG1hcmtlcnMgb2YgdGhlIHNh
bWUgdHlwZSBhcyB0aGUgbmV3IG1hcmtlciB3aGljaCB0b3VjaCBpdCBvciBpbnRlcnNlY3Qgd2l0
aCBpdCwKLSAgICAgICAgLy8gYWRqdXN0aW5nIHRoZSBuZXcgbWFya2VyJ3MgZW5kIG9mZnNldCB0
byBjb3ZlciB0aGVtIGlmIG5lY2Vzc2FyeS4KLSAgICAgICAgd2hpbGUgKGogPCBudW1NYXJrZXJz
KSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2pdOwotICAg
ICAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+IG5ld01hcmtlci5lbmRPZmZzZXQpCi0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAobWFya2VyLnR5cGUgPT0gbmV3
TWFya2VyLnR5cGUpIHsKLSAgICAgICAgICAgICAgICBtYXJrZXJzLnJlbW92ZShqKTsKLSAgICAg
ICAgICAgICAgICByZWN0cy5yZW1vdmUoaik7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld01hcmtl
ci5lbmRPZmZzZXQgPD0gbWFya2VyLmVuZE9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICBu
ZXdNYXJrZXIuZW5kT2Zmc2V0ID0gbWFya2VyLmVuZE9mZnNldDsKLSAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG51bU1hcmtlcnMt
LTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGorKzsKLSAgICAgICAgfQot
ICAgICAgICAvLyBBdCB0aGlzIHBvaW50IGkgcG9pbnRzIHRvIHRoZSBub2RlIGJlZm9yZSB3aGlj
aCB3ZSB3YW50IHRvIGluc2VydC4KLSAgICAgICAgbWFya2Vycy5pbnNlcnQoaSwgbmV3TWFya2Vy
KTsKLSAgICAgICAgcmVjdHMuaW5zZXJ0KGksIHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpKTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAgIGlmIChu
b2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19
Ci0KLS8vIGNvcGllcyBtYXJrZXJzIGZyb20gc3JjTm9kZSB0byBkc3ROb2RlLCBhcHBseWluZyB0
aGUgc3BlY2lmaWVkIHNoaWZ0IGRlbHRhIHRvIHRoZSBjb3BpZXMuICBUaGUgc2hpZnQgaXMKLS8v
IHVzZWZ1bCBpZiwgZS5nLiwgdGhlIGNhbGxlciBoYXMgY3JlYXRlZCB0aGUgZHN0Tm9kZSBmcm9t
IGEgbm9uLXByZWZpeCBzdWJzdHJpbmcgb2YgdGhlIHNyY05vZGUuCi12b2lkIERvY3VtZW50Ojpj
b3B5TWFya2VycyhOb2RlKiBzcmNOb2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGxlbmd0
aCwgTm9kZSogZHN0Tm9kZSwgaW50IGRlbHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBt
YXJrZXJUeXBlKQotewotICAgIGlmIChsZW5ndGggPD0gMCkKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIE1hcmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBtX21hcmtlcnMuZ2V0KHNy
Y05vZGUpOwotICAgIGlmICghdmVjdG9yUGFpcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgQVNT
RVJUKHZlY3RvclBhaXItPmZpcnN0LnNpemUoKSA9PSB2ZWN0b3JQYWlyLT5zZWNvbmQuc2l6ZSgp
KTsKLQotICAgIGJvb2wgZG9jRGlydHkgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBlbmRPZmZzZXQg
PSBzdGFydE9mZnNldCArIGxlbmd0aCAtIDE7Ci0gICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYg
bWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9
IG1hcmtlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0g
bWFya2Vyc1tpXTsKLQotICAgICAgICAvLyBzdG9wIGlmIHdlIGFyZSBub3cgcGFzdCB0aGUgc3Bl
Y2lmaWVkIHJhbmdlCi0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQp
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICAgIC8vIHNraXAgbWFya2VyIHRo
YXQgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb3IgaXMgdGhlIHdyb25nIHR5cGUKLSAg
ICAgICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUg
IT0gbWFya2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJz
KSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIHBpbiB0aGUgbWFya2VyIHRv
IHRoZSBzcGVjaWZpZWQgcmFuZ2UgYW5kIGFwcGx5IHRoZSBzaGlmdCBkZWx0YQotICAgICAgICBk
b2NEaXJ0eSA9IHRydWU7Ci0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPCBzdGFydE9m
ZnNldCkKLSAgICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotICAg
ICAgICBpZiAobWFya2VyLmVuZE9mZnNldCA+IGVuZE9mZnNldCkKLSAgICAgICAgICAgIG1hcmtl
ci5lbmRPZmZzZXQgPSBlbmRPZmZzZXQ7Ci0gICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBk
ZWx0YTsKLSAgICAgICAgbWFya2VyLmVuZE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgCi0gICAg
ICAgIGFkZE1hcmtlcihkc3ROb2RlLCBtYXJrZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBh
aW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAgaWYgKGRvY0RpcnR5ICYmIGRzdE5vZGUtPnJlbmRl
cmVyKCkpCi0gICAgICAgIGRzdE5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVtb3ZlTWFya2VycyhOb2RlKiBub2RlLCB1bnNpZ25lZCBzdGFydE9mZnNl
dCwgaW50IGxlbmd0aCwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2VyVHlwZSkKLXsK
LSAgICBpZiAobGVuZ3RoIDw9IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIE1hcmtlck1hcFZl
Y3RvclBhaXIqIHZlY3RvclBhaXIgPSBtX21hcmtlcnMuZ2V0KG5vZGUpOwotICAgIGlmICghdmVj
dG9yUGFpcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYg
bWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0OwotICAgIFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMg
PSB2ZWN0b3JQYWlyLT5zZWNvbmQ7Ci0gICAgQVNTRVJUKG1hcmtlcnMuc2l6ZSgpID09IHJlY3Rz
LnNpemUoKSk7Ci0gICAgYm9vbCBkb2NEaXJ0eSA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGVuZE9m
ZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bWFya2Vycy5zaXplKCk7KSB7Ci0gICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9IG1hcmtl
cnNbaV07Ci0KLSAgICAgICAgLy8gbWFya2VycyBhcmUgcmV0dXJuZWQgaW4gb3JkZXIsIHNvIHN0
b3AgaWYgd2UgYXJlIG5vdyBwYXN0IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLSAgICAgICAgaWYgKG1h
cmtlci5zdGFydE9mZnNldCA+PSBlbmRPZmZzZXQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgCi0gICAgICAgIC8vIHNraXAgbWFya2VyIHRoYXQgaXMgd3JvbmcgdHlwZSBvciBiZWZvcmUg
dGFyZ2V0Ci0gICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0IDwgc3RhcnRPZmZzZXQgfHwgKG1h
cmtlci50eXBlICE9IG1hcmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6
QWxsTWFya2VycykpIHsKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICB9Ci0KLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgbWFya2Vy
IGFuZCB0YXJnZXQgaW50ZXJzZWN0IGluIHNvbWUgd2F5Ci0gICAgICAgIGRvY0RpcnR5ID0gdHJ1
ZTsKLQotICAgICAgICAvLyBwaXRjaCB0aGUgb2xkIG1hcmtlciBhbmQgYW55IGFzc29jaWF0ZWQg
cmVjdAotICAgICAgICBtYXJrZXJzLnJlbW92ZShpKTsKLSAgICAgICAgcmVjdHMucmVtb3ZlKGkp
OwotICAgICAgICAKLSAgICAgICAgLy8gYWRkIGVpdGhlciBvZiB0aGUgcmVzdWx0aW5nIHNsaWNl
cyB0aGF0IGFyZSBsZWZ0IGFmdGVyIHJlbW92aW5nIHRhcmdldAotICAgICAgICBpZiAoc3RhcnRP
ZmZzZXQgPiBtYXJrZXIuc3RhcnRPZmZzZXQpIHsKLSAgICAgICAgICAgIERvY3VtZW50TWFya2Vy
IG5ld0xlZnQgPSBtYXJrZXI7Ci0gICAgICAgICAgICBuZXdMZWZ0LmVuZE9mZnNldCA9IHN0YXJ0
T2Zmc2V0OwotICAgICAgICAgICAgbWFya2Vycy5pbnNlcnQoaSwgbmV3TGVmdCk7Ci0gICAgICAg
ICAgICByZWN0cy5pbnNlcnQoaSwgcGxhY2Vob2xkZXJSZWN0Rm9yTWFya2VyKCkpOwotICAgICAg
ICAgICAgLy8gaSBub3cgcG9pbnRzIHRvIHRoZSBuZXdseS1pbnNlcnRlZCBub2RlLCBidXQgd2Ug
d2FudCB0byBza2lwIHRoYXQgb25lCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAg
ICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPiBlbmRPZmZzZXQpIHsKLSAgICAgICAgICAgIERvY3Vt
ZW50TWFya2VyIG5ld1JpZ2h0ID0gbWFya2VyOwotICAgICAgICAgICAgbmV3UmlnaHQuc3RhcnRP
ZmZzZXQgPSBlbmRPZmZzZXQ7Ci0gICAgICAgICAgICBtYXJrZXJzLmluc2VydChpLCBuZXdSaWdo
dCk7Ci0gICAgICAgICAgICByZWN0cy5pbnNlcnQoaSwgcGxhY2Vob2xkZXJSZWN0Rm9yTWFya2Vy
KCkpOwotICAgICAgICAgICAgLy8gaSBub3cgcG9pbnRzIHRvIHRoZSBuZXdseS1pbnNlcnRlZCBu
b2RlLCBidXQgd2Ugd2FudCB0byBza2lwIHRoYXQgb25lCi0gICAgICAgICAgICBpKys7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWFya2Vycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgQVNT
RVJUKHJlY3RzLmlzRW1wdHkoKSk7Ci0gICAgICAgIG1fbWFya2Vycy5yZW1vdmUobm9kZSk7Ci0g
ICAgICAgIGRlbGV0ZSB2ZWN0b3JQYWlyOwotICAgIH0KLQotICAgIC8vIHJlcGFpbnQgdGhlIGFm
ZmVjdGVkIG5vZGUKLSAgICBpZiAoZG9jRGlydHkgJiYgbm9kZS0+cmVuZGVyZXIoKSkKLSAgICAg
ICAgbm9kZS0+cmVuZGVyZXIoKS0+cmVwYWludCgpOwotfQotCi1Eb2N1bWVudE1hcmtlciogRG9j
dW1lbnQ6Om1hcmtlckNvbnRhaW5pbmdQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQsIERvY3Vt
ZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgLy8gb3V0ZXIgbG9vcDog
cHJvY2VzcyBlYWNoIG5vZGUgdGhhdCBjb250YWlucyBhbnkgbWFya2VycwotICAgIE1hcmtlck1h
cDo6aXRlcmF0b3IgZW5kID0gbV9tYXJrZXJzLmVuZCgpOwotICAgIGZvciAoTWFya2VyTWFwOjpp
dGVyYXRvciBub2RlSXRlcmF0b3IgPSBtX21hcmtlcnMuYmVnaW4oKTsgbm9kZUl0ZXJhdG9yICE9
IGVuZDsgKytub2RlSXRlcmF0b3IpIHsKLSAgICAgICAgLy8gaW5uZXIgbG9vcDsgcHJvY2VzcyBl
YWNoIG1hcmtlciBpbiB0aGlzIG5vZGUKLSAgICAgICAgTWFya2VyTWFwVmVjdG9yUGFpciogdmVj
dG9yUGFpciA9IG5vZGVJdGVyYXRvci0+c2Vjb25kOwotICAgICAgICBWZWN0b3I8RG9jdW1lbnRN
YXJrZXI+JiBtYXJrZXJzID0gdmVjdG9yUGFpci0+Zmlyc3Q7Ci0gICAgICAgIFZlY3RvcjxJbnRS
ZWN0PiYgcmVjdHMgPSB2ZWN0b3JQYWlyLT5zZWNvbmQ7Ci0gICAgICAgIEFTU0VSVChtYXJrZXJz
LnNpemUoKSA9PSByZWN0cy5zaXplKCkpOwotICAgICAgICB1bnNpZ25lZCBtYXJrZXJDb3VudCA9
IG1hcmtlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIG1hcmtlckluZGV4ID0gMDsg
bWFya2VySW5kZXggPCBtYXJrZXJDb3VudDsgKyttYXJrZXJJbmRleCkgewotICAgICAgICAgICAg
RG9jdW1lbnRNYXJrZXImIG1hcmtlciA9IG1hcmtlcnNbbWFya2VySW5kZXhdOwotICAgICAgICAg
ICAgCi0gICAgICAgICAgICAvLyBza2lwIG1hcmtlciB0aGF0IGlzIHdyb25nIHR5cGUKLSAgICAg
ICAgICAgIGlmIChtYXJrZXIudHlwZSAhPSBtYXJrZXJUeXBlICYmIG1hcmtlclR5cGUgIT0gRG9j
dW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIEludFJlY3QmIHIgPSByZWN0c1ttYXJrZXJJbmRleF07Ci0g
ICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNraXAgcGxhY2Vob2xkZXIgcmVjdHMKLSAgICAg
ICAgICAgIGlmIChyID09IHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpKQotICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoci5jb250YWlucyhw
b2ludCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuICZtYXJrZXI7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVZlY3RvcjxEb2N1bWVudE1hcmtlcj4gRG9jdW1l
bnQ6Om1hcmtlcnNGb3JOb2RlKE5vZGUqIG5vZGUpCi17Ci0gICAgTWFya2VyTWFwVmVjdG9yUGFp
ciogdmVjdG9yUGFpciA9IG1fbWFya2Vycy5nZXQobm9kZSk7Ci0gICAgaWYgKHZlY3RvclBhaXIp
Ci0gICAgICAgIHJldHVybiB2ZWN0b3JQYWlyLT5maXJzdDsKLSAgICByZXR1cm4gVmVjdG9yPERv
Y3VtZW50TWFya2VyPigpOwotfQotCi1WZWN0b3I8SW50UmVjdD4gRG9jdW1lbnQ6OnJlbmRlcmVk
UmVjdHNGb3JNYXJrZXJzKERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17
Ci0gICAgVmVjdG9yPEludFJlY3Q+IHJlc3VsdDsKLSAgICAKLSAgICAvLyBvdXRlciBsb29wOiBw
cm9jZXNzIGVhY2ggbm9kZQotICAgIE1hcmtlck1hcDo6aXRlcmF0b3IgZW5kID0gbV9tYXJrZXJz
LmVuZCgpOwotICAgIGZvciAoTWFya2VyTWFwOjppdGVyYXRvciBub2RlSXRlcmF0b3IgPSBtX21h
cmtlcnMuYmVnaW4oKTsgbm9kZUl0ZXJhdG9yICE9IGVuZDsgKytub2RlSXRlcmF0b3IpIHsKLSAg
ICAgICAgLy8gaW5uZXIgbG9vcDsgcHJvY2VzcyBlYWNoIG1hcmtlciBpbiB0aGlzIG5vZGUKLSAg
ICAgICAgTWFya2VyTWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG5vZGVJdGVyYXRvci0+c2Vj
b25kOwotICAgICAgICBWZWN0b3I8RG9jdW1lbnRNYXJrZXI+JiBtYXJrZXJzID0gdmVjdG9yUGFp
ci0+Zmlyc3Q7Ci0gICAgICAgIFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSB2ZWN0b3JQYWlyLT5z
ZWNvbmQ7Ci0gICAgICAgIEFTU0VSVChtYXJrZXJzLnNpemUoKSA9PSByZWN0cy5zaXplKCkpOwot
ICAgICAgICB1bnNpZ25lZCBtYXJrZXJDb3VudCA9IG1hcmtlcnMuc2l6ZSgpOwotICAgICAgICBm
b3IgKHVuc2lnbmVkIG1hcmtlckluZGV4ID0gMDsgbWFya2VySW5kZXggPCBtYXJrZXJDb3VudDsg
KyttYXJrZXJJbmRleCkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0gbWFy
a2Vyc1ttYXJrZXJJbmRleF07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHNraXAgbWFy
a2VyIHRoYXQgaXMgd3JvbmcgdHlwZQotICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlICE9IG1h
cmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2VycykKLSAg
ICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgSW50UmVj
dCByID0gcmVjdHNbbWFya2VySW5kZXhdOwotICAgICAgICAgICAgLy8gc2tpcCBwbGFjZWhvbGRl
ciByZWN0cwotICAgICAgICAgICAgaWYgKHIgPT0gcGxhY2Vob2xkZXJSZWN0Rm9yTWFya2VyKCkp
Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQo
cik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9p
ZCBEb2N1bWVudDo6cmVtb3ZlTWFya2VycyhOb2RlKiBub2RlKQotewotICAgIE1hcmtlck1hcDo6
aXRlcmF0b3IgaSA9IG1fbWFya2Vycy5maW5kKG5vZGUpOwotICAgIGlmIChpICE9IG1fbWFya2Vy
cy5lbmQoKSkgewotICAgICAgICBkZWxldGUgaS0+c2Vjb25kOwotICAgICAgICBtX21hcmtlcnMu
cmVtb3ZlKGkpOwotICAgICAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJl
bmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgIH0KLX0KLQot
dm9pZCBEb2N1bWVudDo6cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBt
YXJrZXJUeXBlKQotewotICAgIC8vIG91dGVyIGxvb3A6IHByb2Nlc3MgZWFjaCBtYXJrZXJlZCBu
b2RlIGluIHRoZSBkb2N1bWVudAotICAgIE1hcmtlck1hcCBtYXJrZXJNYXBDb3B5ID0gbV9tYXJr
ZXJzOwotICAgIE1hcmtlck1hcDo6aXRlcmF0b3IgZW5kID0gbWFya2VyTWFwQ29weS5lbmQoKTsK
LSAgICBmb3IgKE1hcmtlck1hcDo6aXRlcmF0b3IgaSA9IG1hcmtlck1hcENvcHkuYmVnaW4oKTsg
aSAhPSBlbmQ7ICsraSkgewotICAgICAgICBOb2RlKiBub2RlID0gaS0+Zmlyc3QuZ2V0KCk7Ci0g
ICAgICAgIGJvb2wgbm9kZU5lZWRzUmVwYWludCA9IGZhbHNlOwotCi0gICAgICAgIC8vIGlubmVy
IGxvb3A6IHByb2Nlc3MgZWFjaCBtYXJrZXIgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICAgICBN
YXJrZXJNYXBWZWN0b3JQYWlyKiB2ZWN0b3JQYWlyID0gaS0+c2Vjb25kOwotICAgICAgICBWZWN0
b3I8RG9jdW1lbnRNYXJrZXI+JiBtYXJrZXJzID0gdmVjdG9yUGFpci0+Zmlyc3Q7Ci0gICAgICAg
IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSB2ZWN0b3JQYWlyLT5zZWNvbmQ7Ci0gICAgICAgIEFT
U0VSVChtYXJrZXJzLnNpemUoKSA9PSByZWN0cy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSAhPSBtYXJrZXJzLnNpemUoKTspIHsKLSAgICAgICAgICAgIERvY3VtZW50TWFy
a2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLSAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhh
dCBhcmUgbm90IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAgICAgICAgaWYgKG1hcmtlci50
eXBlICE9IG1hcmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFy
a2VycykgewotICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcGl0Y2ggdGhlIG9sZCBtYXJrZXIKLSAg
ICAgICAgICAgIG1hcmtlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgcmVjdHMucmVtb3ZlKGkp
OwotICAgICAgICAgICAgbm9kZU5lZWRzUmVwYWludCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBt
YXJrZXJJdGVyYXRvciBub3cgcG9pbnRzIHRvIHRoZSBuZXh0IG5vZGUKLSAgICAgICAgfQotCi0g
ICAgICAgIC8vIFJlZHJhdyB0aGUgbm9kZSBpZiBpdCBjaGFuZ2VkLiBEbyB0aGlzIGJlZm9yZSB0
aGUgbm9kZSBpcyByZW1vdmVkIGZyb20gbV9tYXJrZXJzLCBzaW5jZSAKLSAgICAgICAgLy8gbV9t
YXJrZXJzIG1pZ2h0IGNvbnRhaW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlLgotICAg
ICAgICBpZiAobm9kZU5lZWRzUmVwYWludCkgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXIpCi0g
ICAgICAgICAgICAgICAgcmVuZGVyZXItPnJlcGFpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAg
IC8vIGRlbGV0ZSB0aGUgbm9kZSdzIGxpc3QgaWYgaXQgaXMgbm93IGVtcHR5Ci0gICAgICAgIGlm
IChtYXJrZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQVNTRVJUKHJlY3RzLmlzRW1wdHko
KSk7Ci0gICAgICAgICAgICBtX21hcmtlcnMucmVtb3ZlKG5vZGUpOwotICAgICAgICAgICAgZGVs
ZXRlIHZlY3RvclBhaXI7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnQ6OnJl
cGFpbnRNYXJrZXJzKERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0g
ICAgLy8gb3V0ZXIgbG9vcDogcHJvY2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4gdGhlIGRvY3Vt
ZW50Ci0gICAgTWFya2VyTWFwOjppdGVyYXRvciBlbmQgPSBtX21hcmtlcnMuZW5kKCk7Ci0gICAg
Zm9yIChNYXJrZXJNYXA6Oml0ZXJhdG9yIGkgPSBtX21hcmtlcnMuYmVnaW4oKTsgaSAhPSBlbmQ7
ICsraSkgewotICAgICAgICBOb2RlKiBub2RlID0gaS0+Zmlyc3QuZ2V0KCk7Ci0gICAgICAgIAot
ICAgICAgICAvLyBpbm5lciBsb29wOiBwcm9jZXNzIGVhY2ggbWFya2VyIGluIHRoZSBjdXJyZW50
IG5vZGUKLSAgICAgICAgTWFya2VyTWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IGktPnNlY29u
ZDsKLSAgICAgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXIt
PmZpcnN0OwotICAgICAgICBib29sIG5vZGVOZWVkc1JlcGFpbnQgPSBmYWxzZTsKLSAgICAgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbWFya2Vycy5zaXplKCk7ICsraSkgewotICAgICAgICAg
ICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgLy8gc2tpcCBub2RlcyB0aGF0IGFyZSBub3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBl
Ci0gICAgICAgICAgICBpZiAobWFya2VyLnR5cGUgPT0gbWFya2VyVHlwZSB8fCBtYXJrZXJUeXBl
ID09IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSB7Ci0gICAgICAgICAgICAgICAgbm9kZU5l
ZWRzUmVwYWludCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICghbm9kZU5lZWRzUmVwYWludCkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAKLSAgICAgICAgLy8gY2F1c2UgdGhlIG5vZGUg
dG8gYmUgcmVkcmF3bgotICAgICAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUt
PnJlbmRlcmVyKCkpCi0gICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgIH0KLX0K
LQotdm9pZCBEb2N1bWVudDo6c2V0UmVuZGVyZWRSZWN0Rm9yTWFya2VyKE5vZGUqIG5vZGUsIGNv
bnN0IERvY3VtZW50TWFya2VyJiBtYXJrZXIsIGNvbnN0IEludFJlY3QmIHIpCi17Ci0gICAgTWFy
a2VyTWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG1fbWFya2Vycy5nZXQobm9kZSk7Ci0gICAg
aWYgKCF2ZWN0b3JQYWlyKSB7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBzaG91
bGRuJ3QgYmUgdHJ5aW5nIHRvIHNldCB0aGUgcmVjdCBmb3IgYSBtYXJrZXIgd2UgZG9uJ3QgYWxy
ZWFkeSBrbm93IGFib3V0Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgVmVjdG9y
PERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0OwotICAgIEFTU0VS
VChtYXJrZXJzLnNpemUoKSA9PSB2ZWN0b3JQYWlyLT5zZWNvbmQuc2l6ZSgpKTsKLSAgICB1bnNp
Z25lZCBtYXJrZXJDb3VudCA9IG1hcmtlcnMuc2l6ZSgpOwotICAgIGZvciAodW5zaWduZWQgbWFy
a2VySW5kZXggPSAwOyBtYXJrZXJJbmRleCA8IG1hcmtlckNvdW50OyArK21hcmtlckluZGV4KSB7
Ci0gICAgICAgIERvY3VtZW50TWFya2VyIG0gPSBtYXJrZXJzW21hcmtlckluZGV4XTsKLSAgICAg
ICAgaWYgKG0gPT0gbWFya2VyKSB7Ci0gICAgICAgICAgICB2ZWN0b3JQYWlyLT5zZWNvbmRbbWFy
a2VySW5kZXhdID0gcjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLSAg
ICAKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsgLy8gc2hvdWxkbid0IGJlIHRyeWluZyB0byBz
ZXQgdGhlIHJlY3QgZm9yIGEgbWFya2VyIHdlIGRvbid0IGFscmVhZHkga25vdyBhYm91dAotfQot
Ci12b2lkIERvY3VtZW50OjppbnZhbGlkYXRlUmVuZGVyZWRSZWN0c0Zvck1hcmtlcnNJblJlY3Qo
Y29uc3QgSW50UmVjdCYgcikKLXsKLSAgICAvLyBvdXRlciBsb29wOiBwcm9jZXNzIGVhY2ggbWFy
a2VyZWQgbm9kZSBpbiB0aGUgZG9jdW1lbnQKLSAgICBNYXJrZXJNYXA6Oml0ZXJhdG9yIGVuZCA9
IG1fbWFya2Vycy5lbmQoKTsKLSAgICBmb3IgKE1hcmtlck1hcDo6aXRlcmF0b3IgaSA9IG1fbWFy
a2Vycy5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBpbm5l
ciBsb29wOiBwcm9jZXNzIGVhY2ggcmVjdCBpbiB0aGUgY3VycmVudCBub2RlCi0gICAgICAgIE1h
cmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBpLT5zZWNvbmQ7Ci0gICAgICAgIFZlY3Rv
cjxJbnRSZWN0PiYgcmVjdHMgPSB2ZWN0b3JQYWlyLT5zZWNvbmQ7Ci0gICAgICAgIAotICAgICAg
ICB1bnNpZ25lZCByZWN0Q291bnQgPSByZWN0cy5zaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWdu
ZWQgcmVjdEluZGV4ID0gMDsgcmVjdEluZGV4IDwgcmVjdENvdW50OyArK3JlY3RJbmRleCkKLSAg
ICAgICAgICAgIGlmIChyZWN0c1tyZWN0SW5kZXhdLmludGVyc2VjdHMocikpCi0gICAgICAgICAg
ICAgICAgcmVjdHNbcmVjdEluZGV4XSA9IHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpOwotICAg
IH0KLX0KLQotdm9pZCBEb2N1bWVudDo6c2hpZnRNYXJrZXJzKE5vZGUqIG5vZGUsIHVuc2lnbmVk
IHN0YXJ0T2Zmc2V0LCBpbnQgZGVsdGEsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtl
clR5cGUpCi17Ci0gICAgTWFya2VyTWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG1fbWFya2Vy
cy5nZXQobm9kZSk7Ci0gICAgaWYgKCF2ZWN0b3JQYWlyKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0
OwotICAgIFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMgPSB2ZWN0b3JQYWlyLT5zZWNvbmQ7Ci0gICAg
QVNTRVJUKG1hcmtlcnMuc2l6ZSgpID09IHJlY3RzLnNpemUoKSk7Ci0gICAgCi0gICAgYm9vbCBk
b2NEaXJ0eSA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hcmtlcnMuc2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgRG9jdW1lbnRNYXJrZXImIG1hcmtlciA9IG1hcmtlcnNbaV07
Ci0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPj0gc3RhcnRPZmZzZXQgJiYgKG1hcmtl
clR5cGUgPT0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMgfHwgbWFya2VyLnR5cGUgPT0gbWFy
a2VyVHlwZSkpIHsKLSAgICAgICAgICAgIEFTU0VSVCgoaW50KW1hcmtlci5zdGFydE9mZnNldCAr
IGRlbHRhID49IDApOwotICAgICAgICAgICAgbWFya2VyLnN0YXJ0T2Zmc2V0ICs9IGRlbHRhOwot
ICAgICAgICAgICAgbWFya2VyLmVuZE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgICAgIGRvY0Rp
cnR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gTWFya2VyIG1vdmVkLCBz
byBwcmV2aW91c2x5LWNvbXB1dGVkIHJlbmRlcmVkIHJlY3RhbmdsZSBpcyBub3cgaW52YWxpZAot
ICAgICAgICAgICAgcmVjdHNbaV0gPSBwbGFjZWhvbGRlclJlY3RGb3JNYXJrZXIoKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAg
aWYgKGRvY0RpcnR5ICYmIG5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG5vZGUtPnJlbmRlcmVy
KCktPnJlcGFpbnQoKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0TWFya2Vyc0FjdGl2ZShSYW5n
ZSogcmFuZ2UsIGJvb2wgYWN0aXZlKQotewotICAgIGlmIChtX21hcmtlcnMuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBOb2RlKiBz
dGFydENvbnRhaW5lciA9IHJhbmdlLT5zdGFydENvbnRhaW5lcihlYyk7Ci0gICAgTm9kZSogZW5k
Q29udGFpbmVyID0gcmFuZ2UtPmVuZENvbnRhaW5lcihlYyk7Ci0KLSAgICBOb2RlKiBwYXN0TGFz
dE5vZGUgPSByYW5nZS0+cGFzdExhc3ROb2RlKCk7Ci0gICAgZm9yIChOb2RlKiBub2RlID0gcmFu
Z2UtPmZpcnN0Tm9kZSgpOyBub2RlICE9IHBhc3RMYXN0Tm9kZTsgbm9kZSA9IG5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUoKSkgewotICAgICAgICBpbnQgc3RhcnRPZmZzZXQgPSBub2RlID09IHN0YXJ0
Q29udGFpbmVyID8gcmFuZ2UtPnN0YXJ0T2Zmc2V0KGVjKSA6IDA7Ci0gICAgICAgIGludCBlbmRP
ZmZzZXQgPSBub2RlID09IGVuZENvbnRhaW5lciA/IHJhbmdlLT5lbmRPZmZzZXQoZWMpIDogSU5U
X01BWDsKLSAgICAgICAgc2V0TWFya2Vyc0FjdGl2ZShub2RlLCBzdGFydE9mZnNldCwgZW5kT2Zm
c2V0LCBhY3RpdmUpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudDo6c2V0TWFya2Vyc0FjdGl2
ZShOb2RlKiBub2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgdW5zaWduZWQgZW5kT2Zmc2V0LCBi
b29sIGFjdGl2ZSkKLXsKLSAgICBNYXJrZXJNYXBWZWN0b3JQYWlyKiB2ZWN0b3JQYWlyID0gbV9t
YXJrZXJzLmdldChub2RlKTsKLSAgICBpZiAoIXZlY3RvclBhaXIpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFZlY3RvcjxEb2N1bWVudE1hcmtlcj4mIG1hcmtlcnMgPSB2ZWN0b3JQYWlyLT5maXJz
dDsKLSAgICBBU1NFUlQobWFya2Vycy5zaXplKCkgPT0gdmVjdG9yUGFpci0+c2Vjb25kLnNpemUo
KSk7Ci0KLSAgICBib29sIGRvY0RpcnR5ID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgIT0gbWFya2Vycy5zaXplKCk7ICsraSkgewotICAgICAgICBEb2N1bWVudE1hcmtlciYgbWFy
a2VyID0gbWFya2Vyc1tpXTsKLQotICAgICAgICAvLyBNYXJrZXJzIGFyZSByZXR1cm5lZCBpbiBv
cmRlciwgc28gc3RvcCBpZiB3ZSBhcmUgbm93IHBhc3QgdGhlIHNwZWNpZmllZCByYW5nZS4KLSAg
ICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+PSBlbmRPZmZzZXQpCi0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICAvLyBTa2lwIG1hcmtlciB0aGF0IGlzIHdyb25nIHR5cGUgb3IgYmVm
b3JlIHRhcmdldC4KLSAgICAgICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8
fCBtYXJrZXIudHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6VGV4dE1hdGNoKQotICAgICAgICAgICAg
Y29udGludWU7Ci0KLSAgICAgICAgbWFya2VyLmFjdGl2ZU1hdGNoID0gYWN0aXZlOwotICAgICAg
ICBkb2NEaXJ0eSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQg
bm9kZQotICAgIGlmIChkb2NEaXJ0eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2Rl
LT5yZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KICNpZiBFTkFCTEUoWFNMVCkKIAogdm9pZCBE
b2N1bWVudDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uKiBwaSkKSW5k
ZXg6IFdlYkNvcmUvZG9tL0RvY3VtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vRG9j
dW1lbnQuaAkocmV2aXNpb24gNjU3NzgpCisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiQ29sbGVjdGlvblR5cGUuaCIK
ICNpbmNsdWRlICJDb2xvci5oIgogI2luY2x1ZGUgIkNvbnRhaW5lck5vZGUuaCIKLSNpbmNsdWRl
ICJEb2N1bWVudE1hcmtlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50TWFya2VyQ29udHJvbGxlci5o
IgogI2luY2x1ZGUgIlF1YWxpZmllZE5hbWUuaCIKICNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25D
b250ZXh0LmgiCiAjaW5jbHVkZSAiVGltZXIuaCIKQEAgLTgxMSw2ICs4MTEsOCBAQCBwdWJsaWM6
CiAKICAgICBIVE1MSGVhZEVsZW1lbnQqIGhlYWQoKTsKIAorICAgIERvY3VtZW50TWFya2VyQ29u
dHJvbGxlciogbWFya2VyQ29udHJvbGxlcigpIGNvbnN0IHsgcmV0dXJuICZtX21hcmtlckNvbnRy
b2xsZXI7IH0KKwogICAgIGJvb2wgZXhlY0NvbW1hbmQoY29uc3QgU3RyaW5nJiBjb21tYW5kLCBi
b29sIHVzZXJJbnRlcmZhY2UgPSBmYWxzZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSA9IFN0cmluZygp
KTsKICAgICBib29sIHF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJiBjb21tYW5kKTsK
ICAgICBib29sIHF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbnN0IFN0cmluZyYgY29tbWFuZCk7CkBA
IC04MTgsMjQgKzgyMCw2IEBAIHB1YmxpYzoKICAgICBib29sIHF1ZXJ5Q29tbWFuZFN1cHBvcnRl
ZChjb25zdCBTdHJpbmcmIGNvbW1hbmQpOwogICAgIFN0cmluZyBxdWVyeUNvbW1hbmRWYWx1ZShj
b25zdCBTdHJpbmcmIGNvbW1hbmQpOwogICAgIAotICAgIHZvaWQgYWRkTWFya2VyKFJhbmdlKiwg
RG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUsIFN0cmluZyBkZXNjcmlwdGlvbiA9IFN0cmluZygp
KTsKLSAgICB2b2lkIGFkZE1hcmtlcihOb2RlKiwgRG9jdW1lbnRNYXJrZXIpOwotICAgIHZvaWQg
Y29weU1hcmtlcnMoTm9kZSAqc3JjTm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBsZW5n
dGgsIE5vZGUgKmRzdE5vZGUsIGludCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUg
PSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJzKFJh
bmdlKiwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFy
a2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJzKE5vZGUqLCB1bnNpZ25lZCBzdGFydE9mZnNl
dCwgaW50IGxlbmd0aCwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgPSBEb2N1bWVudE1hcmtl
cjo6QWxsTWFya2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpN
YXJrZXJUeXBlID0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQgcmVtb3Zl
TWFya2VycyhOb2RlKik7Ci0gICAgdm9pZCByZXBhaW50TWFya2VycyhEb2N1bWVudE1hcmtlcjo6
TWFya2VyVHlwZSA9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICB2b2lkIHNldFJl
bmRlcmVkUmVjdEZvck1hcmtlcihOb2RlKiwgY29uc3QgRG9jdW1lbnRNYXJrZXImLCBjb25zdCBJ
bnRSZWN0Jik7Ci0gICAgdm9pZCBpbnZhbGlkYXRlUmVuZGVyZWRSZWN0c0Zvck1hcmtlcnNJblJl
Y3QoY29uc3QgSW50UmVjdCYpOwotICAgIHZvaWQgc2hpZnRNYXJrZXJzKE5vZGUqLCB1bnNpZ25l
ZCBzdGFydE9mZnNldCwgaW50IGRlbHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSA9IERv
Y3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICB2b2lkIHNldE1hcmtlcnNBY3RpdmUoUmFu
Z2UqLCBib29sKTsKLSAgICB2b2lkIHNldE1hcmtlcnNBY3RpdmUoTm9kZSosIHVuc2lnbmVkIHN0
YXJ0T2Zmc2V0LCB1bnNpZ25lZCBlbmRPZmZzZXQsIGJvb2wpOwotCi0gICAgRG9jdW1lbnRNYXJr
ZXIqIG1hcmtlckNvbnRhaW5pbmdQb2ludChjb25zdCBJbnRQb2ludCYsIERvY3VtZW50TWFya2Vy
OjpNYXJrZXJUeXBlID0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIFZlY3RvcjxE
b2N1bWVudE1hcmtlcj4gbWFya2Vyc0Zvck5vZGUoTm9kZSopOwotICAgIFZlY3RvcjxJbnRSZWN0
PiByZW5kZXJlZFJlY3RzRm9yTWFya2VycyhEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSA9IERv
Y3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICAKICAgICAvLyBkZXNpZ25Nb2RlIHN1cHBv
cnQKICAgICBlbnVtIEluaGVyaXRlZEJvb2wgeyBvZmYgPSBmYWxzZSwgb24gPSB0cnVlLCBpbmhl
cml0IH07ICAgIAogICAgIHZvaWQgc2V0RGVzaWduTW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKTsK
QEAgLTExODUsMTEgKzExNjksOCBAQCBwcml2YXRlOgogCiAgICAgT3duUHRyPFJlbmRlckFyZW5h
PiBtX3JlbmRlckFyZW5hOwogCi0gICAgdHlwZWRlZiBzdGQ6OnBhaXI8VmVjdG9yPERvY3VtZW50
TWFya2VyPiwgVmVjdG9yPEludFJlY3Q+ID4gTWFya2VyTWFwVmVjdG9yUGFpcjsKLSAgICB0eXBl
ZGVmIEhhc2hNYXA8UmVmUHRyPE5vZGU+LCBNYXJrZXJNYXBWZWN0b3JQYWlyKj4gTWFya2VyTWFw
OwotICAgIE1hcmtlck1hcCBtX21hcmtlcnM7Ci0KICAgICBtdXRhYmxlIEFYT2JqZWN0Q2FjaGUq
IG1fYXhPYmplY3RDYWNoZTsKKyAgICBtdXRhYmxlIERvY3VtZW50TWFya2VyQ29udHJvbGxlciBt
X21hcmtlckNvbnRyb2xsZXI7CiAgICAgCiAgICAgVGltZXI8RG9jdW1lbnQ+IG1fdXBkYXRlRm9j
dXNBcHBlYXJhbmNlVGltZXI7CiAKSW5kZXg6IFdlYkNvcmUvZG9tL0RvY3VtZW50TWFya2VyQ29u
dHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvZG9tL0RvY3VtZW50TWFya2VyQ29u
dHJvbGxlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMp
IDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMp
IDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCisgKiAgICAgICAgICAgKEMpIDIw
MDYgQWxleGV5IFByb3NrdXJ5YWtvdiAoYXBAd2Via2l0Lm9yZykKKyAqIENvcHlyaWdodCAoQykg
MjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgVG9yY2ggTW9iaWxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gKGh0dHA6Ly93d3cudG9yY2htb2JpbGUuY29tLykK
KyAqIENvcHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dE1hcmtlckNvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJSYW5n
ZS5oIgorI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0YXRpYyBJbnRSZWN0IHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpCit7CisgICAgcmV0dXJu
IEludFJlY3QoLTEsIC0xLCAtMSwgLTEpOworfQorCit2b2lkIERvY3VtZW50TWFya2VyQ29udHJv
bGxlcjo6Y2xlYXIoKQoreworICAgIGlmIChtX21hcmtlcnMuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9tYXJrZXJzKTsKKyAgICBtX21hcmtlcnMu
Y2xlYXIoKTsKK30KKwordm9pZCBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI6OmFkZE1hcmtlcihS
YW5nZSogcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIHR5cGUsIFN0cmluZyBkZXNj
cmlwdGlvbikKK3sKKyAgICAvLyBVc2UgYSBUZXh0SXRlcmF0b3IgdG8gdmlzaXQgdGhlIHBvdGVu
dGlhbGx5IG11bHRpcGxlIG5vZGVzIHRoZSByYW5nZSBjb3ZlcnMuCisgICAgZm9yIChUZXh0SXRl
cmF0b3IgbWFya2VkVGV4dChyYW5nZSk7ICFtYXJrZWRUZXh0LmF0RW5kKCk7IG1hcmtlZFRleHQu
YWR2YW5jZSgpKSB7CisgICAgICAgIFJlZlB0cjxSYW5nZT4gdGV4dFBpZWNlID0gbWFya2VkVGV4
dC5yYW5nZSgpOworICAgICAgICBpbnQgZXhjZXB0aW9uID0gMDsKKyAgICAgICAgRG9jdW1lbnRN
YXJrZXIgbWFya2VyID0ge3R5cGUsIHRleHRQaWVjZS0+c3RhcnRPZmZzZXQoZXhjZXB0aW9uKSwg
dGV4dFBpZWNlLT5lbmRPZmZzZXQoZXhjZXB0aW9uKSwgZGVzY3JpcHRpb24sIGZhbHNlfTsKKyAg
ICAgICAgYWRkTWFya2VyKHRleHRQaWVjZS0+c3RhcnRDb250YWluZXIoZXhjZXB0aW9uKSwgbWFy
a2VyKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjpyZW1vdmVN
YXJrZXJzKFJhbmdlKiByYW5nZSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2VyVHlw
ZSkKK3sKKyAgICBpZiAobV9tYXJrZXJzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgTm9kZSogc3RhcnRDb250YWluZXIgPSByYW5n
ZS0+c3RhcnRDb250YWluZXIoZWMpOworICAgIE5vZGUqIGVuZENvbnRhaW5lciA9IHJhbmdlLT5l
bmRDb250YWluZXIoZWMpOworCisgICAgTm9kZSogcGFzdExhc3ROb2RlID0gcmFuZ2UtPnBhc3RM
YXN0Tm9kZSgpOworICAgIGZvciAoTm9kZSogbm9kZSA9IHJhbmdlLT5maXJzdE5vZGUoKTsgbm9k
ZSAhPSBwYXN0TGFzdE5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAg
ICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gbm9kZSA9PSBzdGFydENvbnRhaW5lciA/IHJhbmdlLT5z
dGFydE9mZnNldChlYykgOiAwOworICAgICAgICBpbnQgZW5kT2Zmc2V0ID0gbm9kZSA9PSBlbmRD
b250YWluZXIgPyByYW5nZS0+ZW5kT2Zmc2V0KGVjKSA6IElOVF9NQVg7CisgICAgICAgIGludCBs
ZW5ndGggPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKKyAgICAgICAgcmVtb3ZlTWFya2Vycyhu
b2RlLCBzdGFydE9mZnNldCwgbGVuZ3RoLCBtYXJrZXJUeXBlKTsKKyAgICB9Cit9CisKKy8vIE1h
cmtlcnMgYXJlIHN0b3JlZCBpbiBvcmRlciBzb3J0ZWQgYnkgdGhlaXIgc3RhcnQgb2Zmc2V0Lgor
Ly8gTWFya2VycyBvZiB0aGUgc2FtZSB0eXBlIGRvIG5vdCBvdmVybGFwIGVhY2ggb3RoZXIuCisK
K3ZvaWQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjphZGRNYXJrZXIoTm9kZSogbm9kZSwgRG9j
dW1lbnRNYXJrZXIgbmV3TWFya2VyKSAKK3sKKyAgICBBU1NFUlQobmV3TWFya2VyLmVuZE9mZnNl
dCA+PSBuZXdNYXJrZXIuc3RhcnRPZmZzZXQpOworICAgIGlmIChuZXdNYXJrZXIuZW5kT2Zmc2V0
ID09IG5ld01hcmtlci5zdGFydE9mZnNldCkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWFya2Vy
TWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG1fbWFya2Vycy5nZXQobm9kZSk7CisKKyAgICBp
ZiAoIXZlY3RvclBhaXIpIHsKKyAgICAgICAgdmVjdG9yUGFpciA9IG5ldyBNYXJrZXJNYXBWZWN0
b3JQYWlyOworICAgICAgICB2ZWN0b3JQYWlyLT5maXJzdC5hcHBlbmQobmV3TWFya2VyKTsKKyAg
ICAgICAgdmVjdG9yUGFpci0+c2Vjb25kLmFwcGVuZChwbGFjZWhvbGRlclJlY3RGb3JNYXJrZXIo
KSk7CisgICAgICAgIG1fbWFya2Vycy5zZXQobm9kZSwgdmVjdG9yUGFpcik7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXIt
PmZpcnN0OworICAgICAgICBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gdmVjdG9yUGFpci0+c2Vj
b25kOworICAgICAgICBzaXplX3QgbnVtTWFya2VycyA9IG1hcmtlcnMuc2l6ZSgpOworICAgICAg
ICBBU1NFUlQobnVtTWFya2VycyA9PSByZWN0cy5zaXplKCkpOworICAgICAgICBzaXplX3QgaTsK
KyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBtYXJrZXJzIHdob3NlIHN0YXJ0IG9mZnNldCBp
cyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG5ldyBtYXJrZXIncy4KKyAgICAgICAgLy8gSWYg
b25lIG9mIHRoZW0gaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgbmV3IG1hcmtlciBhbmQgdG91
Y2hlcyBpdCBvciBpbnRlcnNlY3RzIHdpdGggaXQKKyAgICAgICAgLy8gKHRoZXJlIGlzIGF0IG1v
c3Qgb25lKSwgcmVtb3ZlIGl0IGFuZCBhZGp1c3QgdGhlIG5ldyBtYXJrZXIncyBzdGFydCBvZmZz
ZXQgdG8gZW5jb21wYXNzIGl0LgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtTWFya2Vyczsg
KytpKSB7CisgICAgICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwor
ICAgICAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+IG5ld01hcmtlci5zdGFydE9mZnNl
dCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChtYXJrZXIudHlwZSA9
PSBuZXdNYXJrZXIudHlwZSAmJiBtYXJrZXIuZW5kT2Zmc2V0ID49IG5ld01hcmtlci5zdGFydE9m
ZnNldCkgeworICAgICAgICAgICAgICAgIG5ld01hcmtlci5zdGFydE9mZnNldCA9IG1hcmtlci5z
dGFydE9mZnNldDsKKyAgICAgICAgICAgICAgICBtYXJrZXJzLnJlbW92ZShpKTsKKyAgICAgICAg
ICAgICAgICByZWN0cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgbnVtTWFya2Vycy0tOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAg
IHNpemVfdCBqID0gaTsKKyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBtYXJrZXJzIHdob3Nl
IGVuZCBvZmZzZXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgbWFya2VyJ3MsCisg
ICAgICAgIC8vIHJlbW92aW5nIG1hcmtlcnMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgbmV3IG1h
cmtlciB3aGljaCB0b3VjaCBpdCBvciBpbnRlcnNlY3Qgd2l0aCBpdCwKKyAgICAgICAgLy8gYWRq
dXN0aW5nIHRoZSBuZXcgbWFya2VyJ3MgZW5kIG9mZnNldCB0byBjb3ZlciB0aGVtIGlmIG5lY2Vz
c2FyeS4KKyAgICAgICAgd2hpbGUgKGogPCBudW1NYXJrZXJzKSB7CisgICAgICAgICAgICBEb2N1
bWVudE1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2pdOworICAgICAgICAgICAgaWYgKG1hcmtlci5z
dGFydE9mZnNldCA+IG5ld01hcmtlci5lbmRPZmZzZXQpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICBpZiAobWFya2VyLnR5cGUgPT0gbmV3TWFya2VyLnR5cGUpIHsKKyAgICAg
ICAgICAgICAgICBtYXJrZXJzLnJlbW92ZShqKTsKKyAgICAgICAgICAgICAgICByZWN0cy5yZW1v
dmUoaik7CisgICAgICAgICAgICAgICAgaWYgKG5ld01hcmtlci5lbmRPZmZzZXQgPD0gbWFya2Vy
LmVuZE9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBuZXdNYXJrZXIuZW5kT2Zmc2V0ID0g
bWFya2VyLmVuZE9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIG51bU1hcmtlcnMtLTsKKyAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvLyBBdCB0aGlzIHBv
aW50IGkgcG9pbnRzIHRvIHRoZSBub2RlIGJlZm9yZSB3aGljaCB3ZSB3YW50IHRvIGluc2VydC4K
KyAgICAgICAgbWFya2Vycy5pbnNlcnQoaSwgbmV3TWFya2VyKTsKKyAgICAgICAgcmVjdHMuaW5z
ZXJ0KGksIHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpKTsKKyAgICB9CisKKyAgICAvLyByZXBh
aW50IHRoZSBhZmZlY3RlZCBub2RlCisgICAgaWYgKG5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAg
IG5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsKK30KKworLy8gY29waWVzIG1hcmtlcnMgZnJv
bSBzcmNOb2RlIHRvIGRzdE5vZGUsIGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgc2hpZnQgZGVsdGEg
dG8gdGhlIGNvcGllcy4gIFRoZSBzaGlmdCBpcworLy8gdXNlZnVsIGlmLCBlLmcuLCB0aGUgY2Fs
bGVyIGhhcyBjcmVhdGVkIHRoZSBkc3ROb2RlIGZyb20gYSBub24tcHJlZml4IHN1YnN0cmluZyBv
ZiB0aGUgc3JjTm9kZS4KK3ZvaWQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjpjb3B5TWFya2Vy
cyhOb2RlKiBzcmNOb2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgTm9kZSog
ZHN0Tm9kZSwgaW50IGRlbHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBl
KQoreworICAgIGlmIChsZW5ndGggPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWFya2Vy
TWFwVmVjdG9yUGFpciogdmVjdG9yUGFpciA9IG1fbWFya2Vycy5nZXQoc3JjTm9kZSk7CisgICAg
aWYgKCF2ZWN0b3JQYWlyKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQodmVjdG9yUGFp
ci0+Zmlyc3Quc2l6ZSgpID09IHZlY3RvclBhaXItPnNlY29uZC5zaXplKCkpOworCisgICAgYm9v
bCBkb2NEaXJ0eSA9IGZhbHNlOworICAgIHVuc2lnbmVkIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0
ICsgbGVuZ3RoIC0gMTsKKyAgICBWZWN0b3I8RG9jdW1lbnRNYXJrZXI+JiBtYXJrZXJzID0gdmVj
dG9yUGFpci0+Zmlyc3Q7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbWFya2Vycy5zaXpl
KCk7ICsraSkgeworICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwor
CisgICAgICAgIC8vIHN0b3AgaWYgd2UgYXJlIG5vdyBwYXN0IHRoZSBzcGVjaWZpZWQgcmFuZ2UK
KyAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+IGVuZE9mZnNldCkKKyAgICAgICAgICAg
IGJyZWFrOworCisgICAgICAgIC8vIHNraXAgbWFya2VyIHRoYXQgaXMgYmVmb3JlIHRoZSBzcGVj
aWZpZWQgcmFuZ2Ugb3IgaXMgdGhlIHdyb25nIHR5cGUKKyAgICAgICAgaWYgKG1hcmtlci5lbmRP
ZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0gbWFya2VyVHlwZSAmJiBtYXJr
ZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIC8vIHBpbiB0aGUgbWFya2VyIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ug
YW5kIGFwcGx5IHRoZSBzaGlmdCBkZWx0YQorICAgICAgICBkb2NEaXJ0eSA9IHRydWU7CisgICAg
ICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCkKKyAgICAgICAgICAgIG1h
cmtlci5zdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OworICAgICAgICBpZiAobWFya2VyLmVuZE9m
ZnNldCA+IGVuZE9mZnNldCkKKyAgICAgICAgICAgIG1hcmtlci5lbmRPZmZzZXQgPSBlbmRPZmZz
ZXQ7CisgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0YTsKKyAgICAgICAgbWFya2Vy
LmVuZE9mZnNldCArPSBkZWx0YTsKKworICAgICAgICBhZGRNYXJrZXIoZHN0Tm9kZSwgbWFya2Vy
KTsKKyAgICB9CisKKyAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCisgICAgaWYgKGRv
Y0RpcnR5ICYmIGRzdE5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIGRzdE5vZGUtPnJlbmRlcmVy
KCktPnJlcGFpbnQoKTsKK30KKwordm9pZCBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI6OnJlbW92
ZU1hcmtlcnMoTm9kZSogbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIERv
Y3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCit7CisgICAgaWYgKGxlbmd0aCA8
PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBNYXJrZXJNYXBWZWN0b3JQYWlyKiB2ZWN0b3JQ
YWlyID0gbV9tYXJrZXJzLmdldChub2RlKTsKKyAgICBpZiAoIXZlY3RvclBhaXIpCisgICAgICAg
IHJldHVybjsKKworICAgIFZlY3RvcjxEb2N1bWVudE1hcmtlcj4mIG1hcmtlcnMgPSB2ZWN0b3JQ
YWlyLT5maXJzdDsKKyAgICBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gdmVjdG9yUGFpci0+c2Vj
b25kOworICAgIEFTU0VSVChtYXJrZXJzLnNpemUoKSA9PSByZWN0cy5zaXplKCkpOworICAgIGJv
b2wgZG9jRGlydHkgPSBmYWxzZTsKKyAgICB1bnNpZ25lZCBlbmRPZmZzZXQgPSBzdGFydE9mZnNl
dCArIGxlbmd0aDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hcmtlcnMuc2l6ZSgpOykg
eworICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOworCisgICAgICAg
IC8vIG1hcmtlcnMgYXJlIHJldHVybmVkIGluIG9yZGVyLCBzbyBzdG9wIGlmIHdlIGFyZSBub3cg
cGFzdCB0aGUgc3BlY2lmaWVkIHJhbmdlCisgICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQg
Pj0gZW5kT2Zmc2V0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gc2tpcCBtYXJr
ZXIgdGhhdCBpcyB3cm9uZyB0eXBlIG9yIGJlZm9yZSB0YXJnZXQKKyAgICAgICAgaWYgKG1hcmtl
ci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0gbWFya2VyVHlwZSAm
JiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkgeworICAgICAgICAg
ICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBh
dCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBtYXJrZXIgYW5kIHRhcmdldCBpbnRlcnNlY3QgaW4g
c29tZSB3YXkKKyAgICAgICAgZG9jRGlydHkgPSB0cnVlOworCisgICAgICAgIC8vIHBpdGNoIHRo
ZSBvbGQgbWFya2VyIGFuZCBhbnkgYXNzb2NpYXRlZCByZWN0CisgICAgICAgIG1hcmtlcnMucmVt
b3ZlKGkpOworICAgICAgICByZWN0cy5yZW1vdmUoaSk7CisKKyAgICAgICAgLy8gYWRkIGVpdGhl
ciBvZiB0aGUgcmVzdWx0aW5nIHNsaWNlcyB0aGF0IGFyZSBsZWZ0IGFmdGVyIHJlbW92aW5nIHRh
cmdldAorICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiBtYXJrZXIuc3RhcnRPZmZzZXQpIHsKKyAg
ICAgICAgICAgIERvY3VtZW50TWFya2VyIG5ld0xlZnQgPSBtYXJrZXI7CisgICAgICAgICAgICBu
ZXdMZWZ0LmVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0OworICAgICAgICAgICAgbWFya2Vycy5pbnNl
cnQoaSwgbmV3TGVmdCk7CisgICAgICAgICAgICByZWN0cy5pbnNlcnQoaSwgcGxhY2Vob2xkZXJS
ZWN0Rm9yTWFya2VyKCkpOworICAgICAgICAgICAgLy8gaSBub3cgcG9pbnRzIHRvIHRoZSBuZXds
eS1pbnNlcnRlZCBub2RlLCBidXQgd2Ugd2FudCB0byBza2lwIHRoYXQgb25lCisgICAgICAgICAg
ICBpKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPiBlbmRPZmZz
ZXQpIHsKKyAgICAgICAgICAgIERvY3VtZW50TWFya2VyIG5ld1JpZ2h0ID0gbWFya2VyOworICAg
ICAgICAgICAgbmV3UmlnaHQuc3RhcnRPZmZzZXQgPSBlbmRPZmZzZXQ7CisgICAgICAgICAgICBt
YXJrZXJzLmluc2VydChpLCBuZXdSaWdodCk7CisgICAgICAgICAgICByZWN0cy5pbnNlcnQoaSwg
cGxhY2Vob2xkZXJSZWN0Rm9yTWFya2VyKCkpOworICAgICAgICAgICAgLy8gaSBub3cgcG9pbnRz
IHRvIHRoZSBuZXdseS1pbnNlcnRlZCBub2RlLCBidXQgd2Ugd2FudCB0byBza2lwIHRoYXQgb25l
CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWFya2Vycy5p
c0VtcHR5KCkpIHsKKyAgICAgICAgQVNTRVJUKHJlY3RzLmlzRW1wdHkoKSk7CisgICAgICAgIG1f
bWFya2Vycy5yZW1vdmUobm9kZSk7CisgICAgICAgIGRlbGV0ZSB2ZWN0b3JQYWlyOworICAgIH0K
KworICAgIC8vIHJlcGFpbnQgdGhlIGFmZmVjdGVkIG5vZGUKKyAgICBpZiAoZG9jRGlydHkgJiYg
bm9kZS0+cmVuZGVyZXIoKSkKKyAgICAgICAgbm9kZS0+cmVuZGVyZXIoKS0+cmVwYWludCgpOwor
fQorCitEb2N1bWVudE1hcmtlciogRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjptYXJrZXJDb250
YWluaW5nUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50LCBEb2N1bWVudE1hcmtlcjo6TWFya2Vy
VHlwZSBtYXJrZXJUeXBlKQoreworICAgIC8vIG91dGVyIGxvb3A6IHByb2Nlc3MgZWFjaCBub2Rl
IHRoYXQgY29udGFpbnMgYW55IG1hcmtlcnMKKyAgICBNYXJrZXJNYXA6Oml0ZXJhdG9yIGVuZCA9
IG1fbWFya2Vycy5lbmQoKTsKKyAgICBmb3IgKE1hcmtlck1hcDo6aXRlcmF0b3Igbm9kZUl0ZXJh
dG9yID0gbV9tYXJrZXJzLmJlZ2luKCk7IG5vZGVJdGVyYXRvciAhPSBlbmQ7ICsrbm9kZUl0ZXJh
dG9yKSB7CisgICAgICAgIC8vIGlubmVyIGxvb3A7IHByb2Nlc3MgZWFjaCBtYXJrZXIgaW4gdGhp
cyBub2RlCisgICAgICAgIE1hcmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBub2RlSXRl
cmF0b3ItPnNlY29uZDsKKyAgICAgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9
IHZlY3RvclBhaXItPmZpcnN0OworICAgICAgICBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gdmVj
dG9yUGFpci0+c2Vjb25kOworICAgICAgICBBU1NFUlQobWFya2Vycy5zaXplKCkgPT0gcmVjdHMu
c2l6ZSgpKTsKKyAgICAgICAgdW5zaWduZWQgbWFya2VyQ291bnQgPSBtYXJrZXJzLnNpemUoKTsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBtYXJrZXJJbmRleCA9IDA7IG1hcmtlckluZGV4IDwgbWFy
a2VyQ291bnQ7ICsrbWFya2VySW5kZXgpIHsKKyAgICAgICAgICAgIERvY3VtZW50TWFya2VyJiBt
YXJrZXIgPSBtYXJrZXJzW21hcmtlckluZGV4XTsKKworICAgICAgICAgICAgLy8gc2tpcCBtYXJr
ZXIgdGhhdCBpcyB3cm9uZyB0eXBlCisgICAgICAgICAgICBpZiAobWFya2VyLnR5cGUgIT0gbWFy
a2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBJbnRSZWN0JiByID0gcmVjdHNb
bWFya2VySW5kZXhdOworCisgICAgICAgICAgICAvLyBza2lwIHBsYWNlaG9sZGVyIHJlY3RzCisg
ICAgICAgICAgICBpZiAociA9PSBwbGFjZWhvbGRlclJlY3RGb3JNYXJrZXIoKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKHIuY29udGFpbnMocG9pbnQpKQor
ICAgICAgICAgICAgICAgIHJldHVybiAmbWFya2VyOworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIDA7Cit9CisKK1ZlY3RvcjxEb2N1bWVudE1hcmtlcj4gRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyOjptYXJrZXJzRm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIE1hcmtlck1hcFZlY3Rv
clBhaXIqIHZlY3RvclBhaXIgPSBtX21hcmtlcnMuZ2V0KG5vZGUpOworICAgIGlmICh2ZWN0b3JQ
YWlyKQorICAgICAgICByZXR1cm4gdmVjdG9yUGFpci0+Zmlyc3Q7CisgICAgcmV0dXJuIFZlY3Rv
cjxEb2N1bWVudE1hcmtlcj4oKTsKK30KKworVmVjdG9yPEludFJlY3Q+IERvY3VtZW50TWFya2Vy
Q29udHJvbGxlcjo6cmVuZGVyZWRSZWN0c0Zvck1hcmtlcnMoRG9jdW1lbnRNYXJrZXI6Ok1hcmtl
clR5cGUgbWFya2VyVHlwZSkKK3sKKyAgICBWZWN0b3I8SW50UmVjdD4gcmVzdWx0OworCisgICAg
Ly8gb3V0ZXIgbG9vcDogcHJvY2VzcyBlYWNoIG5vZGUKKyAgICBNYXJrZXJNYXA6Oml0ZXJhdG9y
IGVuZCA9IG1fbWFya2Vycy5lbmQoKTsKKyAgICBmb3IgKE1hcmtlck1hcDo6aXRlcmF0b3Igbm9k
ZUl0ZXJhdG9yID0gbV9tYXJrZXJzLmJlZ2luKCk7IG5vZGVJdGVyYXRvciAhPSBlbmQ7ICsrbm9k
ZUl0ZXJhdG9yKSB7CisgICAgICAgIC8vIGlubmVyIGxvb3A7IHByb2Nlc3MgZWFjaCBtYXJrZXIg
aW4gdGhpcyBub2RlCisgICAgICAgIE1hcmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBu
b2RlSXRlcmF0b3ItPnNlY29uZDsKKyAgICAgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFy
a2VycyA9IHZlY3RvclBhaXItPmZpcnN0OworICAgICAgICBWZWN0b3I8SW50UmVjdD4mIHJlY3Rz
ID0gdmVjdG9yUGFpci0+c2Vjb25kOworICAgICAgICBBU1NFUlQobWFya2Vycy5zaXplKCkgPT0g
cmVjdHMuc2l6ZSgpKTsKKyAgICAgICAgdW5zaWduZWQgbWFya2VyQ291bnQgPSBtYXJrZXJzLnNp
emUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBtYXJrZXJJbmRleCA9IDA7IG1hcmtlckluZGV4
IDwgbWFya2VyQ291bnQ7ICsrbWFya2VySW5kZXgpIHsKKyAgICAgICAgICAgIERvY3VtZW50TWFy
a2VyIG1hcmtlciA9IG1hcmtlcnNbbWFya2VySW5kZXhdOworCisgICAgICAgICAgICAvLyBza2lw
IG1hcmtlciB0aGF0IGlzIHdyb25nIHR5cGUKKyAgICAgICAgICAgIGlmIChtYXJrZXIudHlwZSAh
PSBtYXJrZXJUeXBlICYmIG1hcmtlclR5cGUgIT0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIEludFJlY3QgciA9IHJl
Y3RzW21hcmtlckluZGV4XTsKKyAgICAgICAgICAgIC8vIHNraXAgcGxhY2Vob2xkZXIgcmVjdHMK
KyAgICAgICAgICAgIGlmIChyID09IHBsYWNlaG9sZGVyUmVjdEZvck1hcmtlcigpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHIpOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEb2N1bWVudE1h
cmtlckNvbnRyb2xsZXI6OnJlbW92ZU1hcmtlcnMoTm9kZSogbm9kZSkKK3sKKyAgICBNYXJrZXJN
YXA6Oml0ZXJhdG9yIGkgPSBtX21hcmtlcnMuZmluZChub2RlKTsKKyAgICBpZiAoaSAhPSBtX21h
cmtlcnMuZW5kKCkpIHsKKyAgICAgICAgZGVsZXRlIGktPnNlY29uZDsKKyAgICAgICAgbV9tYXJr
ZXJzLnJlbW92ZShpKTsKKyAgICAgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2Rl
LT5yZW5kZXJlcigpKQorICAgICAgICAgICAgcmVuZGVyZXItPnJlcGFpbnQoKTsKKyAgICB9Cit9
CisKK3ZvaWQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjpyZW1vdmVNYXJrZXJzKERvY3VtZW50
TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCit7CisgICAgLy8gb3V0ZXIgbG9vcDogcHJv
Y2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4gdGhlIGRvY3VtZW50CisgICAgTWFya2VyTWFwIG1h
cmtlck1hcENvcHkgPSBtX21hcmtlcnM7CisgICAgTWFya2VyTWFwOjppdGVyYXRvciBlbmQgPSBt
YXJrZXJNYXBDb3B5LmVuZCgpOworICAgIGZvciAoTWFya2VyTWFwOjppdGVyYXRvciBpID0gbWFy
a2VyTWFwQ29weS5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgICAgIE5vZGUqIG5vZGUg
PSBpLT5maXJzdC5nZXQoKTsKKyAgICAgICAgYm9vbCBub2RlTmVlZHNSZXBhaW50ID0gZmFsc2U7
CisKKyAgICAgICAgLy8gaW5uZXIgbG9vcDogcHJvY2VzcyBlYWNoIG1hcmtlciBpbiB0aGUgY3Vy
cmVudCBub2RlCisgICAgICAgIE1hcmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBpLT5z
ZWNvbmQ7CisgICAgICAgIFZlY3RvcjxEb2N1bWVudE1hcmtlcj4mIG1hcmtlcnMgPSB2ZWN0b3JQ
YWlyLT5maXJzdDsKKyAgICAgICAgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IHZlY3RvclBhaXIt
PnNlY29uZDsKKyAgICAgICAgQVNTRVJUKG1hcmtlcnMuc2l6ZSgpID09IHJlY3RzLnNpemUoKSk7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hcmtlcnMuc2l6ZSgpOykgeworICAg
ICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKKworICAgICAgICAg
ICAgLy8gc2tpcCBub2RlcyB0aGF0IGFyZSBub3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlCisgICAg
ICAgICAgICBpZiAobWFya2VyLnR5cGUgIT0gbWFya2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERv
Y3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBwaXRj
aCB0aGUgb2xkIG1hcmtlcgorICAgICAgICAgICAgbWFya2Vycy5yZW1vdmUoaSk7CisgICAgICAg
ICAgICByZWN0cy5yZW1vdmUoaSk7CisgICAgICAgICAgICBub2RlTmVlZHNSZXBhaW50ID0gdHJ1
ZTsKKyAgICAgICAgICAgIC8vIG1hcmtlckl0ZXJhdG9yIG5vdyBwb2ludHMgdG8gdGhlIG5leHQg
bm9kZQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVkcmF3IHRoZSBub2RlIGlmIGl0IGNoYW5n
ZWQuIERvIHRoaXMgYmVmb3JlIHRoZSBub2RlIGlzIHJlbW92ZWQgZnJvbSBtX21hcmtlcnMsIHNp
bmNlIAorICAgICAgICAvLyBtX21hcmtlcnMgbWlnaHQgY29udGFpbiB0aGUgbGFzdCByZWZlcmVu
Y2UgdG8gdGhlIG5vZGUuCisgICAgICAgIGlmIChub2RlTmVlZHNSZXBhaW50KSB7CisgICAgICAg
ICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICAgICAg
ICAgIGlmIChyZW5kZXJlcikKKyAgICAgICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gZGVsZXRlIHRoZSBub2RlJ3MgbGlzdCBpZiBpdCBpcyBu
b3cgZW1wdHkKKyAgICAgICAgaWYgKG1hcmtlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBB
U1NFUlQocmVjdHMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIG1fbWFya2Vycy5yZW1vdmUobm9k
ZSk7CisgICAgICAgICAgICBkZWxldGUgdmVjdG9yUGFpcjsKKyAgICAgICAgfQorICAgIH0KK30K
Kwordm9pZCBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI6OnJlcGFpbnRNYXJrZXJzKERvY3VtZW50
TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCit7CisgICAgLy8gb3V0ZXIgbG9vcDogcHJv
Y2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4gdGhlIGRvY3VtZW50CisgICAgTWFya2VyTWFwOjpp
dGVyYXRvciBlbmQgPSBtX21hcmtlcnMuZW5kKCk7CisgICAgZm9yIChNYXJrZXJNYXA6Oml0ZXJh
dG9yIGkgPSBtX21hcmtlcnMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgICBOb2Rl
KiBub2RlID0gaS0+Zmlyc3QuZ2V0KCk7CisKKyAgICAgICAgLy8gaW5uZXIgbG9vcDogcHJvY2Vz
cyBlYWNoIG1hcmtlciBpbiB0aGUgY3VycmVudCBub2RlCisgICAgICAgIE1hcmtlck1hcFZlY3Rv
clBhaXIqIHZlY3RvclBhaXIgPSBpLT5zZWNvbmQ7CisgICAgICAgIFZlY3RvcjxEb2N1bWVudE1h
cmtlcj4mIG1hcmtlcnMgPSB2ZWN0b3JQYWlyLT5maXJzdDsKKyAgICAgICAgYm9vbCBub2RlTmVl
ZHNSZXBhaW50ID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICE9IG1hcmtl
cnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9IG1h
cmtlcnNbaV07CisKKyAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgbm90IG9mIHRo
ZSBzcGVjaWZpZWQgdHlwZQorICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlID09IG1hcmtlclR5
cGUgfHwgbWFya2VyVHlwZSA9PSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2VycykgeworICAgICAg
ICAgICAgICAgIG5vZGVOZWVkc1JlcGFpbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFub2RlTmVlZHNSZXBh
aW50KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gY2F1c2UgdGhlIG5vZGUg
dG8gYmUgcmVkcmF3bgorICAgICAgICBpZiAoUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUt
PnJlbmRlcmVyKCkpCisgICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOworICAgIH0KK30K
Kwordm9pZCBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI6OnNldFJlbmRlcmVkUmVjdEZvck1hcmtl
cihOb2RlKiBub2RlLCBjb25zdCBEb2N1bWVudE1hcmtlciYgbWFya2VyLCBjb25zdCBJbnRSZWN0
JiByKQoreworICAgIE1hcmtlck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBtX21hcmtlcnMu
Z2V0KG5vZGUpOworICAgIGlmICghdmVjdG9yUGFpcikgeworICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsgLy8gc2hvdWxkbid0IGJlIHRyeWluZyB0byBzZXQgdGhlIHJlY3QgZm9yIGEgbWFy
a2VyIHdlIGRvbid0IGFscmVhZHkga25vdyBhYm91dAorICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0
OworICAgIEFTU0VSVChtYXJrZXJzLnNpemUoKSA9PSB2ZWN0b3JQYWlyLT5zZWNvbmQuc2l6ZSgp
KTsKKyAgICB1bnNpZ25lZCBtYXJrZXJDb3VudCA9IG1hcmtlcnMuc2l6ZSgpOworICAgIGZvciAo
dW5zaWduZWQgbWFya2VySW5kZXggPSAwOyBtYXJrZXJJbmRleCA8IG1hcmtlckNvdW50OyArK21h
cmtlckluZGV4KSB7CisgICAgICAgIERvY3VtZW50TWFya2VyIG0gPSBtYXJrZXJzW21hcmtlcklu
ZGV4XTsKKyAgICAgICAgaWYgKG0gPT0gbWFya2VyKSB7CisgICAgICAgICAgICB2ZWN0b3JQYWly
LT5zZWNvbmRbbWFya2VySW5kZXhdID0gcjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgIH0KKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBzaG91bGRuJ3QgYmUgdHJ5
aW5nIHRvIHNldCB0aGUgcmVjdCBmb3IgYSBtYXJrZXIgd2UgZG9uJ3QgYWxyZWFkeSBrbm93IGFi
b3V0Cit9CisKK3ZvaWQgRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyOjppbnZhbGlkYXRlUmVuZGVy
ZWRSZWN0c0Zvck1hcmtlcnNJblJlY3QoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICAvLyBvdXRl
ciBsb29wOiBwcm9jZXNzIGVhY2ggbWFya2VyZWQgbm9kZSBpbiB0aGUgZG9jdW1lbnQKKyAgICBN
YXJrZXJNYXA6Oml0ZXJhdG9yIGVuZCA9IG1fbWFya2Vycy5lbmQoKTsKKyAgICBmb3IgKE1hcmtl
ck1hcDo6aXRlcmF0b3IgaSA9IG1fbWFya2Vycy5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisK
KyAgICAgICAgLy8gaW5uZXIgbG9vcDogcHJvY2VzcyBlYWNoIHJlY3QgaW4gdGhlIGN1cnJlbnQg
bm9kZQorICAgICAgICBNYXJrZXJNYXBWZWN0b3JQYWlyKiB2ZWN0b3JQYWlyID0gaS0+c2Vjb25k
OworICAgICAgICBWZWN0b3I8SW50UmVjdD4mIHJlY3RzID0gdmVjdG9yUGFpci0+c2Vjb25kOwor
CisgICAgICAgIHVuc2lnbmVkIHJlY3RDb3VudCA9IHJlY3RzLnNpemUoKTsKKyAgICAgICAgZm9y
ICh1bnNpZ25lZCByZWN0SW5kZXggPSAwOyByZWN0SW5kZXggPCByZWN0Q291bnQ7ICsrcmVjdElu
ZGV4KQorICAgICAgICAgICAgaWYgKHJlY3RzW3JlY3RJbmRleF0uaW50ZXJzZWN0cyhyKSkKKyAg
ICAgICAgICAgICAgICByZWN0c1tyZWN0SW5kZXhdID0gcGxhY2Vob2xkZXJSZWN0Rm9yTWFya2Vy
KCk7CisgICAgfQorfQorCit2b2lkIERvY3VtZW50TWFya2VyQ29udHJvbGxlcjo6c2hpZnRNYXJr
ZXJzKE5vZGUqIG5vZGUsIHVuc2lnbmVkIHN0YXJ0T2Zmc2V0LCBpbnQgZGVsdGEsIERvY3VtZW50
TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCit7CisgICAgTWFya2VyTWFwVmVjdG9yUGFp
ciogdmVjdG9yUGFpciA9IG1fbWFya2Vycy5nZXQobm9kZSk7CisgICAgaWYgKCF2ZWN0b3JQYWly
KQorICAgICAgICByZXR1cm47CisKKyAgICBWZWN0b3I8RG9jdW1lbnRNYXJrZXI+JiBtYXJrZXJz
ID0gdmVjdG9yUGFpci0+Zmlyc3Q7CisgICAgVmVjdG9yPEludFJlY3Q+JiByZWN0cyA9IHZlY3Rv
clBhaXItPnNlY29uZDsKKyAgICBBU1NFUlQobWFya2Vycy5zaXplKCkgPT0gcmVjdHMuc2l6ZSgp
KTsKKworICAgIGJvb2wgZG9jRGlydHkgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsg
aSAhPSBtYXJrZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIERvY3VtZW50TWFya2VyJiBtYXJr
ZXIgPSBtYXJrZXJzW2ldOworICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0ID49IHN0YXJ0
T2Zmc2V0ICYmIChtYXJrZXJUeXBlID09IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzIHx8IG1h
cmtlci50eXBlID09IG1hcmtlclR5cGUpKSB7CisgICAgICAgICAgICBBU1NFUlQoKGludCltYXJr
ZXIuc3RhcnRPZmZzZXQgKyBkZWx0YSA+PSAwKTsKKyAgICAgICAgICAgIG1hcmtlci5zdGFydE9m
ZnNldCArPSBkZWx0YTsKKyAgICAgICAgICAgIG1hcmtlci5lbmRPZmZzZXQgKz0gZGVsdGE7Cisg
ICAgICAgICAgICBkb2NEaXJ0eSA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIE1hcmtlciBtb3Zl
ZCwgc28gcHJldmlvdXNseS1jb21wdXRlZCByZW5kZXJlZCByZWN0YW5nbGUgaXMgbm93IGludmFs
aWQKKyAgICAgICAgICAgIHJlY3RzW2ldID0gcGxhY2Vob2xkZXJSZWN0Rm9yTWFya2VyKCk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCisgICAg
aWYgKGRvY0RpcnR5ICYmIG5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIG5vZGUtPnJlbmRlcmVy
KCktPnJlcGFpbnQoKTsKK30KKwordm9pZCBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXI6OnNldE1h
cmtlcnNBY3RpdmUoUmFuZ2UqIHJhbmdlLCBib29sIGFjdGl2ZSkKK3sKKyAgICBpZiAobV9tYXJr
ZXJzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7CisgICAgTm9kZSogc3RhcnRDb250YWluZXIgPSByYW5nZS0+c3RhcnRDb250YWluZXIoZWMp
OworICAgIE5vZGUqIGVuZENvbnRhaW5lciA9IHJhbmdlLT5lbmRDb250YWluZXIoZWMpOworCisg
ICAgTm9kZSogcGFzdExhc3ROb2RlID0gcmFuZ2UtPnBhc3RMYXN0Tm9kZSgpOworICAgIGZvciAo
Tm9kZSogbm9kZSA9IHJhbmdlLT5maXJzdE5vZGUoKTsgbm9kZSAhPSBwYXN0TGFzdE5vZGU7IG5v
ZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKKyAgICAgICAgaW50IHN0YXJ0T2Zmc2V0
ID0gbm9kZSA9PSBzdGFydENvbnRhaW5lciA/IHJhbmdlLT5zdGFydE9mZnNldChlYykgOiAwOwor
ICAgICAgICBpbnQgZW5kT2Zmc2V0ID0gbm9kZSA9PSBlbmRDb250YWluZXIgPyByYW5nZS0+ZW5k
T2Zmc2V0KGVjKSA6IElOVF9NQVg7CisgICAgICAgIHNldE1hcmtlcnNBY3RpdmUobm9kZSwgc3Rh
cnRPZmZzZXQsIGVuZE9mZnNldCwgYWN0aXZlKTsKKyAgICB9Cit9CisKK3ZvaWQgRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyOjpzZXRNYXJrZXJzQWN0aXZlKE5vZGUqIG5vZGUsIHVuc2lnbmVkIHN0
YXJ0T2Zmc2V0LCB1bnNpZ25lZCBlbmRPZmZzZXQsIGJvb2wgYWN0aXZlKQoreworICAgIE1hcmtl
ck1hcFZlY3RvclBhaXIqIHZlY3RvclBhaXIgPSBtX21hcmtlcnMuZ2V0KG5vZGUpOworICAgIGlm
ICghdmVjdG9yUGFpcikKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPERvY3VtZW50TWFy
a2VyPiYgbWFya2VycyA9IHZlY3RvclBhaXItPmZpcnN0OworICAgIEFTU0VSVChtYXJrZXJzLnNp
emUoKSA9PSB2ZWN0b3JQYWlyLT5zZWNvbmQuc2l6ZSgpKTsKKworICAgIGJvb2wgZG9jRGlydHkg
PSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAhPSBtYXJrZXJzLnNpemUoKTsgKytp
KSB7CisgICAgICAgIERvY3VtZW50TWFya2VyJiBtYXJrZXIgPSBtYXJrZXJzW2ldOworCisgICAg
ICAgIC8vIE1hcmtlcnMgYXJlIHJldHVybmVkIGluIG9yZGVyLCBzbyBzdG9wIGlmIHdlIGFyZSBu
b3cgcGFzdCB0aGUgc3BlY2lmaWVkIHJhbmdlLgorICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zm
c2V0ID49IGVuZE9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIFNraXAg
bWFya2VyIHRoYXQgaXMgd3JvbmcgdHlwZSBvciBiZWZvcmUgdGFyZ2V0LgorICAgICAgICBpZiAo
bWFya2VyLmVuZE9mZnNldCA8IHN0YXJ0T2Zmc2V0IHx8IG1hcmtlci50eXBlICE9IERvY3VtZW50
TWFya2VyOjpUZXh0TWF0Y2gpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtYXJr
ZXIuYWN0aXZlTWF0Y2ggPSBhY3RpdmU7CisgICAgICAgIGRvY0RpcnR5ID0gdHJ1ZTsKKyAgICB9
CisKKyAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCisgICAgaWYgKGRvY0RpcnR5ICYm
IG5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIG5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9kb20vRG9jdW1lbnRN
YXJrZXJDb250cm9sbGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9kb20vRG9jdW1lbnRNYXJr
ZXJDb250cm9sbGVyLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL2RvbS9Eb2N1bWVudE1hcmtl
ckNvbnRyb2xsZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChD
KSAxOTk5IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICogICAgICAgICAgIChD
KSAyMDAxIERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogICAgICAgICAgIChDKSAy
MDA2IEFsZXhleSBQcm9za3VyeWFrb3YgKGFwQHdlYmtpdC5vcmcpCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IFRvcmNoIE1vYmls
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIChodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8p
CisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIERvY3VtZW50TWFya2VyQ29udHJvbGxlcl9oCisj
ZGVmaW5lIERvY3VtZW50TWFya2VyQ29udHJvbGxlcl9oCisKKyNpbmNsdWRlICJEb2N1bWVudE1h
cmtlci5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEludFBvaW50OworY2xhc3MgSW50UmVj
dDsKK2NsYXNzIE5vZGU7CitjbGFzcyBSYW5nZTsKKworY2xhc3MgRG9jdW1lbnRNYXJrZXJDb250
cm9sbGVyIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICB+RG9jdW1lbnRNYXJr
ZXJDb250cm9sbGVyKCkgeyBjbGVhcigpOyB9CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgdm9p
ZCBhZGRNYXJrZXIoUmFuZ2UqLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSwgU3RyaW5nIGRl
c2NyaXB0aW9uID0gU3RyaW5nKCkpOworICAgIHZvaWQgYWRkTWFya2VyKE5vZGUqLCBEb2N1bWVu
dE1hcmtlcik7CisgICAgdm9pZCBjb3B5TWFya2VycyhOb2RlICpzcmNOb2RlLCB1bnNpZ25lZCBz
dGFydE9mZnNldCwgaW50IGxlbmd0aCwgTm9kZSAqZHN0Tm9kZSwgaW50IGRlbHRhLCBEb2N1bWVu
dE1hcmtlcjo6TWFya2VyVHlwZSA9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKKyAgICB2
b2lkIHJlbW92ZU1hcmtlcnMoUmFuZ2UqLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSA9IERv
Y3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKKyAgICB2b2lkIHJlbW92ZU1hcmtlcnMoTm9kZSos
IHVuc2lnbmVkIHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBEb2N1bWVudE1hcmtlcjo6TWFya2Vy
VHlwZSA9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKKyAgICB2b2lkIHJlbW92ZU1hcmtl
cnMoRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vy
cyk7CisgICAgdm9pZCByZW1vdmVNYXJrZXJzKE5vZGUqKTsKKyAgICB2b2lkIHJlcGFpbnRNYXJr
ZXJzKERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlID0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtl
cnMpOworICAgIHZvaWQgc2V0UmVuZGVyZWRSZWN0Rm9yTWFya2VyKE5vZGUqLCBjb25zdCBEb2N1
bWVudE1hcmtlciYsIGNvbnN0IEludFJlY3QmKTsKKyAgICB2b2lkIGludmFsaWRhdGVSZW5kZXJl
ZFJlY3RzRm9yTWFya2Vyc0luUmVjdChjb25zdCBJbnRSZWN0Jik7CisgICAgdm9pZCBzaGlmdE1h
cmtlcnMoTm9kZSosIHVuc2lnbmVkIHN0YXJ0T2Zmc2V0LCBpbnQgZGVsdGEsIERvY3VtZW50TWFy
a2VyOjpNYXJrZXJUeXBlID0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOworICAgIHZvaWQg
c2V0TWFya2Vyc0FjdGl2ZShSYW5nZSosIGJvb2wpOworICAgIHZvaWQgc2V0TWFya2Vyc0FjdGl2
ZShOb2RlKiwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIHVuc2lnbmVkIGVuZE9mZnNldCwgYm9vbCk7
CisKKyAgICBEb2N1bWVudE1hcmtlciogbWFya2VyQ29udGFpbmluZ1BvaW50KGNvbnN0IEludFBv
aW50JiwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFy
a2Vycyk7CisgICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiBtYXJrZXJzRm9yTm9kZShOb2RlKik7
CisgICAgVmVjdG9yPEludFJlY3Q+IHJlbmRlcmVkUmVjdHNGb3JNYXJrZXJzKERvY3VtZW50TWFy
a2VyOjpNYXJrZXJUeXBlID0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOworCitwcml2YXRl
OgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPFZlY3RvcjxEb2N1bWVudE1hcmtlcj4sIFZlY3RvcjxJ
bnRSZWN0PiA+IE1hcmtlck1hcFZlY3RvclBhaXI7CisgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0
cjxOb2RlPiwgTWFya2VyTWFwVmVjdG9yUGFpcio+IE1hcmtlck1hcDsKKyAgICBNYXJrZXJNYXAg
bV9tYXJrZXJzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRG9j
dW1lbnRNYXJrZXJDb250cm9sbGVyX2gKSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9FZGl0b3IuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZWRpdGluZy9FZGl0b3IuY3BwCShyZXZpc2lvbiA2NTc3
OCkKKysrIFdlYkNvcmUvZWRpdGluZy9FZGl0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTYz
LDcgKzE1NjMsNyBAQCB2b2lkIEVkaXRvcjo6aWdub3JlU3BlbGxpbmcoKQogICAgICAgICAKICAg
ICBSZWZQdHI8UmFuZ2U+IHNlbGVjdGVkUmFuZ2UgPSBmcmFtZSgpLT5zZWxlY3Rpb24oKS0+dG9O
b3JtYWxpemVkUmFuZ2UoKTsKICAgICBpZiAoc2VsZWN0ZWRSYW5nZSkKLSAgICAgICAgZnJhbWUo
KS0+ZG9jdW1lbnQoKS0+cmVtb3ZlTWFya2VycyhzZWxlY3RlZFJhbmdlLmdldCgpLCBEb2N1bWVu
dE1hcmtlcjo6U3BlbGxpbmcpOworICAgICAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJD
b250cm9sbGVyKCktPnJlbW92ZU1hcmtlcnMoc2VsZWN0ZWRSYW5nZS5nZXQoKSwgRG9jdW1lbnRN
YXJrZXI6OlNwZWxsaW5nKTsKIAogICAgIFN0cmluZyB0ZXh0ID0gZnJhbWUoKS0+c2VsZWN0ZWRU
ZXh0KCk7CiAgICAgQVNTRVJUKHRleHQubGVuZ3RoKCkpOwpAQCAtMTYyOSw3ICsxNjI5LDcgQEAg
c3RhdGljIFN0cmluZyBmaW5kRmlyc3RNaXNzcGVsbGluZ0luUmFuZwogCiAgICAgICAgICAgICAg
ICAgLy8gU3RvcmUgbWFya2VyIGZvciBtaXNzcGVsbGVkIHdvcmQuCiAgICAgICAgICAgICAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgICAgICAgICAgbWlzc3BlbGxpbmdSYW5nZS0+
c3RhcnRDb250YWluZXIoZWMpLT5kb2N1bWVudCgpLT5hZGRNYXJrZXIobWlzc3BlbGxpbmdSYW5n
ZS5nZXQoKSwgRG9jdW1lbnRNYXJrZXI6OlNwZWxsaW5nKTsKKyAgICAgICAgICAgICAgICBtaXNz
cGVsbGluZ1JhbmdlLT5zdGFydENvbnRhaW5lcihlYyktPmRvY3VtZW50KCktPm1hcmtlckNvbnRy
b2xsZXIoKS0+YWRkTWFya2VyKG1pc3NwZWxsaW5nUmFuZ2UuZ2V0KCksIERvY3VtZW50TWFya2Vy
OjpTcGVsbGluZyk7CiAgICAgICAgICAgICAgICAgQVNTRVJUKCFlYyk7CiAKICAgICAgICAgICAg
ICAgICAvLyBCYWlsIG91dCBpZiB3ZSdyZSBtYXJraW5nIG9ubHkgdGhlIGZpcnN0IG1pc3NwZWxs
aW5nLCBhbmQgbm90IGFsbCBpbnN0YW5jZXMuCkBAIC0xNjkyLDcgKzE2OTIsNyBAQCBzdGF0aWMg
aW50IGZpbmRGaXJzdEdyYW1tYXJEZXRhaWxJblJhbmdlCiAgICAgICAgIGlmIChtYXJrQWxsKSB7
CiAgICAgICAgICAgICBSZWZQdHI8UmFuZ2U+IGJhZEdyYW1tYXJSYW5nZSA9IFRleHRJdGVyYXRv
cjo6c3VicmFuZ2Uoc2VhcmNoUmFuZ2UsIGJhZEdyYW1tYXJQaHJhc2VMb2NhdGlvbiAtIHN0YXJ0
T2Zmc2V0ICsgZGV0YWlsLT5sb2NhdGlvbiwgZGV0YWlsLT5sZW5ndGgpOwogICAgICAgICAgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgICAgICAgICBiYWRHcmFtbWFyUmFuZ2UtPnN0YXJ0
Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+YWRkTWFya2VyKGJhZEdyYW1tYXJSYW5nZS5nZXQo
KSwgRG9jdW1lbnRNYXJrZXI6OkdyYW1tYXIsIGRldGFpbC0+dXNlckRlc2NyaXB0aW9uKTsKKyAg
ICAgICAgICAgIGJhZEdyYW1tYXJSYW5nZS0+c3RhcnRDb250YWluZXIoZWMpLT5kb2N1bWVudCgp
LT5tYXJrZXJDb250cm9sbGVyKCktPmFkZE1hcmtlcihiYWRHcmFtbWFyUmFuZ2UuZ2V0KCksIERv
Y3VtZW50TWFya2VyOjpHcmFtbWFyLCBkZXRhaWwtPnVzZXJEZXNjcmlwdGlvbik7CiAgICAgICAg
ICAgICBBU1NFUlQoIWVjKTsKICAgICAgICAgfQogICAgICAgICAKQEAgLTIwNjMsNyArMjA2Myw3
IEBAIHZvaWQgRWRpdG9yOjphZHZhbmNlVG9OZXh0TWlzc3BlbGxpbmcoYm8KICAgICAgICAgZnJh
bWUoKS0+cmV2ZWFsU2VsZWN0aW9uKCk7CiAgICAgICAgIAogICAgICAgICBjbGllbnQoKS0+dXBk
YXRlU3BlbGxpbmdVSVdpdGhHcmFtbWFyU3RyaW5nKGJhZEdyYW1tYXJQaHJhc2UsIGdyYW1tYXJE
ZXRhaWwpOwotICAgICAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5hZGRNYXJrZXIoYmFkR3JhbW1h
clJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6R3JhbW1hciwgZ3JhbW1hckRldGFpbC51c2Vy
RGVzY3JpcHRpb24pOworICAgICAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJDb250cm9s
bGVyKCktPmFkZE1hcmtlcihiYWRHcmFtbWFyUmFuZ2UuZ2V0KCksIERvY3VtZW50TWFya2VyOjpH
cmFtbWFyLCBncmFtbWFyRGV0YWlsLnVzZXJEZXNjcmlwdGlvbik7CiAjZW5kaWYgICAgICAgIAog
ICAgIH0gZWxzZSBpZiAoIW1pc3NwZWxsZWRXb3JkLmlzRW1wdHkoKSkgewogICAgICAgICAvLyBX
ZSBmb3VuZCBhIG1pc3NwZWxsaW5nLCBidXQgbm90IGFueSBlYXJsaWVyIGJhZCBncmFtbWFyLiBT
ZWxlY3QgdGhlIG1pc3NwZWxsaW5nLCB1cGRhdGUgdGhlIHNwZWxsaW5nIHBhbmVsLCBhbmQgc3Rv
cmUKQEAgLTIwNzQsNyArMjA3NCw3IEBAIHZvaWQgRWRpdG9yOjphZHZhbmNlVG9OZXh0TWlzc3Bl
bGxpbmcoYm8KICAgICAgICAgZnJhbWUoKS0+cmV2ZWFsU2VsZWN0aW9uKCk7CiAgICAgICAgIAog
ICAgICAgICBjbGllbnQoKS0+dXBkYXRlU3BlbGxpbmdVSVdpdGhNaXNzcGVsbGVkV29yZChtaXNz
cGVsbGVkV29yZCk7Ci0gICAgICAgIGZyYW1lKCktPmRvY3VtZW50KCktPmFkZE1hcmtlcihtaXNz
cGVsbGluZ1JhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6U3BlbGxpbmcpOworICAgICAgICBm
cmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCktPmFkZE1hcmtlcihtaXNzcGVs
bGluZ1JhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6U3BlbGxpbmcpOwogICAgIH0KIH0KIApA
QCAtMjU0Myw3ICsyNTQzLDcgQEAgdm9pZCBFZGl0b3I6Om1hcmtBbGxNaXNzcGVsbGluZ3NBbmRC
YWRHcgogICAgICAgICBpZiAobWFya1NwZWxsaW5nICYmIHJlc3VsdC0+dHlwZSA9PSBUZXh0Q2hl
Y2tpbmdUeXBlU3BlbGxpbmcgJiYgcmVzdWx0TG9jYXRpb24gPj0gc3BlbGxpbmdSYW5nZVN0YXJ0
T2Zmc2V0ICYmIHJlc3VsdExvY2F0aW9uICsgcmVzdWx0TGVuZ3RoIDw9IHNwZWxsaW5nUmFuZ2VF
bmRPZmZzZXQpIHsKICAgICAgICAgICAgIEFTU0VSVChyZXN1bHRMZW5ndGggPiAwICYmIHJlc3Vs
dExvY2F0aW9uID49IDApOwogICAgICAgICAgICAgUmVmUHRyPFJhbmdlPiBtaXNzcGVsbGluZ1Jh
bmdlID0gVGV4dEl0ZXJhdG9yOjpzdWJyYW5nZShzcGVsbGluZ1JhbmdlLCByZXN1bHRMb2NhdGlv
biAtIHNwZWxsaW5nUmFuZ2VTdGFydE9mZnNldCwgcmVzdWx0TGVuZ3RoKTsKLSAgICAgICAgICAg
IG1pc3NwZWxsaW5nUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+YWRkTWFy
a2VyKG1pc3NwZWxsaW5nUmFuZ2UuZ2V0KCksIERvY3VtZW50TWFya2VyOjpTcGVsbGluZyk7Cisg
ICAgICAgICAgICBtaXNzcGVsbGluZ1JhbmdlLT5zdGFydENvbnRhaW5lcihlYyktPmRvY3VtZW50
KCktPm1hcmtlckNvbnRyb2xsZXIoKS0+YWRkTWFya2VyKG1pc3NwZWxsaW5nUmFuZ2UuZ2V0KCks
IERvY3VtZW50TWFya2VyOjpTcGVsbGluZyk7CiAgICAgICAgIH0gZWxzZSBpZiAobWFya0dyYW1t
YXIgJiYgcmVzdWx0LT50eXBlID09IFRleHRDaGVja2luZ1R5cGVHcmFtbWFyICYmIHJlc3VsdExv
Y2F0aW9uIDwgZ3JhbW1hclJhbmdlRW5kT2Zmc2V0ICYmIHJlc3VsdExvY2F0aW9uICsgcmVzdWx0
TGVuZ3RoID4gZ3JhbW1hclJhbmdlU3RhcnRPZmZzZXQpIHsKICAgICAgICAgICAgIEFTU0VSVChy
ZXN1bHRMZW5ndGggPiAwICYmIHJlc3VsdExvY2F0aW9uID49IDApOwogICAgICAgICAgICAgZm9y
ICh1bnNpZ25lZCBqID0gMDsgaiA8IHJlc3VsdC0+ZGV0YWlscy5zaXplKCk7IGorKykgewpAQCAt
MjU1MSw3ICsyNTUxLDcgQEAgdm9pZCBFZGl0b3I6Om1hcmtBbGxNaXNzcGVsbGluZ3NBbmRCYWRH
cgogICAgICAgICAgICAgICAgIEFTU0VSVChkZXRhaWwtPmxlbmd0aCA+IDAgJiYgZGV0YWlsLT5s
b2NhdGlvbiA+PSAwKTsKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0TG9jYXRpb24gKyBkZXRh
aWwtPmxvY2F0aW9uID49IGdyYW1tYXJSYW5nZVN0YXJ0T2Zmc2V0ICYmIHJlc3VsdExvY2F0aW9u
ICsgZGV0YWlsLT5sb2NhdGlvbiArIGRldGFpbC0+bGVuZ3RoIDw9IGdyYW1tYXJSYW5nZUVuZE9m
ZnNldCkgewogICAgICAgICAgICAgICAgICAgICBSZWZQdHI8UmFuZ2U+IGJhZEdyYW1tYXJSYW5n
ZSA9IFRleHRJdGVyYXRvcjo6c3VicmFuZ2UoZ3JhbW1hclJhbmdlLCByZXN1bHRMb2NhdGlvbiAr
IGRldGFpbC0+bG9jYXRpb24gLSBncmFtbWFyUmFuZ2VTdGFydE9mZnNldCwgZGV0YWlsLT5sZW5n
dGgpOwotICAgICAgICAgICAgICAgICAgICBncmFtbWFyUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVj
KS0+ZG9jdW1lbnQoKS0+YWRkTWFya2VyKGJhZEdyYW1tYXJSYW5nZS5nZXQoKSwgRG9jdW1lbnRN
YXJrZXI6OkdyYW1tYXIsIGRldGFpbC0+dXNlckRlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgICAg
ICAgICAgZ3JhbW1hclJhbmdlLT5zdGFydENvbnRhaW5lcihlYyktPmRvY3VtZW50KCktPm1hcmtl
ckNvbnRyb2xsZXIoKS0+YWRkTWFya2VyKGJhZEdyYW1tYXJSYW5nZS5nZXQoKSwgRG9jdW1lbnRN
YXJrZXI6OkdyYW1tYXIsIGRldGFpbC0+dXNlckRlc2NyaXB0aW9uKTsKICAgICAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocGVyZm9ybVRleHRDaGVja2lu
Z1JlcGxhY2VtZW50cyAmJiByZXN1bHRMb2NhdGlvbiArIHJlc3VsdExlbmd0aCA8PSBzcGVsbGlu
Z1JhbmdlRW5kT2Zmc2V0ICYmIHJlc3VsdExvY2F0aW9uICsgcmVzdWx0TGVuZ3RoID49IHNwZWxs
aW5nUmFuZ2VTdGFydE9mZnNldApAQCAtMjU4MSw3ICsyNTgxLDcgQEAgdm9pZCBFZGl0b3I6Om1h
cmtBbGxNaXNzcGVsbGluZ3NBbmRCYWRHcgogICAgICAgICAgICAgICAgIE5vZGUqIG5vZGUgPSBy
YW5nZVRvUmVwbGFjZS0+c3RhcnRDb250YWluZXIoKTsKICAgICAgICAgICAgICAgICBpbnQgc3Rh
cnRPZmZzZXQgPSByYW5nZVRvUmVwbGFjZS0+c3RhcnRPZmZzZXQoKTsKICAgICAgICAgICAgICAg
ICBpbnQgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyByZXBsYWNlbWVudExlbmd0aDsKLSAgICAg
ICAgICAgICAgICBWZWN0b3I8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnMgPSBub2RlLT5kb2N1bWVu
dCgpLT5tYXJrZXJzRm9yTm9kZShub2RlKTsKKyAgICAgICAgICAgICAgICBWZWN0b3I8RG9jdW1l
bnRNYXJrZXI+IG1hcmtlcnMgPSBub2RlLT5kb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCkt
Pm1hcmtlcnNGb3JOb2RlKG5vZGUpOwogICAgICAgICAgICAgICAgIHNpemVfdCBtYXJrZXJDb3Vu
dCA9IG1hcmtlcnMuc2l6ZSgpOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbWFya2VyQ291bnQ7ICsraSkgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBEb2N1bWVu
dE1hcmtlciYgbWFya2VyID0gbWFya2Vyc1tpXTsKQEAgLTI2MTgsNyArMjYxOCw3IEBAIHZvaWQg
RWRpdG9yOjptYXJrQWxsTWlzc3BlbGxpbmdzQW5kQmFkR3IKICAgICAgICAgICAgICAgICAgICAg
aWYgKHJlc3VsdC0+dHlwZSA9PSBUZXh0Q2hlY2tpbmdUeXBlQ29ycmVjdGlvbikgewogICAgICAg
ICAgICAgICAgICAgICAgICAgLy8gQWRkIGEgbWFya2VyIHNvIHRoYXQgY29ycmVjdGlvbnMgY2Fu
IGVhc2lseSBiZSB1bmRvbmUgYW5kIHdvbid0IGJlIHJlLWNvcnJlY3RlZC4KICAgICAgICAgICAg
ICAgICAgICAgICAgIFJlZlB0cjxSYW5nZT4gcmVwbGFjZWRSYW5nZSA9IFRleHRJdGVyYXRvcjo6
c3VicmFuZ2UocGFyYWdyYXBoUmFuZ2UuZ2V0KCksIHJlc3VsdExvY2F0aW9uLCByZXBsYWNlbWVu
dExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZFJhbmdlLT5zdGFydENv
bnRhaW5lcigpLT5kb2N1bWVudCgpLT5hZGRNYXJrZXIocmVwbGFjZWRSYW5nZS5nZXQoKSwgRG9j
dW1lbnRNYXJrZXI6OlJlcGxhY2VtZW50LCByZXBsYWNlZFN0cmluZyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICByZXBsYWNlZFJhbmdlLT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT5t
YXJrZXJDb250cm9sbGVyKCktPmFkZE1hcmtlcihyZXBsYWNlZFJhbmdlLmdldCgpLCBEb2N1bWVu
dE1hcmtlcjo6UmVwbGFjZW1lbnQsIHJlcGxhY2VkU3RyaW5nKTsKICAgICAgICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI2NTYsNyArMjY1Niw3
IEBAIHZvaWQgRWRpdG9yOjpjaGFuZ2VCYWNrVG9SZXBsYWNlZFN0cmluZygKICAgICBSZWZQdHI8
UmFuZ2U+IHBhcmFncmFwaFJhbmdlID0gcGFyYWdyYXBoQWxpZ25lZFJhbmdlRm9yUmFuZ2Uoc2Vs
ZWN0aW9uLmdldCgpLCBzZWxlY3Rpb25PZmZzZXQsIHBhcmFncmFwaFN0cmluZyk7CiAgICAgcmVw
bGFjZVNlbGVjdGlvbldpdGhUZXh0KHJlcGxhY2VkU3RyaW5nLCBmYWxzZSwgZmFsc2UpOwogICAg
IFJlZlB0cjxSYW5nZT4gY2hhbmdlZFJhbmdlID0gVGV4dEl0ZXJhdG9yOjpzdWJyYW5nZShwYXJh
Z3JhcGhSYW5nZS5nZXQoKSwgc2VsZWN0aW9uT2Zmc2V0LCByZXBsYWNlZFN0cmluZy5sZW5ndGgo
KSk7Ci0gICAgY2hhbmdlZFJhbmdlLT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpLT5hZGRN
YXJrZXIoY2hhbmdlZFJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6UmVwbGFjZW1lbnQsIFN0
cmluZygpKTsKKyAgICBjaGFuZ2VkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCkt
Pm1hcmtlckNvbnRyb2xsZXIoKS0+YWRkTWFya2VyKGNoYW5nZWRSYW5nZS5nZXQoKSwgRG9jdW1l
bnRNYXJrZXI6OlJlcGxhY2VtZW50LCBTdHJpbmcoKSk7CiB9CiAKICNlbmRpZgpJbmRleDogV2Vi
Q29yZS9lZGl0aW5nL1NwbGl0VGV4dE5vZGVDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL2VkaXRpbmcvU3BsaXRUZXh0Tm9kZUNvbW1hbmQuY3BwCShyZXZpc2lvbiA2NTc3OCkKKysr
IFdlYkNvcmUvZWRpdGluZy9TcGxpdFRleHROb2RlQ29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTYwLDcgKzYwLDcgQEAgdm9pZCBTcGxpdFRleHROb2RlQ29tbWFuZDo6ZG9BcHBseSgpCiAK
ICAgICBtX3RleHQxID0gVGV4dDo6Y3JlYXRlKGRvY3VtZW50KCksIHByZWZpeFRleHQpOwogICAg
IEFTU0VSVChtX3RleHQxKTsKLSAgICBkb2N1bWVudCgpLT5jb3B5TWFya2VycyhtX3RleHQyLmdl
dCgpLCAwLCBtX29mZnNldCwgbV90ZXh0MS5nZXQoKSwgMCk7CisgICAgZG9jdW1lbnQoKS0+bWFy
a2VyQ29udHJvbGxlcigpLT5jb3B5TWFya2VycyhtX3RleHQyLmdldCgpLCAwLCBtX29mZnNldCwg
bV90ZXh0MS5nZXQoKSwgMCk7CiAKICAgICBpbnNlcnRUZXh0MUFuZFRyaW1UZXh0MigpOwogfQpA
QCAtNzgsNyArNzgsNyBAQCB2b2lkIFNwbGl0VGV4dE5vZGVDb21tYW5kOjpkb1VuYXBwbHkoKQog
ICAgIG1fdGV4dDItPmluc2VydERhdGEoMCwgcHJlZml4VGV4dCwgZWMpOwogICAgIEFTU0VSVCgh
ZWMpOwogCi0gICAgZG9jdW1lbnQoKS0+Y29weU1hcmtlcnMobV90ZXh0MS5nZXQoKSwgMCwgcHJl
Zml4VGV4dC5sZW5ndGgoKSwgbV90ZXh0Mi5nZXQoKSwgMCk7CisgICAgZG9jdW1lbnQoKS0+bWFy
a2VyQ29udHJvbGxlcigpLT5jb3B5TWFya2VycyhtX3RleHQxLmdldCgpLCAwLCBwcmVmaXhUZXh0
Lmxlbmd0aCgpLCBtX3RleHQyLmdldCgpLCAwKTsKICAgICBtX3RleHQxLT5yZW1vdmUoZWMpOwog
fQogCkluZGV4OiBXZWJDb3JlL3BhZ2UvRnJhbWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGFnZS9GcmFtZS5jcHAJKHJldmlzaW9uIDY1Nzc4KQorKysgV2ViQ29yZS9wYWdlL0ZyYW1lLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAgdW5zaWduZWQgRnJhbWU6Om1h
cmtBbGxNYXRjaGVzRm9yVGV4dChjbwogICAgICAgICAvLyBPbmx5IHRyZWF0IHRoZSByZXN1bHQg
YXMgYSBtYXRjaCBpZiBpdCBpcyB2aXNpYmxlCiAgICAgICAgIGlmIChlZGl0b3IoKS0+aW5zaWRl
VmlzaWJsZUFyZWEocmVzdWx0UmFuZ2UuZ2V0KCkpKSB7CiAgICAgICAgICAgICArK21hdGNoQ291
bnQ7Ci0gICAgICAgICAgICBkb2N1bWVudCgpLT5hZGRNYXJrZXIocmVzdWx0UmFuZ2UuZ2V0KCks
IERvY3VtZW50TWFya2VyOjpUZXh0TWF0Y2gpOworICAgICAgICAgICAgZG9jdW1lbnQoKS0+bWFy
a2VyQ29udHJvbGxlcigpLT5hZGRNYXJrZXIocmVzdWx0UmFuZ2UuZ2V0KCksIERvY3VtZW50TWFy
a2VyOjpUZXh0TWF0Y2gpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gU3RvcCBsb29raW5nIGlm
IHdlIGhpdCB0aGUgc3BlY2lmaWVkIGxpbWl0LiBBIGxpbWl0IG9mIDAgbWVhbnMgbm8gbGltaXQu
CkBAIC0xMzE3LDcgKzEzMTcsNyBAQCB2b2lkIEZyYW1lOjpzZXRNYXJrZWRUZXh0TWF0Y2hlc0Fy
ZUhpZ2hsCiAgICAgICAgIHJldHVybjsKIAogICAgIG1faGlnaGxpZ2h0VGV4dE1hdGNoZXMgPSBm
bGFnOwotICAgIGRvY3VtZW50KCktPnJlcGFpbnRNYXJrZXJzKERvY3VtZW50TWFya2VyOjpUZXh0
TWF0Y2gpOworICAgIGRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xsZXIoKS0+cmVwYWludE1hcmtl
cnMoRG9jdW1lbnRNYXJrZXI6OlRleHRNYXRjaCk7CiB9CiAKIHZvaWQgRnJhbWU6OnNldERPTVdp
bmRvdyhET01XaW5kb3cqIGRvbVdpbmRvdykKQEAgLTE0NjMsMTYgKzE0NjMsMTYgQEAgdm9pZCBG
cmFtZTo6cmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlvbihjbwogICAgICAgICAvLyBUaGlzIG9ubHkg
ZXJhc2VzIG1hcmtlcnMgdGhhdCBhcmUgaW4gdGhlIGZpcnN0IHVuaXQgKHdvcmQgb3Igc2VudGVu
Y2UpIG9mIHRoZSBzZWxlY3Rpb24uCiAgICAgICAgIC8vIFBlcmhhcHMgcGVjdWxpYXIsIGJ1dCBp
dCBtYXRjaGVzIEFwcEtpdC4KICAgICAgICAgaWYgKFJlZlB0cjxSYW5nZT4gd29yZFJhbmdlID0g
bmV3QWRqYWNlbnRXb3Jkcy50b05vcm1hbGl6ZWRSYW5nZSgpKQotICAgICAgICAgICAgZG9jdW1l
bnQoKS0+cmVtb3ZlTWFya2Vycyh3b3JkUmFuZ2UuZ2V0KCksIERvY3VtZW50TWFya2VyOjpTcGVs
bGluZyk7CisgICAgICAgICAgICBkb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCktPnJlbW92
ZU1hcmtlcnMod29yZFJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6U3BlbGxpbmcpOwogICAg
ICAgICBpZiAoUmVmUHRyPFJhbmdlPiBzZW50ZW5jZVJhbmdlID0gbmV3U2VsZWN0ZWRTZW50ZW5j
ZS50b05vcm1hbGl6ZWRSYW5nZSgpKQotICAgICAgICAgICAgZG9jdW1lbnQoKS0+cmVtb3ZlTWFy
a2VycyhzZW50ZW5jZVJhbmdlLmdldCgpLCBEb2N1bWVudE1hcmtlcjo6R3JhbW1hcik7CisgICAg
ICAgICAgICBkb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCktPnJlbW92ZU1hcmtlcnMoc2Vu
dGVuY2VSYW5nZS5nZXQoKSwgRG9jdW1lbnRNYXJrZXI6OkdyYW1tYXIpOwogICAgIH0KIAogICAg
IC8vIFdoZW4gY29udGludW91cyBzcGVsbCBjaGVja2luZyBpcyBvZmYsIGV4aXN0aW5nIG1hcmtl
cnMgZGlzYXBwZWFyIGFmdGVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KICAgICBpZiAoIWlzQ29u
dGludW91c1NwZWxsQ2hlY2tpbmdFbmFibGVkKQotICAgICAgICBkb2N1bWVudCgpLT5yZW1vdmVN
YXJrZXJzKERvY3VtZW50TWFya2VyOjpTcGVsbGluZyk7CisgICAgICAgIGRvY3VtZW50KCktPm1h
cmtlckNvbnRyb2xsZXIoKS0+cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6U3BlbGxpbmcp
OwogICAgIGlmICghaXNDb250aW51b3VzR3JhbW1hckNoZWNraW5nRW5hYmxlZCkKLSAgICAgICAg
ZG9jdW1lbnQoKS0+cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6R3JhbW1hcik7CisgICAg
ICAgIGRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xsZXIoKS0+cmVtb3ZlTWFya2VycyhEb2N1bWVu
dE1hcmtlcjo6R3JhbW1hcik7CiAKICAgICBlZGl0b3IoKS0+cmVzcG9uZFRvQ2hhbmdlZFNlbGVj
dGlvbihvbGRTZWxlY3Rpb24pOwogfQpJbmRleDogV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHJldmlzaW9uIDY1Nzc4
KQorKysgV2ViQ29yZS9wYWdlL0ZyYW1lVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE3NDMs
NyArMTc0Myw3IEBAIHZvaWQgRnJhbWVWaWV3OjppbnZhbGlkYXRlU2Nyb2xsYmFyUmVjdCgKIAog
dm9pZCBGcmFtZVZpZXc6OmdldFRpY2ttYXJrcyhWZWN0b3I8SW50UmVjdD4mIHRpY2ttYXJrcykg
Y29uc3QKIHsKLSAgICB0aWNrbWFya3MgPSBmcmFtZSgpLT5kb2N1bWVudCgpLT5yZW5kZXJlZFJl
Y3RzRm9yTWFya2VycyhEb2N1bWVudE1hcmtlcjo6VGV4dE1hdGNoKTsKKyAgICB0aWNrbWFya3Mg
PSBmcmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCktPnJlbmRlcmVkUmVjdHNG
b3JNYXJrZXJzKERvY3VtZW50TWFya2VyOjpUZXh0TWF0Y2gpOwogfQogCiBJbnRSZWN0IEZyYW1l
Vmlldzo6d2luZG93UmVzaXplclJlY3QoKSBjb25zdApAQCAtMTk1MCw3ICsxOTUwLDcgQEAgdm9p
ZCBGcmFtZVZpZXc6OnBhaW50Q29udGVudHMoR3JhcGhpY3NDbwogCiAgICAgUGFpbnRCZWhhdmlv
ciBvbGRQYWludEJlaGF2aW9yID0gbV9wYWludEJlaGF2aW9yOwogICAgIGlmIChtX3BhaW50QmVo
YXZpb3IgPT0gUGFpbnRCZWhhdmlvck5vcm1hbCkKLSAgICAgICAgZG9jdW1lbnQtPmludmFsaWRh
dGVSZW5kZXJlZFJlY3RzRm9yTWFya2Vyc0luUmVjdChyZWN0KTsKKyAgICAgICAgZG9jdW1lbnQt
Pm1hcmtlckNvbnRyb2xsZXIoKS0+aW52YWxpZGF0ZVJlbmRlcmVkUmVjdHNGb3JNYXJrZXJzSW5S
ZWN0KHJlY3QpOwogCiAgICAgaWYgKGRvY3VtZW50LT5wcmludGluZygpKQogICAgICAgICBtX3Bh
aW50QmVoYXZpb3IgfD0gUGFpbnRCZWhhdmlvckZsYXR0ZW5Db21wb3NpdGluZ0xheWVyczsKSW5k
ZXg6IFdlYkNvcmUvcGFnZS9QYWdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvUGFn
ZS5jcHAJKHJldmlzaW9uIDY1Nzc4KQorKysgV2ViQ29yZS9wYWdlL1BhZ2UuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01NDAsNyArNTQwLDcgQEAgdm9pZCBQYWdlOjp1bm1hcmtBbGxUZXh0TWF0Y2hl
cygpCiAKICAgICBGcmFtZSogZnJhbWUgPSBtYWluRnJhbWUoKTsKICAgICBkbyB7Ci0gICAgICAg
IGZyYW1lLT5kb2N1bWVudCgpLT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpUZXh0TWF0
Y2gpOworICAgICAgICBmcmFtZS0+ZG9jdW1lbnQoKS0+bWFya2VyQ29udHJvbGxlcigpLT5yZW1v
dmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpUZXh0TWF0Y2gpOwogICAgICAgICBmcmFtZSA9IGlu
Y3JlbWVudEZyYW1lKGZyYW1lLCB0cnVlLCBmYWxzZSk7CiAgICAgfSB3aGlsZSAoZnJhbWUpOwog
fQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSGl0VGVzdFJlc3VsdC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvSGl0VGVzdFJlc3VsdC5jcHAJKHJldmlzaW9uIDY1Nzc4KQor
KysgV2ViQ29yZS9yZW5kZXJpbmcvSGl0VGVzdFJlc3VsdC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTE2Niw3ICsxNjYsNyBAQCBTdHJpbmcgSGl0VGVzdFJlc3VsdDo6c3BlbGxpbmdUb29sVGlwKFRl
CiAgICAgaWYgKCFtX2lubmVyTm9uU2hhcmVkTm9kZSkKICAgICAgICAgcmV0dXJuIFN0cmluZygp
OwogICAgIAotICAgIERvY3VtZW50TWFya2VyKiBtYXJrZXIgPSBtX2lubmVyTm9uU2hhcmVkTm9k
ZS0+ZG9jdW1lbnQoKS0+bWFya2VyQ29udGFpbmluZ1BvaW50KG1fcG9pbnQsIERvY3VtZW50TWFy
a2VyOjpHcmFtbWFyKTsKKyAgICBEb2N1bWVudE1hcmtlciogbWFya2VyID0gbV9pbm5lck5vblNo
YXJlZE5vZGUtPmRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xsZXIoKS0+bWFya2VyQ29udGFpbmlu
Z1BvaW50KG1fcG9pbnQsIERvY3VtZW50TWFya2VyOjpHcmFtbWFyKTsKICAgICBpZiAoIW1hcmtl
cikKICAgICAgICAgcmV0dXJuIFN0cmluZygpOwogCkBAIC0xODIsNyArMTgyLDcgQEAgU3RyaW5n
IEhpdFRlc3RSZXN1bHQ6OnJlcGxhY2VkU3RyaW5nKCkgYwogICAgIGlmICghbV9pbm5lck5vblNo
YXJlZE5vZGUpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsKICAgICAKLSAgICBEb2N1bWVudE1h
cmtlciogbWFya2VyID0gbV9pbm5lck5vblNoYXJlZE5vZGUtPmRvY3VtZW50KCktPm1hcmtlckNv
bnRhaW5pbmdQb2ludChtX3BvaW50LCBEb2N1bWVudE1hcmtlcjo6UmVwbGFjZW1lbnQpOworICAg
IERvY3VtZW50TWFya2VyKiBtYXJrZXIgPSBtX2lubmVyTm9uU2hhcmVkTm9kZS0+ZG9jdW1lbnQo
KS0+bWFya2VyQ29udHJvbGxlcigpLT5tYXJrZXJDb250YWluaW5nUG9pbnQobV9wb2ludCwgRG9j
dW1lbnRNYXJrZXI6OlJlcGxhY2VtZW50KTsKICAgICBpZiAoIW1hcmtlcikKICAgICAgICAgcmV0
dXJuIFN0cmluZygpOwogICAgIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJv
eC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJ
KHJldmlzaW9uIDY1Nzc4KQorKysgV2ViQ29yZS9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTgxMCw3ICs4MTAsNyBAQCB2b2lkIElubGluZVRleHRCb3g6OnBh
aW50U3BlbGxpbmdPckdyYW1tCiAgICAgICAgIGlmIChncmFtbWFyKSB7CiAgICAgICAgICAgICBt
YXJrZXJSZWN0Lm1vdmUoLXR4LCAtdHkpOwogICAgICAgICAgICAgbWFya2VyUmVjdCA9IHJlbmRl
cmVyKCktPmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxvYXRSZWN0KG1hcmtlclJlY3QpKS5lbmNsb3Np
bmdCb3VuZGluZ0JveCgpOwotICAgICAgICAgICAgcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+c2V0
UmVuZGVyZWRSZWN0Rm9yTWFya2VyKHJlbmRlcmVyKCktPm5vZGUoKSwgbWFya2VyLCBtYXJrZXJS
ZWN0KTsKKyAgICAgICAgICAgIHJlbmRlcmVyKCktPmRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xs
ZXIoKS0+c2V0UmVuZGVyZWRSZWN0Rm9yTWFya2VyKHJlbmRlcmVyKCktPm5vZGUoKSwgbWFya2Vy
LCBtYXJrZXJSZWN0KTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTg0OCw3ICs4NDgsNyBA
QCB2b2lkIElubGluZVRleHRCb3g6OnBhaW50VGV4dE1hdGNoTWFya2VyCiAgICAgLy8gQWx3YXlz
IGNvbXB1dGUgYW5kIHN0b3JlIHRoZSByZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcmtlci4g
VGhlIGNvbXB1dGVkIHJlY3QgaXMgaW4gYWJzb2x1dGUgY29vcmRpbmF0ZXMuCiAgICAgSW50UmVj
dCBtYXJrZXJSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChmb250LnNlbGVjdGlvblJlY3RGb3JUZXh0
KHJ1biwgSW50UG9pbnQobV94LCB5KSwgaCwgc1BvcywgZVBvcykpOwogICAgIG1hcmtlclJlY3Qg
PSByZW5kZXJlcigpLT5sb2NhbFRvQWJzb2x1dGVRdWFkKEZsb2F0UmVjdChtYXJrZXJSZWN0KSku
ZW5jbG9zaW5nQm91bmRpbmdCb3goKTsKLSAgICByZW5kZXJlcigpLT5kb2N1bWVudCgpLT5zZXRS
ZW5kZXJlZFJlY3RGb3JNYXJrZXIocmVuZGVyZXIoKS0+bm9kZSgpLCBtYXJrZXIsIG1hcmtlclJl
Y3QpOworICAgIHJlbmRlcmVyKCktPmRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xsZXIoKS0+c2V0
UmVuZGVyZWRSZWN0Rm9yTWFya2VyKHJlbmRlcmVyKCktPm5vZGUoKSwgbWFya2VyLCBtYXJrZXJS
ZWN0KTsKICAgICAgCiAgICAgLy8gT3B0aW9uYWxseSBoaWdobGlnaHQgdGhlIHRleHQKICAgICBp
ZiAocmVuZGVyZXIoKS0+ZnJhbWUoKS0+bWFya2VkVGV4dE1hdGNoZXNBcmVIaWdobGlnaHRlZCgp
KSB7CkBAIC04NzcsNyArODc3LDcgQEAgdm9pZCBJbmxpbmVUZXh0Qm94Ojpjb21wdXRlUmVjdEZv
clJlcGxhYwogICAgIC8vIENvbXB1dGUgYW5kIHN0b3JlIHRoZSByZWN0IGFzc29jaWF0ZWQgd2l0
aCB0aGlzIG1hcmtlci4KICAgICBJbnRSZWN0IG1hcmtlclJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0
KGZvbnQuc2VsZWN0aW9uUmVjdEZvclRleHQocnVuLCBzdGFydFBvaW50LCBoLCBzUG9zLCBlUG9z
KSk7CiAgICAgbWFya2VyUmVjdCA9IHJlbmRlcmVyKCktPmxvY2FsVG9BYnNvbHV0ZVF1YWQoRmxv
YXRSZWN0KG1hcmtlclJlY3QpKS5lbmNsb3NpbmdCb3VuZGluZ0JveCgpOwotICAgIHJlbmRlcmVy
KCktPmRvY3VtZW50KCktPnNldFJlbmRlcmVkUmVjdEZvck1hcmtlcihyZW5kZXJlcigpLT5ub2Rl
KCksIG1hcmtlciwgbWFya2VyUmVjdCk7CisgICAgcmVuZGVyZXIoKS0+ZG9jdW1lbnQoKS0+bWFy
a2VyQ29udHJvbGxlcigpLT5zZXRSZW5kZXJlZFJlY3RGb3JNYXJrZXIocmVuZGVyZXIoKS0+bm9k
ZSgpLCBtYXJrZXIsIG1hcmtlclJlY3QpOwogfQogICAgIAogdm9pZCBJbmxpbmVUZXh0Qm94Ojpw
YWludERvY3VtZW50TWFya2VycyhHcmFwaGljc0NvbnRleHQqIHB0LCBpbnQgdHgsIGludCB0eSwg
UmVuZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBGb250JiBmb250LCBib29sIGJhY2tncm91bmQpCkBA
IC04ODUsNyArODg1LDcgQEAgdm9pZCBJbmxpbmVUZXh0Qm94OjpwYWludERvY3VtZW50TWFya2Vy
cwogICAgIGlmICghcmVuZGVyZXIoKS0+bm9kZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBW
ZWN0b3I8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnMgPSByZW5kZXJlcigpLT5kb2N1bWVudCgpLT5t
YXJrZXJzRm9yTm9kZShyZW5kZXJlcigpLT5ub2RlKCkpOworICAgIFZlY3RvcjxEb2N1bWVudE1h
cmtlcj4gbWFya2VycyA9IHJlbmRlcmVyKCktPmRvY3VtZW50KCktPm1hcmtlckNvbnRyb2xsZXIo
KS0+bWFya2Vyc0Zvck5vZGUocmVuZGVyZXIoKS0+bm9kZSgpKTsKICAgICBWZWN0b3I8RG9jdW1l
bnRNYXJrZXI+OjppdGVyYXRvciBtYXJrZXJJdCA9IG1hcmtlcnMuYmVnaW4oKTsKIAogICAgIC8v
IEdpdmUgYW55IGRvY3VtZW50IG1hcmtlcnMgdGhhdCB0b3VjaCB0aGlzIHJ1biBhIGNoYW5jZSB0
byBkcmF3IGJlZm9yZSB0aGUgdGV4dCBoYXMgYmVlbiBkcmF3bi4KSW5kZXg6IFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVy
aW5nL1NWR0lubGluZVRleHRCb3guY3BwCShyZXZpc2lvbiA2NTc3OCkKKysrIFdlYkNvcmUvcmVu
ZGVyaW5nL1NWR0lubGluZVRleHRCb3guY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MDgsNyArNDA4
LDcgQEAgdm9pZCBTVkdJbmxpbmVUZXh0Qm94Ojpjb21wdXRlVGV4dE1hdGNoTQogICAgICAgICBy
ZXR1cm47CiAKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSByZW5kZXJlcigpLT5kb2N1bWVudCgp
OwotICAgIFZlY3RvcjxEb2N1bWVudE1hcmtlcj4gbWFya2VycyA9IGRvY3VtZW50LT5tYXJrZXJz
Rm9yTm9kZShyZW5kZXJlcigpLT5ub2RlKCkpOworICAgIFZlY3RvcjxEb2N1bWVudE1hcmtlcj4g
bWFya2VycyA9IGRvY3VtZW50LT5tYXJrZXJDb250cm9sbGVyKCktPm1hcmtlcnNGb3JOb2RlKHJl
bmRlcmVyKCktPm5vZGUoKSk7CiAKICAgICBWZWN0b3I8RG9jdW1lbnRNYXJrZXI+OjppdGVyYXRv
ciBtYXJrZXJFbmQgPSBtYXJrZXJzLmVuZCgpOwogICAgIGZvciAoVmVjdG9yPERvY3VtZW50TWFy
a2VyPjo6aXRlcmF0b3IgbWFya2VySXQgPSBtYXJrZXJzLmJlZ2luKCk7IG1hcmtlckl0ICE9IG1h
cmtlckVuZDsgKyttYXJrZXJJdCkgewpAQCAtNDMwLDcgKzQzMCw3IEBAIHZvaWQgU1ZHSW5saW5l
VGV4dEJveDo6Y29tcHV0ZVRleHRNYXRjaE0KICAgICAgICAgaWYgKCFtX2NodW5rVHJhbnNmb3Jt
YXRpb24uaXNJZGVudGl0eSgpKQogICAgICAgICAgICAgbWFya2VyUmVjdCA9IG1fY2h1bmtUcmFu
c2Zvcm1hdGlvbi5tYXBSZWN0KG1hcmtlclJlY3QpOwogCi0gICAgICAgIGRvY3VtZW50LT5zZXRS
ZW5kZXJlZFJlY3RGb3JNYXJrZXIobm9kZSwgbWFya2VyLCByZW5kZXJlcigpLT5sb2NhbFRvQWJz
b2x1dGVRdWFkKG1hcmtlclJlY3QpLmVuY2xvc2luZ0JvdW5kaW5nQm94KCkpOworICAgICAgICBk
b2N1bWVudC0+bWFya2VyQ29udHJvbGxlcigpLT5zZXRSZW5kZXJlZFJlY3RGb3JNYXJrZXIobm9k
ZSwgbWFya2VyLCByZW5kZXJlcigpLT5sb2NhbFRvQWJzb2x1dGVRdWFkKG1hcmtlclJlY3QpLmVu
Y2xvc2luZ0JvdW5kaW5nQm94KCkpOwogICAgIH0KIH0KIApJbmRleDogV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCShyZXZp
c2lvbiA2NTc3OSkKKysrIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkK
QEAgLTEsMyArMSwxOSBAQAorMjAxMC0wOC0yMSAgRGFuaWVsIEJhdGVzICA8ZGJhdGVzQHJpbS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRW5j
YXBzdWxhdGUgZG9jdW1lbnQgbWFya2VyIG1hbmFnZW1lbnQgaW50byBEb2N1bWVudE1hcmtlckNv
bnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTQ0MzgzCisKKyAgICAgICAgTW9kaWZ5IGNhbGwgc2l0ZXMgaW4gdGhlIENocm9taXVtIHBvcnQg
dG8gdXNlIERvY3VtZW50TWFya2VyQ29udHJvbGxlci4KKworICAgICAgICBObyBmdW5jdGlvbmFs
aXR5IHdhcyBjaGFuZ2VkLCBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBzcmMvV2ViRnJh
bWVJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViRnJhbWVJbXBsOjpzdG9wRmluZGluZyk6
CisgICAgICAgIChXZWJLaXQ6OldlYkZyYW1lSW1wbDo6YWRkTWFya2VyKToKKyAgICAgICAgKFdl
YktpdDo6V2ViRnJhbWVJbXBsOjpzZXRNYXJrZXJBY3RpdmUpOgorCiAyMDEwLTA4LTIwICBLaW51
a28gWWFzdWRhICA8a2ludWtvQGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJldmlld2VkOyBi
dWlsZCBmaXggZm9yIGNocm9taXVtIChhbmQgcmVtb3ZlIGR1cGxpY2F0ZWQgQ2hhbmdlTG9nIGVu
dHJ5KS4KSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV2ViRnJhbWVJbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZyYW1lSW1wbC5jcHAJKHJldmlzaW9uIDY1
Nzc4KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJGcmFtZUltcGwuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNDI5LDcgKzE0MjksNyBAQCB2b2lkIFdlYkZyYW1lSW1wbDo6c3RvcEZpbmRpbmco
Ym9vbCBjbGVhCiAgICAgY2FuY2VsUGVuZGluZ1Njb3BpbmdFZmZvcnQoKTsKIAogICAgIC8vIFJl
bW92ZSBhbGwgbWFya2VycyBmb3IgbWF0Y2hlcyBmb3VuZCBhbmQgdHVybiBvZmYgdGhlIGhpZ2hs
aWdodGluZy4KLSAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5yZW1vdmVNYXJrZXJzKERvY3VtZW50
TWFya2VyOjpUZXh0TWF0Y2gpOworICAgIGZyYW1lKCktPmRvY3VtZW50KCktPm1hcmtlckNvbnRy
b2xsZXIoKS0+cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6VGV4dE1hdGNoKTsKICAgICBm
cmFtZSgpLT5zZXRNYXJrZWRUZXh0TWF0Y2hlc0FyZUhpZ2hsaWdodGVkKGZhbHNlKTsKIAogICAg
IC8vIExldCB0aGUgZnJhbWUga25vdyB0aGF0IHdlIGRvbid0IHdhbnQgdGlja21hcmtzIG9yIGhp
Z2hsaWdodGluZyBhbnltb3JlLgpAQCAtMjA2MCwxNCArMjA2MCwxNCBAQCB2b2lkIFdlYkZyYW1l
SW1wbDo6YWRkTWFya2VyKFJhbmdlKiByYW5nCiAgICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0
ID4gbWFya2VyLnN0YXJ0T2Zmc2V0KSB7CiAgICAgICAgICAgICAvLyBGaW5kIHRoZSBub2RlIHRv
IGFkZCBhIG1hcmtlciB0byBhbmQgYWRkIGl0LgogICAgICAgICAgICAgTm9kZSogbm9kZSA9IHRl
eHRQaWVjZS0+c3RhcnRDb250YWluZXIoZXhjZXB0aW9uKTsKLSAgICAgICAgICAgIGZyYW1lKCkt
PmRvY3VtZW50KCktPmFkZE1hcmtlcihub2RlLCBtYXJrZXIpOworICAgICAgICAgICAgZnJhbWUo
KS0+ZG9jdW1lbnQoKS0+bWFya2VyQ29udHJvbGxlcigpLT5hZGRNYXJrZXIobm9kZSwgbWFya2Vy
KTsKIAogICAgICAgICAgICAgLy8gUmVuZGVyZWQgcmVjdHMgZm9yIG1hcmtlcnMgaW4gV2ViS2l0
IGFyZSBub3QgcG9wdWxhdGVkIHVudGlsIGVhY2ggdGltZQogICAgICAgICAgICAgLy8gdGhlIG1h
cmtlcnMgYXJlIHBhaW50ZWQuIEhvd2V2ZXIsIHdlIG5lZWQgaXQgdG8gaGFwcGVuIHNvb25lciwg
YmVjYXVzZQogICAgICAgICAgICAgLy8gdGhlIHdob2xlIHB1cnBvc2Ugb2YgdGlja21hcmtzIG9u
IHRoZSBzY3JvbGxiYXIgaXMgdG8gc2hvdyB3aGVyZQogICAgICAgICAgICAgLy8gbWF0Y2hlcyBv
ZmYtc2NyZWVuIGFyZSAodGhhdCBoYXZlbid0IGJlZW4gcGFpbnRlZCB5ZXQpLgotICAgICAgICAg
ICAgVmVjdG9yPERvY3VtZW50TWFya2VyPiBtYXJrZXJzID0gZnJhbWUoKS0+ZG9jdW1lbnQoKS0+
bWFya2Vyc0Zvck5vZGUobm9kZSk7Ci0gICAgICAgICAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5z
ZXRSZW5kZXJlZFJlY3RGb3JNYXJrZXIoCisgICAgICAgICAgICBWZWN0b3I8RG9jdW1lbnRNYXJr
ZXI+IG1hcmtlcnMgPSBmcmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJDb250cm9sbGVyKCktPm1h
cmtlcnNGb3JOb2RlKG5vZGUpOworICAgICAgICAgICAgZnJhbWUoKS0+ZG9jdW1lbnQoKS0+bWFy
a2VyQ29udHJvbGxlcigpLT5zZXRSZW5kZXJlZFJlY3RGb3JNYXJrZXIoCiAgICAgICAgICAgICAg
ICAgdGV4dFBpZWNlLT5zdGFydENvbnRhaW5lcihleGNlcHRpb24pLAogICAgICAgICAgICAgICAg
IG1hcmtlcnNbbWFya2Vycy5zaXplKCkgLSAxXSwKICAgICAgICAgICAgICAgICByYW5nZS0+Ym91
bmRpbmdCb3goKSk7CkBAIC0yMDgxLDcgKzIwODEsNyBAQCB2b2lkIFdlYkZyYW1lSW1wbDo6c2V0
TWFya2VyQWN0aXZlKFJhbmdlCiAgICAgaWYgKCFyYW5nZSB8fCByYW5nZS0+Y29sbGFwc2VkKGVj
KSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZnJhbWUoKS0+ZG9jdW1lbnQoKS0+c2V0TWFya2Vy
c0FjdGl2ZShyYW5nZSwgYWN0aXZlKTsKKyAgICBmcmFtZSgpLT5kb2N1bWVudCgpLT5tYXJrZXJD
b250cm9sbGVyKCktPnNldE1hcmtlcnNBY3RpdmUocmFuZ2UsIGFjdGl2ZSk7CiB9CiAKIGludCBX
ZWJGcmFtZUltcGw6Om9yZGluYWxPZkZpcnN0TWF0Y2hGb3JGcmFtZShXZWJGcmFtZUltcGwqIGZy
YW1lKSBjb25zdApJbmRleDogV2ViS2l0L2VmbC9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2VmbC9DaGFuZ2VMb2cJKHJldmlzaW9uIDY1Nzc5KQorKysgV2ViS2l0L2VmbC9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNyBAQAorMjAxMC0wOC0yMSAgRGFuaWVsIEJh
dGVzICA8ZGJhdGVzQHJpbS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgRW5jYXBzdWxhdGUgZG9jdW1lbnQgbWFya2VyIG1hbmFnZW1lbnQgaW50
byBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTQ0MzgzCisKKyAgICAgICAgTW9kaWZ5IGNhbGwgc2l0ZXMgaW4g
dGhlIEVGTCBwb3J0IHRvIHVzZSBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuCisKKyAgICAgICAg
Tm8gZnVuY3Rpb25hbGl0eSB3YXMgY2hhbmdlZCwgc28gbm8gbmV3IHRlc3RzLgorCisgICAgICAg
ICogZXdrL2V3a19mcmFtZS5jcHA6CisgICAgICAgIChld2tfZnJhbWVfdGV4dF9tYXRjaGVzX3Vu
bWFya19hbGwpOgorCiAyMDEwLTA4LTIwICBMZWFuZHJvIFBlcmVpcmEgIDxsZWFuZHJvQHByb2Z1
c2lvbi5tb2JpPgogCiAgICAgICAgIFtFRkxdIFVucmV2aWV3ZWQuIEZpeCBidWlsZCB3aGVuIHVz
aW5nIEdOVSBnb2xkLgpJbmRleDogV2ViS2l0L2VmbC9ld2svZXdrX2ZyYW1lLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvZWZsL2V3ay9ld2tfZnJhbWUuY3BwCShyZXZpc2lvbiA2NTc3OCkKKysr
IFdlYktpdC9lZmwvZXdrL2V3a19mcmFtZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc4Niw3ICs3
ODYsNyBAQCBFaW5hX0Jvb2wgZXdrX2ZyYW1lX3RleHRfbWF0Y2hlc191bm1hcmtfCiAgICAgRVdL
X0ZSQU1FX1NEX0dFVF9PUl9SRVRVUk4obywgc2QsIEVJTkFfRkFMU0UpOwogICAgIEVJTkFfU0FG
RVRZX09OX05VTExfUkVUVVJOX1ZBTChzZC0+ZnJhbWUsIEVJTkFfRkFMU0UpOwogCi0gICAgc2Qt
PmZyYW1lLT5kb2N1bWVudCgpLT5yZW1vdmVNYXJrZXJzKFdlYkNvcmU6OkRvY3VtZW50TWFya2Vy
OjpUZXh0TWF0Y2gpOworICAgIHNkLT5mcmFtZS0+ZG9jdW1lbnQoKS0+bWFya2VyQ29udHJvbGxl
cigpLT5yZW1vdmVNYXJrZXJzKFdlYkNvcmU6OkRvY3VtZW50TWFya2VyOjpUZXh0TWF0Y2gpOwog
ICAgIHJldHVybiBFSU5BX1RSVUU7CiB9CiAKSW5kZXg6IFdlYktpdC9tYWMvQ2hhbmdlTG9nCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC9tYWMvQ2hhbmdlTG9nCShyZXZpc2lvbiA2NTc3OSkKKysrIFdl
YktpdC9tYWMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjEgQEAKKzIwMTAt
MDgtMjEgIERhbmllbCBCYXRlcyAgPGRiYXRlc0ByaW0uY29tPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEVuY2Fwc3VsYXRlIGRvY3VtZW50IG1hcmtl
ciBtYW5hZ2VtZW50IGludG8gRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NDM4MworCisgICAgICAgIE1vZGlm
eSBjYWxsIHNpdGVzIGluIHRoZSBBcHBsZSBNYWMgcG9ydCB0byB1c2UgRG9jdW1lbnRNYXJrZXJD
b250cm9sbGVyLgorCisgICAgICAgIE5vIGZ1bmN0aW9uYWxpdHkgd2FzIGNoYW5nZWQsIHNvIG5v
IG5ldyB0ZXN0cy4KKworICAgICAgICAqIFdlYlZpZXcvV2ViRnJhbWUubW06CisgICAgICAgICgt
W1dlYkZyYW1lIF91bm1hcmtBbGxCYWRHcmFtbWFyXSk6CisgICAgICAgICgtW1dlYkZyYW1lIF91
bm1hcmtBbGxNaXNzcGVsbGluZ3NdKToKKyAgICAgICAgKiBXZWJWaWV3L1dlYkhUTUxWaWV3Lm1t
OgorICAgICAgICAoLVtXZWJIVE1MVmlldyB1bm1hcmtBbGxUZXh0TWF0Y2hlc10pOgorICAgICAg
ICAoLVtXZWJIVE1MVmlldyByZWN0c0ZvclRleHRNYXRjaGVzXSk6CisKIDIwMTAtMDgtMTkgIERh
dmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAogICAgICAgICA8aHR0cDovL3dlYmtp
dC5vcmcvYi80NDI4NT4gRml4IGNvbXBpbGF0aW9uIHdpdGggTkVUU0NBUEVfUExVR0lOX0FQSSBk
aXNhYmxlZApJbmRleDogV2ViS2l0L21hYy9XZWJWaWV3L1dlYkZyYW1lLm1tCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9tYWMvV2ViVmlldy9XZWJGcmFtZS5tbQkocmV2aXNpb24gNjU3NzgpCisrKyBX
ZWJLaXQvbWFjL1dlYlZpZXcvV2ViRnJhbWUubW0JKHdvcmtpbmcgY29weSkKQEAgLTM5NSw3ICsz
OTUsNyBAQCAtICh2b2lkKV91bm1hcmtBbGxCYWRHcmFtbWFyCiAgICAgRnJhbWUqIGNvcmVGcmFt
ZSA9IF9wcml2YXRlLT5jb3JlRnJhbWU7CiAgICAgZm9yIChGcmFtZSogZnJhbWUgPSBjb3JlRnJh
bWU7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dChjb3JlRnJhbWUp
KSB7CiAgICAgICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKSkK
LSAgICAgICAgICAgIGRvY3VtZW50LT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpHcmFt
bWFyKTsKKyAgICAgICAgICAgIGRvY3VtZW50LT5tYXJrZXJDb250cm9sbGVyKCktPnJlbW92ZU1h
cmtlcnMoRG9jdW1lbnRNYXJrZXI6OkdyYW1tYXIpOwogICAgIH0KIH0KICNlbmRpZgpAQCAtNDA1
LDcgKzQwNSw3IEBAIC0gKHZvaWQpX3VubWFya0FsbE1pc3NwZWxsaW5ncwogICAgIEZyYW1lKiBj
b3JlRnJhbWUgPSBfcHJpdmF0ZS0+Y29yZUZyYW1lOwogICAgIGZvciAoRnJhbWUqIGZyYW1lID0g
Y29yZUZyYW1lOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoY29y
ZUZyYW1lKSkgewogICAgICAgICBpZiAoRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3Vt
ZW50KCkpCi0gICAgICAgICAgICBkb2N1bWVudC0+cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtl
cjo6U3BlbGxpbmcpOworICAgICAgICAgICAgZG9jdW1lbnQtPm1hcmtlckNvbnRyb2xsZXIoKS0+
cmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6U3BlbGxpbmcpOwogICAgIH0KIH0KIApJbmRl
eDogV2ViS2l0L21hYy9XZWJWaWV3L1dlYkhUTUxWaWV3Lm1tCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9tYWMvV2ViVmlldy9XZWJIVE1MVmlldy5tbQkocmV2aXNpb24gNjU3NzgpCisrKyBXZWJLaXQv
bWFjL1dlYlZpZXcvV2ViSFRNTFZpZXcubW0JKHdvcmtpbmcgY29weSkKQEAgLTYyMzAsNyArNjIz
MCw3IEBAIC0gKHZvaWQpdW5tYXJrQWxsVGV4dE1hdGNoZXMKICAgICBEb2N1bWVudCogZG9jdW1l
bnQgPSBjb3JlRnJhbWUtPmRvY3VtZW50KCk7CiAgICAgaWYgKCFkb2N1bWVudCkKICAgICAgICAg
cmV0dXJuOwotICAgIGRvY3VtZW50LT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpUZXh0
TWF0Y2gpOworICAgIGRvY3VtZW50LT5tYXJrZXJDb250cm9sbGVyKCktPnJlbW92ZU1hcmtlcnMo
RG9jdW1lbnRNYXJrZXI6OlRleHRNYXRjaCk7CiB9CiAKIC0gKE5TQXJyYXkgKilyZWN0c0ZvclRl
eHRNYXRjaGVzCkBAIC02MjQyLDcgKzYyNDIsNyBAQCAtIChOU0FycmF5ICopcmVjdHNGb3JUZXh0
TWF0Y2hlcwogICAgIGlmICghZG9jdW1lbnQpCiAgICAgICAgIHJldHVybiBbTlNBcnJheSBhcnJh
eV07CiAKLSAgICBWZWN0b3I8SW50UmVjdD4gcmVjdHMgPSBkb2N1bWVudC0+cmVuZGVyZWRSZWN0
c0Zvck1hcmtlcnMoRG9jdW1lbnRNYXJrZXI6OlRleHRNYXRjaCk7CisgICAgVmVjdG9yPEludFJl
Y3Q+IHJlY3RzID0gZG9jdW1lbnQtPm1hcmtlckNvbnRyb2xsZXIoKS0+cmVuZGVyZWRSZWN0c0Zv
ck1hcmtlcnMoRG9jdW1lbnRNYXJrZXI6OlRleHRNYXRjaCk7CiAgICAgdW5zaWduZWQgY291bnQg
PSByZWN0cy5zaXplKCk7CiAgICAgTlNNdXRhYmxlQXJyYXkgKnJlc3VsdCA9IFtOU011dGFibGVB
cnJheSBhcnJheVdpdGhDYXBhY2l0eTpjb3VudF07CiAgICAgZm9yICh1bnNpZ25lZCBpbmRleCA9
IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpCkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNjU3NzkpCisrKyBX
ZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIwIEBACisyMDEw
LTA4LTIxICBEYW5pZWwgQmF0ZXMgIDxkYmF0ZXNAcmltLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBFbmNhcHN1bGF0ZSBkb2N1bWVudCBtYXJr
ZXIgbWFuYWdlbWVudCBpbnRvIERvY3VtZW50TWFya2VyQ29udHJvbGxlcgorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQzODMKKworICAgICAgICBNb2Rp
ZnkgY2FsbCBzaXRlcyBpbiB0aGUgQXBwbGUgV2luZG93cyBwb3J0IHRvIHVzZSBEb2N1bWVudE1h
cmtlckNvbnRyb2xsZXIuCisKKyAgICAgICAgTm8gZnVuY3Rpb25hbGl0eSB3YXMgY2hhbmdlZCwg
c28gbm8gbmV3IHRlc3RzLgorCisgICAgICAgICogV2ViRnJhbWUuY3BwOgorICAgICAgICAoV2Vi
RnJhbWU6OnVubWFya0FsbE1pc3NwZWxsaW5ncyk6CisgICAgICAgIChXZWJGcmFtZTo6dW5tYXJr
QWxsQmFkR3JhbW1hcik6CisgICAgICAgICogV2ViVmlldy5jcHA6CisgICAgICAgIChXZWJWaWV3
OjpyZWN0c0ZvclRleHRNYXRjaGVzKToKKwogMjAxMC0wOC0xOCAgSmVzc2llIEJlcmxpbiAgPGpi
ZXJsaW5AYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gUm9iZW4uCkluZGV4
OiBXZWJLaXQvd2luL1dlYkZyYW1lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkZy
YW1lLmNwcAkocmV2aXNpb24gNjU3NzgpCisrKyBXZWJLaXQvd2luL1dlYkZyYW1lLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjU2NCw3ICsyNTY0LDcgQEAgdm9pZCBXZWJGcmFtZTo6dW5tYXJrQWxs
TWlzc3BlbGxpbmdzKCkKICAgICAgICAgaWYgKCFkb2MpCiAgICAgICAgICAgICByZXR1cm47CiAK
LSAgICAgICAgZG9jLT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpTcGVsbGluZyk7Cisg
ICAgICAgIGRvYy0+bWFya2VyQ29udHJvbGxlcigpLT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFy
a2VyOjpTcGVsbGluZyk7CiAgICAgfQogfQogCkBAIC0yNTc2LDcgKzI1NzYsNyBAQCB2b2lkIFdl
YkZyYW1lOjp1bm1hcmtBbGxCYWRHcmFtbWFyKCkKICAgICAgICAgaWYgKCFkb2MpCiAgICAgICAg
ICAgICByZXR1cm47CiAKLSAgICAgICAgZG9jLT5yZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2Vy
OjpHcmFtbWFyKTsKKyAgICAgICAgZG9jLT5tYXJrZXJDb250cm9sbGVyKCktPnJlbW92ZU1hcmtl
cnMoRG9jdW1lbnRNYXJrZXI6OkdyYW1tYXIpOwogICAgIH0KIH0KIApJbmRleDogV2ViS2l0L3dp
bi9XZWJWaWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCShyZXZp
c2lvbiA2NTc3OCkKKysrIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTMzNjIsNyArMzM2Miw3IEBAIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgV2ViVmlldzo6cmVj
dHMKICAgICBkbyB7CiAgICAgICAgIGlmIChEb2N1bWVudCogZG9jdW1lbnQgPSBmcmFtZS0+ZG9j
dW1lbnQoKSkgewogICAgICAgICAgICAgSW50UmVjdCB2aXNpYmxlUmVjdCA9IGZyYW1lLT52aWV3
KCktPnZpc2libGVDb250ZW50UmVjdCgpOwotICAgICAgICAgICAgVmVjdG9yPEludFJlY3Q+IGZy
YW1lUmVjdHMgPSBkb2N1bWVudC0+cmVuZGVyZWRSZWN0c0Zvck1hcmtlcnMoRG9jdW1lbnRNYXJr
ZXI6OlRleHRNYXRjaCk7CisgICAgICAgICAgICBWZWN0b3I8SW50UmVjdD4gZnJhbWVSZWN0cyA9
IGRvY3VtZW50LT5tYXJrZXJDb250cm9sbGVyKCktPnJlbmRlcmVkUmVjdHNGb3JNYXJrZXJzKERv
Y3VtZW50TWFya2VyOjpUZXh0TWF0Y2gpOwogICAgICAgICAgICAgSW50UG9pbnQgZnJhbWVPZmZz
ZXQoLWZyYW1lLT52aWV3KCktPnNjcm9sbE9mZnNldCgpLndpZHRoKCksIC1mcmFtZS0+dmlldygp
LT5zY3JvbGxPZmZzZXQoKS5oZWlnaHQoKSk7CiAgICAgICAgICAgICBmcmFtZU9mZnNldCA9IGZy
YW1lLT52aWV3KCktPmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coZnJhbWVPZmZzZXQpOwogCg==
</data>
<flag name="review"
          id="53717"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>