<?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>27771</bug_id>
          
          <creation_ts>2009-07-28 11:06:37 -0700</creation_ts>
          <short_desc>[commit+] Web Inspector: Reimplement Elements Panel so that its interaction with DOM is serialized</short_desc>
          <delta_ts>2009-08-01 22:18:52 -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>Web Inspector (Deprecated)</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>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Pavel Feldman">pfeldman</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>ojan</cc>
    
    <cc>sam</cc>
    
    <cc>timothy</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>135283</commentid>
    <comment_count>0</comment_count>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-07-28 11:06:37 -0700</bug_when>
    <thetext>Today Elements panel is working synchronously with live DOM objects (or wrappers).
This is a proposal on how to make this DOM interaction serialized (and asynchronous).

These are the components that need to be introduced:

1) InspectorDOMAgent

InspectorDOMAgent lives in WebCore/inspector and tracks DOM modifications. It preserves
DOM Node to int bindings for all the nodes that it has sent to the frontend. Frontend can
issue particula requests to this agent such as &apos;getChildNodes&apos;. Agent will respond with
stringified data structure that will &apos;describe&apos; the nodes being requested. There overall
interface of this agent is not big (a handful of methods).

Agent like this lives and works in Chromium. The intention is to upstream it. I am 
attaching a draft of this class together with the InspectorFrontend/Backend interfaces
to the the bug.

2) WebInspector.DOMAgent

WebInspector.DOMAgent lives in the front-end and is receiving calls from the
InspectorDOMAgent. It will convert stringified node descriptions into the structures
that are very similar to JS Node wrappers. It will basically implement all the DOM
operations ElementsPanel needs. It is going to be fairly large (600 lines of code).

This piece lives in Chromium and only needs reformatting. See its code at:
http://src.chromium.org/viewvc/chrome/trunk/src/webkit/glue/devtools/js/dom_agent.js

3) JavaScript on the agent side

It does not make much sense to process Search, CSS, Properties-related requests in 
the native code within InspectorDOMAgent. They look more elegant in JavaScript; they
do not need to be that fast; they won&apos;t lead to the case where all the DOM nodes we see
in the Elements Panel result in JS wrapper being created around the node. Hence there
will be a piece of JS code that will live in the page context and will process requests
such as &apos;getNodeStyles&apos;, &apos;applyStyleText&apos;, everything that is shorthandProperty-related.
InspectorBackend will have a generic &apos;executeUtilityFunction&apos; method that will dispatch
parameters into this agent and get back to the frontend with the results.

It seems to be a relatively large refactoring. I was thinking of introducing
InspectorDOMAgent and WebInspector.DOMAgent first. They will get into code, but will not
be used by the Elements Panel by default. Then I was going to add Search / Styles / Properties
JS agent code, still with Elements Panel working as before. As a last step I would switch
to the new implementation.

Please tell me what you think about this plan!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135286</commentid>
    <comment_count>1</comment_count>
      <attachid>33654</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-07-28 11:10:23 -0700</bug_when>
    <thetext>Created attachment 33654
InspectorDOMAgent draft</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135417</commentid>
    <comment_count>2</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-07-28 16:57:29 -0700</bug_when>
    <thetext>This approch seems good. It sounds like what I imagined and remember discussing with Ojan and others a while ago.

Sam, what do you think?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136024</commentid>
    <comment_count>3</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2009-07-30 14:49:52 -0700</bug_when>
    <thetext>At a high-level, this seems like the right approach to me. I think it will make the code more maintainable for supporting both out of process and in process inspectors.

As a followup task, we should also consider adding buffering of events we want to push from the inspected page to the inspector. For example, mutation events happen very frequently for some code/operations. We could likely get a significant performance boost by buffering the events up before pushing them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136444</commentid>
    <comment_count>4</comment_count>
      <attachid>33935</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-08-01 05:04:38 -0700</bug_when>
    <thetext>Created attachment 33935
InspectorDOMAgent and WebInspector.DOMAgent

This patch adds read and some write capabilities to the DOM tree. No styles, no properties, no search yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136447</commentid>
    <comment_count>5</comment_count>
      <attachid>33935</attachid>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-08-01 06:33:25 -0700</bug_when>
    <thetext>Comment on attachment 33935
InspectorDOMAgent and WebInspector.DOMAgent

&gt; +WebInspector.DOMPayloadIndex = {
&gt; +    ID : 0,
&gt; +    TYPE : 1,
&gt; +    NAME : 2,
&gt; +    VALUE : 3,
&gt; +    ATTRS : 4,
&gt; +    HAS_CHILDREN : 5,
&gt; +    CHILD_NODES : 6
&gt; +};

I thought the payload was going to use objects with properties and not an array. It seems fragile to use an array like this. Maybe they are arrays to minimize the serialized size?

If we continue to use an array, this should have a comment about having the indexes stay in sync with the C++ file and visa versa. Also these names should not be all caps (should be TitleCase).

&gt; +    _makeStyle: function(payload)
&gt; +    {
&gt; +        var style = new WebInspector.CSSStyleDeclaration(payload);
&gt; +        style.nodeId_ = this._id;

The underscore should be a prefix.

&gt; +    WebInspector.DOMNode.call(this, null,
&gt; +        [
&gt; +            0,   // id
&gt; +            9,   // type = Node.DOCUMENT_NODE,
&gt; +            &quot;&quot;,  // nodeName
&gt; +            &quot;&quot;,  // nodeValue
&gt; +            [],  // attributes
&gt; +            0,   // childNodeCount
&gt; +        ]);

This is another place using an array is fragile. It this was an object with properties you could name each item without the need for a comment and not have to worry about it breaking if somthing changes. Also why not just use Node.DOCUMENT_NODE instead of 9?

&gt; +    // Install onpopulate handler.
&gt; +    var domAgent = this;
&gt; +    var originalUpdateChildren = WebInspector.ElementsTreeElement.prototype.updateChildren;
&gt; +    WebInspector.ElementsTreeElement.prototype.updateChildren = function()
&gt; +    {
&gt; +        domAgent.getChildNodesAsync(this.representedObject, originalUpdateChildren.bind(this));
&gt; +    };

Having this here seems wrong. I assume this is temporary? Maybe add a comment.

&gt; +
&gt; +    // Mute console handle to avoid crash on selection change.
&gt; +    WebInspector.Console.prototype.addInspectedNode = function()
&gt; +    {
&gt; +    };

Temporary?

&gt; +    // Whitespace is ignored in InspectorDOMAgent already -&gt; no need to filter.
&gt; +    Preferences.ignoreWhitespace = false;

I guess we can remove this and all the users once we make the switch.

&gt; +    this._id = payload[0];
&gt; +    this.width = payload[1];
&gt; +    this.height = payload[2];
&gt; +    this.__disabledProperties = payload[3];
&gt; +    this.__disabledPropertyValues = payload[4];
&gt; +    this.__disabledPropertyPriorities = payload[5];

These should just have single underscore prefixes. The arrays still make a me nervous.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136466</commentid>
    <comment_count>6</comment_count>
      <attachid>33936</attachid>
    <who name="Pavel Feldman">pfeldman</who>
    <bug_when>2009-08-01 11:03:24 -0700</bug_when>
    <thetext>Created attachment 33936
InspectorDOMAgent and WebInspector.DOMAgent

(In reply to comment #5)
&gt; (From update of attachment 33935 [details])
&gt; 
&gt; I thought the payload was going to use objects with properties and not an
&gt; array. It seems fragile to use an array like this. Maybe they are arrays to
&gt; minimize the serialized size?
&gt; 
&gt; If we continue to use an array, this should have a comment about having the
&gt; indexes stay in sync with the C++ file and visa versa. Also these names should
&gt; not be all caps (should be TitleCase).
&gt; 


It was done to minimize serialized size. But let us try dictionaries first and see if it is actually slow. Updated with dictionaries.


&gt; 
&gt; The underscore should be a prefix.
&gt; 

Done.

&gt; 
&gt; This is another place using an array is fragile. It this was an object with
&gt; properties you could name each item without the need for a comment and not have
&gt; to worry about it breaking if somthing changes. Also why not just use
&gt; Node.DOCUMENT_NODE instead of 9?
&gt;

Done. (using dictionary and Node.DOCUMENT_NODE).

&gt; 
&gt; Having this here seems wrong. I assume this is temporary? Maybe add a comment.
&gt; 
&gt;

Yes. Commented and added TODO
 
&gt; Temporary?
&gt; 

Yes. Added TODO.

&gt; &gt; +    // Whitespace is ignored in InspectorDOMAgent already -&gt; no need to filter.
&gt; &gt; +    Preferences.ignoreWhitespace = false;
&gt; 
&gt; I guess we can remove this and all the users once we make the switch.
&gt;

Yes. Added TODO
 
&gt; &gt; +    this.__disabledProperties = payload[3];
&gt; &gt; +    this.__disabledPropertyValues = payload[4];
&gt; &gt; +    this.__disabledPropertyPriorities = payload[5];
&gt; 
&gt; These should just have single underscore prefixes. The arrays still make a me
&gt; nervous.

Not using arrays anymore, but am using __disabledProperties since we feed StylesSidebarPane with it and latter relies upon this name.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136467</commentid>
    <comment_count>7</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2009-08-01 11:09:17 -0700</bug_when>
    <thetext>
&gt; &gt; &gt; +    this.__disabledProperties = payload[3];
&gt; &gt; &gt; +    this.__disabledPropertyValues = payload[4];
&gt; &gt; &gt; +    this.__disabledPropertyPriorities = payload[5];
&gt; &gt; 
&gt; &gt; These should just have single underscore prefixes. The arrays still make a me
&gt; &gt; nervous.
&gt; 
&gt; Not using arrays anymore, but am using __disabledProperties since we feed
&gt; StylesSidebarPane with it and latter relies upon this name.

I didn&apos;t realize we used double underscores there.

I can wait to see this in action!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136509</commentid>
    <comment_count>8</comment_count>
      <attachid>33936</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-08-01 22:18:47 -0700</bug_when>
    <thetext>Comment on attachment 33936
InspectorDOMAgent and WebInspector.DOMAgent

Clearing review flag on attachment: 33936

Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/GNUmakefile.am
	M	WebCore/WebCore.gypi
	M	WebCore/WebCore.pro
	M	WebCore/WebCore.vcproj/WebCore.vcproj
	M	WebCore/WebCore.xcodeproj/project.pbxproj
	M	WebCore/WebCoreSources.bkl
	M	WebCore/inspector/InspectorBackend.cpp
	M	WebCore/inspector/InspectorBackend.h
	M	WebCore/inspector/InspectorBackend.idl
	M	WebCore/inspector/InspectorController.cpp
	M	WebCore/inspector/InspectorController.h
	A	WebCore/inspector/InspectorDOMAgent.cpp
	A	WebCore/inspector/InspectorDOMAgent.h
	M	WebCore/inspector/InspectorFrontend.cpp
	M	WebCore/inspector/InspectorFrontend.h
	A	WebCore/inspector/front-end/Callback.js
	A	WebCore/inspector/front-end/DOMAgent.js
	M	WebCore/inspector/front-end/ElementsPanel.js
	M	WebCore/inspector/front-end/WebKit.qrc
	M	WebCore/inspector/front-end/inspector.html
	M	WebCore/inspector/front-end/inspector.js
Committed r46687
	M	WebCore/WebCore.pro
	M	WebCore/ChangeLog
	M	WebCore/WebCore.vcproj/WebCore.vcproj
	M	WebCore/GNUmakefile.am
	M	WebCore/WebCore.gypi
	M	WebCore/inspector/InspectorBackend.idl
	M	WebCore/inspector/InspectorFrontend.cpp
	M	WebCore/inspector/InspectorController.cpp
	M	WebCore/inspector/front-end/inspector.js
	M	WebCore/inspector/front-end/ElementsPanel.js
	A	WebCore/inspector/front-end/Callback.js
	A	WebCore/inspector/front-end/DOMAgent.js
	M	WebCore/inspector/front-end/WebKit.qrc
	M	WebCore/inspector/front-end/inspector.html
	M	WebCore/inspector/InspectorFrontend.h
	M	WebCore/inspector/InspectorBackend.cpp
	M	WebCore/inspector/InspectorController.h
	M	WebCore/inspector/InspectorBackend.h
	A	WebCore/inspector/InspectorDOMAgent.cpp
	A	WebCore/inspector/InspectorDOMAgent.h
	M	WebCore/WebCore.xcodeproj/project.pbxproj
	M	WebCore/WebCoreSources.bkl
r46687 = 1560d6b88c90e759ec0b475db93b8d24ae8044a5 (trunk)
No changes between current HEAD and refs/remotes/trunk
Resetting to the latest refs/remotes/trunk
http://trac.webkit.org/changeset/46687</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>136510</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-08-01 22:18:52 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33654</attachid>
            <date>2009-07-28 11:10:23 -0700</date>
            <delta_ts>2009-08-01 05:04:38 -0700</delta_ts>
            <desc>InspectorDOMAgent draft</desc>
            <filename>dom_agent.txt</filename>
            <type>text/plain</type>
            <size>28846</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaWRsDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5pZGwJKHJldmlzaW9uIDQ2
NDkwKQ0KKysrIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaWRsCSh3b3JraW5n
IGNvcHkpDQpAQCAtOTcsNSArOTcsOSBAQA0KIAogICAgICAgICBbQ3VzdG9tXSBBcnJheSBwcm9m
aWxlcygpOwogI2VuZGlmCi0gICAgIH07CisgICAgICAgIHZvaWQgZ2V0RG9jdW1lbnRFbGVtZW50
KCk7DQorICAgICAgICB2b2lkIGdldENoaWxkTm9kZXMoaW4gaW50IGNhbGxJZCwgaW4gaW50IGVs
ZW1lbnRJZCk7DQorICAgICAgICB2b2lkIHNldEF0dHJpYnV0ZShpbiBpbnQgY2FsbElkLCBpbiBp
bnQgZWxlbWVudElkLCBpbiBET01TdHJpbmcgbmFtZSwgaW4gRE9NU3RyaW5nIHZhbHVlKTsNCisg
ICAgICAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKGluIGludCBjYWxsSWQsIGluIGludCBlbGVtZW50
SWQsIGluIERPTVN0cmluZyBuYW1lKTsNCisgICAgICAgIHZvaWQgc2V0VGV4dE5vZGVWYWx1ZShp
biBpbnQgY2FsbElkLCBpbiBpbnQgZWxlbWVudElkLCBpbiBET01TdHJpbmcgdmFsdWUpOw0KICB9
CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5jcHANCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0NCi0tLSBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5jcHAJKHJldmlzaW9u
IDQ2NDkwKQ0KKysrIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kLmNwcAkod29y
a2luZyBjb3B5KQ0KQEAgLTI4Niw2ICsyODYsNjkgQEANCiB9CiAjZW5kaWYKIAordm9pZCBJbnNw
ZWN0b3JGcm9udGVuZDo6c2V0RG9jdW1lbnRFbGVtZW50KGNvbnN0IFNjcmlwdE9iamVjdCYgcm9v
dCkKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlv
bkNhbGwoInNldERvY3VtZW50RWxlbWVudCIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1l
bnQocm9vdCk7CisgICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9u
dGVuZDo6c2V0Q2hpbGROb2RlcyhpbnQgcGFyZW50SWQsIGNvbnN0IFNjcmlwdEFycmF5JiBub2Rl
cykKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlv
bkNhbGwoInNldENoaWxkTm9kZXMiKSk7CisgICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KHBh
cmVudElkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQobm9kZXMpOworICAgIGZ1bmN0
aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Omhhc0NoaWxkcmVuVXBk
YXRlZChpbnQgaWQsIGJvb2wgbmV3VmFsdWUpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0aW9u
Q2FsbD4gZnVuY3Rpb24obmV3RnVuY3Rpb25DYWxsKCJoYXNDaGlsZHJlblVwZGF0ZWQiKSk7Cisg
ICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KGlkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJn
dW1lbnQobmV3VmFsdWUpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5zcGVj
dG9yRnJvbnRlbmQ6OmNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnRJZCwgaW50IHByZXZJZCwg
Y29uc3QgU2NyaXB0T2JqZWN0JiBub2RlKQoreworICAgIE93blB0cjxTY3JpcHRGdW5jdGlvbkNh
bGw+IGZ1bmN0aW9uKG5ld0Z1bmN0aW9uQ2FsbCgiY2hpbGROb2RlSW5zZXJ0ZWQiKSk7CisgICAg
ZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KHBhcmVudElkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5k
QXJndW1lbnQocHJldklkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQobm9kZSk7Cisg
ICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Y2hpbGRO
b2RlUmVtb3ZlZChpbnQgcGFyZW50SWQsIGludCBpZCkKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVu
Y3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImNoaWxkTm9kZVJlbW92ZWQiKSk7
CisgICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KHBhcmVudElkKTsKKyAgICBmdW5jdGlvbi0+
YXBwZW5kQXJndW1lbnQoaWQpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5z
cGVjdG9yRnJvbnRlbmQ6OmF0dHJpYnV0ZXNVcGRhdGVkKGludCBpZCwgY29uc3QgU2NyaXB0QXJy
YXkmIGF0dHJpYnV0ZXMpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4gZnVuY3Rp
b24obmV3RnVuY3Rpb25DYWxsKCJhdHRyaWJ1dGVzVXBkYXRlZCIpKTsKKyAgICBmdW5jdGlvbi0+
YXBwZW5kQXJndW1lbnQoaWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChhdHRyaWJ1
dGVzKTsKKyAgICBmdW5jdGlvbi0+Y2FsbCgpOworfQorCit2b2lkIEluc3BlY3RvckZyb250ZW5k
OjpkaWRHZXRDaGlsZE5vZGVzKGludCBjYWxsSWQpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0
aW9uQ2FsbD4gZnVuY3Rpb24obmV3RnVuY3Rpb25DYWxsKCJkaWRHZXRDaGlsZE5vZGVzIikpOwor
ICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChjYWxsSWQpOworICAgIGZ1bmN0aW9uLT5jYWxs
KCk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6OmRpZEFwcGx5RG9tQ2hhbmdlKGludCBj
YWxsSWQsIGJvb2wgc3VjY2VzcykKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBm
dW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImRpZEFwcGx5RG9tQ2hhbmdlIikpOworICAgIGZ1bmN0
aW9uLT5hcHBlbmRBcmd1bWVudChjYWxsSWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVu
dChzdWNjZXNzKTsKKyAgICBmdW5jdGlvbi0+Y2FsbCgpOworfQorCiBQYXNzT3duUHRyPFNjcmlw
dEZ1bmN0aW9uQ2FsbD4gSW5zcGVjdG9yRnJvbnRlbmQ6Om5ld0Z1bmN0aW9uQ2FsbChjb25zdCBT
dHJpbmcmIGZ1bmN0aW9uTmFtZSkKIHsKICAgICBTY3JpcHRGdW5jdGlvbkNhbGwqIGZ1bmN0aW9u
ID0gbmV3IFNjcmlwdEZ1bmN0aW9uQ2FsbChtX3NjcmlwdFN0YXRlLCBtX3dlYkluc3BlY3Rvciwg
ImRpc3BhdGNoIik7CkluZGV4OiBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDb250cm9sbGVy
LmNwcA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xs
ZXIuY3BwCShyZXZpc2lvbiA0NjQ5MCkNCisrKyBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JD
b250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5KQ0KQEAgLTUxLDYgKzUxLDcgQEANCiAjaW5jbHVk
ZSAiSW5zcGVjdG9yQ2xpZW50LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKICNp
bmNsdWRlICJJbnNwZWN0b3JEYXRhYmFzZVJlc291cmNlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9y
RE9NQWdlbnQuaCIKICNpbmNsdWRlICJJbnNwZWN0b3JET01TdG9yYWdlUmVzb3VyY2UuaCIKICNp
bmNsdWRlICJJbnNwZWN0b3JSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkphdmFTY3JpcHRQcm9maWxl
LmgiCkBAIC0xMTQsNiArMTE1LDcgQEANCiAgICAgOiBtX2luc3BlY3RlZFBhZ2UocGFnZSkKICAg
ICAsIG1fY2xpZW50KGNsaWVudCkKICAgICAsIG1fcGFnZSgwKQorICAgICwgbV9kb2N1bWVudCgw
KQogICAgICwgbV9zY3JpcHRTdGF0ZSgwKQogICAgICwgbV93aW5kb3dWaXNpYmxlKGZhbHNlKQog
ICAgICwgbV9zaG93QWZ0ZXJWaXNpYmxlKEN1cnJlbnRQYW5lbCkKQEAgLTUwNiw2ICs1MDgsMTAg
QEANCiAKICAgICAvLyBHcmFudCB0aGUgaW5zcGVjdG9yIHRoZSBhYmlsaXR5IHRvIHNjcmlwdCB0
aGUgaW5zcGVjdGVkIHBhZ2UuCiAgICAgbV9wYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKS0+
c2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKKyAgICBpZiAobV9kb21B
Z2VudCkKKyAgICAgICAgbV9kb21BZ2VudC0+c2V0RG9jdW1lbnQobV9wYWdlLT5tYWluRnJhbWUo
KS0+ZG9jdW1lbnQoKSk7CisgICAgZWxzZQorICAgICAgICBtX2RvY3VtZW50ID0gbV9wYWdlLT5t
YWluRnJhbWUoKS0+ZG9jdW1lbnQoKTsKIAogICAgIG1fc2NyaXB0U3RhdGUgPSBzY3JpcHRTdGF0
ZUZyb21QYWdlKG1fcGFnZSk7CiAgICAgU2NyaXB0R2xvYmFsT2JqZWN0OjpzZXQobV9zY3JpcHRT
dGF0ZSwgIkluc3BlY3RvckNvbnRyb2xsZXIiLCBtX2luc3BlY3RvckJhY2tlbmQuZ2V0KCkpOwpA
QCAtNTM4LDYgKzU0NCw5IEBADQogdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpzZXRGcm9udGVu
ZFByb3h5T2JqZWN0KFNjcmlwdFN0YXRlKiBzY3JpcHRTdGF0ZSwgU2NyaXB0T2JqZWN0IHdlYklu
c3BlY3Rvck9iaikKIHsKICAgICBtX2Zyb250ZW5kLnNldChuZXcgSW5zcGVjdG9yRnJvbnRlbmQo
c2NyaXB0U3RhdGUsIHdlYkluc3BlY3Rvck9iaikpOworICAgIG1fZG9tQWdlbnQgPSBuZXcgSW5z
cGVjdG9yRE9NQWdlbnQobV9mcm9udGVuZC5nZXQoKSk7CisgICAgaWYgKG1fZG9jdW1lbnQpCisg
ICAgICAgIG1fZG9tQWdlbnQtPnNldERvY3VtZW50KG1fZG9jdW1lbnQpOwogfQogCiB2b2lkIElu
c3BlY3RvckNvbnRyb2xsZXI6OnNob3coKQpAQCAtNTkxLDYgKzYwMCw3IEBADQogICAgIGNsb3Nl
V2luZG93KCk7CiAKICAgICBtX2Zyb250ZW5kLnNldCgwKTsKKyAgICBtX2RvbUFnZW50ID0gMDsK
ICAgICBtX3NjcmlwdFN0YXRlID0gMDsKIH0KIApJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yRnJvbnRlbmQuaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3RvckZyb250ZW5kLmgJKHJldmlzaW9uIDQ2NDkwKQ0KKysrIFdlYkNvcmUvaW5zcGVjdG9yL0lu
c3BlY3RvckZyb250ZW5kLmgJKHdvcmtpbmcgY29weSkNCkBAIC05Niw2ICs5NiwxNSBAQA0KICAg
ICAgICAgYm9vbCBhZGRET01TdG9yYWdlKGNvbnN0IFNjcmlwdE9iamVjdCYgZG9tU3RvcmFnZU9i
aik7CiAjZW5kaWYKIAorICAgICAgICB2b2lkIHNldERvY3VtZW50RWxlbWVudChjb25zdCBTY3Jp
cHRPYmplY3QmIHJvb3QpOworICAgICAgICB2b2lkIHNldENoaWxkTm9kZXMoaW50IHBhcmVudElk
LCBjb25zdCBTY3JpcHRBcnJheSYgbm9kZXMpOworICAgICAgICB2b2lkIGhhc0NoaWxkcmVuVXBk
YXRlZChpbnQgaWQsIGJvb2wgbmV3VmFsdWUpOworICAgICAgICB2b2lkIGNoaWxkTm9kZUluc2Vy
dGVkKGludCBwYXJlbnRJZCwgaW50IHByZXZJZCwgY29uc3QgU2NyaXB0T2JqZWN0JiBub2RlKTsK
KyAgICAgICAgdm9pZCBjaGlsZE5vZGVSZW1vdmVkKGludCBwYXJlbnRJZCwgaW50IGlkKTsKKyAg
ICAgICAgdm9pZCBhdHRyaWJ1dGVzVXBkYXRlZChpbnQgaWQsIGNvbnN0IFNjcmlwdEFycmF5JiBh
dHRyaWJ1dGVzKTsKKyAgICAgICAgdm9pZCBkaWRHZXRDaGlsZE5vZGVzKGludCBjYWxsSWQpOwor
ICAgICAgICB2b2lkIGRpZEFwcGx5RG9tQ2hhbmdlKGludCBjYWxsSWQsIGJvb2wgc3VjY2Vzcyk7
CisKICAgICBwcml2YXRlOgogICAgICAgICBQYXNzT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4g
bmV3RnVuY3Rpb25DYWxsKGNvbnN0IFN0cmluZyYgZnVuY3Rpb25OYW1lKTsKICAgICAgICAgdm9p
ZCBjYWxsU2ltcGxlRnVuY3Rpb24oY29uc3QgU3RyaW5nJiBmdW5jdGlvbk5hbWUpOwpJbmRleDog
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5jcHANCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBX
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcAkocmV2aXNpb24gNDY0OTApDQor
KysgV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5jcHAJKHdvcmtpbmcgY29weSkN
CkBAIC0zNTQsNiArMzU0LDMwIEBADQogCiAjZW5kaWYKIAordm9pZCBJbnNwZWN0b3JCYWNrZW5k
OjpnZXREb2N1bWVudEVsZW1lbnQoKQoreworfQorCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6Omdl
dENoaWxkTm9kZXMoaW50IGNhbGxJZCwgaW50IGVsZW1lbnRJZCkKK3sKK30KKwordm9pZCBJbnNw
ZWN0b3JCYWNrZW5kOjpzZXRBdHRyaWJ1dGUoaW50IGNhbGxJZCwgaW50IGVsZW1lbnRJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQoreworfQorCit2b2lkIEluc3Bl
Y3RvckJhY2tlbmQ6OnJlbW92ZUF0dHJpYnV0ZShpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkLCBj
b25zdCBTdHJpbmcmIG5hbWUpCit7Cit9CisKK3ZvaWQgSW5zcGVjdG9yQmFja2VuZDo6c2V0VGV4
dE5vZGVWYWx1ZShpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIHZhbHVl
KQoreworfQorCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6OnBlcmZvcm1TZWFyY2goaW50IGNhbGxJ
ZCwgY29uc3QgU3RyaW5nJiBxdWVyeSkKK3sKK30KKwogdm9pZCBJbnNwZWN0b3JCYWNrZW5kOjpo
aWdobGlnaHQoTm9kZSogbm9kZSkKIHsKICAgICBpZiAobV9pbnNwZWN0b3JDb250cm9sbGVyKQpJ
bmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oCShyZXZpc2lvbiA0
NjQ5MCkNCisrKyBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmgJKHdvcmtp
bmcgY29weSkNCkBAIC01MywxMSArNTMsMTMgQEANCiAKIGNsYXNzIENhY2hlZFJlc291cmNlOwog
Y2xhc3MgRGF0YWJhc2U7CitjbGFzcyBEb2N1bWVudDsKIGNsYXNzIERvY3VtZW50TG9hZGVyOwog
Y2xhc3MgR3JhcGhpY3NDb250ZXh0OwogY2xhc3MgSGl0VGVzdFJlc3VsdDsKIGNsYXNzIEluc3Bl
Y3RvckJhY2tlbmQ7CiBjbGFzcyBJbnNwZWN0b3JDbGllbnQ7CitjbGFzcyBJbnNwZWN0b3JET01B
Z2VudDsKIGNsYXNzIEluc3BlY3RvckZyb250ZW5kOwogY2xhc3MgSmF2YVNjcmlwdENhbGxGcmFt
ZTsKIGNsYXNzIFN0b3JhZ2VBcmVhOwpAQCAtMzAxLDcgKzMwMyw5IEBADQogICAgIFBhZ2UqIG1f
aW5zcGVjdGVkUGFnZTsKICAgICBJbnNwZWN0b3JDbGllbnQqIG1fY2xpZW50OwogICAgIE93blB0
cjxJbnNwZWN0b3JGcm9udGVuZD4gbV9mcm9udGVuZDsKKyAgICBSZWZQdHI8SW5zcGVjdG9yRE9N
QWdlbnQ+IG1fZG9tQWdlbnQ7CiAgICAgUGFnZSogbV9wYWdlOworICAgIERvY3VtZW50KiBtX2Rv
Y3VtZW50OwogICAgIFJlZlB0cjxOb2RlPiBtX25vZGVUb0ZvY3VzOwogICAgIFJlZlB0cjxJbnNw
ZWN0b3JSZXNvdXJjZT4gbV9tYWluUmVzb3VyY2U7CiAgICAgUmVzb3VyY2VzTWFwIG1fcmVzb3Vy
Y2VzOwpJbmRleDogV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5oDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5oCShyZXZpc2lvbiA0
NjQ5MCkNCisrKyBXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmgJKHdvcmtpbmcg
Y29weSkNCkBAIC0xMjIsNiArMTIyLDEzIEBADQogICAgIHZvaWQgc3RlcE91dE9mRnVuY3Rpb25J
bkRlYnVnZ2VyKCk7CiAjZW5kaWYKIAorICAgIHZvaWQgZ2V0RG9jdW1lbnRFbGVtZW50KCk7DQor
ICAgIHZvaWQgZ2V0Q2hpbGROb2RlcyhpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkKTsNCisgICAg
dm9pZCBzZXRBdHRyaWJ1dGUoaW50IGNhbGxJZCwgaW50IGVsZW1lbnRJZCwgY29uc3QgU3RyaW5n
JiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsNCisgICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUo
aW50IGNhbGxJZCwgaW50IGVsZW1lbnRJZCwgY29uc3QgU3RyaW5nJiBuYW1lKTsNCisgICAgdm9p
ZCBzZXRUZXh0Tm9kZVZhbHVlKGludCBjYWxsSWQsIGludCBlbGVtZW50SWQsIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpOw0KKyAgICB2b2lkIHBlcmZvcm1TZWFyY2goaW50IGNhbGxJZCwgY29uc3QgU3Ry
aW5nJiBxdWVyeSk7DQorCiAgICAgLy8gR2VuZXJpYyBjb2RlIGNhbGxlZCBmcm9tIGN1c3RvbSBp
bXBsZW1lbnRhdGlvbnMuCiAgICAgdm9pZCBoaWdobGlnaHQoTm9kZSogbm9kZSk7CiAKSW5kZXg6
IFdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50LmNjDQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotLS0g
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY2MJKHJldmlzaW9uIDApDQorKysg
V2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY2MJKHJldmlzaW9uIDApDQpAQCAt
MCwwICsxLDQ4MCBAQA0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisg
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkluc3BlY3Rv
ckRPTUFnZW50LmgiCisKKyNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIKKyNpbmNsdWRlICJET01X
aW5kb3cuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5j
bHVkZSAiRXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNpbmNsdWRl
ICJFdmVudFRhcmdldC5oIgorI2luY2x1ZGUgIkhUTUxGcmFtZU93bmVyRWxlbWVudC5oIgorI2lu
Y2x1ZGUgIkluc3BlY3RvckZyb250ZW5kLmgiCisjaW5jbHVkZSAibWFya3VwLmgiCisjaW5jbHVk
ZSAiTXV0YXRpb25FdmVudC5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlICJOb2RlTGlz
dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2NyaXB0T2JqZWN0
LmgiCisjaW5jbHVkZSAiVGV4dC5oIgorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbnNwZWN0b3JET01B
Z2VudDo6SW5zcGVjdG9yRE9NQWdlbnQoSW5zcGVjdG9yRnJvbnRlbmQqIGZyb250ZW5kKQorICAg
IDogbV9mcm9udGVuZChmcm9udGVuZCkKKyAgICAsIG1fbGFzdE5vZGVJZCgxKQorICAgICwgbV9k
b2N1bWVudEVsZW1lbnRSZXF1ZXN0ZWQoZmFsc2UpCit7Cit9CisKK0luc3BlY3RvckRPTUFnZW50
Ojp+SW5zcGVjdG9yRE9NQWdlbnQoKQoreworICAgIHNldERvY3VtZW50KDApOworfQorCit2b2lk
IEluc3BlY3RvckRPTUFnZW50OjpzZXREb2N1bWVudChEb2N1bWVudCogZG9jKQoreworICAgIGlm
IChkb2MgPT0gbWFpbkZyYW1lRG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTGlz
dEhhc2hTZXQ8UmVmUHRyPERvY3VtZW50PiA+IGNvcHkgPSBtX2RvY3VtZW50czsKKyAgICBmb3Ig
KExpc3RIYXNoU2V0PFJlZlB0cjxEb2N1bWVudD4gPjo6aXRlcmF0b3IgaXQgPSBjb3B5LmJlZ2lu
KCk7IGl0ICE9IGNvcHkuZW5kKCk7ICsraXQpCisgICAgICAgIHN0b3BMaXN0ZW5pbmcoKCppdCku
Z2V0KCkpOworICAKKyAgICBBU1NFUlQoIW1fZG9jdW1lbnRzLnNpemUoKSk7CisKKyAgICBpZiAo
ZG9jKSB7CisgICAgICAgIHN0YXJ0TGlzdGVuaW5nKGRvYyk7CisgICAgICAgIGlmIChtX2RvY3Vt
ZW50RWxlbWVudFJlcXVlc3RlZCkgeworICAgICAgICAgICAgZ2V0RG9jdW1lbnRFbGVtZW50KCk7
CisgICAgICAgICAgICBtX2RvY3VtZW50RWxlbWVudFJlcXVlc3RlZCA9IGZhbHNlOworICAgICAg
ICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGlzY2FyZEJpbmRpbmdzKCk7CisgICAgfQorfQor
Cit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpzdGFydExpc3RlbmluZyhEb2N1bWVudCogZG9jKQor
eworICAgIGlmIChtX2RvY3VtZW50cy5jb250YWlucyhkb2MpKQorICAgICAgICByZXR1cm47CisK
KyAgICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTUNvbnRlbnRMb2FkZWRF
dmVudCwgdGhpcywgZmFsc2UpOworICAgIGRvYy0+YWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWVz
KCkuRE9NTm9kZUluc2VydGVkRXZlbnQsIHRoaXMsIGZhbHNlKTsKKyAgICBkb2MtPmFkZEV2ZW50
TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVkRXZlbnQsIHRoaXMsIGZhbHNlKTsK
KyAgICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVkRnJv
bURvY3VtZW50RXZlbnQsIHRoaXMsIHRydWUpOworICAgIGRvYy0+YWRkRXZlbnRMaXN0ZW5lcihl
dmVudE5hbWVzKCkuRE9NQXR0ck1vZGlmaWVkRXZlbnQsIHRoaXMsIGZhbHNlKTsKKyAgICBtX2Rv
Y3VtZW50cy5hZGQoZG9jKTsKK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2VudDo6c3RvcExpc3Rl
bmluZyhEb2N1bWVudCogZG9jKQoreworICAgIGlmICghbV9kb2N1bWVudHMuY29udGFpbnMoZG9j
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZG9jLT5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50
TmFtZXMoKS5ET01Db250ZW50TG9hZGVkRXZlbnQsIHRoaXMsIGZhbHNlKTsKKyAgICBkb2MtPnJl
bW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEV2ZW50LCB0aGlz
LCBmYWxzZSk7CisgICAgZG9jLT5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZXMoKS5ET01O
b2RlUmVtb3ZlZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5yZW1vdmVFdmVudExpc3Rl
bmVyKGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudEV2ZW50LCB0aGlzLCB0
cnVlKTsKKyAgICBkb2MtPnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTUF0dHJN
b2RpZmllZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgbV9kb2N1bWVudHMucmVtb3ZlKGRvYyk7
Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OmhhbmRsZUV2ZW50KEV2ZW50KiBldmVudCwg
Ym9vbCBpc1dpbmRvd0V2ZW50KQoreworICAgIEF0b21pY1N0cmluZyB0eXBlID0gZXZlbnQtPnR5
cGUoKTsKKyAgICBOb2RlKiBub2RlID0gZXZlbnQtPnRhcmdldCgpLT50b05vZGUoKTsKKworICAg
IC8vIFJlbW92ZSBtYXBwaW5nIGVudHJ5IGlmIG5lY2Vzc2FyeS4KKyAgICBpZiAodHlwZSA9PSBl
dmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCkgeworICAgICAgICB1
bmJpbmQobm9kZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodHlwZSA9PSBl
dmVudE5hbWVzKCkuRE9NQXR0ck1vZGlmaWVkRXZlbnQpIHsKKyAgICAgICAgaW50IGlkID0gaWRG
b3JOb2RlKG5vZGUpOworICAgICAgICAvLyBJZiBub2RlIGlzIG5vdCBtYXBwZWQgeWV0IC0+IGln
bm9yZSB0aGUgZXZlbnQuCisgICAgICAgIGlmICghaWQpCisgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsK
KyAgICAgICAgbV9mcm9udGVuZC0+YXR0cmlidXRlc1VwZGF0ZWQoaWQsIGJ1aWxkQXJyYXlGb3JF
bGVtZW50QXR0cmlidXRlcyhlbGVtZW50KSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IGV2ZW50
TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkgeworICAgICAgICBpZiAoaXNXaGl0ZXNwYWNl
KG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIE5vZGUqIHBhcmVudCA9IHN0
YXRpY19jYXN0PE11dGF0aW9uRXZlbnQqPihldmVudCktPnJlbGF0ZWROb2RlKCk7CisgICAgICAg
IGludCBwYXJlbnRJZCA9IGlkRm9yTm9kZShwYXJlbnQpOworICAgICAgICAvLyBSZXR1cm4gaWYg
cGFyZW50IGlzIG5vdCBtYXBwZWQgeWV0LgorICAgICAgICBpZiAoIXBhcmVudElkKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghbV9jaGlsZHJlblJlcXVlc3RlZC5jb250YWlu
cyhwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgIC8vIE5vIGNoaWxkcmVuIGFyZSBtYXBwZWQgeWV0
IC0+IG9ubHkgbm90aWZ5IG9uIGNoYW5nZXMgb2YgaGFzQ2hpbGRyZW4uCisgICAgICAgICAgICBt
X2Zyb250ZW5kLT5oYXNDaGlsZHJlblVwZGF0ZWQocGFyZW50SWQsIHRydWUpOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgLy8gQ2hpbGRyZW4gaGF2ZSBiZWVuIHJlcXVlc3RlZCAtPiBy
ZXR1cm4gdmFsdWUgb2YgYSBuZXcgY2hpbGQuCisgICAgICAgICAgICBpbnQgcHJldklkID0gaWRG
b3JOb2RlKGlubmVyUHJldmlvdXNTaWJsaW5nKG5vZGUpKTsKKworICAgICAgICAgICAgU2NyaXB0
QXJyYXkgdmFsdWUgPSBidWlsZEFycmF5Rm9yTm9kZShub2RlLCAwKTsKKyAgICAgICAgICAgIG1f
ZnJvbnRlbmQtPmNoaWxkTm9kZUluc2VydGVkKHBhcmVudElkLCBwcmV2SWQsIHZhbHVlKTsKKyAg
ICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92
ZWRFdmVudCkgeworICAgICAgICBpZiAoaXNXaGl0ZXNwYWNlKG5vZGUpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIE5vZGUqIHBhcmVudCA9IHN0YXRpY19jYXN0PE11dGF0aW9uRXZl
bnQqPihldmVudCktPnJlbGF0ZWROb2RlKCk7CisgICAgICAgIGludCBwYXJlbnRJZCA9IGlkRm9y
Tm9kZShwYXJlbnQpOworICAgICAgICAvLyBJZiBwYXJlbnQgaXMgbm90IG1hcHBlZCB5ZXQgLT4g
aWdub3JlIHRoZSBldmVudC4KKyAgICAgICAgaWYgKCFwYXJlbnRJZCkKKyAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICBpZiAoIW1fY2hpbGRyZW5SZXF1ZXN0ZWQuY29udGFpbnMocGFyZW50
SWQpKSB7CisgICAgICAgICAgICAvLyBObyBjaGlsZHJlbiBhcmUgbWFwcGVkIHlldCAtPiBvbmx5
IG5vdGlmeSBvbiBjaGFuZ2VzIG9mIGhhc0NoaWxkcmVuLgorICAgICAgICAgICAgaWYgKGlubmVy
Q2hpbGROb2RlQ291bnQocGFyZW50KSA9PSAxKQorICAgICAgICAgICAgICAgIG1fZnJvbnRlbmQt
Pmhhc0NoaWxkcmVuVXBkYXRlZChwYXJlbnRJZCwgZmFsc2UpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgbV9mcm9udGVuZC0+Y2hpbGROb2RlUmVtb3ZlZChwYXJlbnRJZCwgaWRGb3JO
b2RlKG5vZGUpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBldmVudE5hbWVz
KCkuRE9NQ29udGVudExvYWRlZEV2ZW50KSB7CisgICAgICAgIC8vIFJlLXB1c2ggZG9jdW1lbnQg
b25jZSBpdCBpcyBsb2FkZWQuCisgICAgICAgIGRpc2NhcmRCaW5kaW5ncygpOworICAgICAgICBw
dXNoRG9jdW1lbnRFbGVtZW50VG9Gcm9udGVuZCgpOworICAgIH0KK30KKworaW50IEluc3BlY3Rv
ckRPTUFnZW50OjpiaW5kKE5vZGUqIG5vZGUpCit7CisgICAgSGFzaE1hcDxOb2RlKiwgaW50Pjo6
aXRlcmF0b3IgaXQgPSBtX25vZGVUb0lkLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ICE9IG1fbm9k
ZVRvSWQuZW5kKCkpCisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIGludCBpZCA9IG1f
bGFzdE5vZGVJZCsrOworICAgIG1fbm9kZVRvSWQuc2V0KG5vZGUsIGlkKTsKKyAgICBtX2lkVG9O
b2RlLnNldChpZCwgbm9kZSk7CisgICAgcmV0dXJuIGlkOworfQorCit2b2lkIEluc3BlY3RvckRP
TUFnZW50Ojp1bmJpbmQoTm9kZSogbm9kZSkKK3sKKyAgICBpZiAobm9kZS0+aXNGcmFtZU93bmVy
RWxlbWVudCgpKSB7CisgICAgICAgIGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCogZnJhbWVP
d25lciA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxGcmFtZU93bmVyRWxlbWVudCo+KG5vZGUpOwor
ICAgICAgICBzdG9wTGlzdGVuaW5nKGZyYW1lT3duZXItPmNvbnRlbnREb2N1bWVudCgpKTsKKyAg
ICB9CisKKyAgICBIYXNoTWFwPE5vZGUqLCBpbnQ+OjppdGVyYXRvciBpdCA9IG1fbm9kZVRvSWQu
ZmluZChub2RlKTsKKyAgICBpZiAoaXQgIT0gbV9ub2RlVG9JZC5lbmQoKSkgeworICAgICAgICBt
X2lkVG9Ob2RlLnJlbW92ZShtX2lkVG9Ob2RlLmZpbmQoaXQtPnNlY29uZCkpOworICAgICAgICBt
X2NoaWxkcmVuUmVxdWVzdGVkLnJlbW92ZShtX2NoaWxkcmVuUmVxdWVzdGVkLmZpbmQoaXQtPnNl
Y29uZCkpOworICAgICAgICBtX25vZGVUb0lkLnJlbW92ZShpdCk7CisgICAgfQorfQorCit2b2lk
IEluc3BlY3RvckRPTUFnZW50OjpwdXNoRG9jdW1lbnRFbGVtZW50VG9Gcm9udGVuZCgpCit7Cisg
ICAgRWxlbWVudCogZG9jRWxlbSA9IG1haW5GcmFtZURvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpOworICAgIGlmICghbV9ub2RlVG9JZC5jb250YWlucyhkb2NFbGVtKSkKKyAgICAgICAgbV9m
cm9udGVuZC0+c2V0RG9jdW1lbnRFbGVtZW50KGJ1aWxkQXJyYXlGb3JOb2RlKGRvY0VsZW0sIDAp
KTsKK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2VudDo6cHVzaENoaWxkTm9kZXNUb0Zyb250ZW5k
KGludCBlbGVtZW50SWQpCit7CisgICAgTm9kZSogbm9kZSA9IG5vZGVGb3JJZChlbGVtZW50SWQp
OworICAgIGlmICghbm9kZSB8fCAobm9kZS0+bm9kZVR5cGUoKSAhPSBOb2RlOjpFTEVNRU5UX05P
REUpKQorICAgICAgICByZXR1cm47CisgICAgaWYgKG1fY2hpbGRyZW5SZXF1ZXN0ZWQuY29udGFp
bnMoZWxlbWVudElkKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRWxlbWVudCogZWxlbWVudCA9
IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICBTY3JpcHRBcnJheSBjaGlsZHJlbiA9
IGJ1aWxkQXJyYXlGb3JFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCwgMSk7CisgICAgbV9jaGlsZHJl
blJlcXVlc3RlZC5hZGQoZWxlbWVudElkKTsKKyAgICBtX2Zyb250ZW5kLT5zZXRDaGlsZE5vZGVz
KGVsZW1lbnRJZCwgY2hpbGRyZW4pOworfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpkaXNj
YXJkQmluZGluZ3MoKQoreworICAgIG1fbm9kZVRvSWQuY2xlYXIoKTsKKyAgICBtX2lkVG9Ob2Rl
LmNsZWFyKCk7CisgICAgbV9jaGlsZHJlblJlcXVlc3RlZC5jbGVhcigpOworfQorCitOb2RlKiBJ
bnNwZWN0b3JET01BZ2VudDo6bm9kZUZvcklkKGludCBpZCkKK3sKKyAgICBIYXNoTWFwPGludCwg
Tm9kZSo+OjppdGVyYXRvciBpdCA9IG1faWRUb05vZGUuZmluZChpZCk7CisgICAgaWYgKGl0ICE9
IG1faWRUb05vZGUuZW5kKCkpCisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVy
biAwOworfQorCitpbnQgSW5zcGVjdG9yRE9NQWdlbnQ6OmlkRm9yTm9kZShOb2RlKiBub2RlKQor
eworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgSGFzaE1hcDxOb2RlKiwg
aW50Pjo6aXRlcmF0b3IgaXQgPSBtX25vZGVUb0lkLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ICE9
IG1fbm9kZVRvSWQuZW5kKCkpCisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVy
biAwOworfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpnZXREb2N1bWVudEVsZW1lbnQoKQor
eworICAgIERvY3VtZW50KiBtYWluRG9jdW1lbnQgPSBtYWluRnJhbWVEb2N1bWVudCgpOworICAg
IGlmIChtYWluRG9jdW1lbnQpCisgICAgICAgIHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zyb250ZW5k
KCk7CisgICAgZWxzZQorICAgICAgICBtX2RvY3VtZW50RWxlbWVudFJlcXVlc3RlZCA9IHRydWU7
Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OmdldENoaWxkTm9kZXMoaW50IGNhbGxJZCwg
aW50IGVsZW1lbnRJZCkKK3sKKyAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQoZWxlbWVudElk
KTsKKyAgICBtX2Zyb250ZW5kLT5kaWRHZXRDaGlsZE5vZGVzKGNhbGxJZCk7Cit9CisKK2ludCBJ
bnNwZWN0b3JET01BZ2VudDo6cHVzaE5vZGVQYXRoVG9Gcm9udGVuZChOb2RlKiBub2RlVG9QdXNo
KQoreworICAgIEFTU0VSVChub2RlVG9QdXNoKTsgIC8vIEludmFsaWQgaW5wdXQKKworICAgIC8v
IElmIHdlIGFyZSBzZW5kaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBjbGllbnQgdGhhdCBpcyBjdXJy
ZW50bHkgYmVpbmcgY3JlYXRlZC4gU2VuZCByb290IG5vZGUgZmlyc3QuCisgICAgcHVzaERvY3Vt
ZW50RWxlbWVudFRvRnJvbnRlbmQoKTsKKworICAgIC8vIFJldHVybiBpZCBpbiBjYXNlIHRoZSBu
b2RlIGlzIGtub3duLgorICAgIGludCByZXN1bHQgPSBpZEZvck5vZGUobm9kZVRvUHVzaCk7Cisg
ICAgaWYgKHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIEVsZW1lbnQqIGVs
ZW1lbnQgPSBpbm5lclBhcmVudEVsZW1lbnQobm9kZVRvUHVzaCk7CisgICAgQVNTRVJUKGVsZW1l
bnQpOyAgLy8gTm9kZSBpcyBkZXRhY2hlZCBvciBpcyBhIGRvY3VtZW50IGl0c2VsZgorCisgICAg
VmVjdG9yPEVsZW1lbnQqPiBwYXRoOworICAgIHdoaWxlIChlbGVtZW50ICYmICFpZEZvck5vZGUo
ZWxlbWVudCkpIHsKKyAgICAgICAgcGF0aC5hcHBlbmQoZWxlbWVudCk7CisgICAgICAgIGVsZW1l
bnQgPSBpbm5lclBhcmVudEVsZW1lbnQoZWxlbWVudCk7CisgICAgfQorCisgICAgLy8gZWxlbWVu
dCBpcyBrbm93biB0byB0aGUgY2xpZW50CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIHBhdGgu
YXBwZW5kKGVsZW1lbnQpOworICAgIGZvciAoaW50IGkgPSBwYXRoLnNpemUoKSAtIDE7IGkgPj0g
MDsgLS1pKSB7CisgICAgICAgIGludCBub2RlSWQgPSBpZEZvck5vZGUocGF0aC5hdChpKSk7Cisg
ICAgICAgIEFTU0VSVChub2RlSWQpOworICAgICAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQo
bm9kZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIGlkRm9yTm9kZShub2RlVG9QdXNoKTsKK30KKwor
dm9pZCBJbnNwZWN0b3JET01BZ2VudDo6c2V0QXR0cmlidXRlKGludCBjYWxsSWQsIGludCBlbGVt
ZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBO
b2RlKiBub2RlID0gbm9kZUZvcklkKGVsZW1lbnRJZCk7CisgICAgaWYgKG5vZGUgJiYgKG5vZGUt
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6RUxFTUVOVF9OT0RFKSkgeworICAgICAgICBFbGVtZW50KiBl
bGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOworICAgICAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKKyAgICAgICAgZWxlbWVudC0+c2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlLCBl
Yyk7CisgICAgICAgIG1fZnJvbnRlbmQtPmRpZEFwcGx5RG9tQ2hhbmdlKGNhbGxJZCwgZWMgPT0g
MCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9mcm9udGVuZC0+ZGlkQXBwbHlEb21DaGFuZ2Uo
Y2FsbElkLCBmYWxzZSk7CisgICAgfQorfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpyZW1v
dmVBdHRyaWJ1dGUoaW50IGNhbGxJZCwgaW50IGVsZW1lbnRJZCwgY29uc3QgU3RyaW5nJiBuYW1l
KQoreworICAgIE5vZGUqIG5vZGUgPSBub2RlRm9ySWQoZWxlbWVudElkKTsKKyAgICBpZiAobm9k
ZSAmJiAobm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUpKSB7CisgICAgICAg
IEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAg
IEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBlbGVtZW50LT5yZW1vdmVBdHRyaWJ1dGUo
bmFtZSwgZWMpOworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxsSWQs
IGVjID09IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fZnJvbnRlbmQtPmRpZEFwcGx5RG9t
Q2hhbmdlKGNhbGxJZCwgZmFsc2UpOworICAgIH0KK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2Vu
dDo6c2V0VGV4dE5vZGVWYWx1ZShpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkLCBjb25zdCBTdHJp
bmcmIHZhbHVlKQoreworICAgIE5vZGUqIG5vZGUgPSBub2RlRm9ySWQoZWxlbWVudElkKTsKKyAg
ICBpZiAobm9kZSAmJiAobm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUpKSB7Cisg
ICAgICAgIFRleHQqIHRleHRfbm9kZSA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlKTsKKyAgICAg
ICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIHRleHRfbm9kZS0+cmVwbGFjZVdob2xl
VGV4dCh2YWx1ZSwgZWMpOworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShj
YWxsSWQsIGVjID09IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fZnJvbnRlbmQtPmRpZEFw
cGx5RG9tQ2hhbmdlKGNhbGxJZCwgZmFsc2UpOworICAgIH0KK30KKworU2NyaXB0QXJyYXkgSW5z
cGVjdG9yRE9NQWdlbnQ6OmJ1aWxkQXJyYXlGb3JOb2RlKE5vZGUqIG5vZGUsIGludCBkZXB0aCkg
Cit7CisgICAgU2NyaXB0QXJyYXkgdmFsdWUgPSBtX2Zyb250ZW5kLT5uZXdTY3JpcHRBcnJheSgp
OworCisgICAgaW50IGlkID0gYmluZChub2RlKTsKKyAgICBTdHJpbmcgbm9kZU5hbWU7CisgICAg
U3RyaW5nIG5vZGVWYWx1ZTsKKworICAgIHN3aXRjaCAobm9kZS0+bm9kZVR5cGUoKSkgeworICAg
ICAgICBjYXNlIE5vZGU6OlRFWFRfTk9ERToKKyAgICAgICAgY2FzZSBOb2RlOjpDT01NRU5UX05P
REU6CisgICAgICAgICAgICBub2RlVmFsdWUgPSBub2RlLT5ub2RlVmFsdWUoKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOgorICAgICAgICBj
YXNlIE5vZGU6OkRPQ1VNRU5UX05PREU6CisgICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJB
R01FTlRfTk9ERToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5vZGU6OkVMRU1F
TlRfTk9ERToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS0+
bm9kZU5hbWUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZhbHVlLnNldCgw
LCBpZCk7CisgICAgdmFsdWUuc2V0KDEsIG5vZGUtPm5vZGVUeXBlKCkpOworICAgIHZhbHVlLnNl
dCgyLCBub2RlTmFtZSk7CisgICAgdmFsdWUuc2V0KDMsIG5vZGVWYWx1ZSk7CisKKyAgICBpZiAo
bm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUpIHsKKyAgICAgICAgRWxlbWVu
dCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgdmFsdWUu
c2V0KDQsIGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhlbGVtZW50KSk7CisgICAgICAg
IGludCBub2RlQ291bnQgPSBpbm5lckNoaWxkTm9kZUNvdW50KGVsZW1lbnQpOworICAgICAgICB2
YWx1ZS5zZXQoNSwgbm9kZUNvdW50KTsKKworICAgICAgICBTY3JpcHRBcnJheSBjaGlsZHJlbiA9
IGJ1aWxkQXJyYXlGb3JFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCwgZGVwdGgpOworICAgICAgICBp
ZiAoY2hpbGRyZW4ubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgdmFsdWUuc2V0KDYsIGNoaWxk
cmVuKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCitTY3JpcHRBcnJheSBJbnNwZWN0
b3JET01BZ2VudDo6YnVpbGRBcnJheUZvckVsZW1lbnRBdHRyaWJ1dGVzKEVsZW1lbnQqIGVsZW1l
bnQpCit7CisgICAgU2NyaXB0QXJyYXkgYXR0cmlidXRlc1ZhbHVlID0gbV9mcm9udGVuZC0+bmV3
U2NyaXB0QXJyYXkoKTsKKyAgICAvLyBHbyB0aHJvdWdoIGFsbCBhdHRyaWJ1dGVzIGFuZCBzZXJp
YWxpemUgdGhlbS4KKyAgICBjb25zdCBOYW1lZE5vZGVNYXAqIG1fYXR0ck1hcCA9IGVsZW1lbnQt
PmF0dHJpYnV0ZXModHJ1ZSk7CisgICAgaWYgKCFtX2F0dHJNYXApCisgICAgICAgIHJldHVybiBh
dHRyaWJ1dGVzVmFsdWU7CisgICAgdW5zaWduZWQgbnVtQXR0cnMgPSBtX2F0dHJNYXAtPmxlbmd0
aCgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1BdHRyczsgKytpKSB7CisgICAg
ICAgIC8vIEFkZCBhdHRyaWJ1dGUgcGFpcgorICAgICAgICBjb25zdCBBdHRyaWJ1dGUgKmF0dHJp
YnV0ZSA9IG1fYXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsKKyAgICAgICAgYXR0cmlidXRlc1Zh
bHVlLnNldCgwLCBhdHRyaWJ1dGUtPm5hbWUoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXR0cmli
dXRlc1ZhbHVlLnNldCgxLCBhdHRyaWJ1dGUtPnZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4g
YXR0cmlidXRlc1ZhbHVlOworfQorCitTY3JpcHRBcnJheSBJbnNwZWN0b3JET01BZ2VudDo6YnVp
bGRBcnJheUZvckVsZW1lbnRDaGlsZHJlbihFbGVtZW50KiBlbGVtZW50LCBpbnQgZGVwdGgpCit7
CisgICAgU2NyaXB0QXJyYXkgY2hpbGRyZW4gPSBtX2Zyb250ZW5kLT5uZXdTY3JpcHRBcnJheSgp
OworICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAg
IC8vIFNwZWNpYWwgY2FzZSB0aGVfb25seSB0ZXh0IGNoaWxkLgorICAgICAgICBpZiAoaW5uZXJD
aGlsZE5vZGVDb3VudChlbGVtZW50KSA9PSAxKSB7CisgICAgICAgICAgICBOb2RlICpjaGlsZCA9
IGlubmVyRmlyc3RDaGlsZChlbGVtZW50KTsKKyAgICAgICAgICAgIGlmIChjaGlsZC0+bm9kZVR5
cGUoKSA9PSBOb2RlOjpURVhUX05PREUpCisgICAgICAgICAgICAgICAgY2hpbGRyZW4uc2V0KGlu
ZGV4KyssIGJ1aWxkQXJyYXlGb3JOb2RlKGNoaWxkLCAwKSk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIGNoaWxkcmVuOworICAgIH0gZWxzZSBpZiAoZGVwdGggPiAwKSB7CisgICAgICAgIGRl
cHRoLS07CisgICAgfQorCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKE5vZGUgKmNoaWxk
ID0gaW5uZXJGaXJzdENoaWxkKGVsZW1lbnQpOyBjaGlsZDsgY2hpbGQgPSBpbm5lck5leHRTaWJs
aW5nKGNoaWxkKSkKKyAgICAgICAgY2hpbGRyZW4uc2V0KGluZGV4KyssIGJ1aWxkQXJyYXlGb3JO
b2RlKGNoaWxkLCBkZXB0aCkpOworICAgIHJldHVybiBjaGlsZHJlbjsKK30KKworTm9kZSogSW5z
cGVjdG9yRE9NQWdlbnQ6OmlubmVyRmlyc3RDaGlsZChOb2RlKiBub2RlKQoreworICAgIGlmIChu
b2RlLT5pc0ZyYW1lT3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgSFRNTEZyYW1lT3duZXJFbGVt
ZW50KiBmcmFtZU93bmVyID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4obm9k
ZSk7CisgICAgICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZU93bmVyLT5jb250ZW50RG9jdW1lbnQo
KTsKKyAgICAgICAgaWYgKGRvYykgeworICAgICAgICAgICAgc3RhcnRMaXN0ZW5pbmcoZG9jKTsK
KyAgICAgICAgICAgIHJldHVybiBkb2MtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICBub2RlID0gbm9kZS0+Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChpc1doaXRlc3BhY2Uo
bm9kZSkpCisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpOworICAgIHJldHVybiBu
b2RlOworfQorCitOb2RlKiBJbnNwZWN0b3JET01BZ2VudDo6aW5uZXJOZXh0U2libGluZyhOb2Rl
KiBub2RlKQoreworICAgIGRvIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCk7
CisgICAgfSB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30K
KworTm9kZSogSW5zcGVjdG9yRE9NQWdlbnQ6OmlubmVyUHJldmlvdXNTaWJsaW5nKE5vZGUqIG5v
ZGUpCit7CisgICAgZG8geworICAgICAgICBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7
CisgICAgfSB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30K
KworaW50IEluc3BlY3RvckRPTUFnZW50Ojppbm5lckNoaWxkTm9kZUNvdW50KE5vZGUqIG5vZGUp
Cit7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBOb2RlKiBjaGlsZCA9IGlubmVyRmlyc3RDaGls
ZChub2RlKTsKKyAgICB3aGlsZSAoY2hpbGQpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAg
Y2hpbGQgPSBpbm5lck5leHRTaWJsaW5nKGNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50
OworfQorCitFbGVtZW50KiBJbnNwZWN0b3JET01BZ2VudDo6aW5uZXJQYXJlbnRFbGVtZW50KE5v
ZGUqIG5vZGUpCit7CisgICAgRWxlbWVudCogZWxlbWVudCA9IG5vZGUtPnBhcmVudEVsZW1lbnQo
KTsKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybiBub2RlLT5vd25lckRvY3VtZW50
KCktPm93bmVyRWxlbWVudCgpOworICAgIHJldHVybiBlbGVtZW50OworfQorCitib29sIEluc3Bl
Y3RvckRPTUFnZW50Ojppc1doaXRlc3BhY2UoTm9kZSogbm9kZSkKK3sKKyAgICByZXR1cm4gbm9k
ZSAmJiBub2RlLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSAmJiBub2RlLT5ub2RlVmFs
dWUoKS5zdHJpcFdoaXRlU3BhY2UoKS5sZW5ndGgoKSA9PSAwOworfQorCitEb2N1bWVudCogSW5z
cGVjdG9yRE9NQWdlbnQ6Om1haW5GcmFtZURvY3VtZW50KCkKK3sKKyAgICBMaXN0SGFzaFNldDxS
ZWZQdHI8RG9jdW1lbnQ+ID46Oml0ZXJhdG9yIGl0ID0gbV9kb2N1bWVudHMuYmVnaW4oKTsKKyAg
ICBpZiAoaXQgIT0gbV9kb2N1bWVudHMuZW5kKCkpCisgICAgICAgIHJldHVybiBpdC0+Z2V0KCk7
CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNv
cmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50LmgNCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3Jl
L2luc3BlY3Rvci9JbnNwZWN0b3JET01BZ2VudC5oCShyZXZpc2lvbiAwKQ0KKysrIFdlYkNvcmUv
aW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50LmgJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDEx
MSBAQA0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBJbnNwZWN0b3JET01BZ2VudF9oCisjZGVmaW5lIEluc3BlY3RvckRP
TUFnZW50X2gKKworI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJTY3JpcHRB
cnJheS5oIgorI2luY2x1ZGUgIlNjcmlwdE9iamVjdC5oIgorI2luY2x1ZGUgIlNjcmlwdFN0YXRl
LmgiCisKKyNpbmNsdWRlIDx3dGYvTGlzdEhhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIu
aD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBj
bGFzcyBFbGVtZW50OworICAgIGNsYXNzIEV2ZW50OworICAgIGNsYXNzIERvY3VtZW50OworICAg
IGNsYXNzIEluc3BlY3RvckZyb250ZW5kOworICAgIGNsYXNzIE5hbWVOb2RlTWFwOworICAgIGNs
YXNzIE5vZGU7CisgICAgY2xhc3MgUGFnZTsKKworICAgIGNsYXNzIEluc3BlY3RvckRPTUFnZW50
IDogcHVibGljIEV2ZW50TGlzdGVuZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW5zcGVjdG9y
RE9NQWdlbnQoSW5zcGVjdG9yRnJvbnRlbmQqIGZyb250ZW5kKTsKKyAgICAgICAgfkluc3BlY3Rv
ckRPTUFnZW50KCk7CisKKyAgICAgICAgdm9pZCBnZXREb2N1bWVudEVsZW1lbnQoKTsNCisgICAg
ICAgIHZvaWQgZ2V0Q2hpbGROb2RlcyhpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkKTsNCisgICAg
ICAgIHZvaWQgc2V0QXR0cmlidXRlKGludCBjYWxsSWQsIGludCBlbGVtZW50SWQsIGNvbnN0IFN0
cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7DQorICAgICAgICB2b2lkIHJlbW92ZUF0
dHJpYnV0ZShpbnQgY2FsbElkLCBpbnQgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIG5hbWUpOw0K
KyAgICAgICAgdm9pZCBzZXRUZXh0Tm9kZVZhbHVlKGludCBjYWxsSWQsIGludCBlbGVtZW50SWQs
IGNvbnN0IFN0cmluZyYgdmFsdWUpOw0KKworICAgICAgICB2b2lkIHNldERvY3VtZW50KERvY3Vt
ZW50KiBkb2N1bWVudCk7CisKKyAgICAgICAgTm9kZSogbm9kZUZvcklkKGludCBub2RlSWQpOwor
ICAgICAgICBpbnQgaWRGb3JOb2RlKE5vZGUqIG5vZGUpOworICAgICAgICBpbnQgcHVzaE5vZGVQ
YXRoVG9Gcm9udGVuZChOb2RlKiBub2RlKTsKKworICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBz
dGFydExpc3RlbmluZyhEb2N1bWVudCogZG9jdW1lbnQpOworICAgICAgICB2b2lkIHN0b3BMaXN0
ZW5pbmcoRG9jdW1lbnQqIGRvY3VtZW50KTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxl
RXZlbnQoRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93RXZlbnQpOworCisgICAgICAgIGludCBi
aW5kKE5vZGUqIG5vZGUpOworICAgICAgICB2b2lkIHVuYmluZChOb2RlKiBub2RlKTsKKworICAg
ICAgICB2b2lkIHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zyb250ZW5kKCk7CisgICAgICAgIHZvaWQg
cHVzaENoaWxkTm9kZXNUb0Zyb250ZW5kKGludCBlbGVtZW50SWQpOworCisgICAgICAgIFNjcmlw
dEFycmF5IGJ1aWxkQXJyYXlGb3JOb2RlKE5vZGUqIG5vZGUsIGludCBkZXB0aCk7CisgICAgICAg
IFNjcmlwdEFycmF5IGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhFbGVtZW50KiBlbGVt
ZW4pOworICAgICAgICBTY3JpcHRBcnJheSBidWlsZEFycmF5Rm9yRWxlbWVudENoaWxkcmVuKEVs
ZW1lbnQqIGVsZW1lbnQsIGludCBkZXB0aCk7CisKKyAgICAgICAgLy8gV2UgcmVwcmVzZW50IGVt
YmVkZGVkIGRvbXMgYXMgYSBwYXJ0IG9mIHRoZSBzYW1lIGhpZXJhcmNoeS4gSGVuY2Ugd2UgdHJl
YXQgY2hpbGRyZW4gb2YgZnJhbWUgb3duZXJzIGRpZmZlcmVudGx5LiAKKyAgICAgICAgLy8gV2Ug
YWxzbyBza2lwIHdoaXRlc3BhY2UgdGV4dCBub2RlcyBjb25kaXRpb25hbGx5LiBGb2xsb3dpbmcg
bWV0aG9kcyBlbmNhcHN1bGF0ZSB0aGVzZSBzcGVjaWZpY3MuCisgICAgICAgIE5vZGUqIGlubmVy
Rmlyc3RDaGlsZChOb2RlKiBub2RlKTsKKyAgICAgICAgTm9kZSogaW5uZXJOZXh0U2libGluZyhO
b2RlKiBub2RlKTsKKyAgICAgICAgTm9kZSogaW5uZXJQcmV2aW91c1NpYmxpbmcoTm9kZSogbm9k
ZSk7CisgICAgICAgIGludCBpbm5lckNoaWxkTm9kZUNvdW50KE5vZGUqIG5vZGUpOworICAgICAg
ICBFbGVtZW50KiBpbm5lclBhcmVudEVsZW1lbnQoTm9kZSogbm9kZSk7CisgICAgICAgIGJvb2wg
aXNXaGl0ZXNwYWNlKE5vZGUqIG5vZGUpOworCisgICAgICAgIERvY3VtZW50KiBtYWluRnJhbWVE
b2N1bWVudCgpOworICAgICAgICB2b2lkIGRpc2NhcmRCaW5kaW5ncygpOworCisgICAgICAgIElu
c3BlY3RvckZyb250ZW5kKiBtX2Zyb250ZW5kOworICAgICAgICBIYXNoTWFwPE5vZGUqLCBpbnQ+
IG1fbm9kZVRvSWQ7CisgICAgICAgIEhhc2hNYXA8aW50LCBOb2RlKj4gbV9pZFRvTm9kZTsKKyAg
ICAgICAgSGFzaFNldDxpbnQ+IG1fY2hpbGRyZW5SZXF1ZXN0ZWQ7CisgICAgICAgIGludCBtX2xh
c3ROb2RlSWQ7CisgICAgICAgIExpc3RIYXNoU2V0PFJlZlB0cjxEb2N1bWVudD4gPiBtX2RvY3Vt
ZW50czsKKyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IG1fZXZlbnRMaXN0ZW5lcjsKKyAg
ICAgICAgYm9vbCBtX2RvY3VtZW50RWxlbWVudFJlcXVlc3RlZDsKKyAgICB9OworCisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vICFkZWZpbmVkKEluc3BlY3RvckRPTUFnZW50
X2gpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33935</attachid>
            <date>2009-08-01 05:04:38 -0700</date>
            <delta_ts>2009-08-01 11:03:24 -0700</delta_ts>
            <desc>InspectorDOMAgent and WebInspector.DOMAgent</desc>
            <filename>dom_agent.patch</filename>
            <type>text/plain</type>
            <size>65422</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTYwMWNmMS4uNzgxMTBjNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MSBAQAorMjAwOS0wOC0wMSAgUGF2ZWwgRmVsZG1h
biAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBSZWltcGxlbWVudCBFbGVtZW50cyBQ
YW5lbCBzbyB0aGF0IGl0cworICAgICAgICBpbnRlcmFjdGlvbiB3aXRoIERPTSBpcyBzZXJpYWxp
emVkLgorCisgICAgICAgIFRoaXMgaXMgYSBmaXJzdCBjdXQgd3V0aCByZWFkIHN1cHBvcnQgZm9y
IERPTSBlbGVtZW50cworICAgICAgICB0cmVlIGFzIHdlbGwgYXMgc29tZSBsaW1pdGVkIGVkaXRp
bmcuIE5vIHByb3BlcnRpZXMsIG5vCisgICAgICAgIHN0eWxlcywgbm8gc2VhcmNoIGNhcGFiaWxp
dGllcyBhcmUgaW1wbGVtZW50ZWQgeWV0LgorICAgICAgICBTZXQgUHJlZmVyZW5jZXMudXNlRE9N
QWdlbnQgdG8gdHJ1ZSBpbiBvcmRlciB0byB0cnkgaXQKKyAgICAgICAgb3V0LCBvdGhlcndpc2Ug
ZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mjc3NzEKKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAg
ICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnBybzoKKyAgICAgICAgKiBXZWJD
b3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2o6CisgICAgICAgICogV2ViQ29yZVNvdXJjZXMuYmtsOgorICAgICAgICAq
IGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Okluc3Bl
Y3RvckJhY2tlbmQ6OmdldENoaWxkTm9kZXMpOgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9y
QmFja2VuZDo6c2V0QXR0cmlidXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckJhY2tl
bmQ6OnJlbW92ZUF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JCYWNrZW5k
OjpzZXRUZXh0Tm9kZVZhbHVlKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQmFja2Vu
ZC5oOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmlkbDoKKyAgICAgICAg
KiBpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
bnNwZWN0b3JDb250cm9sbGVyOjp3aW5kb3dTY3JpcHRPYmplY3RBdmFpbGFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6c2V0RnJvbnRlbmRQcm94eU9iamVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpjbG9zZSk6CisgICAgICAg
IChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpwb3B1bGF0ZVNjcmlwdE9iamVjdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6ZGlkQ29tbWl0TG9hZCk6Cisg
ICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuaDoKKyAgICAgICAgKFdlYkNv
cmU6Okluc3BlY3RvckNvbnRyb2xsZXI6OmRvbUFnZW50KToKKyAgICAgICAgKiBpbnNwZWN0b3Iv
SW5zcGVjdG9yRE9NQWdlbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVj
dG9yRE9NQWdlbnQuaDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250
ZW5kLmNwcDoKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuaDoKKyAgICAg
ICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0NhbGxiYWNrLmpzOiBBZGRlZC4KKyAgICAgICAgKiBp
bnNwZWN0b3IvZnJvbnQtZW5kL0RPTUFnZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0
b3IvZnJvbnQtZW5kL0VsZW1lbnRzUGFuZWwuanM6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250
LWVuZC9XZWJLaXQucXJjOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9y
Lmh0bWw6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanM6CisgICAg
ICAgIChXZWJJbnNwZWN0b3IubG9hZGVkKToKKwogMjAwOS0wNy0zMCAgQW50b24gTXVoaW4gIDxh
bnRvbm1AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIExldmluLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFrZWZpbGUu
YW0KaW5kZXggYWRkMzVhYS4uNmNiMzY5MyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmls
ZS5hbQorKysgYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xMTI1LDYgKzExMjUsOCBAQCB3
ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQu
aCBcCiAJV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAgXAog
CVdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRhdGFiYXNlUmVzb3VyY2UuaCBcCisJV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY3BwIFwKKwlXZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JET01BZ2VudC5oIFwKIAlXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01TdG9y
YWdlUmVzb3VyY2UuY3BwIFwKIAlXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01TdG9yYWdl
UmVzb3VyY2UuaCBcCiAJV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ2xpZW50LmggXApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRl
eCA3YjI2NDIxLi5jOGMwNzU4IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysg
Yi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTQwNiw2ICsxNDA2LDggQEAKICAgICAgICAgICAg
ICdpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9JbnNwZWN0b3JEYXRhYmFzZVJlc291cmNlLmgnLAorICAgICAgICAgICAgJ2luc3BlY3Rvci9J
bnNwZWN0b3JET01BZ2VudC5jcHAnLAorICAgICAgICAgICAgJ2luc3BlY3Rvci9JbnNwZWN0b3JE
T01BZ2VudC5oJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFnZVJl
c291cmNlLmNwcCcsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL0luc3BlY3RvckRPTVN0b3JhZ2VS
ZXNvdXJjZS5oJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuY3Bw
JywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJv
CmluZGV4IDQzYTkxZTguLmRkY2M1MWIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8K
KysrIGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtODQ4LDYgKzg0OCw3IEBAIFNPVVJDRVMgKz0g
XAogICAgIGluc3BlY3Rvci9Db25zb2xlTWVzc2FnZS5jcHAgXAogICAgIGluc3BlY3Rvci9JbnNw
ZWN0b3JCYWNrZW5kLmNwcCBcCiAgICAgaW5zcGVjdG9yL0luc3BlY3RvckRhdGFiYXNlUmVzb3Vy
Y2UuY3BwIFwKKyAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY3BwIFwKICAgICBpbnNw
ZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFnZVJlc291cmNlLmNwcCBcCiAgICAgaW5zcGVjdG9yL0lu
c3BlY3RvckNvbnRyb2xsZXIuY3BwIFwKICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQu
Y3BwIFwKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2og
Yi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCmluZGV4IGZiNjhmZWMuLmFm
MWY5MGIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oK
KysrIGIvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagpAQCAtMzA2NzYsNiAr
MzA2NzYsMTQgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZl
UGF0aD0iLi5caW5zcGVjdG9yXEluc3BlY3RvckRPTUFnZW50LmNwcCINCisJCQkJPg0KKwkJCTwv
RmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3RvclxJbnNwZWN0
b3JET01BZ2VudC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0
aXZlUGF0aD0iLi5caW5zcGVjdG9yXEluc3BlY3RvckRPTVN0b3JhZ2VSZXNvdXJjZS5jcHAiDQog
CQkJCT4NCiAJCQk8L0ZpbGU+DQpAQCAtMzA3NTEsNiArMzA3NTksMTAgQEAKIAkJCQkJPg0KIAkJ
CQk8L0ZpbGU+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxm
cm9udC1lbmRcQ2FsbGJhY2suanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUN
CiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxDYWxsU3RhY2tTaWRl
YmFyUGFuZS5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTMwNzc5LDYgKzMwNzkxLDEw
IEBACiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXERPTUFnZW50LmpzIg0KKwkJCQkJPg0KKwkJCQk8L0Zp
bGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1l
bmRcRE9NU3RvcmFnZS5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggNjkxZDJlNy4uZjFiZGYzYSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTEwMjQsNiArMTAyNCw4
IEBACiAJCTc1NzkzRUQ1MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnRJbnRlcm5h
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzU3OTNF
RDIwRDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVudEludGVybmFsLmggKi87IH07CiAJ
CTdBMUU4OEY1MTAxQ0MzODQwMDBDNERGNSAvKiBTY3JpcHRBcnJheS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QTFFODhGMzEwMUNDMzg0MDAwQzRE
RjUgLyogU2NyaXB0QXJyYXkuY3BwICovOyB9OwogCQk3QTFFODhGNjEwMUNDMzg0MDAwQzRERjUg
LyogU2NyaXB0QXJyYXkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDdBMUU4OEY0MTAxQ0MzODQwMDBDNERGNSAvKiBTY3JpcHRBcnJheS5oICovOyB9Owor
CQk3QTI0NTg3QjEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gN0EyNDU4NzkxMDIxRUFG
NDAwMEEwMEFBIC8qIEluc3BlY3RvckRPTUFnZW50LmNwcCAqLzsgfTsKKwkJN0EyNDU4N0MxMDIx
RUFGNDAwMEEwMEFBIC8qIEluc3BlY3RvckRPTUFnZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QTI0NTg3QTEwMjFFQUY0MDAwQTAwQUEgLyogSW5z
cGVjdG9yRE9NQWdlbnQuaCAqLzsgfTsKIAkJN0E2NzRCREIwRjlFQkY0RTAwNkNGMDk5IC8qIFBh
Z2VHcm91cExvYWREZWZlcnJlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA3QTY3NEJEOTBGOUVCRjRFMDA2Q0YwOTkgLyogUGFnZUdyb3VwTG9hZERl
ZmVycmVyLmNwcCAqLzsgfTsKIAkJN0E2NzRCREMwRjlFQkY0RTAwNkNGMDk5IC8qIFBhZ2VHcm91
cExvYWREZWZlcnJlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gN0E2NzRCREEwRjlFQkY0RTAwNkNGMDk5IC8qIFBhZ2VHcm91cExvYWREZWZlcnJlci5o
ICovOyB9OwogCQk3QTc0RUNCNzEwMTgzOTlBMDBCRjkzOUUgLyogSW5zcGVjdG9yQmFja2VuZC5p
ZGwgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdBNzRF
Q0I2MTAxODM5OUEwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmlkbCAqLzsgfTsKQEAgLTYw
NTAsNiArNjA1Miw4IEBACiAJCTc1NzkzRUQyMEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdl
RXZlbnRJbnRlcm5hbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRE9NTWVz
c2FnZUV2ZW50SW50ZXJuYWwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJN0ExRTg4
RjMxMDFDQzM4NDAwMEM0REY1IC8qIFNjcmlwdEFycmF5LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFNjcmlwdEFycmF5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJN0ExRTg4RjQxMDFDQzM4NDAwMEM0REY1IC8qIFNjcmlwdEFycmF5LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNjcmlwdEFycmF5Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTdBMjQ1ODc5MTAyMUVBRjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01B
Z2VudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JE
T01BZ2VudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTdBMjQ1ODdBMTAyMUVB
RjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01BZ2VudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBJbnNwZWN0b3JET01BZ2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk3QTY3NEJEOTBGOUVCRjRFMDA2Q0YwOTkgLyogUGFnZUdyb3VwTG9hZERlZmVycmVyLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhZ2VHcm91cExvYWREZWZl
cnJlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdBNjc0QkRBMEY5RUJGNEUw
MDZDRjA5OSAvKiBQYWdlR3JvdXBMb2FkRGVmZXJyZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gUGFnZUdyb3VwTG9hZERlZmVycmVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTdBNzRFQ0I2MTAxODM5OUEwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmlk
bCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBJbnNwZWN0b3JCYWNrZW5kLmlkbDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTk4NDMsNiArOTg0Nyw4IEBACiAJCQkJMUM4MUI5NTYwRTk3
MzMwODAwMjY2RTA3IC8qIEluc3BlY3RvckNvbnRyb2xsZXIuaCAqLywKIAkJCQk0MUYwNjIxMzBG
NUYxOTI2MDBBMDdFQUMgLyogSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAgKi8sCiAJCQkJ
NDFGMDYyMTIwRjVGMTkyNjAwQTA3RUFDIC8qIEluc3BlY3RvckRhdGFiYXNlUmVzb3VyY2UuaCAq
LywKKwkJCQk3QTI0NTg3OTEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3Bw
ICovLAorCQkJCTdBMjQ1ODdBMTAyMUVBRjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01BZ2VudC5o
ICovLAogCQkJCTQxRjA2MTczMEY1RjAwQUMwMEEwN0VBQyAvKiBJbnNwZWN0b3JET01TdG9yYWdl
UmVzb3VyY2UuY3BwICovLAogCQkJCTQxRjA2MTcyMEY1RjAwQUMwMEEwN0VBQyAvKiBJbnNwZWN0
b3JET01TdG9yYWdlUmVzb3VyY2UuaCAqLywKIAkJCQk3QUVEM0UwMzBGQkIxRUFBMDBEMkIwM0Mg
LyogSW5zcGVjdG9yRnJvbnRlbmQuY3BwICovLApAQCAtMTcwNjMsNiArMTcwNjksNyBAQAogCQkJ
CTdBNzRFQ0JCMTAxODM5QTYwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmggaW4gSGVhZGVy
cyAqLywKIAkJCQk3QTFFODhGNjEwMUNDMzg0MDAwQzRERjUgLyogU2NyaXB0QXJyYXkuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTQxQTNENThGMTAxQzE1MkQwMDMxNkQwNyAvKiBEZWRpY2F0ZWRXb3Jr
ZXJUaHJlYWQuaCBpbiBIZWFkZXJzICovLAorCQkJCTdBMjQ1ODdDMTAyMUVBRjQwMDBBMDBBQSAv
KiBJbnNwZWN0b3JET01BZ2VudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZv
ckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xOTEwNSw2ICsxOTExMiw3
IEBACiAJCQkJN0E3NEVDQkQxMDE4MzlEQTAwQkY5MzlFIC8qIEpTSW5zcGVjdG9yQmFja2VuZEN1
c3RvbS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3QTFFODhGNTEwMUNDMzg0MDAwQzRERjUgLyog
U2NyaXB0QXJyYXkuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDFBM0Q1OEUxMDFDMTUyRDAwMzE2
RDA3IC8qIERlZGljYXRlZFdvcmtlclRocmVhZC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk3QTI0
NTg3QjEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJ
CX07CmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmVTb3VyY2VzLmJrbCBiL1dlYkNvcmUvV2Vi
Q29yZVNvdXJjZXMuYmtsCmluZGV4IDhiNzJiY2UuLmY3ODE0YjQgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvV2ViQ29yZVNvdXJjZXMuYmtsCisrKyBiL1dlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCkBA
IC02NjMsNiArNjYzLDcgQEAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGZpbGVzIG5l
ZWRlZCB0byBidWlsZCBXZWJDb3JlLgogICAgICAgICBpbnNwZWN0b3IvQ29uc29sZU1lc3NhZ2Uu
Y3BwCiAgICAgICAgIGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcAogICAgICAgICBpbnNw
ZWN0b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAKKyAgICAgICAgaW5zcGVjdG9yL0lu
c3BlY3RvckRPTUFnZW50LmNwcAogICAgICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFn
ZVJlc291cmNlLmNwcAogICAgICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAK
ICAgICAgICAgaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kLmNwcApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5jcHAgYi9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JCYWNrZW5kLmNwcAppbmRleCBkNTBlZmQzLi4xZWIxMGU4IDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcAorKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkhU
TUxGcmFtZU93bmVyRWxlbWVudC5oIgogI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudC5oIgogI2lu
Y2x1ZGUgIkluc3BlY3RvckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JET01BZ2Vu
dC5oIgogI2luY2x1ZGUgIkluc3BlY3RvclJlc291cmNlLmgiCiAKICNpZiBFTkFCTEUoSkFWQVND
UklQVF9ERUJVR0dFUikKQEAgLTE4MSwxMCArMTgyLDEwIEBAIGJvb2wgSW5zcGVjdG9yQmFja2Vu
ZDo6c2VhcmNoaW5nRm9yTm9kZSgpCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEluc3Bl
Y3RvckJhY2tlbmQ6OmxvYWRlZCgpCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6OmxvYWRlZChib29s
IGVuYWJsZURPTUFnZW50KQogewogICAgIGlmIChtX2luc3BlY3RvckNvbnRyb2xsZXIpCi0gICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+c2NyaXB0T2JqZWN0UmVhZHkoKTsKKyAgICAgICAg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5zY3JpcHRPYmplY3RSZWFkeShlbmFibGVET01BZ2VudCk7
CiB9CiAKIHZvaWQgSW5zcGVjdG9yQmFja2VuZDo6ZW5hYmxlUmVzb3VyY2VUcmFja2luZyhib29s
IGFsd2F5cykKQEAgLTM1NCw2ICszNTUsMzAgQEAgdm9pZCBJbnNwZWN0b3JCYWNrZW5kOjpzdGVw
T3V0T2ZGdW5jdGlvbkluRGVidWdnZXIoKQogCiAjZW5kaWYKIAordm9pZCBJbnNwZWN0b3JCYWNr
ZW5kOjpnZXRDaGlsZE5vZGVzKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCkKK3sKKyAgICBp
ZiAobV9pbnNwZWN0b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXIt
PmRvbUFnZW50KCktPmdldENoaWxkTm9kZXMoY2FsbElkLCBlbGVtZW50SWQpOworfQorCit2b2lk
IEluc3BlY3RvckJhY2tlbmQ6OnNldEF0dHJpYnV0ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50
SWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBpZiAo
bV9pbnNwZWN0b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRv
bUFnZW50KCktPnNldEF0dHJpYnV0ZShjYWxsSWQsIGVsZW1lbnRJZCwgbmFtZSwgdmFsdWUpOwor
fQorCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6OnJlbW92ZUF0dHJpYnV0ZShsb25nIGNhbGxJZCwg
bG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBpZiAobV9pbnNwZWN0
b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkt
PnJlbW92ZUF0dHJpYnV0ZShjYWxsSWQsIGVsZW1lbnRJZCwgbmFtZSk7Cit9CisKK3ZvaWQgSW5z
cGVjdG9yQmFja2VuZDo6c2V0VGV4dE5vZGVWYWx1ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50
SWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgaWYgKG1faW5zcGVjdG9yQ29udHJvbGxl
cikKKyAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5zZXRUZXh0Tm9k
ZVZhbHVlKGNhbGxJZCwgZWxlbWVudElkLCB2YWx1ZSk7Cit9CisKIHZvaWQgSW5zcGVjdG9yQmFj
a2VuZDo6aGlnaGxpZ2h0KE5vZGUqIG5vZGUpCiB7CiAgICAgaWYgKG1faW5zcGVjdG9yQ29udHJv
bGxlcikKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaCBi
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaAppbmRleCBiYjg5MWMyLi5kYWEx
NmI0IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmgKKysr
IGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5oCkBAIC0zOSw2ICszOSw3IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQ2FjaGVkUmVzb3VyY2U7CiBjbGFzcyBJbnNw
ZWN0b3JDbGllbnQ7CitjbGFzcyBJbnNwZWN0b3JET01BZ2VudDsKIGNsYXNzIEphdmFTY3JpcHRD
YWxsRnJhbWU7CiBjbGFzcyBOb2RlOwogCkBAIC04MSw3ICs4Miw3IEBAIHB1YmxpYzoKIAogICAg
IGJvb2wgc2VhcmNoaW5nRm9yTm9kZSgpOwogCi0gICAgdm9pZCBsb2FkZWQoKTsKKyAgICB2b2lk
IGxvYWRlZChib29sIGVuYWJsZURPTUFnZW50KTsKIAogICAgIHZvaWQgZW5hYmxlUmVzb3VyY2VU
cmFja2luZyhib29sIGFsd2F5cyk7CiAgICAgdm9pZCBkaXNhYmxlUmVzb3VyY2VUcmFja2luZyhi
b29sIGFsd2F5cyk7CkBAIC0xMjIsNiArMTIzLDExIEBAIHB1YmxpYzoKICAgICB2b2lkIHN0ZXBP
dXRPZkZ1bmN0aW9uSW5EZWJ1Z2dlcigpOwogI2VuZGlmCiAKKyAgICB2b2lkIGdldENoaWxkTm9k
ZXMobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkKTsKKyAgICB2b2lkIHNldEF0dHJpYnV0ZShs
b25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CisgICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUobG9uZyBjYWxsSWQsIGxvbmcg
ZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZvaWQgc2V0VGV4dE5vZGVWYWx1
ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCiAg
ICAgLy8gR2VuZXJpYyBjb2RlIGNhbGxlZCBmcm9tIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuCiAg
ICAgdm9pZCBoaWdobGlnaHQoTm9kZSogbm9kZSk7CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaWRsIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
QmFja2VuZC5pZGwKaW5kZXggMjFlNmQ5OS4uYmFlMWYyNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5pZGwKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQmFja2VuZC5pZGwKQEAgLTM2LDcgKzM2LDcgQEAgbW9kdWxlIGNvcmUgewogICAgIF0g
SW5zcGVjdG9yQmFja2VuZCB7CiAgICAgICAgIHZvaWQgaGlkZURPTU5vZGVIaWdobGlnaHQoKTsK
ICAgICAgICAgW0N1c3RvbV0gdm9pZCBoaWdobGlnaHRET01Ob2RlKGluIE5vZGUgbm9kZSk7Ci0g
ICAgICAgIHZvaWQgbG9hZGVkKCk7CisgICAgICAgIHZvaWQgbG9hZGVkKGluIGJvb2xlYW4gZW5h
YmxlRE9NQWdlbnQpOwogICAgICAgICB2b2lkIHdpbmRvd1VubG9hZGluZygpOwogICAgICAgICB2
b2lkIGF0dGFjaCgpOwogICAgICAgICB2b2lkIGRldGFjaCgpOwpAQCAtOTcsNSArOTcsOSBAQCBt
b2R1bGUgY29yZSB7CiAKICAgICAgICAgW0N1c3RvbV0gQXJyYXkgcHJvZmlsZXMoKTsKICNlbmRp
ZgotICAgICB9OworICAgICAgICB2b2lkIGdldENoaWxkTm9kZXMoaW4gbG9uZyBjYWxsSWQsIGlu
IGxvbmcgZWxlbWVudElkKTsKKyAgICAgICAgdm9pZCBzZXRBdHRyaWJ1dGUoaW4gbG9uZyBjYWxs
SWQsIGluIGxvbmcgZWxlbWVudElkLCBpbiBET01TdHJpbmcgbmFtZSwgaW4gRE9NU3RyaW5nIHZh
bHVlKTsKKyAgICAgICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoaW4gbG9uZyBjYWxsSWQsIGluIGxv
bmcgZWxlbWVudElkLCBpbiBET01TdHJpbmcgbmFtZSk7CisgICAgICAgIHZvaWQgc2V0VGV4dE5v
ZGVWYWx1ZShpbiBsb25nIGNhbGxJZCwgaW4gbG9uZyBlbGVtZW50SWQsIGluIERPTVN0cmluZyB2
YWx1ZSk7CisgICAgfTsKICB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JDb250cm9sbGVyLmNwcCBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIu
Y3BwCmluZGV4IGRkOWQxNTYuLmMzMzUxZTUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
ckNvbnRyb2xsZXIuY3BwCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSAiSW5zcGVjdG9yQ2xp
ZW50LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKICNpbmNsdWRlICJJbnNwZWN0
b3JEYXRhYmFzZVJlc291cmNlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yRE9NQWdlbnQuaCIKICNp
bmNsdWRlICJJbnNwZWN0b3JET01TdG9yYWdlUmVzb3VyY2UuaCIKICNpbmNsdWRlICJJbnNwZWN0
b3JSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkphdmFTY3JpcHRQcm9maWxlLmgiCkBAIC01MDYsMTIg
KzUwNywxMSBAQCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OndpbmRvd1NjcmlwdE9iamVjdEF2
YWlsYWJsZSgpCiAKICAgICAvLyBHcmFudCB0aGUgaW5zcGVjdG9yIHRoZSBhYmlsaXR5IHRvIHNj
cmlwdCB0aGUgaW5zcGVjdGVkIHBhZ2UuCiAgICAgbV9wYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1l
bnQoKS0+c2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKLQogICAgIG1f
c2NyaXB0U3RhdGUgPSBzY3JpcHRTdGF0ZUZyb21QYWdlKG1fcGFnZSk7CiAgICAgU2NyaXB0R2xv
YmFsT2JqZWN0OjpzZXQobV9zY3JpcHRTdGF0ZSwgIkluc3BlY3RvckNvbnRyb2xsZXIiLCBtX2lu
c3BlY3RvckJhY2tlbmQuZ2V0KCkpOwogfQogCi12b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OnNj
cmlwdE9iamVjdFJlYWR5KCkKK3ZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6c2NyaXB0T2JqZWN0
UmVhZHkoYm9vbCBlbmFibGVET01BZ2VudCkKIHsKICAgICBBU1NFUlQobV9zY3JpcHRTdGF0ZSk7
CiAgICAgaWYgKCFtX3NjcmlwdFN0YXRlKQpAQCAtNTIxLDYgKzUyMSw4IEBAIHZvaWQgSW5zcGVj
dG9yQ29udHJvbGxlcjo6c2NyaXB0T2JqZWN0UmVhZHkoKQogICAgIGlmICghU2NyaXB0R2xvYmFs
T2JqZWN0OjpnZXQobV9zY3JpcHRTdGF0ZSwgIldlYkluc3BlY3RvciIsIHdlYkluc3BlY3Rvck9i
aikpCiAgICAgICAgIHJldHVybjsKICAgICBzZXRGcm9udGVuZFByb3h5T2JqZWN0KG1fc2NyaXB0
U3RhdGUsIHdlYkluc3BlY3Rvck9iaik7CisgICAgaWYgKGVuYWJsZURPTUFnZW50KQorICAgICAg
ICBtX2RvbUFnZW50ID0gbmV3IEluc3BlY3RvckRPTUFnZW50KG1fZnJvbnRlbmQuZ2V0KCkpOwog
CiAjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICAgU2V0dGluZyBkZWJ1Z2dlckVu
YWJsZWQgPSBzZXR0aW5nKGRlYnVnZ2VyRW5hYmxlZFNldHRpbmdOYW1lKTsKQEAgLTU5Myw2ICs1
OTUsMTAgQEAgdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpjbG9zZSgpCiAgICAgY2xvc2VXaW5k
b3coKTsKIAogICAgIG1fZnJvbnRlbmQuc2V0KDApOworICAgIGlmIChtX2RvbUFnZW50KSB7Cisg
ICAgICAgIG1fZG9tQWdlbnQtPnNldERvY3VtZW50KDApOworICAgICAgICBtX2RvbUFnZW50ID0g
MDsKKyAgICB9CiAgICAgbV9zY3JpcHRTdGF0ZSA9IDA7CiB9CiAKQEAgLTY0Myw2ICs2NDksOCBA
QCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OnBvcHVsYXRlU2NyaXB0T2JqZWN0cygpCiAgICAg
ICAgICgqaXQpLT5iaW5kKG1fZnJvbnRlbmQuZ2V0KCkpOwogI2VuZGlmCiAKKyAgICBpZiAobV9k
b21BZ2VudCkKKyAgICAgICAgbV9kb21BZ2VudC0+c2V0RG9jdW1lbnQobV9pbnNwZWN0ZWRQYWdl
LT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKSk7CiAgICAgbV9mcm9udGVuZC0+cG9wdWxhdGVJbnRl
cmZhY2UoKTsKIH0KIApAQCAtNzMxLDYgKzczOSw5IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxl
cjo6ZGlkQ29tbWl0TG9hZChEb2N1bWVudExvYWRlciogbG9hZGVyKQogICAgICAgICAgICAgICAg
IG1fbWFpblJlc291cmNlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAg
IGlmIChtX2RvbUFnZW50KQorICAgICAgICAgICAgbV9kb21BZ2VudC0+c2V0RG9jdW1lbnQobV9p
bnNwZWN0ZWRQYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKSk7CiAgICAgfQogCiAgICAgZm9y
IChGcmFtZSogZnJhbWUgPSBsb2FkZXItPmZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50
cmVlKCktPnRyYXZlcnNlTmV4dChsb2FkZXItPmZyYW1lKCkpKQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQ29udHJvbGxlci5oCmluZGV4IDc3MWY3NDEuLmQ5ZTcxNzYgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuaAorKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmgKQEAgLTUzLDExICs1MywxMyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKIGNsYXNzIENhY2hlZFJlc291cmNlOwogY2xhc3MgRGF0YWJhc2U7CitjbGFz
cyBEb2N1bWVudDsKIGNsYXNzIERvY3VtZW50TG9hZGVyOwogY2xhc3MgR3JhcGhpY3NDb250ZXh0
OwogY2xhc3MgSGl0VGVzdFJlc3VsdDsKIGNsYXNzIEluc3BlY3RvckJhY2tlbmQ7CiBjbGFzcyBJ
bnNwZWN0b3JDbGllbnQ7CitjbGFzcyBJbnNwZWN0b3JET01BZ2VudDsKIGNsYXNzIEluc3BlY3Rv
ckZyb250ZW5kOwogY2xhc3MgSmF2YVNjcmlwdENhbGxGcmFtZTsKIGNsYXNzIFN0b3JhZ2VBcmVh
OwpAQCAtMjY5LDEyICsyNzEsMTQgQEAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgSW5zcGVj
dG9yQmFja2VuZDsKICAKICAgICAvLyBGb2xsb3dpbmcgYXJlIHVzZWQgZnJvbSBJbnNwZWN0b3JC
YWNrZW5kIGFuZCBpbnRlcm5hbGx5LgotICAgIHZvaWQgc2NyaXB0T2JqZWN0UmVhZHkoKTsKKyAg
ICB2b2lkIHNjcmlwdE9iamVjdFJlYWR5KGJvb2wgZW5hYmxlRE9NQWdlbnQpOwogICAgIHZvaWQg
bW92ZVdpbmRvd0J5KGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0OwogICAgIHZvaWQgc2V0QXR0YWNo
ZWRXaW5kb3coYm9vbCk7CiAgICAgdm9pZCBzZXRBdHRhY2hlZFdpbmRvd0hlaWdodCh1bnNpZ25l
ZCBoZWlnaHQpOwogICAgIHZvaWQgc3RvcmVMYXN0QWN0aXZlUGFuZWwoY29uc3QgU3RyaW5nJiBw
YW5lbE5hbWUpOwogICAgIHZvaWQgY2xvc2VXaW5kb3coKTsKKyAgICBJbnNwZWN0b3JET01BZ2Vu
dCogZG9tQWdlbnQoKSB7IHJldHVybiBtX2RvbUFnZW50LmdldCgpOyB9CisKICNpZiBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKICAgICB2b2lkIHN0YXJ0VXNlckluaXRpYXRlZFByb2ZpbGlu
Z1Nvb24oKTsKICAgICB2b2lkIHRvZ2dsZVJlY29yZEJ1dHRvbihib29sKTsKQEAgLTMwMSw2ICsz
MDUsNyBAQCBwcml2YXRlOgogICAgIFBhZ2UqIG1faW5zcGVjdGVkUGFnZTsKICAgICBJbnNwZWN0
b3JDbGllbnQqIG1fY2xpZW50OwogICAgIE93blB0cjxJbnNwZWN0b3JGcm9udGVuZD4gbV9mcm9u
dGVuZDsKKyAgICBSZWZQdHI8SW5zcGVjdG9yRE9NQWdlbnQ+IG1fZG9tQWdlbnQ7CiAgICAgUGFn
ZSogbV9wYWdlOwogICAgIFJlZlB0cjxOb2RlPiBtX25vZGVUb0ZvY3VzOwogICAgIFJlZlB0cjxJ
bnNwZWN0b3JSZXNvdXJjZT4gbV9tYWluUmVzb3VyY2U7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JET01BZ2VudC5jcHAgYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JET01BZ2VudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViZWQ3
NwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50
LmNwcApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5z
cGVjdG9yRE9NQWdlbnQuaCIKKworI2luY2x1ZGUgIkF0b21pY1N0cmluZy5oIgorI2luY2x1ZGUg
IkRPTVdpbmRvdy5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRXZlbnQuaCIK
KyNpbmNsdWRlICJFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2lu
Y2x1ZGUgIkV2ZW50VGFyZ2V0LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lT3duZXJFbGVtZW50Lmgi
CisjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKyNp
bmNsdWRlICJNdXRhdGlvbkV2ZW50LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIk5v
ZGVMaXN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTY3JpcHRP
YmplY3QuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0luc3BlY3Rv
ckRPTUFnZW50OjpJbnNwZWN0b3JET01BZ2VudChJbnNwZWN0b3JGcm9udGVuZCogZnJvbnRlbmQp
CisgICAgOiBtX2Zyb250ZW5kKGZyb250ZW5kKQorICAgICwgbV9sYXN0Tm9kZUlkKDEpCit7Cit9
CisKK0luc3BlY3RvckRPTUFnZW50Ojp+SW5zcGVjdG9yRE9NQWdlbnQoKQoreworICAgIHNldERv
Y3VtZW50KDApOworfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpzZXREb2N1bWVudChEb2N1
bWVudCogZG9jKQoreworICAgIGlmIChkb2MgPT0gbWFpbkZyYW1lRG9jdW1lbnQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgTGlzdEhhc2hTZXQ8UmVmUHRyPERvY3VtZW50PiA+IGNvcHkgPSBt
X2RvY3VtZW50czsKKyAgICBmb3IgKExpc3RIYXNoU2V0PFJlZlB0cjxEb2N1bWVudD4gPjo6aXRl
cmF0b3IgaXQgPSBjb3B5LmJlZ2luKCk7IGl0ICE9IGNvcHkuZW5kKCk7ICsraXQpCisgICAgICAg
IHN0b3BMaXN0ZW5pbmcoKCppdCkuZ2V0KCkpOworCisgICAgQVNTRVJUKCFtX2RvY3VtZW50cy5z
aXplKCkpOworCisgICAgaWYgKGRvYykgeworICAgICAgICBzdGFydExpc3RlbmluZyhkb2MpOwor
ICAgICAgICBpZiAoZG9jLT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgcHVzaERv
Y3VtZW50RWxlbWVudFRvRnJvbnRlbmQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICAgIGRpc2NhcmRCaW5kaW5ncygpOworICAgIH0KK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2Vu
dDo6c3RhcnRMaXN0ZW5pbmcoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBpZiAobV9kb2N1bWVudHMu
Y29udGFpbnMoZG9jKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZG9jLT5hZGRFdmVudExpc3Rl
bmVyKGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVkRXZlbnQsIHRoaXMsIGZhbHNlKTsKKyAg
ICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEV2ZW50
LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZXMoKS5E
T01Ob2RlUmVtb3ZlZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5hZGRFdmVudExpc3Rl
bmVyKGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudEV2ZW50LCB0aGlzLCB0
cnVlKTsKKyAgICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTUF0dHJNb2Rp
ZmllZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgbV9kb2N1bWVudHMuYWRkKGRvYyk7Cit9CisK
K3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnN0b3BMaXN0ZW5pbmcoRG9jdW1lbnQqIGRvYykKK3sK
KyAgICBpZiAoIW1fZG9jdW1lbnRzLmNvbnRhaW5zKGRvYykpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGRvYy0+cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NQ29udGVudExvYWRl
ZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50
TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCwgdGhpcywgZmFsc2UpOworICAgIGRvYy0+cmVt
b3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCwgdGhpcywg
ZmFsc2UpOworICAgIGRvYy0+cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NTm9k
ZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCwgdGhpcywgdHJ1ZSk7CisgICAgZG9jLT5yZW1vdmVF
dmVudExpc3RlbmVyKGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCwgdGhpcywgZmFs
c2UpOworICAgIG1fZG9jdW1lbnRzLnJlbW92ZShkb2MpOworfQorCit2b2lkIEluc3BlY3RvckRP
TUFnZW50OjpoYW5kbGVFdmVudChFdmVudCogZXZlbnQsIGJvb2wpCit7CisgICAgQXRvbWljU3Ry
aW5nIHR5cGUgPSBldmVudC0+dHlwZSgpOworICAgIE5vZGUqIG5vZGUgPSBldmVudC0+dGFyZ2V0
KCktPnRvTm9kZSgpOworCisgICAgLy8gUmVtb3ZlIG1hcHBpbmcgZW50cnkgaWYgbmVjZXNzYXJ5
LgorICAgIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVu
dEV2ZW50KSB7CisgICAgICAgIHVuYmluZChub2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkgewor
ICAgICAgICBsb25nIGlkID0gaWRGb3JOb2RlKG5vZGUpOworICAgICAgICAvLyBJZiBub2RlIGlz
IG5vdCBtYXBwZWQgeWV0IC0+IGlnbm9yZSB0aGUgZXZlbnQuCisgICAgICAgIGlmICghaWQpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19j
YXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgbV9mcm9udGVuZC0+YXR0cmlidXRlc1VwZGF0
ZWQoaWQsIGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhlbGVtZW50KSk7CisgICAgfSBl
bHNlIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkgeworICAg
ICAgICBpZiAoaXNXaGl0ZXNwYWNlKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIE5vZGUqIHBhcmVudCA9IHN0YXRpY19jYXN0PE11dGF0aW9uRXZlbnQqPihldmVudCktPnJl
bGF0ZWROb2RlKCk7CisgICAgICAgIGxvbmcgcGFyZW50SWQgPSBpZEZvck5vZGUocGFyZW50KTsK
KyAgICAgICAgLy8gUmV0dXJuIGlmIHBhcmVudCBpcyBub3QgbWFwcGVkIHlldC4KKyAgICAgICAg
aWYgKCFwYXJlbnRJZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIW1fY2hp
bGRyZW5SZXF1ZXN0ZWQuY29udGFpbnMocGFyZW50SWQpKSB7CisgICAgICAgICAgICAvLyBObyBj
aGlsZHJlbiBhcmUgbWFwcGVkIHlldCAtPiBvbmx5IG5vdGlmeSBvbiBjaGFuZ2VzIG9mIGhhc0No
aWxkcmVuLgorICAgICAgICAgICAgbV9mcm9udGVuZC0+aGFzQ2hpbGRyZW5VcGRhdGVkKHBhcmVu
dElkLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoaWxkcmVuIGhh
dmUgYmVlbiByZXF1ZXN0ZWQgLT4gcmV0dXJuIHZhbHVlIG9mIGEgbmV3IGNoaWxkLgorICAgICAg
ICAgICAgbG9uZyBwcmV2SWQgPSBpZEZvck5vZGUoaW5uZXJQcmV2aW91c1NpYmxpbmcobm9kZSkp
OworCisgICAgICAgICAgICBTY3JpcHRBcnJheSB2YWx1ZSA9IGJ1aWxkQXJyYXlGb3JOb2RlKG5v
ZGUsIDApOworICAgICAgICAgICAgbV9mcm9udGVuZC0+Y2hpbGROb2RlSW5zZXJ0ZWQocGFyZW50
SWQsIHByZXZJZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IGV2
ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEV2ZW50KSB7CisgICAgICAgIGlmIChpc1doaXRlc3Bh
Y2Uobm9kZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgTm9kZSogcGFyZW50ID0g
c3RhdGljX2Nhc3Q8TXV0YXRpb25FdmVudCo+KGV2ZW50KS0+cmVsYXRlZE5vZGUoKTsKKyAgICAg
ICAgbG9uZyBwYXJlbnRJZCA9IGlkRm9yTm9kZShwYXJlbnQpOworICAgICAgICAvLyBJZiBwYXJl
bnQgaXMgbm90IG1hcHBlZCB5ZXQgLT4gaWdub3JlIHRoZSBldmVudC4KKyAgICAgICAgaWYgKCFw
YXJlbnRJZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIW1fY2hpbGRyZW5S
ZXF1ZXN0ZWQuY29udGFpbnMocGFyZW50SWQpKSB7CisgICAgICAgICAgICAvLyBObyBjaGlsZHJl
biBhcmUgbWFwcGVkIHlldCAtPiBvbmx5IG5vdGlmeSBvbiBjaGFuZ2VzIG9mIGhhc0NoaWxkcmVu
LgorICAgICAgICAgICAgaWYgKGlubmVyQ2hpbGROb2RlQ291bnQocGFyZW50KSA9PSAxKQorICAg
ICAgICAgICAgICAgIG1fZnJvbnRlbmQtPmhhc0NoaWxkcmVuVXBkYXRlZChwYXJlbnRJZCwgZmFs
c2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9mcm9udGVuZC0+Y2hpbGROb2Rl
UmVtb3ZlZChwYXJlbnRJZCwgaWRGb3JOb2RlKG5vZGUpKTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSBpZiAodHlwZSA9PSBldmVudE5hbWVzKCkuRE9NQ29udGVudExvYWRlZEV2ZW50KSB7CisgICAg
ICAgIC8vIFJlLXB1c2ggZG9jdW1lbnQgb25jZSBpdCBpcyBsb2FkZWQuCisgICAgICAgIGRpc2Nh
cmRCaW5kaW5ncygpOworICAgICAgICBwdXNoRG9jdW1lbnRFbGVtZW50VG9Gcm9udGVuZCgpOwor
ICAgIH0KK30KKworbG9uZyBJbnNwZWN0b3JET01BZ2VudDo6YmluZChOb2RlKiBub2RlKQorewor
ICAgIEhhc2hNYXA8Tm9kZSosIGxvbmc+OjppdGVyYXRvciBpdCA9IG1fbm9kZVRvSWQuZmluZChu
b2RlKTsKKyAgICBpZiAoaXQgIT0gbV9ub2RlVG9JZC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGl0
LT5zZWNvbmQ7CisgICAgbG9uZyBpZCA9IG1fbGFzdE5vZGVJZCsrOworICAgIG1fbm9kZVRvSWQu
c2V0KG5vZGUsIGlkKTsKKyAgICBtX2lkVG9Ob2RlLnNldChpZCwgbm9kZSk7CisgICAgcmV0dXJu
IGlkOworfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50Ojp1bmJpbmQoTm9kZSogbm9kZSkKK3sK
KyAgICBpZiAobm9kZS0+aXNGcmFtZU93bmVyRWxlbWVudCgpKSB7CisgICAgICAgIGNvbnN0IEhU
TUxGcmFtZU93bmVyRWxlbWVudCogZnJhbWVPd25lciA9IHN0YXRpY19jYXN0PGNvbnN0IEhUTUxG
cmFtZU93bmVyRWxlbWVudCo+KG5vZGUpOworICAgICAgICBzdG9wTGlzdGVuaW5nKGZyYW1lT3du
ZXItPmNvbnRlbnREb2N1bWVudCgpKTsKKyAgICB9CisKKyAgICBIYXNoTWFwPE5vZGUqLCBsb25n
Pjo6aXRlcmF0b3IgaXQgPSBtX25vZGVUb0lkLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ICE9IG1f
bm9kZVRvSWQuZW5kKCkpIHsKKyAgICAgICAgbV9pZFRvTm9kZS5yZW1vdmUobV9pZFRvTm9kZS5m
aW5kKGl0LT5zZWNvbmQpKTsKKyAgICAgICAgbV9jaGlsZHJlblJlcXVlc3RlZC5yZW1vdmUobV9j
aGlsZHJlblJlcXVlc3RlZC5maW5kKGl0LT5zZWNvbmQpKTsKKyAgICAgICAgbV9ub2RlVG9JZC5y
ZW1vdmUoaXQpOworICAgIH0KK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2VudDo6cHVzaERvY3Vt
ZW50RWxlbWVudFRvRnJvbnRlbmQoKQoreworICAgIEVsZW1lbnQqIGRvY0VsZW0gPSBtYWluRnJh
bWVEb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICBpZiAoIW1fbm9kZVRvSWQuY29u
dGFpbnMoZG9jRWxlbSkpCisgICAgICAgIG1fZnJvbnRlbmQtPnNldERvY3VtZW50RWxlbWVudChi
dWlsZEFycmF5Rm9yTm9kZShkb2NFbGVtLCAwKSk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdl
bnQ6OnB1c2hDaGlsZE5vZGVzVG9Gcm9udGVuZChsb25nIGVsZW1lbnRJZCkKK3sKKyAgICBOb2Rl
KiBub2RlID0gbm9kZUZvcklkKGVsZW1lbnRJZCk7CisgICAgaWYgKCFub2RlIHx8IChub2RlLT5u
b2RlVHlwZSgpICE9IE5vZGU6OkVMRU1FTlRfTk9ERSkpCisgICAgICAgIHJldHVybjsKKyAgICBp
ZiAobV9jaGlsZHJlblJlcXVlc3RlZC5jb250YWlucyhlbGVtZW50SWQpKQorICAgICAgICByZXR1
cm47CisKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUp
OworICAgIFNjcmlwdEFycmF5IGNoaWxkcmVuID0gYnVpbGRBcnJheUZvckVsZW1lbnRDaGlsZHJl
bihlbGVtZW50LCAxKTsKKyAgICBtX2NoaWxkcmVuUmVxdWVzdGVkLmFkZChlbGVtZW50SWQpOwor
ICAgIG1fZnJvbnRlbmQtPnNldENoaWxkTm9kZXMoZWxlbWVudElkLCBjaGlsZHJlbik7Cit9CisK
K3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OmRpc2NhcmRCaW5kaW5ncygpCit7CisgICAgbV9ub2Rl
VG9JZC5jbGVhcigpOworICAgIG1faWRUb05vZGUuY2xlYXIoKTsKKyAgICBtX2NoaWxkcmVuUmVx
dWVzdGVkLmNsZWFyKCk7Cit9CisKK05vZGUqIEluc3BlY3RvckRPTUFnZW50Ojpub2RlRm9ySWQo
bG9uZyBpZCkKK3sKKyAgICBIYXNoTWFwPGxvbmcsIE5vZGUqPjo6aXRlcmF0b3IgaXQgPSBtX2lk
VG9Ob2RlLmZpbmQoaWQpOworICAgIGlmIChpdCAhPSBtX2lkVG9Ob2RlLmVuZCgpKQorICAgICAg
ICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICByZXR1cm4gMDsKK30KKworbG9uZyBJbnNwZWN0b3JE
T01BZ2VudDo6aWRGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICBIYXNoTWFwPE5vZGUqLCBsb25nPjo6aXRlcmF0b3IgaXQgPSBtX25v
ZGVUb0lkLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ICE9IG1fbm9kZVRvSWQuZW5kKCkpCisgICAg
ICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVybiAwOworfQorCit2b2lkIEluc3BlY3Rv
ckRPTUFnZW50OjpnZXRDaGlsZE5vZGVzKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCkKK3sK
KyAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQoZWxlbWVudElkKTsKKyAgICBtX2Zyb250ZW5k
LT5kaWRHZXRDaGlsZE5vZGVzKGNhbGxJZCk7Cit9CisKK2xvbmcgSW5zcGVjdG9yRE9NQWdlbnQ6
OnB1c2hOb2RlUGF0aFRvRnJvbnRlbmQoTm9kZSogbm9kZVRvUHVzaCkKK3sKKyAgICBBU1NFUlQo
bm9kZVRvUHVzaCk7ICAvLyBJbnZhbGlkIGlucHV0CisKKyAgICAvLyBJZiB3ZSBhcmUgc2VuZGlu
ZyBpbmZvcm1hdGlvbiB0byB0aGUgY2xpZW50IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGNyZWF0
ZWQuIFNlbmQgcm9vdCBub2RlIGZpcnN0LgorICAgIHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zyb250
ZW5kKCk7CisKKyAgICAvLyBSZXR1cm4gaWQgaW4gY2FzZSB0aGUgbm9kZSBpcyBrbm93bi4KKyAg
ICBsb25nIHJlc3VsdCA9IGlkRm9yTm9kZShub2RlVG9QdXNoKTsKKyAgICBpZiAocmVzdWx0KQor
ICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgRWxlbWVudCogZWxlbWVudCA9IGlubmVyUGFy
ZW50RWxlbWVudChub2RlVG9QdXNoKTsKKyAgICBBU1NFUlQoZWxlbWVudCk7ICAvLyBOb2RlIGlz
IGRldGFjaGVkIG9yIGlzIGEgZG9jdW1lbnQgaXRzZWxmCisKKyAgICBWZWN0b3I8RWxlbWVudCo+
IHBhdGg7CisgICAgd2hpbGUgKGVsZW1lbnQgJiYgIWlkRm9yTm9kZShlbGVtZW50KSkgeworICAg
ICAgICBwYXRoLmFwcGVuZChlbGVtZW50KTsKKyAgICAgICAgZWxlbWVudCA9IGlubmVyUGFyZW50
RWxlbWVudChlbGVtZW50KTsKKyAgICB9CisKKyAgICAvLyBlbGVtZW50IGlzIGtub3duIHRvIHRo
ZSBjbGllbnQKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgcGF0aC5hcHBlbmQoZWxlbWVudCk7
CisgICAgZm9yIChpbnQgaSA9IHBhdGguc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAg
ICAgbG9uZyBub2RlSWQgPSBpZEZvck5vZGUocGF0aC5hdChpKSk7CisgICAgICAgIEFTU0VSVChu
b2RlSWQpOworICAgICAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQobm9kZUlkKTsKKyAgICB9
CisgICAgcmV0dXJuIGlkRm9yTm9kZShub2RlVG9QdXNoKTsKK30KKwordm9pZCBJbnNwZWN0b3JE
T01BZ2VudDo6c2V0QXR0cmlidXRlKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCwgY29uc3Qg
U3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQoreworICAgIE5vZGUqIG5vZGUgPSBu
b2RlRm9ySWQoZWxlbWVudElkKTsKKyAgICBpZiAobm9kZSAmJiAobm9kZS0+bm9kZVR5cGUoKSA9
PSBOb2RlOjpFTEVNRU5UX05PREUpKSB7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwor
ICAgICAgICBlbGVtZW50LT5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGVjKTsKKyAgICAgICAg
bV9mcm9udGVuZC0+ZGlkQXBwbHlEb21DaGFuZ2UoY2FsbElkLCBlYyA9PSAwKTsKKyAgICB9IGVs
c2UgeworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxsSWQsIGZhbHNl
KTsKKyAgICB9Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnJlbW92ZUF0dHJpYnV0ZShs
b25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBO
b2RlKiBub2RlID0gbm9kZUZvcklkKGVsZW1lbnRJZCk7CisgICAgaWYgKG5vZGUgJiYgKG5vZGUt
Pm5vZGVUeXBlKCkgPT0gTm9kZTo6RUxFTUVOVF9OT0RFKSkgeworICAgICAgICBFbGVtZW50KiBl
bGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOworICAgICAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKKyAgICAgICAgZWxlbWVudC0+cmVtb3ZlQXR0cmlidXRlKG5hbWUsIGVjKTsK
KyAgICAgICAgbV9mcm9udGVuZC0+ZGlkQXBwbHlEb21DaGFuZ2UoY2FsbElkLCBlYyA9PSAwKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxs
SWQsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnNldFRleHRO
b2RlVmFsdWUobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIHZhbHVl
KQoreworICAgIE5vZGUqIG5vZGUgPSBub2RlRm9ySWQoZWxlbWVudElkKTsKKyAgICBpZiAobm9k
ZSAmJiAobm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUpKSB7CisgICAgICAgIFRl
eHQqIHRleHRfbm9kZSA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlKTsKKyAgICAgICAgRXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIHRleHRfbm9kZS0+cmVwbGFjZVdob2xlVGV4dCh2YWx1
ZSwgZWMpOworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxsSWQsIGVj
ID09IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fZnJvbnRlbmQtPmRpZEFwcGx5RG9tQ2hh
bmdlKGNhbGxJZCwgZmFsc2UpOworICAgIH0KK30KKworU2NyaXB0QXJyYXkgSW5zcGVjdG9yRE9N
QWdlbnQ6OmJ1aWxkQXJyYXlGb3JOb2RlKE5vZGUqIG5vZGUsIGludCBkZXB0aCkKK3sKKyAgICBT
Y3JpcHRBcnJheSB2YWx1ZSA9IG1fZnJvbnRlbmQtPm5ld1NjcmlwdEFycmF5KCk7CisKKyAgICBs
b25nIGlkID0gYmluZChub2RlKTsKKyAgICBTdHJpbmcgbm9kZU5hbWU7CisgICAgU3RyaW5nIG5v
ZGVWYWx1ZTsKKworICAgIHN3aXRjaCAobm9kZS0+bm9kZVR5cGUoKSkgeworICAgICAgICBjYXNl
IE5vZGU6OlRFWFRfTk9ERToKKyAgICAgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6CisgICAg
ICAgICAgICBub2RlVmFsdWUgPSBub2RlLT5ub2RlVmFsdWUoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIE5vZGU6OkFUVFJJQlVURV9OT0RFOgorICAgICAgICBjYXNlIE5vZGU6
OkRPQ1VNRU5UX05PREU6CisgICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9E
RToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERToK
KyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS0+bm9kZU5hbWUo
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHZhbHVlLnNldCgwLCBzdGF0aWNf
Y2FzdDxpbnQ+KGlkKSk7CisgICAgdmFsdWUuc2V0KDEsIG5vZGUtPm5vZGVUeXBlKCkpOworICAg
IHZhbHVlLnNldCgyLCBub2RlTmFtZSk7CisgICAgdmFsdWUuc2V0KDMsIG5vZGVWYWx1ZSk7CisK
KyAgICBpZiAobm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUpIHsKKyAgICAg
ICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICAg
ICAgdmFsdWUuc2V0KDQsIGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhlbGVtZW50KSk7
CisgICAgICAgIGludCBub2RlQ291bnQgPSBpbm5lckNoaWxkTm9kZUNvdW50KGVsZW1lbnQpOwor
ICAgICAgICB2YWx1ZS5zZXQoNSwgbm9kZUNvdW50KTsKKworICAgICAgICBTY3JpcHRBcnJheSBj
aGlsZHJlbiA9IGJ1aWxkQXJyYXlGb3JFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCwgZGVwdGgpOwor
ICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKCkgPiAwKQorICAgICAgICAgICAgdmFsdWUuc2V0
KDYsIGNoaWxkcmVuKTsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlOworfQorCitTY3JpcHRBcnJh
eSBJbnNwZWN0b3JET01BZ2VudDo6YnVpbGRBcnJheUZvckVsZW1lbnRBdHRyaWJ1dGVzKEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgU2NyaXB0QXJyYXkgYXR0cmlidXRlc1ZhbHVlID0gbV9mcm9u
dGVuZC0+bmV3U2NyaXB0QXJyYXkoKTsKKyAgICAvLyBHbyB0aHJvdWdoIGFsbCBhdHRyaWJ1dGVz
IGFuZCBzZXJpYWxpemUgdGhlbS4KKyAgICBjb25zdCBOYW1lZE5vZGVNYXAqIGF0dHJNYXAgPSBl
bGVtZW50LT5hdHRyaWJ1dGVzKHRydWUpOworICAgIGlmICghYXR0ck1hcCkKKyAgICAgICAgcmV0
dXJuIGF0dHJpYnV0ZXNWYWx1ZTsKKyAgICB1bnNpZ25lZCBudW1BdHRycyA9IGF0dHJNYXAtPmxl
bmd0aCgpOworICAgIGludCBpbmRleCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG51bUF0dHJzOyArK2kpIHsKKyAgICAgICAgLy8gQWRkIGF0dHJpYnV0ZSBwYWlyCisgICAgICAg
IGNvbnN0IEF0dHJpYnV0ZSAqYXR0cmlidXRlID0gYXR0ck1hcC0+YXR0cmlidXRlSXRlbShpKTsK
KyAgICAgICAgYXR0cmlidXRlc1ZhbHVlLnNldChpbmRleCsrLCBhdHRyaWJ1dGUtPm5hbWUoKS50
b1N0cmluZygpKTsKKyAgICAgICAgYXR0cmlidXRlc1ZhbHVlLnNldChpbmRleCsrLCBhdHRyaWJ1
dGUtPnZhbHVlKCkpOworICAgIH0KKyAgICByZXR1cm4gYXR0cmlidXRlc1ZhbHVlOworfQorCitT
Y3JpcHRBcnJheSBJbnNwZWN0b3JET01BZ2VudDo6YnVpbGRBcnJheUZvckVsZW1lbnRDaGlsZHJl
bihFbGVtZW50KiBlbGVtZW50LCBpbnQgZGVwdGgpCit7CisgICAgU2NyaXB0QXJyYXkgY2hpbGRy
ZW4gPSBtX2Zyb250ZW5kLT5uZXdTY3JpcHRBcnJheSgpOworICAgIGlmIChkZXB0aCA9PSAwKSB7
CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZSB0aGVfb25s
eSB0ZXh0IGNoaWxkLgorICAgICAgICBpZiAoaW5uZXJDaGlsZE5vZGVDb3VudChlbGVtZW50KSA9
PSAxKSB7CisgICAgICAgICAgICBOb2RlICpjaGlsZCA9IGlubmVyRmlyc3RDaGlsZChlbGVtZW50
KTsKKyAgICAgICAgICAgIGlmIChjaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUp
CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uc2V0KGluZGV4KyssIGJ1aWxkQXJyYXlGb3JOb2Rl
KGNoaWxkLCAwKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoaWxkcmVuOworICAgIH0g
ZWxzZSBpZiAoZGVwdGggPiAwKSB7CisgICAgICAgIGRlcHRoLS07CisgICAgfQorCisgICAgaW50
IGluZGV4ID0gMDsKKyAgICBmb3IgKE5vZGUgKmNoaWxkID0gaW5uZXJGaXJzdENoaWxkKGVsZW1l
bnQpOyBjaGlsZDsgY2hpbGQgPSBpbm5lck5leHRTaWJsaW5nKGNoaWxkKSkKKyAgICAgICAgY2hp
bGRyZW4uc2V0KGluZGV4KyssIGJ1aWxkQXJyYXlGb3JOb2RlKGNoaWxkLCBkZXB0aCkpOworICAg
IHJldHVybiBjaGlsZHJlbjsKK30KKworTm9kZSogSW5zcGVjdG9yRE9NQWdlbnQ6OmlubmVyRmly
c3RDaGlsZChOb2RlKiBub2RlKQoreworICAgIGlmIChub2RlLT5pc0ZyYW1lT3duZXJFbGVtZW50
KCkpIHsKKyAgICAgICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBmcmFtZU93bmVyID0gc3RhdGlj
X2Nhc3Q8SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIERvY3VtZW50KiBk
b2MgPSBmcmFtZU93bmVyLT5jb250ZW50RG9jdW1lbnQoKTsKKyAgICAgICAgaWYgKGRvYykgewor
ICAgICAgICAgICAgc3RhcnRMaXN0ZW5pbmcoZG9jKTsKKyAgICAgICAgICAgIHJldHVybiBkb2Mt
PmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gbm9kZS0+Zmlyc3RD
aGlsZCgpOworICAgIHdoaWxlIChpc1doaXRlc3BhY2Uobm9kZSkpCisgICAgICAgIG5vZGUgPSBu
b2RlLT5uZXh0U2libGluZygpOworICAgIHJldHVybiBub2RlOworfQorCitOb2RlKiBJbnNwZWN0
b3JET01BZ2VudDo6aW5uZXJOZXh0U2libGluZyhOb2RlKiBub2RlKQoreworICAgIGRvIHsKKyAg
ICAgICAgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCk7CisgICAgfSB3aGlsZSAoaXNXaGl0ZXNw
YWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30KKworTm9kZSogSW5zcGVjdG9yRE9NQWdl
bnQ6OmlubmVyUHJldmlvdXNTaWJsaW5nKE5vZGUqIG5vZGUpCit7CisgICAgZG8geworICAgICAg
ICBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAgfSB3aGlsZSAoaXNXaGl0ZXNw
YWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30KKworaW50IEluc3BlY3RvckRPTUFnZW50
Ojppbm5lckNoaWxkTm9kZUNvdW50KE5vZGUqIG5vZGUpCit7CisgICAgaW50IGNvdW50ID0gMDsK
KyAgICBOb2RlKiBjaGlsZCA9IGlubmVyRmlyc3RDaGlsZChub2RlKTsKKyAgICB3aGlsZSAoY2hp
bGQpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgY2hpbGQgPSBpbm5lck5leHRTaWJsaW5n
KGNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCitFbGVtZW50KiBJbnNwZWN0
b3JET01BZ2VudDo6aW5uZXJQYXJlbnRFbGVtZW50KE5vZGUqIG5vZGUpCit7CisgICAgRWxlbWVu
dCogZWxlbWVudCA9IG5vZGUtPnBhcmVudEVsZW1lbnQoKTsKKyAgICBpZiAoIWVsZW1lbnQpCisg
ICAgICAgIHJldHVybiBub2RlLT5vd25lckRvY3VtZW50KCktPm93bmVyRWxlbWVudCgpOworICAg
IHJldHVybiBlbGVtZW50OworfQorCitib29sIEluc3BlY3RvckRPTUFnZW50Ojppc1doaXRlc3Bh
Y2UoTm9kZSogbm9kZSkKK3sKKyAgICAvL1RPRE86IHB1bGwgaWdub3JlV2hpdGVzcGFjZSBzZXR0
aW5nIGZyb20gdGhlIGZyb250ZW5kIGFuZCB1c2UgaGVyZS4KKyAgICByZXR1cm4gbm9kZSAmJiBu
b2RlLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSAmJiBub2RlLT5ub2RlVmFsdWUoKS5z
dHJpcFdoaXRlU3BhY2UoKS5sZW5ndGgoKSA9PSAwOworfQorCitEb2N1bWVudCogSW5zcGVjdG9y
RE9NQWdlbnQ6Om1haW5GcmFtZURvY3VtZW50KCkKK3sKKyAgICBMaXN0SGFzaFNldDxSZWZQdHI8
RG9jdW1lbnQ+ID46Oml0ZXJhdG9yIGl0ID0gbV9kb2N1bWVudHMuYmVnaW4oKTsKKyAgICBpZiAo
aXQgIT0gbV9kb2N1bWVudHMuZW5kKCkpCisgICAgICAgIHJldHVybiBpdC0+Z2V0KCk7CisgICAg
cmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50LmggYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNw
ZWN0b3JET01BZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2OTRl
OTgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01BZ2Vu
dC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSW5zcGVjdG9yRE9NQWdlbnRfaAorI2RlZmlu
ZSBJbnNwZWN0b3JET01BZ2VudF9oCisKKyNpbmNsdWRlICJFdmVudExpc3RlbmVyLmgiCisjaW5j
bHVkZSAiU2NyaXB0QXJyYXkuaCIKKyNpbmNsdWRlICJTY3JpcHRPYmplY3QuaCIKKyNpbmNsdWRl
ICJTY3JpcHRTdGF0ZS5oIgorCisjaW5jbHVkZSA8d3RmL0xpc3RIYXNoU2V0Lmg+CisjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisgICAgY2xhc3MgRWxlbWVudDsKKyAgICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBE
b2N1bWVudDsKKyAgICBjbGFzcyBJbnNwZWN0b3JGcm9udGVuZDsKKyAgICBjbGFzcyBOYW1lTm9k
ZU1hcDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNsYXNzIFBhZ2U7CisKKyAgICBjbGFzcyBJbnNw
ZWN0b3JET01BZ2VudCA6IHB1YmxpYyBFdmVudExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIEluc3BlY3RvckRPTUFnZW50KEluc3BlY3RvckZyb250ZW5kKiBmcm9udGVuZCk7CisgICAg
ICAgIH5JbnNwZWN0b3JET01BZ2VudCgpOworCisgICAgICAgIC8vIE1ldGhvZHMgY2FsbGVkIGZy
b20gdGhlIGZyb250ZW5kLgorICAgICAgICB2b2lkIGdldENoaWxkTm9kZXMobG9uZyBjYWxsSWQs
IGxvbmcgZWxlbWVudElkKTsKKyAgICAgICAgdm9pZCBzZXRBdHRyaWJ1dGUobG9uZyBjYWxsSWQs
IGxvbmcgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUp
OworICAgICAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50
SWQsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgICAgIHZvaWQgc2V0VGV4dE5vZGVWYWx1ZShs
b25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCisgICAg
ICAgIC8vIE1ldGhvZHMgY2FsbGVkIGZyb20gdGhlIEluc3BlY3RvckNvbnRyb2xsZXIuCisgICAg
ICAgIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50KTsKKworICAgICAgICBOb2Rl
KiBub2RlRm9ySWQobG9uZyBub2RlSWQpOworICAgICAgICBsb25nIGlkRm9yTm9kZShOb2RlKiBu
b2RlKTsKKyAgICAgICAgbG9uZyBwdXNoTm9kZVBhdGhUb0Zyb250ZW5kKE5vZGUqIG5vZGUpOwor
CisgICBwcml2YXRlOgorICAgICAgICB2b2lkIHN0YXJ0TGlzdGVuaW5nKERvY3VtZW50KiBkb2N1
bWVudCk7CisgICAgICAgIHZvaWQgc3RvcExpc3RlbmluZyhEb2N1bWVudCogZG9jdW1lbnQpOwor
CisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCogZXZlbnQsIGJvb2wgaXNX
aW5kb3dFdmVudCk7CisKKyAgICAgICAgbG9uZyBiaW5kKE5vZGUqIG5vZGUpOworICAgICAgICB2
b2lkIHVuYmluZChOb2RlKiBub2RlKTsKKworICAgICAgICB2b2lkIHB1c2hEb2N1bWVudEVsZW1l
bnRUb0Zyb250ZW5kKCk7CisgICAgICAgIHZvaWQgcHVzaENoaWxkTm9kZXNUb0Zyb250ZW5kKGxv
bmcgZWxlbWVudElkKTsKKworICAgICAgICBTY3JpcHRBcnJheSBidWlsZEFycmF5Rm9yTm9kZShO
b2RlKiBub2RlLCBpbnQgZGVwdGgpOworICAgICAgICBTY3JpcHRBcnJheSBidWlsZEFycmF5Rm9y
RWxlbWVudEF0dHJpYnV0ZXMoRWxlbWVudCogZWxlbWVuKTsKKyAgICAgICAgU2NyaXB0QXJyYXkg
YnVpbGRBcnJheUZvckVsZW1lbnRDaGlsZHJlbihFbGVtZW50KiBlbGVtZW50LCBpbnQgZGVwdGgp
OworCisgICAgICAgIC8vIFdlIHJlcHJlc2VudCBlbWJlZGRlZCBkb21zIGFzIGEgcGFydCBvZiB0
aGUgc2FtZSBoaWVyYXJjaHkuIEhlbmNlIHdlIHRyZWF0IGNoaWxkcmVuIG9mIGZyYW1lIG93bmVy
cyBkaWZmZXJlbnRseS4KKyAgICAgICAgLy8gV2UgYWxzbyBza2lwIHdoaXRlc3BhY2UgdGV4dCBu
b2RlcyBjb25kaXRpb25hbGx5LiBGb2xsb3dpbmcgbWV0aG9kcyBlbmNhcHN1bGF0ZSB0aGVzZSBz
cGVjaWZpY3MuCisgICAgICAgIE5vZGUqIGlubmVyRmlyc3RDaGlsZChOb2RlKiBub2RlKTsKKyAg
ICAgICAgTm9kZSogaW5uZXJOZXh0U2libGluZyhOb2RlKiBub2RlKTsKKyAgICAgICAgTm9kZSog
aW5uZXJQcmV2aW91c1NpYmxpbmcoTm9kZSogbm9kZSk7CisgICAgICAgIGludCBpbm5lckNoaWxk
Tm9kZUNvdW50KE5vZGUqIG5vZGUpOworICAgICAgICBFbGVtZW50KiBpbm5lclBhcmVudEVsZW1l
bnQoTm9kZSogbm9kZSk7CisgICAgICAgIGJvb2wgaXNXaGl0ZXNwYWNlKE5vZGUqIG5vZGUpOwor
CisgICAgICAgIERvY3VtZW50KiBtYWluRnJhbWVEb2N1bWVudCgpOworICAgICAgICB2b2lkIGRp
c2NhcmRCaW5kaW5ncygpOworCisgICAgICAgIEluc3BlY3RvckZyb250ZW5kKiBtX2Zyb250ZW5k
OworICAgICAgICBIYXNoTWFwPE5vZGUqLCBsb25nPiBtX25vZGVUb0lkOworICAgICAgICBIYXNo
TWFwPGxvbmcsIE5vZGUqPiBtX2lkVG9Ob2RlOworICAgICAgICBIYXNoU2V0PGxvbmc+IG1fY2hp
bGRyZW5SZXF1ZXN0ZWQ7CisgICAgICAgIGxvbmcgbV9sYXN0Tm9kZUlkOworICAgICAgICBMaXN0
SGFzaFNldDxSZWZQdHI8RG9jdW1lbnQ+ID4gbV9kb2N1bWVudHM7CisgICAgICAgIFJlZlB0cjxF
dmVudExpc3RlbmVyPiBtX2V2ZW50TGlzdGVuZXI7CisgICAgfTsKKworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyAhZGVmaW5lZChJbnNwZWN0b3JET01BZ2VudF9oKQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuY3BwIGIvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuY3BwCmluZGV4IGVmMmU4YmQuLmFmNjVmYjQg
MTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kLmNwcAorKysg
Yi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5jcHAKQEAgLTI4Niw2ICsyODYs
NjkgQEAgYm9vbCBJbnNwZWN0b3JGcm9udGVuZDo6YWRkRE9NU3RvcmFnZShjb25zdCBTY3JpcHRP
YmplY3QmIGRvbVN0b3JhZ2VPYmopCiB9CiAjZW5kaWYKIAordm9pZCBJbnNwZWN0b3JGcm9udGVu
ZDo6c2V0RG9jdW1lbnRFbGVtZW50KGNvbnN0IFNjcmlwdE9iamVjdCYgcm9vdCkKK3sKKyAgICBP
d25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoInNldERv
Y3VtZW50RWxlbWVudCIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQocm9vdCk7Cisg
ICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6c2V0Q2hp
bGROb2RlcyhpbnQgcGFyZW50SWQsIGNvbnN0IFNjcmlwdEFycmF5JiBub2RlcykKK3sKKyAgICBP
d25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoInNldENo
aWxkTm9kZXMiKSk7CisgICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KHBhcmVudElkKTsKKyAg
ICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQobm9kZXMpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7
Cit9CisKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6Omhhc0NoaWxkcmVuVXBkYXRlZChpbnQgaWQs
IGJvb2wgbmV3VmFsdWUpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4gZnVuY3Rp
b24obmV3RnVuY3Rpb25DYWxsKCJoYXNDaGlsZHJlblVwZGF0ZWQiKSk7CisgICAgZnVuY3Rpb24t
PmFwcGVuZEFyZ3VtZW50KGlkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQobmV3VmFs
dWUpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRnJvbnRlbmQ6
OmNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnRJZCwgaW50IHByZXZJZCwgY29uc3QgU2NyaXB0
T2JqZWN0JiBub2RlKQoreworICAgIE93blB0cjxTY3JpcHRGdW5jdGlvbkNhbGw+IGZ1bmN0aW9u
KG5ld0Z1bmN0aW9uQ2FsbCgiY2hpbGROb2RlSW5zZXJ0ZWQiKSk7CisgICAgZnVuY3Rpb24tPmFw
cGVuZEFyZ3VtZW50KHBhcmVudElkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQocHJl
dklkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQobm9kZSk7CisgICAgZnVuY3Rpb24t
PmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6Y2hpbGROb2RlUmVtb3ZlZChp
bnQgcGFyZW50SWQsIGludCBpZCkKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBm
dW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImNoaWxkTm9kZVJlbW92ZWQiKSk7CisgICAgZnVuY3Rp
b24tPmFwcGVuZEFyZ3VtZW50KHBhcmVudElkKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1l
bnQoaWQpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRnJvbnRl
bmQ6OmF0dHJpYnV0ZXNVcGRhdGVkKGludCBpZCwgY29uc3QgU2NyaXB0QXJyYXkmIGF0dHJpYnV0
ZXMpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4gZnVuY3Rpb24obmV3RnVuY3Rp
b25DYWxsKCJhdHRyaWJ1dGVzVXBkYXRlZCIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1l
bnQoaWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChhdHRyaWJ1dGVzKTsKKyAgICBm
dW5jdGlvbi0+Y2FsbCgpOworfQorCit2b2lkIEluc3BlY3RvckZyb250ZW5kOjpkaWRHZXRDaGls
ZE5vZGVzKGludCBjYWxsSWQpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4gZnVu
Y3Rpb24obmV3RnVuY3Rpb25DYWxsKCJkaWRHZXRDaGlsZE5vZGVzIikpOworICAgIGZ1bmN0aW9u
LT5hcHBlbmRBcmd1bWVudChjYWxsSWQpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3Zv
aWQgSW5zcGVjdG9yRnJvbnRlbmQ6OmRpZEFwcGx5RG9tQ2hhbmdlKGludCBjYWxsSWQsIGJvb2wg
c3VjY2VzcykKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdG
dW5jdGlvbkNhbGwoImRpZEFwcGx5RG9tQ2hhbmdlIikpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRB
cmd1bWVudChjYWxsSWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChzdWNjZXNzKTsK
KyAgICBmdW5jdGlvbi0+Y2FsbCgpOworfQorCiBQYXNzT3duUHRyPFNjcmlwdEZ1bmN0aW9uQ2Fs
bD4gSW5zcGVjdG9yRnJvbnRlbmQ6Om5ld0Z1bmN0aW9uQ2FsbChjb25zdCBTdHJpbmcmIGZ1bmN0
aW9uTmFtZSkKIHsKICAgICBTY3JpcHRGdW5jdGlvbkNhbGwqIGZ1bmN0aW9uID0gbmV3IFNjcmlw
dEZ1bmN0aW9uQ2FsbChtX3NjcmlwdFN0YXRlLCBtX3dlYkluc3BlY3RvciwgImRpc3BhdGNoIik7
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5oIGIvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuaAppbmRleCBiODY4YzEwLi43YTQ4YjYy
IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5oCisrKyBi
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kLmgKQEAgLTk2LDYgKzk2LDE1IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgYm9vbCBhZGRET01TdG9yYWdlKGNvbnN0IFNj
cmlwdE9iamVjdCYgZG9tU3RvcmFnZU9iaik7CiAjZW5kaWYKIAorICAgICAgICB2b2lkIHNldERv
Y3VtZW50RWxlbWVudChjb25zdCBTY3JpcHRPYmplY3QmIHJvb3QpOworICAgICAgICB2b2lkIHNl
dENoaWxkTm9kZXMoaW50IHBhcmVudElkLCBjb25zdCBTY3JpcHRBcnJheSYgbm9kZXMpOworICAg
ICAgICB2b2lkIGhhc0NoaWxkcmVuVXBkYXRlZChpbnQgaWQsIGJvb2wgbmV3VmFsdWUpOworICAg
ICAgICB2b2lkIGNoaWxkTm9kZUluc2VydGVkKGludCBwYXJlbnRJZCwgaW50IHByZXZJZCwgY29u
c3QgU2NyaXB0T2JqZWN0JiBub2RlKTsKKyAgICAgICAgdm9pZCBjaGlsZE5vZGVSZW1vdmVkKGlu
dCBwYXJlbnRJZCwgaW50IGlkKTsKKyAgICAgICAgdm9pZCBhdHRyaWJ1dGVzVXBkYXRlZChpbnQg
aWQsIGNvbnN0IFNjcmlwdEFycmF5JiBhdHRyaWJ1dGVzKTsKKyAgICAgICAgdm9pZCBkaWRHZXRD
aGlsZE5vZGVzKGludCBjYWxsSWQpOworICAgICAgICB2b2lkIGRpZEFwcGx5RG9tQ2hhbmdlKGlu
dCBjYWxsSWQsIGJvb2wgc3VjY2Vzcyk7CisKICAgICBwcml2YXRlOgogICAgICAgICBQYXNzT3du
UHRyPFNjcmlwdEZ1bmN0aW9uQ2FsbD4gbmV3RnVuY3Rpb25DYWxsKGNvbnN0IFN0cmluZyYgZnVu
Y3Rpb25OYW1lKTsKICAgICAgICAgdm9pZCBjYWxsU2ltcGxlRnVuY3Rpb24oY29uc3QgU3RyaW5n
JiBmdW5jdGlvbk5hbWUpOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5k
L0NhbGxiYWNrLmpzIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0NhbGxiYWNrLmpzCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTdmOTUKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvQ2FsbGJhY2suanMKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKK1dlYkluc3BlY3Rvci5DYWxsYmFjayA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLl9sYXN0
Q2FsbGJhY2tJZCA9IDE7CisgICAgdGhpcy5fY2FsbGJhY2tzID0ge307Cit9CisKK1dlYkluc3Bl
Y3Rvci5DYWxsYmFjay5wcm90b3R5cGUgPSB7CisgICAgd3JhcDogZnVuY3Rpb24oY2FsbGJhY2sp
CisgICAgeworICAgICAgICB2YXIgY2FsbGJhY2tJZCA9IHRoaXMuX2xhc3RDYWxsYmFja0lkKys7
CisgICAgICAgIHRoaXMuX2NhbGxiYWNrc1tjYWxsYmFja0lkXSA9IGNhbGxiYWNrIHx8IGZ1bmN0
aW9uKCkge307CisgICAgICAgIHJldHVybiBjYWxsYmFja0lkOworICAgIH0sCisKKyAgICBwcm9j
ZXNzQ2FsbGJhY2s6IGZ1bmN0aW9uKGNhbGxiYWNrSWQsIG9wdF92YXJhcmcpCisgICAgeworICAg
ICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7
CisgICAgICAgIHZhciBjYWxsYmFjayA9IHRoaXMuX2NhbGxiYWNrc1tjYWxsYmFja0lkXTsKKyAg
ICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJncyk7CisgICAgICAgIGRlbGV0ZSB0aGlzLl9j
YWxsYmFja3NbY2FsbGJhY2tJZF07CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuQ2FsbGJhY2su
X0lOU1RBTkNFID0gbmV3IFdlYkluc3BlY3Rvci5DYWxsYmFjaygpOworV2ViSW5zcGVjdG9yLkNh
bGxiYWNrLndyYXAgPSBXZWJJbnNwZWN0b3IuQ2FsbGJhY2suX0lOU1RBTkNFLndyYXAuYmluZChX
ZWJJbnNwZWN0b3IuQ2FsbGJhY2suX0lOU1RBTkNFKTsKK1dlYkluc3BlY3Rvci5DYWxsYmFjay5w
cm9jZXNzQ2FsbGJhY2sgPSBXZWJJbnNwZWN0b3IuQ2FsbGJhY2suX0lOU1RBTkNFLnByb2Nlc3ND
YWxsYmFjay5iaW5kKFdlYkluc3BlY3Rvci5DYWxsYmFjay5fSU5TVEFOQ0UpOwpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0RPTUFnZW50LmpzIGIvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL0RPTUFnZW50LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmUxNGY2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvRE9NQWdlbnQuanMKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitXZWJJbnNwZWN0b3IuRE9NUGF5bG9h
ZEluZGV4ID0geworICAgIElEIDogMCwKKyAgICBUWVBFIDogMSwKKyAgICBOQU1FIDogMiwKKyAg
ICBWQUxVRSA6IDMsCisgICAgQVRUUlMgOiA0LAorICAgIEhBU19DSElMRFJFTiA6IDUsCisgICAg
Q0hJTERfTk9ERVMgOiA2Cit9OworCisKK1dlYkluc3BlY3Rvci5ET01Ob2RlID0gZnVuY3Rpb24o
ZG9jLCBwYXlsb2FkKSB7CisgICAgdGhpcy5vd25lckRvY3VtZW50ID0gZG9jOworCisgICAgdGhp
cy5faWQgPSBwYXlsb2FkW1dlYkluc3BlY3Rvci5ET01QYXlsb2FkSW5kZXguSURdOworICAgIHRo
aXMubm9kZVR5cGUgPSBwYXlsb2FkW1dlYkluc3BlY3Rvci5ET01QYXlsb2FkSW5kZXguVFlQRV07
CisgICAgdGhpcy5ub2RlTmFtZSA9IHBheWxvYWRbV2ViSW5zcGVjdG9yLkRPTVBheWxvYWRJbmRl
eC5OQU1FXTsKKyAgICB0aGlzLl9ub2RlVmFsdWUgPSBwYXlsb2FkW1dlYkluc3BlY3Rvci5ET01Q
YXlsb2FkSW5kZXguVkFMVUVdOworICAgIHRoaXMudGV4dENvbnRlbnQgPSB0aGlzLm5vZGVWYWx1
ZTsKKworICAgIHRoaXMuYXR0cmlidXRlcyA9IFtdOworICAgIHRoaXMuX2F0dHJpYnV0ZXNNYXAg
PSB7fTsKKyAgICBpZiAocGF5bG9hZC5sZW5ndGggPiBXZWJJbnNwZWN0b3IuRE9NUGF5bG9hZElu
ZGV4LkFUVFJTKQorICAgICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVzUGF5bG9hZChwYXlsb2FkW1dl
Ykluc3BlY3Rvci5ET01QYXlsb2FkSW5kZXguQVRUUlNdKTsKKworICAgIHRoaXMuX2NoaWxkTm9k
ZXNDb3VudCA9IHBheWxvYWRbV2ViSW5zcGVjdG9yLkRPTVBheWxvYWRJbmRleC5IQVNfQ0hJTERS
RU5dOworICAgIHRoaXMuY2hpbGRyZW4gPSBudWxsOworCisgICAgdGhpcy5uZXh0U2libGluZyA9
IG51bGw7CisgICAgdGhpcy5wcmV2U2libGluZyA9IG51bGw7CisgICAgdGhpcy5maXJzdENoaWxk
ID0gbnVsbDsKKyAgICB0aGlzLnBhcmVudE5vZGUgPSBudWxsOworCisgICAgaWYgKHBheWxvYWQu
bGVuZ3RoID4gV2ViSW5zcGVjdG9yLkRPTVBheWxvYWRJbmRleC5DSElMRF9OT0RFUykKKyAgICAg
ICAgdGhpcy5fc2V0Q2hpbGRyZW5QYXlsb2FkKHBheWxvYWRbV2ViSW5zcGVjdG9yLkRPTVBheWxv
YWRJbmRleC5DSElMRF9OT0RFU10pOworCisgICAgdGhpcy5fY29tcHV0ZWRTdHlsZSA9IG51bGw7
CisgICAgdGhpcy5zdHlsZSA9IG51bGw7CisgICAgdGhpcy5fbWF0Y2hlZENTU1J1bGVzID0gW107
Cit9CisKK1dlYkluc3BlY3Rvci5ET01Ob2RlLnByb3RvdHlwZSA9IHsKKyAgICBoYXNBdHRyaWJ1
dGVzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hdHRyaWJ1dGVzLmxl
bmd0aCA+IDA7CisgICAgfSwKKworICAgIGhhc0NoaWxkTm9kZXM6IGZ1bmN0aW9uKCkgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkTm9kZXNDb3VudCA+IDA7CisgICAgfSwKKworICAgIGdl
dCBub2RlVmFsdWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLl9ub2RlVmFsdWU7CisgICAgfSwK
KworICAgIHNldCBub2RlVmFsdWUodmFsdWUpIHsKKyAgICAgICAgaWYgKHRoaXMubm9kZVR5cGUg
IT0gTm9kZS5URVhUX05PREUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHZhciBzZWxm
ID0gdGhpczsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKQorICAgICAgICB7Cisg
ICAgICAgICAgICBzZWxmLl9ub2RlVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHNlbGYudGV4
dENvbnRlbnQgPSB2YWx1ZTsKKyAgICAgICAgfTsKKyAgICAgICAgdGhpcy5vd25lckRvY3VtZW50
Ll9kb21BZ2VudC5zZXRUZXh0Tm9kZVZhbHVlQXN5bmModGhpcywgdmFsdWUsIGNhbGxiYWNrKTsK
KyAgICB9LAorCisgICAgZ2V0QXR0cmlidXRlOiBmdW5jdGlvbihuYW1lKQorICAgIHsKKyAgICAg
ICAgdmFyIGF0dHIgPSB0aGlzLl9hdHRyaWJ1dGVzTWFwW25hbWVdOworICAgICAgICByZXR1cm4g
YXR0ciA/IGF0dHIudmFsdWUgOiB1bmRlZmluZWQ7CisgICAgfSwKKworICAgIHNldEF0dHJpYnV0
ZTogZnVuY3Rpb24obmFtZSwgdmFsdWUpCisgICAgeworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7
CisgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgdmFyIGF0dHIgPSBzZWxmLl9hdHRyaWJ1dGVzTWFwW25hbWVdOworICAgICAgICAgICAgaWYg
KGF0dHIpCisgICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLl9hZGRBdHRyaWJ1dGUobmFtZSwgdmFs
dWUpOworICAgICAgICB9OworICAgICAgICB0aGlzLm93bmVyRG9jdW1lbnQuX2RvbUFnZW50LnNl
dEF0dHJpYnV0ZUFzeW5jKHRoaXMsIG5hbWUsIHZhbHVlLCBjYWxsYmFjayk7CisgICAgfSwKKwor
ICAgIHJlbW92ZUF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSkKKyAgICB7CisgICAgICAgIHZhciBz
ZWxmID0gdGhpczsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24oKQorICAgICAgICB7
CisgICAgICAgICAgICBkZWxldGUgc2VsZi5fYXR0cmlidXRlc01hcFtuYW1lXTsKKyAgICAgICAg
ICAgIGZvciAodmFyIGkgPSAwOyAgaSA8IHNlbGYuYXR0cmlidXRlcy5sZW5ndGg7ICsraSkgewor
ICAgICAgICAgICAgICAgIGlmIChzZWxmLmF0dHJpYnV0ZXNbaV0ubmFtZSA9PSBuYW1lKSB7Cisg
ICAgICAgICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlcy5zcGxpY2UoaSwgMSk7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfTsKKyAgICAgICAgdGhpcy5vd25lckRvY3VtZW50Ll9kb21BZ2VudC5yZW1vdmVBdHRy
aWJ1dGVBc3luYyh0aGlzLCBuYW1lLCBjYWxsYmFjayk7CisgICAgfSwKKworICAgIF9zZXRBdHRy
aWJ1dGVzUGF5bG9hZDogZnVuY3Rpb24oYXR0cnMpCisgICAgeworICAgICAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSArPSAyKQorICAgICAgICAgICAgdGhpcy5fYWRkQXR0
cmlidXRlKGF0dHJzW2ldLCBhdHRyc1tpICsgMV0pOworICAgIH0sCisKKyAgICBfaW5zZXJ0Q2hp
bGQ6IGZ1bmN0aW9uKHByZXYsIHBheWxvYWQpCisgICAgeworICAgICAgICB2YXIgbm9kZSA9IG5l
dyBXZWJJbnNwZWN0b3IuRE9NTm9kZSh0aGlzLm93bmVyRG9jdW1lbnQsIHBheWxvYWQpOworICAg
ICAgICBpZiAoIXByZXYpCisgICAgICAgICAgICAvLyBGaXJzdCBub2RlCisgICAgICAgICAgICB0
aGlzLmNoaWxkcmVuID0gWyBub2RlIF07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMu
Y2hpbGRyZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihwcmV2KSArIDEsIDAsIG5vZGUp
OworICAgICAgICB0aGlzLl9yZW51bWJlcigpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9
LAorCisgICAgcmVtb3ZlQ2hpbGRfOiBmdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAgICAgdGhp
cy5jaGlsZHJlbi5zcGxpY2UodGhpcy5jaGlsZHJlbi5pbmRleE9mKG5vZGUpLCAxKTsKKyAgICAg
ICAgbm9kZS5wYXJlbnROb2RlID0gbnVsbDsKKyAgICAgICAgdGhpcy5fcmVudW1iZXIoKTsKKyAg
ICB9LAorCisgICAgX3NldENoaWxkcmVuUGF5bG9hZDogZnVuY3Rpb24ocGF5bG9hZHMpCisgICAg
eworICAgICAgICB0aGlzLmNoaWxkcmVuID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBp
IDwgcGF5bG9hZHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHZhciBwYXlsb2FkID0gcGF5
bG9hZHNbaV07CisgICAgICAgICAgICB2YXIgbm9kZSA9IG5ldyBXZWJJbnNwZWN0b3IuRE9NTm9k
ZSh0aGlzLm93bmVyRG9jdW1lbnQsIHBheWxvYWQpOworICAgICAgICAgICAgdGhpcy5jaGlsZHJl
bi5wdXNoKG5vZGUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuX3JlbnVtYmVyKCk7CisgICAg
fSwKKworICAgIF9yZW51bWJlcjogZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2hp
bGROb2Rlc0NvdW50ID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CisgICAgICAgIGlmICh0aGlzLl9j
aGlsZE5vZGVzQ291bnQgPT0gMCkgeworICAgICAgICAgICAgdGhpcy5maXJzdENoaWxkID0gbnVs
bDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmZpcnN0Q2hp
bGQgPSB0aGlzLmNoaWxkcmVuWzBdOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMu
X2NoaWxkTm9kZXNDb3VudDsgKytpKSB7CisgICAgICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNo
aWxkcmVuW2ldOworICAgICAgICAgICAgY2hpbGQubmV4dFNpYmxpbmcgPSBpICsgMSA8IHRoaXMu
X2NoaWxkTm9kZXNDb3VudCA/IHRoaXMuY2hpbGRyZW5baSArIDFdIDogbnVsbDsKKyAgICAgICAg
ICAgIGNoaWxkLnByZXZTaWJsaW5nID0gaSAtIDEgPj0gMCA/IHRoaXMuY2hpbGRyZW5baSAtIDFd
IDogbnVsbDsKKyAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUgPSB0aGlzOworICAgICAgICB9
CisgICAgfSwKKworICAgIF9hZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKQorICAg
IHsKKyAgICAgICAgdmFyIGF0dHIgPSB7CisgICAgICAgICAgICAibmFtZSI6IG5hbWUsCisgICAg
ICAgICAgICAidmFsdWUiOiB2YWx1ZSwKKyAgICAgICAgICAgICJfbm9kZSI6IHRoaXMKKyAgICAg
ICAgfTsKKyAgICAgICAgdGhpcy5fYXR0cmlidXRlc01hcFtuYW1lXSA9IGF0dHI7CisgICAgICAg
IHRoaXMuYXR0cmlidXRlcy5wdXNoKGF0dHIpOworICAgIH0sCisKKyAgICBfc2V0U3R5bGVzOiBm
dW5jdGlvbihjb21wdXRlZFN0eWxlLCBpbmxpbmVTdHlsZSwgc3R5bGVBdHRyaWJ1dGVzLCBtYXRj
aGVkQ1NTUnVsZXMpCisgICAgeworICAgICAgICB0aGlzLl9jb21wdXRlZFN0eWxlID0gdGhpcy5f
bWFrZVN0eWxlKGNvbXB1dGVkU3R5bGUpOworICAgICAgICB0aGlzLnN0eWxlID0gdGhpcy5fbWFr
ZVN0eWxlKGlubGluZVN0eWxlKTsKKworICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlQXR0
cmlidXRlcykgeworICAgICAgICAgICAgaWYgKHRoaXMuX2F0dHJpYnV0ZXNNYXBbbmFtZV0pCisg
ICAgICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlc01hcFtuYW1lXS5zdHlsZSA9IHRoaXMuX21h
a2VTdHlsZShzdHlsZUF0dHJpYnV0ZXNbbmFtZV0pOworICAgICAgICB9CisKKyAgICAgICAgdGhp
cy5fbWF0Y2hlZENTU1J1bGVzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0
Y2hlZENTU1J1bGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgZGVzY3JpcHRpb24g
PSBtYXRjaGVkQ1NTUnVsZXNbaV07CisKKyAgICAgICAgICAgIHZhciBydWxlID0ge307CisgICAg
ICAgICAgICBydWxlLnNlbGVjdG9yVGV4dCA9IGRlc2NyaXB0aW9uLnNlbGVjdG9yVGV4dDsKKyAg
ICAgICAgICAgIHJ1bGUuc3R5bGUgPSB0aGlzLl9tYWtlU3R5bGUoZGVzY3JpcHRpb24uc3R5bGUp
OworCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24ucGFyZW50U3R5bGVTaGVldCkgeworICAg
ICAgICAgICAgICAgIHZhciBwYXJlbnRTdHlsZU1vY2sgPSB7fTsKKyAgICAgICAgICAgICAgICBw
YXJlbnRTdHlsZU1vY2suaHJlZiA9IGRlc2NyaXB0aW9uLnBhcmVudFN0eWxlU2hlZXQuaHJlZjsK
KyAgICAgICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBkZXNjcmlwdGlvbi5wYXJlbnRTdHlsZVNo
ZWV0Lm93bmVyTm9kZU5hbWU7CisgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lKSB7CisgICAg
ICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlTW9jay5vd25lck5vZGUgPSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAibm9kZU5hbWUiOiBub2RlTmFtZQorICAgICAgICAgICAgICAgICAgICB9
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBydWxlLnBhcmVudFN0eWxlU2hl
ZXQgPSBwYXJlbnRTdHlsZU1vY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9t
YXRjaGVkQ1NTUnVsZXMucHVzaChydWxlKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBfbWFr
ZVN0eWxlOiBmdW5jdGlvbihwYXlsb2FkKQorICAgIHsKKyAgICAgICAgdmFyIHN0eWxlID0gbmV3
IFdlYkluc3BlY3Rvci5DU1NTdHlsZURlY2xhcmF0aW9uKHBheWxvYWQpOworICAgICAgICBzdHls
ZS5ub2RlSWRfID0gdGhpcy5faWQ7CisgICAgICAgIHJldHVybiBzdHlsZTsKKyAgICB9LAorCisg
ICAgX2NsZWFyU3R5bGVzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLmNvbXB1dGVk
U3R5bGUgPSBudWxsOworICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDsKKyAgICAgICAgZm9yICh2
YXIgbmFtZSBpbiB0aGlzLl9hdHRyaWJ1dGVzTWFwKQorICAgICAgICAgICAgdGhpcy5fYXR0cmli
dXRlc01hcFtuYW1lXS5zdHlsZSA9IG51bGw7CisgICAgICAgIHRoaXMuX21hdGNoZWRDU1NSdWxl
cyA9IG51bGw7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuRE9NRG9jdW1lbnQgPSBmdW5jdGlv
bihkb21BZ2VudCwgZGVmYXVsdFZpZXcpCit7CisgICAgV2ViSW5zcGVjdG9yLkRPTU5vZGUuY2Fs
bCh0aGlzLCBudWxsLAorICAgICAgICBbCisgICAgICAgICAgICAwLCAgIC8vIGlkCisgICAgICAg
ICAgICA5LCAgIC8vIHR5cGUgPSBOb2RlLkRPQ1VNRU5UX05PREUsCisgICAgICAgICAgICAiIiwg
IC8vIG5vZGVOYW1lCisgICAgICAgICAgICAiIiwgIC8vIG5vZGVWYWx1ZQorICAgICAgICAgICAg
W10sICAvLyBhdHRyaWJ1dGVzCisgICAgICAgICAgICAwLCAgIC8vIGNoaWxkTm9kZUNvdW50Cisg
ICAgICAgIF0pOworICAgIHRoaXMuX2xpc3RlbmVycyA9IHt9OworICAgIHRoaXMuX2RvbUFnZW50
ID0gZG9tQWdlbnQ7CisgICAgdGhpcy5kZWZhdWx0VmlldyA9IGRlZmF1bHRWaWV3OworfQorCitX
ZWJJbnNwZWN0b3IuRE9NRG9jdW1lbnQucHJvdG90eXBlID0geworCisgICAgYWRkRXZlbnRMaXN0
ZW5lcjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUpCisgICAgeworICAgICAg
ICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW25hbWVdOworICAgICAgICBpZiAoIWxp
c3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXJzID0gW107CisgICAgICAgICAgICB0aGlz
Ll9saXN0ZW5lcnNbbmFtZV0gPSBsaXN0ZW5lcnM7CisgICAgICAgIH0KKyAgICAgICAgbGlzdGVu
ZXJzLnB1c2goY2FsbGJhY2spOworICAgIH0sCisKKyAgICByZW1vdmVFdmVudExpc3RlbmVyOiBm
dW5jdGlvbihuYW1lLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSkKKyAgICB7CisgICAgICAgIHZhciBs
aXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbbmFtZV07CisgICAgICAgIGlmICghbGlzdGVuZXJz
KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHZhciBpbmRleCA9IGxpc3RlbmVycy5p
bmRleE9mKGNhbGxiYWNrKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IC0xKQorICAgICAgICAgICAg
bGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CisgICAgfSwKKworICAgIF9maXJlRG9tRXZlbnQ6
IGZ1bmN0aW9uKG5hbWUsIGV2ZW50KQorICAgIHsKKyAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRo
aXMuX2xpc3RlbmVyc1tuYW1lXTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcnMpCisgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsg
KytpKQorICAgICAgICAgIGxpc3RlbmVyc1tpXShldmVudCk7CisgICAgfQorfQorCitXZWJJbnNw
ZWN0b3IuRE9NRG9jdW1lbnQucHJvdG90eXBlLl9fcHJvdG9fXyA9IFdlYkluc3BlY3Rvci5ET01O
b2RlLnByb3RvdHlwZTsKKworCitXZWJJbnNwZWN0b3IuRE9NV2luZG93ID0gZnVuY3Rpb24oZG9t
QWdlbnQpCit7CisgICAgdGhpcy5fZG9tQWdlbnQgPSBkb21BZ2VudDsKK30KKworV2ViSW5zcGVj
dG9yLkRPTVdpbmRvdy5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGRvY3VtZW50KCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl9kb21BZ2VudC5kb2N1bWVudDsKKyAgICB9LAorICAgIGdldCBO
b2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBXZWJJbnNwZWN0b3IuRE9NTm9kZTsKKyAgICB9
LAorCisgICAgZ2V0IEVsZW1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdlYkluc3BlY3Rv
ci5ET01Ob2RlOworICAgIH0sCisKKyAgICBPYmplY3Q6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAg
fSwKKworICAgIGdldENvbXB1dGVkU3R5bGU6IGZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbm9kZS5fY29tcHV0ZWRTdHlsZTsKKyAgICB9LAorCisgICAgZ2V0TWF0Y2hlZENT
U1J1bGVzOiBmdW5jdGlvbihub2RlLCBwc2V1ZG9FbGVtZW50LCBhdXRob3JPbmx5KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5vZGUuX21hdGNoZWRDU1NSdWxlczsKKyAgICB9Cit9CisKK1dlYklu
c3BlY3Rvci5ET01BZ2VudCA9IGZ1bmN0aW9uKCkgeworICAgIHRoaXMuX3dpbmRvdyA9IG5ldyBX
ZWJJbnNwZWN0b3IuRE9NV2luZG93KHRoaXMpOworICAgIHRoaXMuX2lkVG9ET01Ob2RlID0gbnVs
bDsKKyAgICB0aGlzLmRvY3VtZW50ID0gbnVsbDsKKworICAgIC8vIEluc3RhbGwgb25wb3B1bGF0
ZSBoYW5kbGVyLgorICAgIHZhciBkb21BZ2VudCA9IHRoaXM7CisgICAgdmFyIG9yaWdpbmFsVXBk
YXRlQ2hpbGRyZW4gPSBXZWJJbnNwZWN0b3IuRWxlbWVudHNUcmVlRWxlbWVudC5wcm90b3R5cGUu
dXBkYXRlQ2hpbGRyZW47CisgICAgV2ViSW5zcGVjdG9yLkVsZW1lbnRzVHJlZUVsZW1lbnQucHJv
dG90eXBlLnVwZGF0ZUNoaWxkcmVuID0gZnVuY3Rpb24oKQorICAgIHsKKyAgICAgICAgZG9tQWdl
bnQuZ2V0Q2hpbGROb2Rlc0FzeW5jKHRoaXMucmVwcmVzZW50ZWRPYmplY3QsIG9yaWdpbmFsVXBk
YXRlQ2hpbGRyZW4uYmluZCh0aGlzKSk7CisgICAgfTsKKworICAgIC8vIE11dGUgY29uc29sZSBo
YW5kbGUgdG8gYXZvaWQgY3Jhc2ggb24gc2VsZWN0aW9uIGNoYW5nZS4KKyAgICBXZWJJbnNwZWN0
b3IuQ29uc29sZS5wcm90b3R5cGUuYWRkSW5zcGVjdGVkTm9kZSA9IGZ1bmN0aW9uKCkKKyAgICB7
CisgICAgfTsKKworICAgIC8vIFdoaXRlc3BhY2UgaXMgaWdub3JlZCBpbiBJbnNwZWN0b3JET01B
Z2VudCBhbHJlYWR5IC0+IG5vIG5lZWQgdG8gZmlsdGVyLgorICAgIFByZWZlcmVuY2VzLmlnbm9y
ZVdoaXRlc3BhY2UgPSBmYWxzZTsKK30KKworV2ViSW5zcGVjdG9yLkRPTUFnZW50LnByb3RvdHlw
ZSA9IHsKKyAgICBnZXQgaW5zcGVjdGVkV2luZG93KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl93aW5kb3c7CisgICAgfSwKKworICAgIGdldENoaWxkTm9kZXNBc3luYzogZnVuY3Rpb24o
cGFyZW50LCBvcHRfY2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgY2hpbGRyZW4gPSBwYXJl
bnQuY2hpbGRyZW47CisgICAgICAgIGlmIChjaGlsZHJlbiAmJiBvcHRfY2FsbGJhY2spIHsKKyAg
ICAgICAgICBvcHRfY2FsbGJhY2soY2hpbGRyZW4pOworICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICB2YXIgbXljYWxsYmFjayA9IGZ1bmN0aW9uKCkgeworICAgICAgICAgICAg
aWYgKG9wdF9jYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG9wdF9jYWxsYmFjayhwYXJlbnQu
Y2hpbGRyZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICB2YXIgY2FsbElk
ID0gV2ViSW5zcGVjdG9yLkNhbGxiYWNrLndyYXAobXljYWxsYmFjayk7CisgICAgICAgIEluc3Bl
Y3RvckNvbnRyb2xsZXIuZ2V0Q2hpbGROb2RlcyhjYWxsSWQsIHBhcmVudC5faWQpOworICAgIH0s
CisKKyAgICBzZXRBdHRyaWJ1dGVBc3luYzogZnVuY3Rpb24obm9kZSwgbmFtZSwgdmFsdWUsIGNh
bGxiYWNrKQorICAgIHsKKyAgICAgICAgdmFyIG15Y2FsbGJhY2sgPSB0aGlzLl9kaWRBcHBseURv
bUNoYW5nZS5iaW5kKHRoaXMsIG5vZGUsIGNhbGxiYWNrKTsKKyAgICAgICAgSW5zcGVjdG9yQ29u
dHJvbGxlci5zZXRBdHRyaWJ1dGUoV2ViSW5zcGVjdG9yLkNhbGxiYWNrLndyYXAobXljYWxsYmFj
ayksIG5vZGUuX2lkLCBuYW1lLCB2YWx1ZSk7CisgICAgfSwKKworICAgIHJlbW92ZUF0dHJpYnV0
ZUFzeW5jOiBmdW5jdGlvbihub2RlLCBuYW1lLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHZh
ciBteWNhbGxiYWNrID0gdGhpcy5fZGlkQXBwbHlEb21DaGFuZ2UuYmluZCh0aGlzLCBub2RlLCBj
YWxsYmFjayk7CisgICAgICAgIEluc3BlY3RvckNvbnRyb2xsZXIucmVtb3ZlQXR0cmlidXRlKFdl
Ykluc3BlY3Rvci5DYWxsYmFjay53cmFwKG15Y2FsbGJhY2spLCBub2RlLl9pZCwgbmFtZSk7Cisg
ICAgfSwKKworICAgIHNldFRleHROb2RlVmFsdWVBc3luYzogZnVuY3Rpb24obm9kZSwgdGV4dCwg
Y2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgbXljYWxsYmFjayA9IHRoaXMuX2RpZEFwcGx5
RG9tQ2hhbmdlLmJpbmQodGhpcywgbm9kZSwgY2FsbGJhY2spOworICAgICAgICBJbnNwZWN0b3JD
b250cm9sbGVyLnNldFRleHROb2RlVmFsdWUoV2ViSW5zcGVjdG9yLkNhbGxiYWNrLndyYXAobXlj
YWxsYmFjayksIG5vZGUuX2lkLCB0ZXh0KTsKKyAgICB9LAorCisgICAgX2RpZEFwcGx5RG9tQ2hh
bmdlOiBmdW5jdGlvbihub2RlLCBjYWxsYmFjaywgc3VjY2VzcykKKyAgICB7CisgICAgICAgIGlm
ICghc3VjY2VzcykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FsbGJhY2soKTsKKyAg
ICAgICAgLy8gVE9ETyhwZmVsZG1hbik6IEZpeCB0aGlzIGhhY2suCisgICAgICAgIHZhciBlbGVt
ID0gV2ViSW5zcGVjdG9yLnBhbmVscy5lbGVtZW50cy50cmVlT3V0bGluZS5maW5kVHJlZUVsZW1l
bnQobm9kZSk7CisgICAgICAgIGlmIChlbGVtKSB7CisgICAgICAgICAgICBlbGVtLl91cGRhdGVU
aXRsZSgpOworICAgICAgICB9CisgICAgfSwKKworICAgIF9hdHRyaWJ1dGVzVXBkYXRlZDogZnVu
Y3Rpb24obm9kZUlkLCBhdHRyc0FycmF5KQorICAgIHsKKyAgICAgICAgdmFyIG5vZGUgPSB0aGlz
Ll9pZFRvRE9NTm9kZVtub2RlSWRdOworICAgICAgICBub2RlLl9zZXRBdHRyaWJ1dGVzUGF5bG9h
ZChhdHRyc0FycmF5KTsKKyAgICB9LAorCisgICAgZ2V0Tm9kZUZvcklkOiBmdW5jdGlvbihub2Rl
SWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF07CisgICAgfSwK
KworICAgIF9zZXREb2N1bWVudEVsZW1lbnQ6IGZ1bmN0aW9uKHBheWxvYWQpCisgICAgeworICAg
ICAgICB0aGlzLmRvY3VtZW50ID0gbmV3IFdlYkluc3BlY3Rvci5ET01Eb2N1bWVudCh0aGlzLCB0
aGlzLl93aW5kb3cpOworICAgICAgICB0aGlzLl9pZFRvRE9NTm9kZSA9IHsgMCA6IHRoaXMuZG9j
dW1lbnQgfTsKKyAgICAgICAgdGhpcy5fc2V0Q2hpbGROb2RlcygwLCBbcGF5bG9hZF0pOworICAg
ICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuZmlyc3RD
aGlsZDsKKyAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3duZXJEb2N1bWVu
dCA9IHRoaXMuZG9jdW1lbnQ7CisgICAgICAgIFdlYkluc3BlY3Rvci5wYW5lbHMuZWxlbWVudHMu
cmVzZXQoKTsKKyAgICB9LAorCisgICAgX3NldENoaWxkTm9kZXM6IGZ1bmN0aW9uKHBhcmVudElk
LCBwYXlsb2FkcykKKyAgICB7CisgICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLl9pZFRvRE9NTm9k
ZVtwYXJlbnRJZF07CisgICAgICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHsKKyAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcGFyZW50Ll9zZXRDaGlsZHJlblBheWxvYWQocGF5
bG9hZHMpOworICAgICAgICB0aGlzLl9iaW5kTm9kZXMocGFyZW50LmNoaWxkcmVuKTsKKyAgICB9
LAorCisgICAgX2JpbmROb2RlczogZnVuY3Rpb24oY2hpbGRyZW4pCisgICAgeworICAgICAgICBm
b3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB2
YXIgY2hpbGQgPSBjaGlsZHJlbltpXTsKKyAgICAgICAgICAgIHRoaXMuX2lkVG9ET01Ob2RlW2No
aWxkLl9pZF0gPSBjaGlsZDsKKyAgICAgICAgICAgIGlmIChjaGlsZC5jaGlsZHJlbikKKyAgICAg
ICAgICAgICAgICB0aGlzLl9iaW5kTm9kZXMoY2hpbGQuY2hpbGRyZW4pOworICAgICAgICB9Cisg
ICAgfSwKKworICAgIF9oYXNDaGlsZHJlblVwZGF0ZWQ6IGZ1bmN0aW9uKG5vZGVJZCwgbmV3VmFs
dWUpCisgICAgeworICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF07
CisgICAgICAgIHZhciBvdXRsaW5lID0gV2ViSW5zcGVjdG9yLnBhbmVscy5lbGVtZW50cy50cmVl
T3V0bGluZTsKKyAgICAgICAgdmFyIHRyZWVFbGVtZW50ID0gb3V0bGluZS5maW5kVHJlZUVsZW1l
bnQobm9kZSk7CisgICAgICAgIGlmICh0cmVlRWxlbWVudCkgeworICAgICAgICAgICAgdHJlZUVs
ZW1lbnQuaGFzQ2hpbGRyZW4gPSBuZXdWYWx1ZTsKKyAgICAgICAgICAgIHRyZWVFbGVtZW50Lndo
aXRlc3BhY2VJZ25vcmVkID0gUHJlZmVyZW5jZXMuaWdub3JlV2hpdGVzcGFjZTsKKyAgICAgICAg
fQorICAgIH0sCisKKyAgICBfY2hpbGROb2RlSW5zZXJ0ZWQ6IGZ1bmN0aW9uKHBhcmVudElkLCBw
cmV2SWQsIHBheWxvYWQpCisgICAgeworICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5faWRUb0RP
TU5vZGVbcGFyZW50SWRdOworICAgICAgICB2YXIgcHJldiA9IHRoaXMuX2lkVG9ET01Ob2RlW3By
ZXZJZF07CisgICAgICAgIHZhciBub2RlID0gcGFyZW50Ll9pbnNlcnRDaGlsZChwcmV2LCBwYXls
b2FkKTsKKyAgICAgICAgdGhpcy5faWRUb0RPTU5vZGVbbm9kZS5faWRdID0gbm9kZTsKKyAgICAg
ICAgdmFyIGV2ZW50ID0geyB0YXJnZXQgOiBub2RlLCByZWxhdGVkTm9kZSA6IHBhcmVudCB9Owor
ICAgICAgICB0aGlzLmRvY3VtZW50Ll9maXJlRG9tRXZlbnQoIkRPTU5vZGVJbnNlcnRlZCIsIGV2
ZW50KTsKKyAgICB9LAorCisgICAgX2NoaWxkTm9kZVJlbW92ZWQ6IGZ1bmN0aW9uKHBhcmVudElk
LCBub2RlSWQpCisgICAgeworICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5faWRUb0RPTU5vZGVb
cGFyZW50SWRdOworICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF07
CisgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZF8obm9kZSk7CisgICAgICAgIHZhciBldmVudCA9
IHsgdGFyZ2V0IDogbm9kZSwgcmVsYXRlZE5vZGUgOiBwYXJlbnQgfTsKKyAgICAgICAgdGhpcy5k
b2N1bWVudC5fZmlyZURvbUV2ZW50KCJET01Ob2RlUmVtb3ZlZCIsIGV2ZW50KTsKKyAgICAgICAg
ZGVsZXRlIHRoaXMuX2lkVG9ET01Ob2RlW25vZGVJZF07CisgICAgfQorfQorCitXZWJJbnNwZWN0
b3IuQ1NTU3R5bGVEZWNsYXJhdGlvbiA9IGZ1bmN0aW9uKHBheWxvYWQpIHsKKyAgICB0aGlzLl9p
ZCA9IHBheWxvYWRbMF07CisgICAgdGhpcy53aWR0aCA9IHBheWxvYWRbMV07CisgICAgdGhpcy5o
ZWlnaHQgPSBwYXlsb2FkWzJdOworICAgIHRoaXMuX19kaXNhYmxlZFByb3BlcnRpZXMgPSBwYXls
b2FkWzNdOworICAgIHRoaXMuX19kaXNhYmxlZFByb3BlcnR5VmFsdWVzID0gcGF5bG9hZFs0XTsK
KyAgICB0aGlzLl9fZGlzYWJsZWRQcm9wZXJ0eVByaW9yaXRpZXMgPSBwYXlsb2FkWzVdOworCisg
ICAgdGhpcy5sZW5ndGggPSBwYXlsb2FkLmxlbmd0aCAtIDY7CisgICAgdGhpcy5fcHJpb3JpdHkg
PSB7fTsKKyAgICB0aGlzLl9pbXBsaWNpdCA9IHt9OworICAgIHRoaXMuX3Nob3J0aGFuZCA9IHt9
OworICAgIHRoaXMuX3ZhbHVlID0ge307CisKKyAgICBmb3IgKHZhciBpID0gNjsgaSA8IHBheWxv
YWQubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgdmFyIHAgPSBwYXlsb2FkW2ldOworICAgICAgICB2
YXIgbmFtZSA9IHBbMF07CisKKyAgICAgICAgdGhpcy5fcHJpb3JpdHlbbmFtZV0gPSBwWzFdOwor
ICAgICAgICB0aGlzLl9pbXBsaWNpdFtuYW1lXSA9IHBbMl07CisgICAgICAgIHRoaXMuX3Nob3J0
aGFuZFtuYW1lXSA9IHBbM107CisgICAgICAgIHRoaXMuX3ZhbHVlW25hbWVdID0gcFs0XTsKKwor
ICAgICAgICB0aGlzW2kgLSA2XSA9IG5hbWU7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuQ1NT
U3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUgPSB7CisgICAgZ2V0UHJvcGVydHlWYWx1ZTogZnVu
Y3Rpb24obmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZVtuYW1lXSB8fCAi
IjsKKyAgICB9LAorCisgICAgZ2V0UHJvcGVydHlQcmlvcml0eTogZnVuY3Rpb24obmFtZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcmlvcml0eVtuYW1lXSB8fCAiIjsKKyAgICB9LAor
CisgICAgZ2V0UHJvcGVydHlTaG9ydGhhbmQ6IGZ1bmN0aW9uKG5hbWUpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fc2hvcnRoYW5kW25hbWVdIHx8ICIiOworICAgIH0sCisKKyAgICBpc1By
b3BlcnR5SW1wbGljaXQ6IGZ1bmN0aW9uKG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gISF0
aGlzLl9pbXBsaWNpdFtuYW1lXTsKKyAgICB9Cit9CisKK1dlYkluc3BlY3Rvci5hdHRyaWJ1dGVz
VXBkYXRlZCA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLmRvbUFnZW50Ll9hdHRyaWJ1dGVzVXBk
YXRlZC5hcHBseSh0aGlzLmRvbUFnZW50LCBhcmd1bWVudHMpOworfQorCitXZWJJbnNwZWN0b3Iu
c2V0RG9jdW1lbnRFbGVtZW50ID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuZG9tQWdlbnQuX3Nl
dERvY3VtZW50RWxlbWVudC5hcHBseSh0aGlzLmRvbUFnZW50LCBhcmd1bWVudHMpOworfQorCitX
ZWJJbnNwZWN0b3Iuc2V0Q2hpbGROb2RlcyA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlzLmRvbUFn
ZW50Ll9zZXRDaGlsZE5vZGVzLmFwcGx5KHRoaXMuZG9tQWdlbnQsIGFyZ3VtZW50cyk7Cit9CisK
K1dlYkluc3BlY3Rvci5oYXNDaGlsZHJlblVwZGF0ZWQgPSBmdW5jdGlvbigpCit7CisgICAgdGhp
cy5kb21BZ2VudC5faGFzQ2hpbGRyZW5VcGRhdGVkLmFwcGx5KHRoaXMuZG9tQWdlbnQsIGFyZ3Vt
ZW50cyk7Cit9CisKK1dlYkluc3BlY3Rvci5jaGlsZE5vZGVJbnNlcnRlZCA9IGZ1bmN0aW9uKCkK
K3sKKyAgICB0aGlzLmRvbUFnZW50Ll9jaGlsZE5vZGVJbnNlcnRlZC5hcHBseSh0aGlzLmRvbUFn
ZW50LCBhcmd1bWVudHMpOworICAgIHRoaXMuX2NoaWxkTm9kZUluc2VydGVkLmJpbmQodGhpcyk7
Cit9CisKK1dlYkluc3BlY3Rvci5jaGlsZE5vZGVSZW1vdmVkID0gZnVuY3Rpb24oKQoreworICAg
IHRoaXMuZG9tQWdlbnQuX2NoaWxkTm9kZVJlbW92ZWQuYXBwbHkodGhpcy5kb21BZ2VudCwgYXJn
dW1lbnRzKTsKKyAgICB0aGlzLl9jaGlsZE5vZGVSZW1vdmVkLmJpbmQodGhpcyk7Cit9CisKK1dl
Ykluc3BlY3Rvci5kaWRHZXRDaGlsZE5vZGVzID0gV2ViSW5zcGVjdG9yLkNhbGxiYWNrLnByb2Nl
c3NDYWxsYmFjazsKK1dlYkluc3BlY3Rvci5kaWRQZXJmb3JtU2VhcmNoID0gV2ViSW5zcGVjdG9y
LkNhbGxiYWNrLnByb2Nlc3NDYWxsYmFjazsKK1dlYkluc3BlY3Rvci5kaWRBcHBseURvbUNoYW5n
ZSA9IFdlYkluc3BlY3Rvci5DYWxsYmFjay5wcm9jZXNzQ2FsbGJhY2s7CitXZWJJbnNwZWN0b3Iu
ZGlkUmVtb3ZlQXR0cmlidXRlID0gV2ViSW5zcGVjdG9yLkNhbGxiYWNrLnByb2Nlc3NDYWxsYmFj
azsKK1dlYkluc3BlY3Rvci5kaWRTZXRUZXh0Tm9kZVZhbHVlID0gV2ViSW5zcGVjdG9yLkNhbGxi
YWNrLnByb2Nlc3NDYWxsYmFjazsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250
LWVuZC9FbGVtZW50c1BhbmVsLmpzIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL0VsZW1l
bnRzUGFuZWwuanMKaW5kZXggNzZkOTc0Ni4uNTgzYWZjYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9p
bnNwZWN0b3IvZnJvbnQtZW5kL0VsZW1lbnRzUGFuZWwuanMKKysrIGIvV2ViQ29yZS9pbnNwZWN0
b3IvZnJvbnQtZW5kL0VsZW1lbnRzUGFuZWwuanMKQEAgLTYwLDcgKzYwLDYgQEAgV2ViSW5zcGVj
dG9yLkVsZW1lbnRzUGFuZWwgPSBmdW5jdGlvbigpCiAgICAgICAgICAgICBJbnNwZWN0b3JDb250
cm9sbGVyLnRvZ2dsZU5vZGVTZWFyY2goKTsKICAgICAgICAgICAgIHRoaXMucGFuZWwubm9kZVNl
YXJjaEJ1dHRvbi5yZW1vdmVTdHlsZUNsYXNzKCJ0b2dnbGVkLW9uIik7CiAgICAgICAgIH0KLQog
ICAgICAgICBXZWJJbnNwZWN0b3IuY29uc29sZS5hZGRJbnNwZWN0ZWROb2RlKHRoaXMuX2ZvY3Vz
ZWRET01Ob2RlKTsKICAgICB9OwogCkBAIC0xODEsNyArMTgwLDcgQEAgV2ViSW5zcGVjdG9yLkVs
ZW1lbnRzUGFuZWwucHJvdG90eXBlID0gewogICAgICAgICBkZWxldGUgdGhpcy5jdXJyZW50UXVl
cnk7CiAgICAgICAgIHRoaXMuc2VhcmNoQ2FuY2VsZWQoKTsKIAotICAgICAgICB2YXIgaW5zcGVj
dGVkV2luZG93ID0gSW5zcGVjdG9yQ29udHJvbGxlci5pbnNwZWN0ZWRXaW5kb3coKTsKKyAgICAg
ICAgdmFyIGluc3BlY3RlZFdpbmRvdyA9IFByZWZlcmVuY2VzLnVzZURPTUFnZW50ID8gV2ViSW5z
cGVjdG9yLmRvbUFnZW50Lmluc3BlY3RlZFdpbmRvdyA6IEluc3BlY3RvckNvbnRyb2xsZXIuaW5z
cGVjdGVkV2luZG93KCk7CiAgICAgICAgIGlmICghaW5zcGVjdGVkV2luZG93IHx8ICFpbnNwZWN0
ZWRXaW5kb3cuZG9jdW1lbnQpCiAgICAgICAgICAgICByZXR1cm47CiAKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9XZWJLaXQucXJjIGIvV2ViQ29yZS9pbnNwZWN0b3Iv
ZnJvbnQtZW5kL1dlYktpdC5xcmMKaW5kZXggNjYxOTQ5OS4uNTExYTFiYyAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKKysrIGIvV2ViQ29yZS9pbnNw
ZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMKQEAgLTQsNiArNCw3IEBACiAgICAgPGZpbGU+Qm90
dG9tVXBQcm9maWxlRGF0YUdyaWRUcmVlLmpzPC9maWxlPgogICAgIDxmaWxlPkJyZWFrcG9pbnQu
anM8L2ZpbGU+CiAgICAgPGZpbGU+QnJlYWtwb2ludHNTaWRlYmFyUGFuZS5qczwvZmlsZT4KKyAg
ICA8ZmlsZT5DYWxsYmFjay5qczwvZmlsZT4KICAgICA8ZmlsZT5DYWxsU3RhY2tTaWRlYmFyUGFu
ZS5qczwvZmlsZT4KICAgICA8ZmlsZT5Db25zb2xlLmpzPC9maWxlPgogICAgIDxmaWxlPkRhdGFi
YXNlLmpzPC9maWxlPgpAQCAtMTEsNiArMTIsNyBAQAogICAgIDxmaWxlPkRhdGFiYXNlc1BhbmVs
LmpzPC9maWxlPgogICAgIDxmaWxlPkRhdGFiYXNlVGFibGVWaWV3LmpzPC9maWxlPgogICAgIDxm
aWxlPkRhdGFHcmlkLmpzPC9maWxlPgorICAgIDxmaWxlPkRPTUFnZW50LmpzPC9maWxlPgogICAg
IDxmaWxlPkRPTVN0b3JhZ2UuanM8L2ZpbGU+CiAgICAgPGZpbGU+RE9NU3RvcmFnZURhdGFHcmlk
LmpzPC9maWxlPgogICAgIDxmaWxlPkRPTVN0b3JhZ2VJdGVtc1ZpZXcuanM8L2ZpbGU+CmRpZmYg
LS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwgYi9XZWJD
b3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0bWwKaW5kZXggNzYyMDc0ZS4uZGM3
NmM0OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5o
dG1sCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbApAQCAt
MzksNiArMzksNyBAQCBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0
IiBzcmM9IlBsYWNhcmQuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZh
c2NyaXB0IiBzcmM9IlZpZXcuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0idGV4dC9q
YXZhc2NyaXB0IiBzcmM9IkNvbnNvbGUuanMiPjwvc2NyaXB0PgorICAgIDxzY3JpcHQgdHlwZT0i
dGV4dC9qYXZhc2NyaXB0IiBzcmM9IkNhbGxiYWNrLmpzIj48L3NjcmlwdD4KICAgICA8c2NyaXB0
IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJSZXNvdXJjZS5qcyI+PC9zY3JpcHQ+CiAgICAg
PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iUmVzb3VyY2VDYXRlZ29yeS5qcyI+
PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iRGF0YWJh
c2UuanMiPjwvc2NyaXB0PgpAQCAtNzgsNiArNzksNyBAQCBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICAgIDxzY3JpcHQg
dHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkJvdHRvbVVwUHJvZmlsZURhdGFHcmlkVHJlZS5q
cyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iVG9w
RG93blByb2ZpbGVEYXRhR3JpZFRyZWUuanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQgdHlwZT0i
dGV4dC9qYXZhc2NyaXB0IiBzcmM9IlByb2ZpbGVWaWV3LmpzIj48L3NjcmlwdD4KKyAgICA8c2Ny
aXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJET01BZ2VudC5qcyI+PC9zY3JpcHQ+CiA8
L2hlYWQ+CiA8Ym9keSBjbGFzcz0iZGV0YWNoZWQiPgogICAgIDxkaXYgaWQ9InRvb2xiYXIiPgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcyBiL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKaW5kZXggN2UyMzY5Mi4uZGI1
YjZkMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5q
cworKysgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzCkBAIC0zNyw3
ICszNyw4IEBAIHZhciBQcmVmZXJlbmNlcyA9IHsKICAgICBtaW5TY3JpcHRzU2lkZWJhcldpZHRo
OiAyMDAsCiAgICAgc2hvd0luaGVyaXRlZENvbXB1dGVkU3R5bGVQcm9wZXJ0aWVzOiBmYWxzZSwK
ICAgICBzdHlsZVJ1bGVzRXhwYW5kZWRTdGF0ZToge30sCi0gICAgc2hvd01pc3NpbmdMb2NhbGl6
ZWRTdHJpbmdzOiBmYWxzZQorICAgIHNob3dNaXNzaW5nTG9jYWxpemVkU3RyaW5nczogZmFsc2Us
CisgICAgdXNlRE9NQWdlbnQ6IGZhbHNlCiB9CiAKIHZhciBXZWJJbnNwZWN0b3IgPSB7CkBAIC0y
OTksNiArMzAwLDggQEAgV2ViSW5zcGVjdG9yLmxvYWRlZCA9IGZ1bmN0aW9uKCkKICAgICBkb2N1
bWVudC5ib2R5LmFkZFN0eWxlQ2xhc3MoInBsYXRmb3JtLSIgKyBwbGF0Zm9ybSk7CiAKICAgICB0
aGlzLmNvbnNvbGUgPSBuZXcgV2ViSW5zcGVjdG9yLkNvbnNvbGUoKTsKKyAgICBpZiAoUHJlZmVy
ZW5jZXMudXNlRE9NQWdlbnQpCisgICAgICAgIHRoaXMuZG9tQWdlbnQgPSBuZXcgV2ViSW5zcGVj
dG9yLkRPTUFnZW50KCk7CiAKICAgICB0aGlzLnBhbmVscyA9IHt9OwogICAgIHRoaXMuX2NyZWF0
ZVBhbmVscygpOwpAQCAtMzc4LDcgKzM4MSw3IEBAIFdlYkluc3BlY3Rvci5sb2FkZWQgPSBmdW5j
dGlvbigpCiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvb2xiYXIiKS5hZGRFdmVudExp
c3RlbmVyKCJtb3VzZWRvd24iLCB0aGlzLnRvb2xiYXJEcmFnU3RhcnQsIHRydWUpOwogICAgIGRv
Y3VtZW50LmdldEVsZW1lbnRCeUlkKCJjbG9zZS1idXR0b24iKS5hZGRFdmVudExpc3RlbmVyKCJj
bGljayIsIHRoaXMuY2xvc2UsIHRydWUpOwogCi0gICAgSW5zcGVjdG9yQ29udHJvbGxlci5sb2Fk
ZWQoKTsKKyAgICBJbnNwZWN0b3JDb250cm9sbGVyLmxvYWRlZChQcmVmZXJlbmNlcy51c2VET01B
Z2VudCk7CiB9CiAKIHZhciB3aW5kb3dMb2FkZWQgPSBmdW5jdGlvbigpCg==
</data>
<flag name="review"
          id="18113"
          type_id="1"
          status="-"
          setter="timothy"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33936</attachid>
            <date>2009-08-01 11:03:24 -0700</date>
            <delta_ts>2009-08-01 22:18:46 -0700</delta_ts>
            <desc>InspectorDOMAgent and WebInspector.DOMAgent</desc>
            <filename>dom_agent.patch</filename>
            <type>text/plain</type>
            <size>65649</size>
            <attacher name="Pavel Feldman">pfeldman</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTYwMWNmMS4uNzgxMTBjNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MSBAQAorMjAwOS0wOC0wMSAgUGF2ZWwgRmVsZG1h
biAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXZWIgSW5zcGVjdG9yOiBSZWltcGxlbWVudCBFbGVtZW50cyBQ
YW5lbCBzbyB0aGF0IGl0cworICAgICAgICBpbnRlcmFjdGlvbiB3aXRoIERPTSBpcyBzZXJpYWxp
emVkLgorCisgICAgICAgIFRoaXMgaXMgYSBmaXJzdCBjdXQgd3V0aCByZWFkIHN1cHBvcnQgZm9y
IERPTSBlbGVtZW50cworICAgICAgICB0cmVlIGFzIHdlbGwgYXMgc29tZSBsaW1pdGVkIGVkaXRp
bmcuIE5vIHByb3BlcnRpZXMsIG5vCisgICAgICAgIHN0eWxlcywgbm8gc2VhcmNoIGNhcGFiaWxp
dGllcyBhcmUgaW1wbGVtZW50ZWQgeWV0LgorICAgICAgICBTZXQgUHJlZmVyZW5jZXMudXNlRE9N
QWdlbnQgdG8gdHJ1ZSBpbiBvcmRlciB0byB0cnkgaXQKKyAgICAgICAgb3V0LCBvdGhlcndpc2Ug
ZGlzYWJsZWQgYnkgZGVmYXVsdC4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9Mjc3NzEKKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAg
ICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJDb3JlLnBybzoKKyAgICAgICAgKiBXZWJD
b3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAgICAgKiBXZWJDb3JlLnhjb2RlcHJvai9w
cm9qZWN0LnBieHByb2o6CisgICAgICAgICogV2ViQ29yZVNvdXJjZXMuYmtsOgorICAgICAgICAq
IGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Okluc3Bl
Y3RvckJhY2tlbmQ6OmdldENoaWxkTm9kZXMpOgorICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9y
QmFja2VuZDo6c2V0QXR0cmlidXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okluc3BlY3RvckJhY2tl
bmQ6OnJlbW92ZUF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JCYWNrZW5k
OjpzZXRUZXh0Tm9kZVZhbHVlKToKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yQmFja2Vu
ZC5oOgorICAgICAgICAqIGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmlkbDoKKyAgICAgICAg
KiBpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
bnNwZWN0b3JDb250cm9sbGVyOjp3aW5kb3dTY3JpcHRPYmplY3RBdmFpbGFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6c2V0RnJvbnRlbmRQcm94eU9iamVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpjbG9zZSk6CisgICAgICAg
IChXZWJDb3JlOjpJbnNwZWN0b3JDb250cm9sbGVyOjpwb3B1bGF0ZVNjcmlwdE9iamVjdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6SW5zcGVjdG9yQ29udHJvbGxlcjo6ZGlkQ29tbWl0TG9hZCk6Cisg
ICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuaDoKKyAgICAgICAgKFdlYkNv
cmU6Okluc3BlY3RvckNvbnRyb2xsZXI6OmRvbUFnZW50KToKKyAgICAgICAgKiBpbnNwZWN0b3Iv
SW5zcGVjdG9yRE9NQWdlbnQuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVj
dG9yRE9NQWdlbnQuaDogQWRkZWQuCisgICAgICAgICogaW5zcGVjdG9yL0luc3BlY3RvckZyb250
ZW5kLmNwcDoKKyAgICAgICAgKiBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuaDoKKyAgICAg
ICAgKiBpbnNwZWN0b3IvZnJvbnQtZW5kL0NhbGxiYWNrLmpzOiBBZGRlZC4KKyAgICAgICAgKiBp
bnNwZWN0b3IvZnJvbnQtZW5kL0RPTUFnZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0
b3IvZnJvbnQtZW5kL0VsZW1lbnRzUGFuZWwuanM6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250
LWVuZC9XZWJLaXQucXJjOgorICAgICAgICAqIGluc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9y
Lmh0bWw6CisgICAgICAgICogaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanM6CisgICAg
ICAgIChXZWJJbnNwZWN0b3IubG9hZGVkKToKKwogMjAwOS0wNy0zMCAgQW50b24gTXVoaW4gIDxh
bnRvbm1AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIExldmluLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbSBiL1dlYkNvcmUvR05VbWFrZWZpbGUu
YW0KaW5kZXggYWRkMzVhYS4uNmNiMzY5MyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9HTlVtYWtlZmls
ZS5hbQorKysgYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCkBAIC0xMTI1LDYgKzExMjUsOCBAQCB3
ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQu
aCBcCiAJV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAgXAog
CVdlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRhdGFiYXNlUmVzb3VyY2UuaCBcCisJV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY3BwIFwKKwlXZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JET01BZ2VudC5oIFwKIAlXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01TdG9y
YWdlUmVzb3VyY2UuY3BwIFwKIAlXZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01TdG9yYWdl
UmVzb3VyY2UuaCBcCiAJV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ2xpZW50LmggXApkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRl
eCA3YjI2NDIxLi5jOGMwNzU4IDEwMDY0NAotLS0gYS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysg
Yi9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMTQwNiw2ICsxNDA2LDggQEAKICAgICAgICAgICAg
ICdpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oJywKICAgICAgICAgICAgICdpbnNwZWN0
b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAnLAogICAgICAgICAgICAgJ2luc3BlY3Rv
ci9JbnNwZWN0b3JEYXRhYmFzZVJlc291cmNlLmgnLAorICAgICAgICAgICAgJ2luc3BlY3Rvci9J
bnNwZWN0b3JET01BZ2VudC5jcHAnLAorICAgICAgICAgICAgJ2luc3BlY3Rvci9JbnNwZWN0b3JE
T01BZ2VudC5oJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFnZVJl
c291cmNlLmNwcCcsCiAgICAgICAgICAgICAnaW5zcGVjdG9yL0luc3BlY3RvckRPTVN0b3JhZ2VS
ZXNvdXJjZS5oJywKICAgICAgICAgICAgICdpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQuY3Bw
JywKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS5wcm8gYi9XZWJDb3JlL1dlYkNvcmUucHJv
CmluZGV4IDQzYTkxZTguLmRkY2M1MWIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS5wcm8K
KysrIGIvV2ViQ29yZS9XZWJDb3JlLnBybwpAQCAtODQ4LDYgKzg0OCw3IEBAIFNPVVJDRVMgKz0g
XAogICAgIGluc3BlY3Rvci9Db25zb2xlTWVzc2FnZS5jcHAgXAogICAgIGluc3BlY3Rvci9JbnNw
ZWN0b3JCYWNrZW5kLmNwcCBcCiAgICAgaW5zcGVjdG9yL0luc3BlY3RvckRhdGFiYXNlUmVzb3Vy
Y2UuY3BwIFwKKyAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRE9NQWdlbnQuY3BwIFwKICAgICBpbnNw
ZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFnZVJlc291cmNlLmNwcCBcCiAgICAgaW5zcGVjdG9yL0lu
c3BlY3RvckNvbnRyb2xsZXIuY3BwIFwKICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQu
Y3BwIFwKZGlmZiAtLWdpdCBhL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2og
Yi9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCmluZGV4IGZiNjhmZWMuLmFm
MWY5MGIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oK
KysrIGIvV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagpAQCAtMzA2NzYsNiAr
MzA2NzYsMTQgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJCVJlbGF0aXZl
UGF0aD0iLi5caW5zcGVjdG9yXEluc3BlY3RvckRPTUFnZW50LmNwcCINCisJCQkJPg0KKwkJCTwv
RmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3RvclxJbnNwZWN0
b3JET01BZ2VudC5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0
aXZlUGF0aD0iLi5caW5zcGVjdG9yXEluc3BlY3RvckRPTVN0b3JhZ2VSZXNvdXJjZS5jcHAiDQog
CQkJCT4NCiAJCQk8L0ZpbGU+DQpAQCAtMzA3NTEsNiArMzA3NTksMTAgQEAKIAkJCQkJPg0KIAkJ
CQk8L0ZpbGU+DQogCQkJCTxGaWxlDQorCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxm
cm9udC1lbmRcQ2FsbGJhY2suanMiDQorCQkJCQk+DQorCQkJCTwvRmlsZT4NCisJCQkJPEZpbGUN
CiAJCQkJCVJlbGF0aXZlUGF0aD0iLi5caW5zcGVjdG9yXGZyb250LWVuZFxDYWxsU3RhY2tTaWRl
YmFyUGFuZS5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KQEAgLTMwNzc5LDYgKzMwNzkxLDEw
IEBACiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KIAkJCQk8RmlsZQ0KKwkJCQkJUmVsYXRpdmVQYXRo
PSIuLlxpbnNwZWN0b3JcZnJvbnQtZW5kXERPTUFnZW50LmpzIg0KKwkJCQkJPg0KKwkJCQk8L0Zp
bGU+DQorCQkJCTxGaWxlDQogCQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXGluc3BlY3Rvclxmcm9udC1l
bmRcRE9NU3RvcmFnZS5qcyINCiAJCQkJCT4NCiAJCQkJPC9GaWxlPg0KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggNjkxZDJlNy4uZjFiZGYzYSAxMDA2NDQK
LS0tIGEvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKQEAgLTEwMjQsNiArMTAyNCw4
IEBACiAJCTc1NzkzRUQ1MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnRJbnRlcm5h
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzU3OTNF
RDIwRDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVudEludGVybmFsLmggKi87IH07CiAJ
CTdBMUU4OEY1MTAxQ0MzODQwMDBDNERGNSAvKiBTY3JpcHRBcnJheS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QTFFODhGMzEwMUNDMzg0MDAwQzRE
RjUgLyogU2NyaXB0QXJyYXkuY3BwICovOyB9OwogCQk3QTFFODhGNjEwMUNDMzg0MDAwQzRERjUg
LyogU2NyaXB0QXJyYXkuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDdBMUU4OEY0MTAxQ0MzODQwMDBDNERGNSAvKiBTY3JpcHRBcnJheS5oICovOyB9Owor
CQk3QTI0NTg3QjEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gN0EyNDU4NzkxMDIxRUFG
NDAwMEEwMEFBIC8qIEluc3BlY3RvckRPTUFnZW50LmNwcCAqLzsgfTsKKwkJN0EyNDU4N0MxMDIx
RUFGNDAwMEEwMEFBIC8qIEluc3BlY3RvckRPTUFnZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA3QTI0NTg3QTEwMjFFQUY0MDAwQTAwQUEgLyogSW5z
cGVjdG9yRE9NQWdlbnQuaCAqLzsgfTsKIAkJN0E2NzRCREIwRjlFQkY0RTAwNkNGMDk5IC8qIFBh
Z2VHcm91cExvYWREZWZlcnJlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA3QTY3NEJEOTBGOUVCRjRFMDA2Q0YwOTkgLyogUGFnZUdyb3VwTG9hZERl
ZmVycmVyLmNwcCAqLzsgfTsKIAkJN0E2NzRCREMwRjlFQkY0RTAwNkNGMDk5IC8qIFBhZ2VHcm91
cExvYWREZWZlcnJlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gN0E2NzRCREEwRjlFQkY0RTAwNkNGMDk5IC8qIFBhZ2VHcm91cExvYWREZWZlcnJlci5o
ICovOyB9OwogCQk3QTc0RUNCNzEwMTgzOTlBMDBCRjkzOUUgLyogSW5zcGVjdG9yQmFja2VuZC5p
ZGwgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDdBNzRF
Q0I2MTAxODM5OUEwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmlkbCAqLzsgfTsKQEAgLTYw
NTAsNiArNjA1Miw4IEBACiAJCTc1NzkzRUQyMEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdl
RXZlbnRJbnRlcm5hbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRE9NTWVz
c2FnZUV2ZW50SW50ZXJuYWwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJN0ExRTg4
RjMxMDFDQzM4NDAwMEM0REY1IC8qIFNjcmlwdEFycmF5LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuY3BwLmNwcDsgcGF0aCA9IFNjcmlwdEFycmF5LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJN0ExRTg4RjQxMDFDQzM4NDAwMEM0REY1IC8qIFNjcmlwdEFycmF5LmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFNjcmlwdEFycmF5Lmg7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CisJCTdBMjQ1ODc5MTAyMUVBRjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01B
Z2VudC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBJbnNwZWN0b3JE
T01BZ2VudC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTdBMjQ1ODdBMTAyMUVB
RjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01BZ2VudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBJbnNwZWN0b3JET01BZ2VudC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQk3QTY3NEJEOTBGOUVCRjRFMDA2Q0YwOTkgLyogUGFnZUdyb3VwTG9hZERlZmVycmVyLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFBhZ2VHcm91cExvYWREZWZl
cnJlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTdBNjc0QkRBMEY5RUJGNEUw
MDZDRjA5OSAvKiBQYWdlR3JvdXBMb2FkRGVmZXJyZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gUGFnZUdyb3VwTG9hZERlZmVycmVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTdBNzRFQ0I2MTAxODM5OUEwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmlk
bCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBJbnNwZWN0b3JCYWNrZW5kLmlkbDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTk4NDMsNiArOTg0Nyw4IEBACiAJCQkJMUM4MUI5NTYwRTk3
MzMwODAwMjY2RTA3IC8qIEluc3BlY3RvckNvbnRyb2xsZXIuaCAqLywKIAkJCQk0MUYwNjIxMzBG
NUYxOTI2MDBBMDdFQUMgLyogSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAgKi8sCiAJCQkJ
NDFGMDYyMTIwRjVGMTkyNjAwQTA3RUFDIC8qIEluc3BlY3RvckRhdGFiYXNlUmVzb3VyY2UuaCAq
LywKKwkJCQk3QTI0NTg3OTEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3Bw
ICovLAorCQkJCTdBMjQ1ODdBMTAyMUVBRjQwMDBBMDBBQSAvKiBJbnNwZWN0b3JET01BZ2VudC5o
ICovLAogCQkJCTQxRjA2MTczMEY1RjAwQUMwMEEwN0VBQyAvKiBJbnNwZWN0b3JET01TdG9yYWdl
UmVzb3VyY2UuY3BwICovLAogCQkJCTQxRjA2MTcyMEY1RjAwQUMwMEEwN0VBQyAvKiBJbnNwZWN0
b3JET01TdG9yYWdlUmVzb3VyY2UuaCAqLywKIAkJCQk3QUVEM0UwMzBGQkIxRUFBMDBEMkIwM0Mg
LyogSW5zcGVjdG9yRnJvbnRlbmQuY3BwICovLApAQCAtMTcwNjMsNiArMTcwNjksNyBAQAogCQkJ
CTdBNzRFQ0JCMTAxODM5QTYwMEJGOTM5RSAvKiBJbnNwZWN0b3JCYWNrZW5kLmggaW4gSGVhZGVy
cyAqLywKIAkJCQk3QTFFODhGNjEwMUNDMzg0MDAwQzRERjUgLyogU2NyaXB0QXJyYXkuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTQxQTNENThGMTAxQzE1MkQwMDMxNkQwNyAvKiBEZWRpY2F0ZWRXb3Jr
ZXJUaHJlYWQuaCBpbiBIZWFkZXJzICovLAorCQkJCTdBMjQ1ODdDMTAyMUVBRjQwMDBBMDBBQSAv
KiBJbnNwZWN0b3JET01BZ2VudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZv
ckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xOTEwNSw2ICsxOTExMiw3
IEBACiAJCQkJN0E3NEVDQkQxMDE4MzlEQTAwQkY5MzlFIC8qIEpTSW5zcGVjdG9yQmFja2VuZEN1
c3RvbS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk3QTFFODhGNTEwMUNDMzg0MDAwQzRERjUgLyog
U2NyaXB0QXJyYXkuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNDFBM0Q1OEUxMDFDMTUyRDAwMzE2
RDA3IC8qIERlZGljYXRlZFdvcmtlclRocmVhZC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk3QTI0
NTg3QjEwMjFFQUY0MDAwQTAwQUEgLyogSW5zcGVjdG9yRE9NQWdlbnQuY3BwIGluIFNvdXJjZXMg
Ki8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJ
CX07CmRpZmYgLS1naXQgYS9XZWJDb3JlL1dlYkNvcmVTb3VyY2VzLmJrbCBiL1dlYkNvcmUvV2Vi
Q29yZVNvdXJjZXMuYmtsCmluZGV4IDhiNzJiY2UuLmY3ODE0YjQgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvV2ViQ29yZVNvdXJjZXMuYmtsCisrKyBiL1dlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCkBA
IC02NjMsNiArNjYzLDcgQEAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGZpbGVzIG5l
ZWRlZCB0byBidWlsZCBXZWJDb3JlLgogICAgICAgICBpbnNwZWN0b3IvQ29uc29sZU1lc3NhZ2Uu
Y3BwCiAgICAgICAgIGluc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcAogICAgICAgICBpbnNw
ZWN0b3IvSW5zcGVjdG9yRGF0YWJhc2VSZXNvdXJjZS5jcHAKKyAgICAgICAgaW5zcGVjdG9yL0lu
c3BlY3RvckRPTUFnZW50LmNwcAogICAgICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yRE9NU3RvcmFn
ZVJlc291cmNlLmNwcAogICAgICAgICBpbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5jcHAK
ICAgICAgICAgaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5kLmNwcApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5jcHAgYi9XZWJDb3JlL2luc3BlY3Rvci9J
bnNwZWN0b3JCYWNrZW5kLmNwcAppbmRleCBkNTBlZmQzLi4xZWIxMGU4IDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcAorKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JCYWNrZW5kLmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkhU
TUxGcmFtZU93bmVyRWxlbWVudC5oIgogI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudC5oIgogI2lu
Y2x1ZGUgIkluc3BlY3RvckNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JET01BZ2Vu
dC5oIgogI2luY2x1ZGUgIkluc3BlY3RvclJlc291cmNlLmgiCiAKICNpZiBFTkFCTEUoSkFWQVND
UklQVF9ERUJVR0dFUikKQEAgLTE4MSwxMCArMTgyLDEwIEBAIGJvb2wgSW5zcGVjdG9yQmFja2Vu
ZDo6c2VhcmNoaW5nRm9yTm9kZSgpCiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEluc3Bl
Y3RvckJhY2tlbmQ6OmxvYWRlZCgpCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6OmxvYWRlZChib29s
IGVuYWJsZURPTUFnZW50KQogewogICAgIGlmIChtX2luc3BlY3RvckNvbnRyb2xsZXIpCi0gICAg
ICAgIG1faW5zcGVjdG9yQ29udHJvbGxlci0+c2NyaXB0T2JqZWN0UmVhZHkoKTsKKyAgICAgICAg
bV9pbnNwZWN0b3JDb250cm9sbGVyLT5zY3JpcHRPYmplY3RSZWFkeShlbmFibGVET01BZ2VudCk7
CiB9CiAKIHZvaWQgSW5zcGVjdG9yQmFja2VuZDo6ZW5hYmxlUmVzb3VyY2VUcmFja2luZyhib29s
IGFsd2F5cykKQEAgLTM1NCw2ICszNTUsMzAgQEAgdm9pZCBJbnNwZWN0b3JCYWNrZW5kOjpzdGVw
T3V0T2ZGdW5jdGlvbkluRGVidWdnZXIoKQogCiAjZW5kaWYKIAordm9pZCBJbnNwZWN0b3JCYWNr
ZW5kOjpnZXRDaGlsZE5vZGVzKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCkKK3sKKyAgICBp
ZiAobV9pbnNwZWN0b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXIt
PmRvbUFnZW50KCktPmdldENoaWxkTm9kZXMoY2FsbElkLCBlbGVtZW50SWQpOworfQorCit2b2lk
IEluc3BlY3RvckJhY2tlbmQ6OnNldEF0dHJpYnV0ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50
SWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBpZiAo
bV9pbnNwZWN0b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRv
bUFnZW50KCktPnNldEF0dHJpYnV0ZShjYWxsSWQsIGVsZW1lbnRJZCwgbmFtZSwgdmFsdWUpOwor
fQorCit2b2lkIEluc3BlY3RvckJhY2tlbmQ6OnJlbW92ZUF0dHJpYnV0ZShsb25nIGNhbGxJZCwg
bG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBpZiAobV9pbnNwZWN0
b3JDb250cm9sbGVyKQorICAgICAgICBtX2luc3BlY3RvckNvbnRyb2xsZXItPmRvbUFnZW50KCkt
PnJlbW92ZUF0dHJpYnV0ZShjYWxsSWQsIGVsZW1lbnRJZCwgbmFtZSk7Cit9CisKK3ZvaWQgSW5z
cGVjdG9yQmFja2VuZDo6c2V0VGV4dE5vZGVWYWx1ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50
SWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgaWYgKG1faW5zcGVjdG9yQ29udHJvbGxl
cikKKyAgICAgICAgbV9pbnNwZWN0b3JDb250cm9sbGVyLT5kb21BZ2VudCgpLT5zZXRUZXh0Tm9k
ZVZhbHVlKGNhbGxJZCwgZWxlbWVudElkLCB2YWx1ZSk7Cit9CisKIHZvaWQgSW5zcGVjdG9yQmFj
a2VuZDo6aGlnaGxpZ2h0KE5vZGUqIG5vZGUpCiB7CiAgICAgaWYgKG1faW5zcGVjdG9yQ29udHJv
bGxlcikKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaCBi
L1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaAppbmRleCBiYjg5MWMyLi5kYWEx
NmI0IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JCYWNrZW5kLmgKKysr
IGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5oCkBAIC0zOSw2ICszOSw3IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQ2FjaGVkUmVzb3VyY2U7CiBjbGFzcyBJbnNw
ZWN0b3JDbGllbnQ7CitjbGFzcyBJbnNwZWN0b3JET01BZ2VudDsKIGNsYXNzIEphdmFTY3JpcHRD
YWxsRnJhbWU7CiBjbGFzcyBOb2RlOwogCkBAIC04MSw3ICs4Miw3IEBAIHB1YmxpYzoKIAogICAg
IGJvb2wgc2VhcmNoaW5nRm9yTm9kZSgpOwogCi0gICAgdm9pZCBsb2FkZWQoKTsKKyAgICB2b2lk
IGxvYWRlZChib29sIGVuYWJsZURPTUFnZW50KTsKIAogICAgIHZvaWQgZW5hYmxlUmVzb3VyY2VU
cmFja2luZyhib29sIGFsd2F5cyk7CiAgICAgdm9pZCBkaXNhYmxlUmVzb3VyY2VUcmFja2luZyhi
b29sIGFsd2F5cyk7CkBAIC0xMjIsNiArMTIzLDExIEBAIHB1YmxpYzoKICAgICB2b2lkIHN0ZXBP
dXRPZkZ1bmN0aW9uSW5EZWJ1Z2dlcigpOwogI2VuZGlmCiAKKyAgICB2b2lkIGdldENoaWxkTm9k
ZXMobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkKTsKKyAgICB2b2lkIHNldEF0dHJpYnV0ZShs
b25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSwgY29uc3QgU3Ry
aW5nJiB2YWx1ZSk7CisgICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUobG9uZyBjYWxsSWQsIGxvbmcg
ZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIG5hbWUpOworICAgIHZvaWQgc2V0VGV4dE5vZGVWYWx1
ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCiAg
ICAgLy8gR2VuZXJpYyBjb2RlIGNhbGxlZCBmcm9tIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuCiAg
ICAgdm9pZCBoaWdobGlnaHQoTm9kZSogbm9kZSk7CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5z
cGVjdG9yL0luc3BlY3RvckJhY2tlbmQuaWRsIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9y
QmFja2VuZC5pZGwKaW5kZXggMjFlNmQ5OS4uYmFlMWYyNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9p
bnNwZWN0b3IvSW5zcGVjdG9yQmFja2VuZC5pZGwKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQmFja2VuZC5pZGwKQEAgLTM2LDcgKzM2LDcgQEAgbW9kdWxlIGNvcmUgewogICAgIF0g
SW5zcGVjdG9yQmFja2VuZCB7CiAgICAgICAgIHZvaWQgaGlkZURPTU5vZGVIaWdobGlnaHQoKTsK
ICAgICAgICAgW0N1c3RvbV0gdm9pZCBoaWdobGlnaHRET01Ob2RlKGluIE5vZGUgbm9kZSk7Ci0g
ICAgICAgIHZvaWQgbG9hZGVkKCk7CisgICAgICAgIHZvaWQgbG9hZGVkKGluIGJvb2xlYW4gZW5h
YmxlRE9NQWdlbnQpOwogICAgICAgICB2b2lkIHdpbmRvd1VubG9hZGluZygpOwogICAgICAgICB2
b2lkIGF0dGFjaCgpOwogICAgICAgICB2b2lkIGRldGFjaCgpOwpAQCAtOTcsNSArOTcsOSBAQCBt
b2R1bGUgY29yZSB7CiAKICAgICAgICAgW0N1c3RvbV0gQXJyYXkgcHJvZmlsZXMoKTsKICNlbmRp
ZgotICAgICB9OworICAgICAgICB2b2lkIGdldENoaWxkTm9kZXMoaW4gbG9uZyBjYWxsSWQsIGlu
IGxvbmcgZWxlbWVudElkKTsKKyAgICAgICAgdm9pZCBzZXRBdHRyaWJ1dGUoaW4gbG9uZyBjYWxs
SWQsIGluIGxvbmcgZWxlbWVudElkLCBpbiBET01TdHJpbmcgbmFtZSwgaW4gRE9NU3RyaW5nIHZh
bHVlKTsKKyAgICAgICAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoaW4gbG9uZyBjYWxsSWQsIGluIGxv
bmcgZWxlbWVudElkLCBpbiBET01TdHJpbmcgbmFtZSk7CisgICAgICAgIHZvaWQgc2V0VGV4dE5v
ZGVWYWx1ZShpbiBsb25nIGNhbGxJZCwgaW4gbG9uZyBlbGVtZW50SWQsIGluIERPTVN0cmluZyB2
YWx1ZSk7CisgICAgfTsKICB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JDb250cm9sbGVyLmNwcCBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIu
Y3BwCmluZGV4IGRkOWQxNTYuLmMzMzUxZTUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9y
L0luc3BlY3RvckNvbnRyb2xsZXIuY3BwCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3Rv
ckNvbnRyb2xsZXIuY3BwCkBAIC01MSw2ICs1MSw3IEBACiAjaW5jbHVkZSAiSW5zcGVjdG9yQ2xp
ZW50LmgiCiAjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKICNpbmNsdWRlICJJbnNwZWN0
b3JEYXRhYmFzZVJlc291cmNlLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yRE9NQWdlbnQuaCIKICNp
bmNsdWRlICJJbnNwZWN0b3JET01TdG9yYWdlUmVzb3VyY2UuaCIKICNpbmNsdWRlICJJbnNwZWN0
b3JSZXNvdXJjZS5oIgogI2luY2x1ZGUgIkphdmFTY3JpcHRQcm9maWxlLmgiCkBAIC01MDYsMTIg
KzUwNywxMSBAQCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OndpbmRvd1NjcmlwdE9iamVjdEF2
YWlsYWJsZSgpCiAKICAgICAvLyBHcmFudCB0aGUgaW5zcGVjdG9yIHRoZSBhYmlsaXR5IHRvIHNj
cmlwdCB0aGUgaW5zcGVjdGVkIHBhZ2UuCiAgICAgbV9wYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1l
bnQoKS0+c2VjdXJpdHlPcmlnaW4oKS0+Z3JhbnRVbml2ZXJzYWxBY2Nlc3MoKTsKLQogICAgIG1f
c2NyaXB0U3RhdGUgPSBzY3JpcHRTdGF0ZUZyb21QYWdlKG1fcGFnZSk7CiAgICAgU2NyaXB0R2xv
YmFsT2JqZWN0OjpzZXQobV9zY3JpcHRTdGF0ZSwgIkluc3BlY3RvckNvbnRyb2xsZXIiLCBtX2lu
c3BlY3RvckJhY2tlbmQuZ2V0KCkpOwogfQogCi12b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OnNj
cmlwdE9iamVjdFJlYWR5KCkKK3ZvaWQgSW5zcGVjdG9yQ29udHJvbGxlcjo6c2NyaXB0T2JqZWN0
UmVhZHkoYm9vbCBlbmFibGVET01BZ2VudCkKIHsKICAgICBBU1NFUlQobV9zY3JpcHRTdGF0ZSk7
CiAgICAgaWYgKCFtX3NjcmlwdFN0YXRlKQpAQCAtNTIxLDYgKzUyMSw4IEBAIHZvaWQgSW5zcGVj
dG9yQ29udHJvbGxlcjo6c2NyaXB0T2JqZWN0UmVhZHkoKQogICAgIGlmICghU2NyaXB0R2xvYmFs
T2JqZWN0OjpnZXQobV9zY3JpcHRTdGF0ZSwgIldlYkluc3BlY3RvciIsIHdlYkluc3BlY3Rvck9i
aikpCiAgICAgICAgIHJldHVybjsKICAgICBzZXRGcm9udGVuZFByb3h5T2JqZWN0KG1fc2NyaXB0
U3RhdGUsIHdlYkluc3BlY3Rvck9iaik7CisgICAgaWYgKGVuYWJsZURPTUFnZW50KQorICAgICAg
ICBtX2RvbUFnZW50ID0gbmV3IEluc3BlY3RvckRPTUFnZW50KG1fZnJvbnRlbmQuZ2V0KCkpOwog
CiAjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCiAgICAgU2V0dGluZyBkZWJ1Z2dlckVu
YWJsZWQgPSBzZXR0aW5nKGRlYnVnZ2VyRW5hYmxlZFNldHRpbmdOYW1lKTsKQEAgLTU5Myw2ICs1
OTUsMTAgQEAgdm9pZCBJbnNwZWN0b3JDb250cm9sbGVyOjpjbG9zZSgpCiAgICAgY2xvc2VXaW5k
b3coKTsKIAogICAgIG1fZnJvbnRlbmQuc2V0KDApOworICAgIGlmIChtX2RvbUFnZW50KSB7Cisg
ICAgICAgIG1fZG9tQWdlbnQtPnNldERvY3VtZW50KDApOworICAgICAgICBtX2RvbUFnZW50ID0g
MDsKKyAgICB9CiAgICAgbV9zY3JpcHRTdGF0ZSA9IDA7CiB9CiAKQEAgLTY0Myw2ICs2NDksOCBA
QCB2b2lkIEluc3BlY3RvckNvbnRyb2xsZXI6OnBvcHVsYXRlU2NyaXB0T2JqZWN0cygpCiAgICAg
ICAgICgqaXQpLT5iaW5kKG1fZnJvbnRlbmQuZ2V0KCkpOwogI2VuZGlmCiAKKyAgICBpZiAobV9k
b21BZ2VudCkKKyAgICAgICAgbV9kb21BZ2VudC0+c2V0RG9jdW1lbnQobV9pbnNwZWN0ZWRQYWdl
LT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKSk7CiAgICAgbV9mcm9udGVuZC0+cG9wdWxhdGVJbnRl
cmZhY2UoKTsKIH0KIApAQCAtNzMxLDYgKzczOSw5IEBAIHZvaWQgSW5zcGVjdG9yQ29udHJvbGxl
cjo6ZGlkQ29tbWl0TG9hZChEb2N1bWVudExvYWRlciogbG9hZGVyKQogICAgICAgICAgICAgICAg
IG1fbWFpblJlc291cmNlID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAg
IGlmIChtX2RvbUFnZW50KQorICAgICAgICAgICAgbV9kb21BZ2VudC0+c2V0RG9jdW1lbnQobV9p
bnNwZWN0ZWRQYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKSk7CiAgICAgfQogCiAgICAgZm9y
IChGcmFtZSogZnJhbWUgPSBsb2FkZXItPmZyYW1lKCk7IGZyYW1lOyBmcmFtZSA9IGZyYW1lLT50
cmVlKCktPnRyYXZlcnNlTmV4dChsb2FkZXItPmZyYW1lKCkpKQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9pbnNwZWN0b3IvSW5zcGVjdG9yQ29udHJvbGxlci5oIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5z
cGVjdG9yQ29udHJvbGxlci5oCmluZGV4IDc3MWY3NDEuLmQ5ZTcxNzYgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckNvbnRyb2xsZXIuaAorKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9JbnNwZWN0b3JDb250cm9sbGVyLmgKQEAgLTUzLDExICs1MywxMyBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKIGNsYXNzIENhY2hlZFJlc291cmNlOwogY2xhc3MgRGF0YWJhc2U7CitjbGFz
cyBEb2N1bWVudDsKIGNsYXNzIERvY3VtZW50TG9hZGVyOwogY2xhc3MgR3JhcGhpY3NDb250ZXh0
OwogY2xhc3MgSGl0VGVzdFJlc3VsdDsKIGNsYXNzIEluc3BlY3RvckJhY2tlbmQ7CiBjbGFzcyBJ
bnNwZWN0b3JDbGllbnQ7CitjbGFzcyBJbnNwZWN0b3JET01BZ2VudDsKIGNsYXNzIEluc3BlY3Rv
ckZyb250ZW5kOwogY2xhc3MgSmF2YVNjcmlwdENhbGxGcmFtZTsKIGNsYXNzIFN0b3JhZ2VBcmVh
OwpAQCAtMjY5LDEyICsyNzEsMTQgQEAgcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgSW5zcGVj
dG9yQmFja2VuZDsKICAKICAgICAvLyBGb2xsb3dpbmcgYXJlIHVzZWQgZnJvbSBJbnNwZWN0b3JC
YWNrZW5kIGFuZCBpbnRlcm5hbGx5LgotICAgIHZvaWQgc2NyaXB0T2JqZWN0UmVhZHkoKTsKKyAg
ICB2b2lkIHNjcmlwdE9iamVjdFJlYWR5KGJvb2wgZW5hYmxlRE9NQWdlbnQpOwogICAgIHZvaWQg
bW92ZVdpbmRvd0J5KGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0OwogICAgIHZvaWQgc2V0QXR0YWNo
ZWRXaW5kb3coYm9vbCk7CiAgICAgdm9pZCBzZXRBdHRhY2hlZFdpbmRvd0hlaWdodCh1bnNpZ25l
ZCBoZWlnaHQpOwogICAgIHZvaWQgc3RvcmVMYXN0QWN0aXZlUGFuZWwoY29uc3QgU3RyaW5nJiBw
YW5lbE5hbWUpOwogICAgIHZvaWQgY2xvc2VXaW5kb3coKTsKKyAgICBJbnNwZWN0b3JET01BZ2Vu
dCogZG9tQWdlbnQoKSB7IHJldHVybiBtX2RvbUFnZW50LmdldCgpOyB9CisKICNpZiBFTkFCTEUo
SkFWQVNDUklQVF9ERUJVR0dFUikKICAgICB2b2lkIHN0YXJ0VXNlckluaXRpYXRlZFByb2ZpbGlu
Z1Nvb24oKTsKICAgICB2b2lkIHRvZ2dsZVJlY29yZEJ1dHRvbihib29sKTsKQEAgLTMwMSw2ICsz
MDUsNyBAQCBwcml2YXRlOgogICAgIFBhZ2UqIG1faW5zcGVjdGVkUGFnZTsKICAgICBJbnNwZWN0
b3JDbGllbnQqIG1fY2xpZW50OwogICAgIE93blB0cjxJbnNwZWN0b3JGcm9udGVuZD4gbV9mcm9u
dGVuZDsKKyAgICBSZWZQdHI8SW5zcGVjdG9yRE9NQWdlbnQ+IG1fZG9tQWdlbnQ7CiAgICAgUGFn
ZSogbV9wYWdlOwogICAgIFJlZlB0cjxOb2RlPiBtX25vZGVUb0ZvY3VzOwogICAgIFJlZlB0cjxJ
bnNwZWN0b3JSZXNvdXJjZT4gbV9tYWluUmVzb3VyY2U7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2lu
c3BlY3Rvci9JbnNwZWN0b3JET01BZ2VudC5jcHAgYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0
b3JET01BZ2VudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMjIz
OQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50
LmNwcApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW5z
cGVjdG9yRE9NQWdlbnQuaCIKKworI2luY2x1ZGUgIkF0b21pY1N0cmluZy5oIgorI2luY2x1ZGUg
IkRPTVdpbmRvdy5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRXZlbnQuaCIK
KyNpbmNsdWRlICJFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgorI2lu
Y2x1ZGUgIkV2ZW50VGFyZ2V0LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lT3duZXJFbGVtZW50Lmgi
CisjaW5jbHVkZSAiSW5zcGVjdG9yRnJvbnRlbmQuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKyNp
bmNsdWRlICJNdXRhdGlvbkV2ZW50LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIk5v
ZGVMaXN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTY3JpcHRP
YmplY3QuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0luc3BlY3Rv
ckRPTUFnZW50OjpJbnNwZWN0b3JET01BZ2VudChJbnNwZWN0b3JGcm9udGVuZCogZnJvbnRlbmQp
CisgICAgOiBtX2Zyb250ZW5kKGZyb250ZW5kKQorICAgICwgbV9sYXN0Tm9kZUlkKDEpCit7Cit9
CisKK0luc3BlY3RvckRPTUFnZW50Ojp+SW5zcGVjdG9yRE9NQWdlbnQoKQoreworICAgIHNldERv
Y3VtZW50KDApOworfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpzZXREb2N1bWVudChEb2N1
bWVudCogZG9jKQoreworICAgIGlmIChkb2MgPT0gbWFpbkZyYW1lRG9jdW1lbnQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgTGlzdEhhc2hTZXQ8UmVmUHRyPERvY3VtZW50PiA+IGNvcHkgPSBt
X2RvY3VtZW50czsKKyAgICBmb3IgKExpc3RIYXNoU2V0PFJlZlB0cjxEb2N1bWVudD4gPjo6aXRl
cmF0b3IgaXQgPSBjb3B5LmJlZ2luKCk7IGl0ICE9IGNvcHkuZW5kKCk7ICsraXQpCisgICAgICAg
IHN0b3BMaXN0ZW5pbmcoKCppdCkuZ2V0KCkpOworCisgICAgQVNTRVJUKCFtX2RvY3VtZW50cy5z
aXplKCkpOworCisgICAgaWYgKGRvYykgeworICAgICAgICBzdGFydExpc3RlbmluZyhkb2MpOwor
ICAgICAgICBpZiAoZG9jLT5kb2N1bWVudEVsZW1lbnQoKSkgeworICAgICAgICAgICAgcHVzaERv
Y3VtZW50RWxlbWVudFRvRnJvbnRlbmQoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAg
ICAgIGRpc2NhcmRCaW5kaW5ncygpOworICAgIH0KK30KKwordm9pZCBJbnNwZWN0b3JET01BZ2Vu
dDo6c3RhcnRMaXN0ZW5pbmcoRG9jdW1lbnQqIGRvYykKK3sKKyAgICBpZiAobV9kb2N1bWVudHMu
Y29udGFpbnMoZG9jKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZG9jLT5hZGRFdmVudExpc3Rl
bmVyKGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVkRXZlbnQsIHRoaXMsIGZhbHNlKTsKKyAg
ICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEV2ZW50
LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZXMoKS5E
T01Ob2RlUmVtb3ZlZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5hZGRFdmVudExpc3Rl
bmVyKGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVudEV2ZW50LCB0aGlzLCB0
cnVlKTsKKyAgICBkb2MtPmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lcygpLkRPTUF0dHJNb2Rp
ZmllZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgbV9kb2N1bWVudHMuYWRkKGRvYyk7Cit9CisK
K3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnN0b3BMaXN0ZW5pbmcoRG9jdW1lbnQqIGRvYykKK3sK
KyAgICBpZiAoIW1fZG9jdW1lbnRzLmNvbnRhaW5zKGRvYykpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGRvYy0+cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NQ29udGVudExvYWRl
ZEV2ZW50LCB0aGlzLCBmYWxzZSk7CisgICAgZG9jLT5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50
TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCwgdGhpcywgZmFsc2UpOworICAgIGRvYy0+cmVt
b3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NTm9kZVJlbW92ZWRFdmVudCwgdGhpcywg
ZmFsc2UpOworICAgIGRvYy0+cmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWVzKCkuRE9NTm9k
ZVJlbW92ZWRGcm9tRG9jdW1lbnRFdmVudCwgdGhpcywgdHJ1ZSk7CisgICAgZG9jLT5yZW1vdmVF
dmVudExpc3RlbmVyKGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCwgdGhpcywgZmFs
c2UpOworICAgIG1fZG9jdW1lbnRzLnJlbW92ZShkb2MpOworfQorCit2b2lkIEluc3BlY3RvckRP
TUFnZW50OjpoYW5kbGVFdmVudChFdmVudCogZXZlbnQsIGJvb2wpCit7CisgICAgQXRvbWljU3Ry
aW5nIHR5cGUgPSBldmVudC0+dHlwZSgpOworICAgIE5vZGUqIG5vZGUgPSBldmVudC0+dGFyZ2V0
KCktPnRvTm9kZSgpOworCisgICAgLy8gUmVtb3ZlIG1hcHBpbmcgZW50cnkgaWYgbmVjZXNzYXJ5
LgorICAgIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZyb21Eb2N1bWVu
dEV2ZW50KSB7CisgICAgICAgIHVuYmluZChub2RlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01BdHRyTW9kaWZpZWRFdmVudCkgewor
ICAgICAgICBsb25nIGlkID0gaWRGb3JOb2RlKG5vZGUpOworICAgICAgICAvLyBJZiBub2RlIGlz
IG5vdCBtYXBwZWQgeWV0IC0+IGlnbm9yZSB0aGUgZXZlbnQuCisgICAgICAgIGlmICghaWQpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19j
YXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgbV9mcm9udGVuZC0+YXR0cmlidXRlc1VwZGF0
ZWQoaWQsIGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhlbGVtZW50KSk7CisgICAgfSBl
bHNlIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01Ob2RlSW5zZXJ0ZWRFdmVudCkgeworICAg
ICAgICBpZiAoaXNXaGl0ZXNwYWNlKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIE5vZGUqIHBhcmVudCA9IHN0YXRpY19jYXN0PE11dGF0aW9uRXZlbnQqPihldmVudCktPnJl
bGF0ZWROb2RlKCk7CisgICAgICAgIGxvbmcgcGFyZW50SWQgPSBpZEZvck5vZGUocGFyZW50KTsK
KyAgICAgICAgLy8gUmV0dXJuIGlmIHBhcmVudCBpcyBub3QgbWFwcGVkIHlldC4KKyAgICAgICAg
aWYgKCFwYXJlbnRJZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoIW1fY2hp
bGRyZW5SZXF1ZXN0ZWQuY29udGFpbnMocGFyZW50SWQpKSB7CisgICAgICAgICAgICAvLyBObyBj
aGlsZHJlbiBhcmUgbWFwcGVkIHlldCAtPiBvbmx5IG5vdGlmeSBvbiBjaGFuZ2VzIG9mIGhhc0No
aWxkcmVuLgorICAgICAgICAgICAgbV9mcm9udGVuZC0+aGFzQ2hpbGRyZW5VcGRhdGVkKHBhcmVu
dElkLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENoaWxkcmVuIGhh
dmUgYmVlbiByZXF1ZXN0ZWQgLT4gcmV0dXJuIHZhbHVlIG9mIGEgbmV3IGNoaWxkLgorICAgICAg
ICAgICAgbG9uZyBwcmV2SWQgPSBpZEZvck5vZGUoaW5uZXJQcmV2aW91c1NpYmxpbmcobm9kZSkp
OworCisgICAgICAgICAgICBTY3JpcHRPYmplY3QgdmFsdWUgPSBidWlsZE9iamVjdEZvck5vZGUo
bm9kZSwgMCk7CisgICAgICAgICAgICBtX2Zyb250ZW5kLT5jaGlsZE5vZGVJbnNlcnRlZChwYXJl
bnRJZCwgcHJldklkLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0g
ZXZlbnROYW1lcygpLkRPTU5vZGVSZW1vdmVkRXZlbnQpIHsKKyAgICAgICAgaWYgKGlzV2hpdGVz
cGFjZShub2RlKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBOb2RlKiBwYXJlbnQg
PSBzdGF0aWNfY2FzdDxNdXRhdGlvbkV2ZW50Kj4oZXZlbnQpLT5yZWxhdGVkTm9kZSgpOworICAg
ICAgICBsb25nIHBhcmVudElkID0gaWRGb3JOb2RlKHBhcmVudCk7CisgICAgICAgIC8vIElmIHBh
cmVudCBpcyBub3QgbWFwcGVkIHlldCAtPiBpZ25vcmUgdGhlIGV2ZW50LgorICAgICAgICBpZiAo
IXBhcmVudElkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghbV9jaGlsZHJl
blJlcXVlc3RlZC5jb250YWlucyhwYXJlbnRJZCkpIHsKKyAgICAgICAgICAgIC8vIE5vIGNoaWxk
cmVuIGFyZSBtYXBwZWQgeWV0IC0+IG9ubHkgbm90aWZ5IG9uIGNoYW5nZXMgb2YgaGFzQ2hpbGRy
ZW4uCisgICAgICAgICAgICBpZiAoaW5uZXJDaGlsZE5vZGVDb3VudChwYXJlbnQpID09IDEpCisg
ICAgICAgICAgICAgICAgbV9mcm9udGVuZC0+aGFzQ2hpbGRyZW5VcGRhdGVkKHBhcmVudElkLCBm
YWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2Zyb250ZW5kLT5jaGlsZE5v
ZGVSZW1vdmVkKHBhcmVudElkLCBpZEZvck5vZGUobm9kZSkpOworICAgICAgICB9CisgICAgfSBl
bHNlIGlmICh0eXBlID09IGV2ZW50TmFtZXMoKS5ET01Db250ZW50TG9hZGVkRXZlbnQpIHsKKyAg
ICAgICAgLy8gUmUtcHVzaCBkb2N1bWVudCBvbmNlIGl0IGlzIGxvYWRlZC4KKyAgICAgICAgZGlz
Y2FyZEJpbmRpbmdzKCk7CisgICAgICAgIHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zyb250ZW5kKCk7
CisgICAgfQorfQorCitsb25nIEluc3BlY3RvckRPTUFnZW50OjpiaW5kKE5vZGUqIG5vZGUpCit7
CisgICAgSGFzaE1hcDxOb2RlKiwgbG9uZz46Oml0ZXJhdG9yIGl0ID0gbV9ub2RlVG9JZC5maW5k
KG5vZGUpOworICAgIGlmIChpdCAhPSBtX25vZGVUb0lkLmVuZCgpKQorICAgICAgICByZXR1cm4g
aXQtPnNlY29uZDsKKyAgICBsb25nIGlkID0gbV9sYXN0Tm9kZUlkKys7CisgICAgbV9ub2RlVG9J
ZC5zZXQobm9kZSwgaWQpOworICAgIG1faWRUb05vZGUuc2V0KGlkLCBub2RlKTsKKyAgICByZXR1
cm4gaWQ7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnVuYmluZChOb2RlKiBub2RlKQor
eworICAgIGlmIChub2RlLT5pc0ZyYW1lT3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgY29uc3Qg
SFRNTEZyYW1lT3duZXJFbGVtZW50KiBmcmFtZU93bmVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRN
TEZyYW1lT3duZXJFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIHN0b3BMaXN0ZW5pbmcoZnJhbWVP
d25lci0+Y29udGVudERvY3VtZW50KCkpOworICAgIH0KKworICAgIEhhc2hNYXA8Tm9kZSosIGxv
bmc+OjppdGVyYXRvciBpdCA9IG1fbm9kZVRvSWQuZmluZChub2RlKTsKKyAgICBpZiAoaXQgIT0g
bV9ub2RlVG9JZC5lbmQoKSkgeworICAgICAgICBtX2lkVG9Ob2RlLnJlbW92ZShtX2lkVG9Ob2Rl
LmZpbmQoaXQtPnNlY29uZCkpOworICAgICAgICBtX2NoaWxkcmVuUmVxdWVzdGVkLnJlbW92ZSht
X2NoaWxkcmVuUmVxdWVzdGVkLmZpbmQoaXQtPnNlY29uZCkpOworICAgICAgICBtX25vZGVUb0lk
LnJlbW92ZShpdCk7CisgICAgfQorfQorCit2b2lkIEluc3BlY3RvckRPTUFnZW50OjpwdXNoRG9j
dW1lbnRFbGVtZW50VG9Gcm9udGVuZCgpCit7CisgICAgRWxlbWVudCogZG9jRWxlbSA9IG1haW5G
cmFtZURvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpOworICAgIGlmICghbV9ub2RlVG9JZC5j
b250YWlucyhkb2NFbGVtKSkKKyAgICAgICAgbV9mcm9udGVuZC0+c2V0RG9jdW1lbnRFbGVtZW50
KGJ1aWxkT2JqZWN0Rm9yTm9kZShkb2NFbGVtLCAwKSk7Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9N
QWdlbnQ6OnB1c2hDaGlsZE5vZGVzVG9Gcm9udGVuZChsb25nIGVsZW1lbnRJZCkKK3sKKyAgICBO
b2RlKiBub2RlID0gbm9kZUZvcklkKGVsZW1lbnRJZCk7CisgICAgaWYgKCFub2RlIHx8IChub2Rl
LT5ub2RlVHlwZSgpICE9IE5vZGU6OkVMRU1FTlRfTk9ERSkpCisgICAgICAgIHJldHVybjsKKyAg
ICBpZiAobV9jaGlsZHJlblJlcXVlc3RlZC5jb250YWlucyhlbGVtZW50SWQpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5v
ZGUpOworICAgIFNjcmlwdEFycmF5IGNoaWxkcmVuID0gYnVpbGRBcnJheUZvckVsZW1lbnRDaGls
ZHJlbihlbGVtZW50LCAxKTsKKyAgICBtX2NoaWxkcmVuUmVxdWVzdGVkLmFkZChlbGVtZW50SWQp
OworICAgIG1fZnJvbnRlbmQtPnNldENoaWxkTm9kZXMoZWxlbWVudElkLCBjaGlsZHJlbik7Cit9
CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OmRpc2NhcmRCaW5kaW5ncygpCit7CisgICAgbV9u
b2RlVG9JZC5jbGVhcigpOworICAgIG1faWRUb05vZGUuY2xlYXIoKTsKKyAgICBtX2NoaWxkcmVu
UmVxdWVzdGVkLmNsZWFyKCk7Cit9CisKK05vZGUqIEluc3BlY3RvckRPTUFnZW50Ojpub2RlRm9y
SWQobG9uZyBpZCkKK3sKKyAgICBIYXNoTWFwPGxvbmcsIE5vZGUqPjo6aXRlcmF0b3IgaXQgPSBt
X2lkVG9Ob2RlLmZpbmQoaWQpOworICAgIGlmIChpdCAhPSBtX2lkVG9Ob2RlLmVuZCgpKQorICAg
ICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICByZXR1cm4gMDsKK30KKworbG9uZyBJbnNwZWN0
b3JET01BZ2VudDo6aWRGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBIYXNoTWFwPE5vZGUqLCBsb25nPjo6aXRlcmF0b3IgaXQgPSBt
X25vZGVUb0lkLmZpbmQobm9kZSk7CisgICAgaWYgKGl0ICE9IG1fbm9kZVRvSWQuZW5kKCkpCisg
ICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIHJldHVybiAwOworfQorCit2b2lkIEluc3Bl
Y3RvckRPTUFnZW50OjpnZXRDaGlsZE5vZGVzKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCkK
K3sKKyAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQoZWxlbWVudElkKTsKKyAgICBtX2Zyb250
ZW5kLT5kaWRHZXRDaGlsZE5vZGVzKGNhbGxJZCk7Cit9CisKK2xvbmcgSW5zcGVjdG9yRE9NQWdl
bnQ6OnB1c2hOb2RlUGF0aFRvRnJvbnRlbmQoTm9kZSogbm9kZVRvUHVzaCkKK3sKKyAgICBBU1NF
UlQobm9kZVRvUHVzaCk7ICAvLyBJbnZhbGlkIGlucHV0CisKKyAgICAvLyBJZiB3ZSBhcmUgc2Vu
ZGluZyBpbmZvcm1hdGlvbiB0byB0aGUgY2xpZW50IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGNy
ZWF0ZWQuIFNlbmQgcm9vdCBub2RlIGZpcnN0LgorICAgIHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zy
b250ZW5kKCk7CisKKyAgICAvLyBSZXR1cm4gaWQgaW4gY2FzZSB0aGUgbm9kZSBpcyBrbm93bi4K
KyAgICBsb25nIHJlc3VsdCA9IGlkRm9yTm9kZShub2RlVG9QdXNoKTsKKyAgICBpZiAocmVzdWx0
KQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgRWxlbWVudCogZWxlbWVudCA9IGlubmVy
UGFyZW50RWxlbWVudChub2RlVG9QdXNoKTsKKyAgICBBU1NFUlQoZWxlbWVudCk7ICAvLyBOb2Rl
IGlzIGRldGFjaGVkIG9yIGlzIGEgZG9jdW1lbnQgaXRzZWxmCisKKyAgICBWZWN0b3I8RWxlbWVu
dCo+IHBhdGg7CisgICAgd2hpbGUgKGVsZW1lbnQgJiYgIWlkRm9yTm9kZShlbGVtZW50KSkgewor
ICAgICAgICBwYXRoLmFwcGVuZChlbGVtZW50KTsKKyAgICAgICAgZWxlbWVudCA9IGlubmVyUGFy
ZW50RWxlbWVudChlbGVtZW50KTsKKyAgICB9CisKKyAgICAvLyBlbGVtZW50IGlzIGtub3duIHRv
IHRoZSBjbGllbnQKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgcGF0aC5hcHBlbmQoZWxlbWVu
dCk7CisgICAgZm9yIChpbnQgaSA9IHBhdGguc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAg
ICAgICAgbG9uZyBub2RlSWQgPSBpZEZvck5vZGUocGF0aC5hdChpKSk7CisgICAgICAgIEFTU0VS
VChub2RlSWQpOworICAgICAgICBwdXNoQ2hpbGROb2Rlc1RvRnJvbnRlbmQobm9kZUlkKTsKKyAg
ICB9CisgICAgcmV0dXJuIGlkRm9yTm9kZShub2RlVG9QdXNoKTsKK30KKwordm9pZCBJbnNwZWN0
b3JET01BZ2VudDo6c2V0QXR0cmlidXRlKGxvbmcgY2FsbElkLCBsb25nIGVsZW1lbnRJZCwgY29u
c3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJpbmcmIHZhbHVlKQoreworICAgIE5vZGUqIG5vZGUg
PSBub2RlRm9ySWQoZWxlbWVudElkKTsKKyAgICBpZiAobm9kZSAmJiAobm9kZS0+bm9kZVR5cGUo
KSA9PSBOb2RlOjpFTEVNRU5UX05PREUpKSB7CisgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAw
OworICAgICAgICBlbGVtZW50LT5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUsIGVjKTsKKyAgICAg
ICAgbV9mcm9udGVuZC0+ZGlkQXBwbHlEb21DaGFuZ2UoY2FsbElkLCBlYyA9PSAwKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxsSWQsIGZh
bHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnJlbW92ZUF0dHJpYnV0
ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAg
ICBOb2RlKiBub2RlID0gbm9kZUZvcklkKGVsZW1lbnRJZCk7CisgICAgaWYgKG5vZGUgJiYgKG5v
ZGUtPm5vZGVUeXBlKCkgPT0gTm9kZTo6RUxFTUVOVF9OT0RFKSkgeworICAgICAgICBFbGVtZW50
KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOworICAgICAgICBFeGNlcHRp
b25Db2RlIGVjID0gMDsKKyAgICAgICAgZWxlbWVudC0+cmVtb3ZlQXR0cmlidXRlKG5hbWUsIGVj
KTsKKyAgICAgICAgbV9mcm9udGVuZC0+ZGlkQXBwbHlEb21DaGFuZ2UoY2FsbElkLCBlYyA9PSAw
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShj
YWxsSWQsIGZhbHNlKTsKKyAgICB9Cit9CisKK3ZvaWQgSW5zcGVjdG9yRE9NQWdlbnQ6OnNldFRl
eHROb2RlVmFsdWUobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIHZh
bHVlKQoreworICAgIE5vZGUqIG5vZGUgPSBub2RlRm9ySWQoZWxlbWVudElkKTsKKyAgICBpZiAo
bm9kZSAmJiAobm9kZS0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUpKSB7CisgICAgICAg
IFRleHQqIHRleHRfbm9kZSA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlKTsKKyAgICAgICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIHRleHRfbm9kZS0+cmVwbGFjZVdob2xlVGV4dCh2
YWx1ZSwgZWMpOworICAgICAgICBtX2Zyb250ZW5kLT5kaWRBcHBseURvbUNoYW5nZShjYWxsSWQs
IGVjID09IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fZnJvbnRlbmQtPmRpZEFwcGx5RG9t
Q2hhbmdlKGNhbGxJZCwgZmFsc2UpOworICAgIH0KK30KKworU2NyaXB0T2JqZWN0IEluc3BlY3Rv
ckRPTUFnZW50OjpidWlsZE9iamVjdEZvck5vZGUoTm9kZSogbm9kZSwgaW50IGRlcHRoKQorewor
ICAgIFNjcmlwdE9iamVjdCB2YWx1ZSA9IG1fZnJvbnRlbmQtPm5ld1NjcmlwdE9iamVjdCgpOwor
CisgICAgbG9uZyBpZCA9IGJpbmQobm9kZSk7CisgICAgU3RyaW5nIG5vZGVOYW1lOworICAgIFN0
cmluZyBub2RlVmFsdWU7CisKKyAgICBzd2l0Y2ggKG5vZGUtPm5vZGVUeXBlKCkpIHsKKyAgICAg
ICAgY2FzZSBOb2RlOjpURVhUX05PREU6CisgICAgICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RF
OgorICAgICAgICAgICAgbm9kZVZhbHVlID0gbm9kZS0+bm9kZVZhbHVlKCk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBOb2RlOjpBVFRSSUJVVEVfTk9ERToKKyAgICAgICAgY2Fz
ZSBOb2RlOjpET0NVTUVOVF9OT0RFOgorICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX0ZSQUdN
RU5UX05PREU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5U
X05PREU6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBub2RlTmFtZSA9IG5vZGUtPm5v
ZGVOYW1lKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB2YWx1ZS5zZXQoImlk
Iiwgc3RhdGljX2Nhc3Q8aW50PihpZCkpOworICAgIHZhbHVlLnNldCgibm9kZVR5cGUiLCBub2Rl
LT5ub2RlVHlwZSgpKTsKKyAgICB2YWx1ZS5zZXQoIm5vZGVOYW1lIiwgbm9kZU5hbWUpOworICAg
IHZhbHVlLnNldCgibm9kZVZhbHVlIiwgbm9kZVZhbHVlKTsKKworICAgIGlmIChub2RlLT5ub2Rl
VHlwZSgpID09IE5vZGU6OkVMRU1FTlRfTk9ERSkgeworICAgICAgICBFbGVtZW50KiBlbGVtZW50
ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUpOworICAgICAgICB2YWx1ZS5zZXQoImF0dHJp
YnV0ZXMiLCBidWlsZEFycmF5Rm9yRWxlbWVudEF0dHJpYnV0ZXMoZWxlbWVudCkpOworICAgICAg
ICBpbnQgbm9kZUNvdW50ID0gaW5uZXJDaGlsZE5vZGVDb3VudChlbGVtZW50KTsKKyAgICAgICAg
dmFsdWUuc2V0KCJjaGlsZE5vZGVDb3VudCIsIG5vZGVDb3VudCk7CisKKyAgICAgICAgU2NyaXB0
QXJyYXkgY2hpbGRyZW4gPSBidWlsZEFycmF5Rm9yRWxlbWVudENoaWxkcmVuKGVsZW1lbnQsIGRl
cHRoKTsKKyAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIHZh
bHVlLnNldCgiY2hpbGRyZW4iLCBjaGlsZHJlbik7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsK
K30KKworU2NyaXB0QXJyYXkgSW5zcGVjdG9yRE9NQWdlbnQ6OmJ1aWxkQXJyYXlGb3JFbGVtZW50
QXR0cmlidXRlcyhFbGVtZW50KiBlbGVtZW50KQoreworICAgIFNjcmlwdEFycmF5IGF0dHJpYnV0
ZXNWYWx1ZSA9IG1fZnJvbnRlbmQtPm5ld1NjcmlwdEFycmF5KCk7CisgICAgLy8gR28gdGhyb3Vn
aCBhbGwgYXR0cmlidXRlcyBhbmQgc2VyaWFsaXplIHRoZW0uCisgICAgY29uc3QgTmFtZWROb2Rl
TWFwKiBhdHRyTWFwID0gZWxlbWVudC0+YXR0cmlidXRlcyh0cnVlKTsKKyAgICBpZiAoIWF0dHJN
YXApCisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzVmFsdWU7CisgICAgdW5zaWduZWQgbnVtQXR0
cnMgPSBhdHRyTWFwLT5sZW5ndGgoKTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBudW1BdHRyczsgKytpKSB7CisgICAgICAgIC8vIEFkZCBhdHRyaWJ1
dGUgcGFpcgorICAgICAgICBjb25zdCBBdHRyaWJ1dGUgKmF0dHJpYnV0ZSA9IGF0dHJNYXAtPmF0
dHJpYnV0ZUl0ZW0oaSk7CisgICAgICAgIGF0dHJpYnV0ZXNWYWx1ZS5zZXQoaW5kZXgrKywgYXR0
cmlidXRlLT5uYW1lKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGF0dHJpYnV0ZXNWYWx1ZS5zZXQo
aW5kZXgrKywgYXR0cmlidXRlLT52YWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGF0dHJpYnV0
ZXNWYWx1ZTsKK30KKworU2NyaXB0QXJyYXkgSW5zcGVjdG9yRE9NQWdlbnQ6OmJ1aWxkQXJyYXlG
b3JFbGVtZW50Q2hpbGRyZW4oRWxlbWVudCogZWxlbWVudCwgaW50IGRlcHRoKQoreworICAgIFNj
cmlwdEFycmF5IGNoaWxkcmVuID0gbV9mcm9udGVuZC0+bmV3U2NyaXB0QXJyYXkoKTsKKyAgICBp
ZiAoZGVwdGggPT0gMCkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAvLyBTcGVj
aWFsIGNhc2UgdGhlX29ubHkgdGV4dCBjaGlsZC4KKyAgICAgICAgaWYgKGlubmVyQ2hpbGROb2Rl
Q291bnQoZWxlbWVudCkgPT0gMSkgeworICAgICAgICAgICAgTm9kZSAqY2hpbGQgPSBpbm5lckZp
cnN0Q2hpbGQoZWxlbWVudCk7CisgICAgICAgICAgICBpZiAoY2hpbGQtPm5vZGVUeXBlKCkgPT0g
Tm9kZTo6VEVYVF9OT0RFKQorICAgICAgICAgICAgICAgIGNoaWxkcmVuLnNldChpbmRleCsrLCBi
dWlsZE9iamVjdEZvck5vZGUoY2hpbGQsIDApKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
Y2hpbGRyZW47CisgICAgfSBlbHNlIGlmIChkZXB0aCA+IDApIHsKKyAgICAgICAgZGVwdGgtLTsK
KyAgICB9CisKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoTm9kZSAqY2hpbGQgPSBpbm5l
ckZpcnN0Q2hpbGQoZWxlbWVudCk7IGNoaWxkOyBjaGlsZCA9IGlubmVyTmV4dFNpYmxpbmcoY2hp
bGQpKQorICAgICAgICBjaGlsZHJlbi5zZXQoaW5kZXgrKywgYnVpbGRPYmplY3RGb3JOb2RlKGNo
aWxkLCBkZXB0aCkpOworICAgIHJldHVybiBjaGlsZHJlbjsKK30KKworTm9kZSogSW5zcGVjdG9y
RE9NQWdlbnQ6OmlubmVyRmlyc3RDaGlsZChOb2RlKiBub2RlKQoreworICAgIGlmIChub2RlLT5p
c0ZyYW1lT3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBm
cmFtZU93bmVyID0gc3RhdGljX2Nhc3Q8SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4obm9kZSk7Cisg
ICAgICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZU93bmVyLT5jb250ZW50RG9jdW1lbnQoKTsKKyAg
ICAgICAgaWYgKGRvYykgeworICAgICAgICAgICAgc3RhcnRMaXN0ZW5pbmcoZG9jKTsKKyAgICAg
ICAgICAgIHJldHVybiBkb2MtPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBu
b2RlID0gbm9kZS0+Zmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChpc1doaXRlc3BhY2Uobm9kZSkp
CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpOworICAgIHJldHVybiBub2RlOwor
fQorCitOb2RlKiBJbnNwZWN0b3JET01BZ2VudDo6aW5uZXJOZXh0U2libGluZyhOb2RlKiBub2Rl
KQoreworICAgIGRvIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCk7CisgICAg
fSB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30KKworTm9k
ZSogSW5zcGVjdG9yRE9NQWdlbnQ6OmlubmVyUHJldmlvdXNTaWJsaW5nKE5vZGUqIG5vZGUpCit7
CisgICAgZG8geworICAgICAgICBub2RlID0gbm9kZS0+cHJldmlvdXNTaWJsaW5nKCk7CisgICAg
fSB3aGlsZSAoaXNXaGl0ZXNwYWNlKG5vZGUpKTsKKyAgICByZXR1cm4gbm9kZTsKK30KKworaW50
IEluc3BlY3RvckRPTUFnZW50Ojppbm5lckNoaWxkTm9kZUNvdW50KE5vZGUqIG5vZGUpCit7Cisg
ICAgaW50IGNvdW50ID0gMDsKKyAgICBOb2RlKiBjaGlsZCA9IGlubmVyRmlyc3RDaGlsZChub2Rl
KTsKKyAgICB3aGlsZSAoY2hpbGQpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgY2hpbGQg
PSBpbm5lck5leHRTaWJsaW5nKGNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQor
CitFbGVtZW50KiBJbnNwZWN0b3JET01BZ2VudDo6aW5uZXJQYXJlbnRFbGVtZW50KE5vZGUqIG5v
ZGUpCit7CisgICAgRWxlbWVudCogZWxlbWVudCA9IG5vZGUtPnBhcmVudEVsZW1lbnQoKTsKKyAg
ICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybiBub2RlLT5vd25lckRvY3VtZW50KCktPm93
bmVyRWxlbWVudCgpOworICAgIHJldHVybiBlbGVtZW50OworfQorCitib29sIEluc3BlY3RvckRP
TUFnZW50Ojppc1doaXRlc3BhY2UoTm9kZSogbm9kZSkKK3sKKyAgICAvL1RPRE86IHB1bGwgaWdu
b3JlV2hpdGVzcGFjZSBzZXR0aW5nIGZyb20gdGhlIGZyb250ZW5kIGFuZCB1c2UgaGVyZS4KKyAg
ICByZXR1cm4gbm9kZSAmJiBub2RlLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSAmJiBu
b2RlLT5ub2RlVmFsdWUoKS5zdHJpcFdoaXRlU3BhY2UoKS5sZW5ndGgoKSA9PSAwOworfQorCitE
b2N1bWVudCogSW5zcGVjdG9yRE9NQWdlbnQ6Om1haW5GcmFtZURvY3VtZW50KCkKK3sKKyAgICBM
aXN0SGFzaFNldDxSZWZQdHI8RG9jdW1lbnQ+ID46Oml0ZXJhdG9yIGl0ID0gbV9kb2N1bWVudHMu
YmVnaW4oKTsKKyAgICBpZiAoaXQgIT0gbV9kb2N1bWVudHMuZW5kKCkpCisgICAgICAgIHJldHVy
biBpdC0+Z2V0KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckRPTUFnZW50LmggYi9XZWJD
b3JlL2luc3BlY3Rvci9JbnNwZWN0b3JET01BZ2VudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjI4YzNhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2luc3BlY3Rv
ci9JbnNwZWN0b3JET01BZ2VudC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSW5zcGVjdG9y
RE9NQWdlbnRfaAorI2RlZmluZSBJbnNwZWN0b3JET01BZ2VudF9oCisKKyNpbmNsdWRlICJFdmVu
dExpc3RlbmVyLmgiCisjaW5jbHVkZSAiU2NyaXB0QXJyYXkuaCIKKyNpbmNsdWRlICJTY3JpcHRP
YmplY3QuaCIKKyNpbmNsdWRlICJTY3JpcHRTdGF0ZS5oIgorCisjaW5jbHVkZSA8d3RmL0xpc3RI
YXNoU2V0Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaFNl
dC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgRWxlbWVudDsKKyAgICBjbGFzcyBF
dmVudDsKKyAgICBjbGFzcyBEb2N1bWVudDsKKyAgICBjbGFzcyBJbnNwZWN0b3JGcm9udGVuZDsK
KyAgICBjbGFzcyBOYW1lTm9kZU1hcDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNsYXNzIFBhZ2U7
CisKKyAgICBjbGFzcyBJbnNwZWN0b3JET01BZ2VudCA6IHB1YmxpYyBFdmVudExpc3RlbmVyIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIEluc3BlY3RvckRPTUFnZW50KEluc3BlY3RvckZyb250ZW5k
KiBmcm9udGVuZCk7CisgICAgICAgIH5JbnNwZWN0b3JET01BZ2VudCgpOworCisgICAgICAgIC8v
IE1ldGhvZHMgY2FsbGVkIGZyb20gdGhlIGZyb250ZW5kLgorICAgICAgICB2b2lkIGdldENoaWxk
Tm9kZXMobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkKTsKKyAgICAgICAgdm9pZCBzZXRBdHRy
aWJ1dGUobG9uZyBjYWxsSWQsIGxvbmcgZWxlbWVudElkLCBjb25zdCBTdHJpbmcmIG5hbWUsIGNv
bnN0IFN0cmluZyYgdmFsdWUpOworICAgICAgICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShsb25nIGNh
bGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmluZyYgbmFtZSk7CisgICAgICAgIHZvaWQg
c2V0VGV4dE5vZGVWYWx1ZShsb25nIGNhbGxJZCwgbG9uZyBlbGVtZW50SWQsIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpOworCisgICAgICAgIC8vIE1ldGhvZHMgY2FsbGVkIGZyb20gdGhlIEluc3BlY3Rv
ckNvbnRyb2xsZXIuCisgICAgICAgIHZvaWQgc2V0RG9jdW1lbnQoRG9jdW1lbnQqIGRvY3VtZW50
KTsKKworICAgICAgICBOb2RlKiBub2RlRm9ySWQobG9uZyBub2RlSWQpOworICAgICAgICBsb25n
IGlkRm9yTm9kZShOb2RlKiBub2RlKTsKKyAgICAgICAgbG9uZyBwdXNoTm9kZVBhdGhUb0Zyb250
ZW5kKE5vZGUqIG5vZGUpOworCisgICBwcml2YXRlOgorICAgICAgICB2b2lkIHN0YXJ0TGlzdGVu
aW5nKERvY3VtZW50KiBkb2N1bWVudCk7CisgICAgICAgIHZvaWQgc3RvcExpc3RlbmluZyhEb2N1
bWVudCogZG9jdW1lbnQpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChFdmVu
dCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCk7CisKKyAgICAgICAgbG9uZyBiaW5kKE5vZGUq
IG5vZGUpOworICAgICAgICB2b2lkIHVuYmluZChOb2RlKiBub2RlKTsKKworICAgICAgICB2b2lk
IHB1c2hEb2N1bWVudEVsZW1lbnRUb0Zyb250ZW5kKCk7CisgICAgICAgIHZvaWQgcHVzaENoaWxk
Tm9kZXNUb0Zyb250ZW5kKGxvbmcgZWxlbWVudElkKTsKKworICAgICAgICBTY3JpcHRPYmplY3Qg
YnVpbGRPYmplY3RGb3JOb2RlKE5vZGUqIG5vZGUsIGludCBkZXB0aCk7CisgICAgICAgIFNjcmlw
dEFycmF5IGJ1aWxkQXJyYXlGb3JFbGVtZW50QXR0cmlidXRlcyhFbGVtZW50KiBlbGVtZW4pOwor
ICAgICAgICBTY3JpcHRBcnJheSBidWlsZEFycmF5Rm9yRWxlbWVudENoaWxkcmVuKEVsZW1lbnQq
IGVsZW1lbnQsIGludCBkZXB0aCk7CisKKyAgICAgICAgLy8gV2UgcmVwcmVzZW50IGVtYmVkZGVk
IGRvbXMgYXMgYSBwYXJ0IG9mIHRoZSBzYW1lIGhpZXJhcmNoeS4gSGVuY2Ugd2UgdHJlYXQgY2hp
bGRyZW4gb2YgZnJhbWUgb3duZXJzIGRpZmZlcmVudGx5LgorICAgICAgICAvLyBXZSBhbHNvIHNr
aXAgd2hpdGVzcGFjZSB0ZXh0IG5vZGVzIGNvbmRpdGlvbmFsbHkuIEZvbGxvd2luZyBtZXRob2Rz
IGVuY2Fwc3VsYXRlIHRoZXNlIHNwZWNpZmljcy4KKyAgICAgICAgTm9kZSogaW5uZXJGaXJzdENo
aWxkKE5vZGUqIG5vZGUpOworICAgICAgICBOb2RlKiBpbm5lck5leHRTaWJsaW5nKE5vZGUqIG5v
ZGUpOworICAgICAgICBOb2RlKiBpbm5lclByZXZpb3VzU2libGluZyhOb2RlKiBub2RlKTsKKyAg
ICAgICAgaW50IGlubmVyQ2hpbGROb2RlQ291bnQoTm9kZSogbm9kZSk7CisgICAgICAgIEVsZW1l
bnQqIGlubmVyUGFyZW50RWxlbWVudChOb2RlKiBub2RlKTsKKyAgICAgICAgYm9vbCBpc1doaXRl
c3BhY2UoTm9kZSogbm9kZSk7CisKKyAgICAgICAgRG9jdW1lbnQqIG1haW5GcmFtZURvY3VtZW50
KCk7CisgICAgICAgIHZvaWQgZGlzY2FyZEJpbmRpbmdzKCk7CisKKyAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmQqIG1fZnJvbnRlbmQ7CisgICAgICAgIEhhc2hNYXA8Tm9kZSosIGxvbmc+IG1fbm9k
ZVRvSWQ7CisgICAgICAgIEhhc2hNYXA8bG9uZywgTm9kZSo+IG1faWRUb05vZGU7CisgICAgICAg
IEhhc2hTZXQ8bG9uZz4gbV9jaGlsZHJlblJlcXVlc3RlZDsKKyAgICAgICAgbG9uZyBtX2xhc3RO
b2RlSWQ7CisgICAgICAgIExpc3RIYXNoU2V0PFJlZlB0cjxEb2N1bWVudD4gPiBtX2RvY3VtZW50
czsKKyAgICAgICAgUmVmUHRyPEV2ZW50TGlzdGVuZXI+IG1fZXZlbnRMaXN0ZW5lcjsKKyAgICB9
OworCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vICFkZWZpbmVkKEluc3Bl
Y3RvckRPTUFnZW50X2gpCmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JG
cm9udGVuZC5jcHAgYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5jcHAKaW5k
ZXggZWYyZThiZC4uYWY2NWZiNCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVj
dG9yRnJvbnRlbmQuY3BwCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL0luc3BlY3RvckZyb250ZW5k
LmNwcApAQCAtMjg2LDYgKzI4Niw2OSBAQCBib29sIEluc3BlY3RvckZyb250ZW5kOjphZGRET01T
dG9yYWdlKGNvbnN0IFNjcmlwdE9iamVjdCYgZG9tU3RvcmFnZU9iaikKIH0KICNlbmRpZgogCit2
b2lkIEluc3BlY3RvckZyb250ZW5kOjpzZXREb2N1bWVudEVsZW1lbnQoY29uc3QgU2NyaXB0T2Jq
ZWN0JiByb290KQoreworICAgIE93blB0cjxTY3JpcHRGdW5jdGlvbkNhbGw+IGZ1bmN0aW9uKG5l
d0Z1bmN0aW9uQ2FsbCgic2V0RG9jdW1lbnRFbGVtZW50IikpOworICAgIGZ1bmN0aW9uLT5hcHBl
bmRBcmd1bWVudChyb290KTsKKyAgICBmdW5jdGlvbi0+Y2FsbCgpOworfQorCit2b2lkIEluc3Bl
Y3RvckZyb250ZW5kOjpzZXRDaGlsZE5vZGVzKGludCBwYXJlbnRJZCwgY29uc3QgU2NyaXB0QXJy
YXkmIG5vZGVzKQoreworICAgIE93blB0cjxTY3JpcHRGdW5jdGlvbkNhbGw+IGZ1bmN0aW9uKG5l
d0Z1bmN0aW9uQ2FsbCgic2V0Q2hpbGROb2RlcyIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJn
dW1lbnQocGFyZW50SWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChub2Rlcyk7Cisg
ICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6aGFzQ2hp
bGRyZW5VcGRhdGVkKGludCBpZCwgYm9vbCBuZXdWYWx1ZSkKK3sKKyAgICBPd25QdHI8U2NyaXB0
RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImhhc0NoaWxkcmVuVXBkYXRl
ZCIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQoaWQpOworICAgIGZ1bmN0aW9uLT5h
cHBlbmRBcmd1bWVudChuZXdWYWx1ZSk7CisgICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwordm9p
ZCBJbnNwZWN0b3JGcm9udGVuZDo6Y2hpbGROb2RlSW5zZXJ0ZWQoaW50IHBhcmVudElkLCBpbnQg
cHJldklkLCBjb25zdCBTY3JpcHRPYmplY3QmIG5vZGUpCit7CisgICAgT3duUHRyPFNjcmlwdEZ1
bmN0aW9uQ2FsbD4gZnVuY3Rpb24obmV3RnVuY3Rpb25DYWxsKCJjaGlsZE5vZGVJbnNlcnRlZCIp
KTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQocGFyZW50SWQpOworICAgIGZ1bmN0aW9u
LT5hcHBlbmRBcmd1bWVudChwcmV2SWQpOworICAgIGZ1bmN0aW9uLT5hcHBlbmRBcmd1bWVudChu
b2RlKTsKKyAgICBmdW5jdGlvbi0+Y2FsbCgpOworfQorCit2b2lkIEluc3BlY3RvckZyb250ZW5k
OjpjaGlsZE5vZGVSZW1vdmVkKGludCBwYXJlbnRJZCwgaW50IGlkKQoreworICAgIE93blB0cjxT
Y3JpcHRGdW5jdGlvbkNhbGw+IGZ1bmN0aW9uKG5ld0Z1bmN0aW9uQ2FsbCgiY2hpbGROb2RlUmVt
b3ZlZCIpKTsKKyAgICBmdW5jdGlvbi0+YXBwZW5kQXJndW1lbnQocGFyZW50SWQpOworICAgIGZ1
bmN0aW9uLT5hcHBlbmRBcmd1bWVudChpZCk7CisgICAgZnVuY3Rpb24tPmNhbGwoKTsKK30KKwor
dm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6YXR0cmlidXRlc1VwZGF0ZWQoaW50IGlkLCBjb25zdCBT
Y3JpcHRBcnJheSYgYXR0cmlidXRlcykKK3sKKyAgICBPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxs
PiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImF0dHJpYnV0ZXNVcGRhdGVkIikpOworICAgIGZ1
bmN0aW9uLT5hcHBlbmRBcmd1bWVudChpZCk7CisgICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50
KGF0dHJpYnV0ZXMpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKK3ZvaWQgSW5zcGVjdG9y
RnJvbnRlbmQ6OmRpZEdldENoaWxkTm9kZXMoaW50IGNhbGxJZCkKK3sKKyAgICBPd25QdHI8U2Ny
aXB0RnVuY3Rpb25DYWxsPiBmdW5jdGlvbihuZXdGdW5jdGlvbkNhbGwoImRpZEdldENoaWxkTm9k
ZXMiKSk7CisgICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KGNhbGxJZCk7CisgICAgZnVuY3Rp
b24tPmNhbGwoKTsKK30KKwordm9pZCBJbnNwZWN0b3JGcm9udGVuZDo6ZGlkQXBwbHlEb21DaGFu
Z2UoaW50IGNhbGxJZCwgYm9vbCBzdWNjZXNzKQoreworICAgIE93blB0cjxTY3JpcHRGdW5jdGlv
bkNhbGw+IGZ1bmN0aW9uKG5ld0Z1bmN0aW9uQ2FsbCgiZGlkQXBwbHlEb21DaGFuZ2UiKSk7Cisg
ICAgZnVuY3Rpb24tPmFwcGVuZEFyZ3VtZW50KGNhbGxJZCk7CisgICAgZnVuY3Rpb24tPmFwcGVu
ZEFyZ3VtZW50KHN1Y2Nlc3MpOworICAgIGZ1bmN0aW9uLT5jYWxsKCk7Cit9CisKIFBhc3NPd25Q
dHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBJbnNwZWN0b3JGcm9udGVuZDo6bmV3RnVuY3Rpb25DYWxs
KGNvbnN0IFN0cmluZyYgZnVuY3Rpb25OYW1lKQogewogICAgIFNjcmlwdEZ1bmN0aW9uQ2FsbCog
ZnVuY3Rpb24gPSBuZXcgU2NyaXB0RnVuY3Rpb25DYWxsKG1fc2NyaXB0U3RhdGUsIG1fd2ViSW5z
cGVjdG9yLCAiZGlzcGF0Y2giKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3RvckZyb250ZW5kLmggYi9XZWJDb3JlL2luc3BlY3Rvci9JbnNwZWN0b3JGcm9udGVuZC5oCmlu
ZGV4IGI4NjhjMTAuLjdhNDhiNjIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvaW5zcGVjdG9yL0luc3Bl
Y3RvckZyb250ZW5kLmgKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvSW5zcGVjdG9yRnJvbnRlbmQu
aApAQCAtOTYsNiArOTYsMTUgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBib29sIGFk
ZERPTVN0b3JhZ2UoY29uc3QgU2NyaXB0T2JqZWN0JiBkb21TdG9yYWdlT2JqKTsKICNlbmRpZgog
CisgICAgICAgIHZvaWQgc2V0RG9jdW1lbnRFbGVtZW50KGNvbnN0IFNjcmlwdE9iamVjdCYgcm9v
dCk7CisgICAgICAgIHZvaWQgc2V0Q2hpbGROb2RlcyhpbnQgcGFyZW50SWQsIGNvbnN0IFNjcmlw
dEFycmF5JiBub2Rlcyk7CisgICAgICAgIHZvaWQgaGFzQ2hpbGRyZW5VcGRhdGVkKGludCBpZCwg
Ym9vbCBuZXdWYWx1ZSk7CisgICAgICAgIHZvaWQgY2hpbGROb2RlSW5zZXJ0ZWQoaW50IHBhcmVu
dElkLCBpbnQgcHJldklkLCBjb25zdCBTY3JpcHRPYmplY3QmIG5vZGUpOworICAgICAgICB2b2lk
IGNoaWxkTm9kZVJlbW92ZWQoaW50IHBhcmVudElkLCBpbnQgaWQpOworICAgICAgICB2b2lkIGF0
dHJpYnV0ZXNVcGRhdGVkKGludCBpZCwgY29uc3QgU2NyaXB0QXJyYXkmIGF0dHJpYnV0ZXMpOwor
ICAgICAgICB2b2lkIGRpZEdldENoaWxkTm9kZXMoaW50IGNhbGxJZCk7CisgICAgICAgIHZvaWQg
ZGlkQXBwbHlEb21DaGFuZ2UoaW50IGNhbGxJZCwgYm9vbCBzdWNjZXNzKTsKKwogICAgIHByaXZh
dGU6CiAgICAgICAgIFBhc3NPd25QdHI8U2NyaXB0RnVuY3Rpb25DYWxsPiBuZXdGdW5jdGlvbkNh
bGwoY29uc3QgU3RyaW5nJiBmdW5jdGlvbk5hbWUpOwogICAgICAgICB2b2lkIGNhbGxTaW1wbGVG
dW5jdGlvbihjb25zdCBTdHJpbmcmIGZ1bmN0aW9uTmFtZSk7CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L2luc3BlY3Rvci9mcm9udC1lbmQvQ2FsbGJhY2suanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9u
dC1lbmQvQ2FsbGJhY2suanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFl
N2Y5NQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9DYWxs
YmFjay5qcwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworV2ViSW5zcGVjdG9yLkNhbGxiYWNrID0gZnVuY3Rpb24o
KQoreworICAgIHRoaXMuX2xhc3RDYWxsYmFja0lkID0gMTsKKyAgICB0aGlzLl9jYWxsYmFja3Mg
PSB7fTsKK30KKworV2ViSW5zcGVjdG9yLkNhbGxiYWNrLnByb3RvdHlwZSA9IHsKKyAgICB3cmFw
OiBmdW5jdGlvbihjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHZhciBjYWxsYmFja0lkID0gdGhp
cy5fbGFzdENhbGxiYWNrSWQrKzsKKyAgICAgICAgdGhpcy5fY2FsbGJhY2tzW2NhbGxiYWNrSWRd
ID0gY2FsbGJhY2sgfHwgZnVuY3Rpb24oKSB7fTsKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrSWQ7
CisgICAgfSwKKworICAgIHByb2Nlc3NDYWxsYmFjazogZnVuY3Rpb24oY2FsbGJhY2tJZCwgb3B0
X3ZhcmFyZykKKyAgICB7CisgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNl
LmNhbGwoYXJndW1lbnRzLCAxKTsKKyAgICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5fY2FsbGJh
Y2tzW2NhbGxiYWNrSWRdOworICAgICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmdzKTsKKyAg
ICAgICAgZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tjYWxsYmFja0lkXTsKKyAgICB9Cit9CisKK1dl
Ykluc3BlY3Rvci5DYWxsYmFjay5fSU5TVEFOQ0UgPSBuZXcgV2ViSW5zcGVjdG9yLkNhbGxiYWNr
KCk7CitXZWJJbnNwZWN0b3IuQ2FsbGJhY2sud3JhcCA9IFdlYkluc3BlY3Rvci5DYWxsYmFjay5f
SU5TVEFOQ0Uud3JhcC5iaW5kKFdlYkluc3BlY3Rvci5DYWxsYmFjay5fSU5TVEFOQ0UpOworV2Vi
SW5zcGVjdG9yLkNhbGxiYWNrLnByb2Nlc3NDYWxsYmFjayA9IFdlYkluc3BlY3Rvci5DYWxsYmFj
ay5fSU5TVEFOQ0UucHJvY2Vzc0NhbGxiYWNrLmJpbmQoV2ViSW5zcGVjdG9yLkNhbGxiYWNrLl9J
TlNUQU5DRSk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRE9NQWdl
bnQuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRE9NQWdlbnQuanMKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwYWU1YQotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9ET01BZ2VudC5qcwpAQCAtMCwwICsxLDU1NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK1dl
Ykluc3BlY3Rvci5ET01Ob2RlID0gZnVuY3Rpb24oZG9jLCBwYXlsb2FkKSB7CisgICAgdGhpcy5v
d25lckRvY3VtZW50ID0gZG9jOworCisgICAgdGhpcy5faWQgPSBwYXlsb2FkLmlkOworICAgIHRo
aXMubm9kZVR5cGUgPSBwYXlsb2FkLm5vZGVUeXBlOworICAgIHRoaXMubm9kZU5hbWUgPSBwYXls
b2FkLm5vZGVOYW1lOworICAgIHRoaXMuX25vZGVWYWx1ZSA9IHBheWxvYWQubm9kZVZhbHVlOwor
ICAgIHRoaXMudGV4dENvbnRlbnQgPSB0aGlzLm5vZGVWYWx1ZTsKKworICAgIHRoaXMuYXR0cmli
dXRlcyA9IFtdOworICAgIHRoaXMuX2F0dHJpYnV0ZXNNYXAgPSB7fTsKKyAgICBpZiAocGF5bG9h
ZC5hdHRyaWJ1dGVzKQorICAgICAgICB0aGlzLl9zZXRBdHRyaWJ1dGVzUGF5bG9hZChwYXlsb2Fk
LmF0dHJpYnV0ZXMpOworCisgICAgdGhpcy5fY2hpbGROb2RlQ291bnQgPSBwYXlsb2FkLmNoaWxk
Tm9kZUNvdW50OworICAgIHRoaXMuY2hpbGRyZW4gPSBudWxsOworCisgICAgdGhpcy5uZXh0U2li
bGluZyA9IG51bGw7CisgICAgdGhpcy5wcmV2U2libGluZyA9IG51bGw7CisgICAgdGhpcy5maXJz
dENoaWxkID0gbnVsbDsKKyAgICB0aGlzLnBhcmVudE5vZGUgPSBudWxsOworCisgICAgaWYgKHBh
eWxvYWQuY2hpbGROb2RlcykKKyAgICAgICAgdGhpcy5fc2V0Q2hpbGRyZW5QYXlsb2FkKHBheWxv
YWQuY2hpbGROb2Rlcyk7CisKKyAgICB0aGlzLl9jb21wdXRlZFN0eWxlID0gbnVsbDsKKyAgICB0
aGlzLnN0eWxlID0gbnVsbDsKKyAgICB0aGlzLl9tYXRjaGVkQ1NTUnVsZXMgPSBbXTsKK30KKwor
V2ViSW5zcGVjdG9yLkRPTU5vZGUucHJvdG90eXBlID0geworICAgIGhhc0F0dHJpYnV0ZXM6IGZ1
bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoID4g
MDsKKyAgICB9LAorCisgICAgaGFzQ2hpbGROb2RlczogZnVuY3Rpb24oKSAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fY2hpbGROb2RlQ291bnQgPiAwOworICAgIH0sCisKKyAgICBnZXQgbm9kZVZh
bHVlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5fbm9kZVZhbHVlOworICAgIH0sCisKKyAgICBz
ZXQgbm9kZVZhbHVlKHZhbHVlKSB7CisgICAgICAgIGlmICh0aGlzLm5vZGVUeXBlICE9IE5vZGUu
VEVYVF9OT0RFKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB2YXIgc2VsZiA9IHRoaXM7
CisgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkKKyAgICAgICAgeworICAgICAgICAg
ICAgc2VsZi5fbm9kZVZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICBzZWxmLnRleHRDb250ZW50
ID0gdmFsdWU7CisgICAgICAgIH07CisgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5fZG9tQWdl
bnQuc2V0VGV4dE5vZGVWYWx1ZUFzeW5jKHRoaXMsIHZhbHVlLCBjYWxsYmFjayk7CisgICAgfSwK
KworICAgIGdldEF0dHJpYnV0ZTogZnVuY3Rpb24obmFtZSkKKyAgICB7CisgICAgICAgIHZhciBh
dHRyID0gdGhpcy5fYXR0cmlidXRlc01hcFtuYW1lXTsKKyAgICAgICAgcmV0dXJuIGF0dHIgPyBh
dHRyLnZhbHVlIDogdW5kZWZpbmVkOworICAgIH0sCisKKyAgICBzZXRBdHRyaWJ1dGU6IGZ1bmN0
aW9uKG5hbWUsIHZhbHVlKQorICAgIHsKKyAgICAgICAgdmFyIHNlbGYgPSB0aGlzOworICAgICAg
ICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBh
dHRyID0gc2VsZi5fYXR0cmlidXRlc01hcFtuYW1lXTsKKyAgICAgICAgICAgIGlmIChhdHRyKQor
ICAgICAgICAgICAgICAgIGF0dHIudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICBhdHRyID0gc2VsZi5fYWRkQXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKKyAg
ICAgICAgfTsKKyAgICAgICAgdGhpcy5vd25lckRvY3VtZW50Ll9kb21BZ2VudC5zZXRBdHRyaWJ1
dGVBc3luYyh0aGlzLCBuYW1lLCB2YWx1ZSwgY2FsbGJhY2spOworICAgIH0sCisKKyAgICByZW1v
dmVBdHRyaWJ1dGU6IGZ1bmN0aW9uKG5hbWUpCisgICAgeworICAgICAgICB2YXIgc2VsZiA9IHRo
aXM7CisgICAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uKCkKKyAgICAgICAgeworICAgICAg
ICAgICAgZGVsZXRlIHNlbGYuX2F0dHJpYnV0ZXNNYXBbbmFtZV07CisgICAgICAgICAgICBmb3Ig
KHZhciBpID0gMDsgIGkgPCBzZWxmLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoc2VsZi5hdHRyaWJ1dGVzW2ldLm5hbWUgPT0gbmFtZSkgeworICAgICAgICAg
ICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZXMuc3BsaWNlKGksIDEpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07
CisgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5fZG9tQWdlbnQucmVtb3ZlQXR0cmlidXRlQXN5
bmModGhpcywgbmFtZSwgY2FsbGJhY2spOworICAgIH0sCisKKyAgICBfc2V0QXR0cmlidXRlc1Bh
eWxvYWQ6IGZ1bmN0aW9uKGF0dHJzKQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkg
PCBhdHRycy5sZW5ndGg7IGkgKz0gMikKKyAgICAgICAgICAgIHRoaXMuX2FkZEF0dHJpYnV0ZShh
dHRyc1tpXSwgYXR0cnNbaSArIDFdKTsKKyAgICB9LAorCisgICAgX2luc2VydENoaWxkOiBmdW5j
dGlvbihwcmV2LCBwYXlsb2FkKQorICAgIHsKKyAgICAgICAgdmFyIG5vZGUgPSBuZXcgV2ViSW5z
cGVjdG9yLkRPTU5vZGUodGhpcy5vd25lckRvY3VtZW50LCBwYXlsb2FkKTsKKyAgICAgICAgaWYg
KCFwcmV2KQorICAgICAgICAgICAgLy8gRmlyc3Qgbm9kZQorICAgICAgICAgICAgdGhpcy5jaGls
ZHJlbiA9IFsgbm9kZSBdOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aGlzLmNoaWxkcmVu
LnNwbGljZSh0aGlzLmNoaWxkcmVuLmluZGV4T2YocHJldikgKyAxLCAwLCBub2RlKTsKKyAgICAg
ICAgdGhpcy5fcmVudW1iZXIoKTsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfSwKKworICAg
IHJlbW92ZUNoaWxkXzogZnVuY3Rpb24obm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuY2hpbGRy
ZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihub2RlKSwgMSk7CisgICAgICAgIG5vZGUu
cGFyZW50Tm9kZSA9IG51bGw7CisgICAgICAgIHRoaXMuX3JlbnVtYmVyKCk7CisgICAgfSwKKwor
ICAgIF9zZXRDaGlsZHJlblBheWxvYWQ6IGZ1bmN0aW9uKHBheWxvYWRzKQorICAgIHsKKyAgICAg
ICAgdGhpcy5jaGlsZHJlbiA9IFtdOworICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBheWxv
YWRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB2YXIgcGF5bG9hZCA9IHBheWxvYWRzW2ld
OworICAgICAgICAgICAgdmFyIG5vZGUgPSBuZXcgV2ViSW5zcGVjdG9yLkRPTU5vZGUodGhpcy5v
d25lckRvY3VtZW50LCBwYXlsb2FkKTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChu
b2RlKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9yZW51bWJlcigpOworICAgIH0sCisKKyAg
ICBfcmVudW1iZXI6IGZ1bmN0aW9uKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2NoaWxkTm9kZUNv
dW50ID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7CisgICAgICAgIGlmICh0aGlzLl9jaGlsZE5vZGVD
b3VudCA9PSAwKSB7CisgICAgICAgICAgICB0aGlzLmZpcnN0Q2hpbGQgPSBudWxsOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRoaXMuZmlyc3RDaGlsZCA9IHRoaXMu
Y2hpbGRyZW5bMF07CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fY2hpbGROb2Rl
Q291bnQ7ICsraSkgeworICAgICAgICAgICAgdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlbltpXTsK
KyAgICAgICAgICAgIGNoaWxkLm5leHRTaWJsaW5nID0gaSArIDEgPCB0aGlzLl9jaGlsZE5vZGVD
b3VudCA/IHRoaXMuY2hpbGRyZW5baSArIDFdIDogbnVsbDsKKyAgICAgICAgICAgIGNoaWxkLnBy
ZXZTaWJsaW5nID0gaSAtIDEgPj0gMCA/IHRoaXMuY2hpbGRyZW5baSAtIDFdIDogbnVsbDsKKyAg
ICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUgPSB0aGlzOworICAgICAgICB9CisgICAgfSwKKwor
ICAgIF9hZGRBdHRyaWJ1dGU6IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKQorICAgIHsKKyAgICAgICAg
dmFyIGF0dHIgPSB7CisgICAgICAgICAgICAibmFtZSI6IG5hbWUsCisgICAgICAgICAgICAidmFs
dWUiOiB2YWx1ZSwKKyAgICAgICAgICAgICJfbm9kZSI6IHRoaXMKKyAgICAgICAgfTsKKyAgICAg
ICAgdGhpcy5fYXR0cmlidXRlc01hcFtuYW1lXSA9IGF0dHI7CisgICAgICAgIHRoaXMuYXR0cmli
dXRlcy5wdXNoKGF0dHIpOworICAgIH0sCisKKyAgICBfc2V0U3R5bGVzOiBmdW5jdGlvbihjb21w
dXRlZFN0eWxlLCBpbmxpbmVTdHlsZSwgc3R5bGVBdHRyaWJ1dGVzLCBtYXRjaGVkQ1NTUnVsZXMp
CisgICAgeworICAgICAgICB0aGlzLl9jb21wdXRlZFN0eWxlID0gdGhpcy5fbWFrZVN0eWxlKGNv
bXB1dGVkU3R5bGUpOworICAgICAgICB0aGlzLnN0eWxlID0gdGhpcy5fbWFrZVN0eWxlKGlubGlu
ZVN0eWxlKTsKKworICAgICAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlQXR0cmlidXRlcykgewor
ICAgICAgICAgICAgaWYgKHRoaXMuX2F0dHJpYnV0ZXNNYXBbbmFtZV0pCisgICAgICAgICAgICAg
ICAgdGhpcy5fYXR0cmlidXRlc01hcFtuYW1lXS5zdHlsZSA9IHRoaXMuX21ha2VTdHlsZShzdHls
ZUF0dHJpYnV0ZXNbbmFtZV0pOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fbWF0Y2hlZENT
U1J1bGVzID0gW107CisgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hlZENTU1J1bGVz
Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YXIgZGVzY3JpcHRpb24gPSBtYXRjaGVkQ1NT
UnVsZXNbaV07CisKKyAgICAgICAgICAgIHZhciBydWxlID0ge307CisgICAgICAgICAgICBydWxl
LnNlbGVjdG9yVGV4dCA9IGRlc2NyaXB0aW9uLnNlbGVjdG9yVGV4dDsKKyAgICAgICAgICAgIHJ1
bGUuc3R5bGUgPSB0aGlzLl9tYWtlU3R5bGUoZGVzY3JpcHRpb24uc3R5bGUpOworCisgICAgICAg
ICAgICBpZiAoZGVzY3JpcHRpb24ucGFyZW50U3R5bGVTaGVldCkgeworICAgICAgICAgICAgICAg
IHZhciBwYXJlbnRTdHlsZU1vY2sgPSB7fTsKKyAgICAgICAgICAgICAgICBwYXJlbnRTdHlsZU1v
Y2suaHJlZiA9IGRlc2NyaXB0aW9uLnBhcmVudFN0eWxlU2hlZXQuaHJlZjsKKyAgICAgICAgICAg
ICAgICB2YXIgbm9kZU5hbWUgPSBkZXNjcmlwdGlvbi5wYXJlbnRTdHlsZVNoZWV0Lm93bmVyTm9k
ZU5hbWU7CisgICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lKSB7CisgICAgICAgICAgICAgICAg
ICAgIHBhcmVudFN0eWxlTW9jay5vd25lck5vZGUgPSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAibm9kZU5hbWUiOiBub2RlTmFtZQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICBydWxlLnBhcmVudFN0eWxlU2hlZXQgPSBwYXJlbnRT
dHlsZU1vY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLl9tYXRjaGVkQ1NTUnVs
ZXMucHVzaChydWxlKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBfbWFrZVN0eWxlOiBmdW5j
dGlvbihwYXlsb2FkKQorICAgIHsKKyAgICAgICAgdmFyIHN0eWxlID0gbmV3IFdlYkluc3BlY3Rv
ci5DU1NTdHlsZURlY2xhcmF0aW9uKHBheWxvYWQpOworICAgICAgICBzdHlsZS5fbm9kZUlkID0g
dGhpcy5faWQ7CisgICAgICAgIHJldHVybiBzdHlsZTsKKyAgICB9LAorCisgICAgX2NsZWFyU3R5
bGVzOiBmdW5jdGlvbigpCisgICAgeworICAgICAgICB0aGlzLmNvbXB1dGVkU3R5bGUgPSBudWxs
OworICAgICAgICB0aGlzLnN0eWxlID0gbnVsbDsKKyAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0
aGlzLl9hdHRyaWJ1dGVzTWFwKQorICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlc01hcFtuYW1l
XS5zdHlsZSA9IG51bGw7CisgICAgICAgIHRoaXMuX21hdGNoZWRDU1NSdWxlcyA9IG51bGw7Cisg
ICAgfQorfQorCitXZWJJbnNwZWN0b3IuRE9NRG9jdW1lbnQgPSBmdW5jdGlvbihkb21BZ2VudCwg
ZGVmYXVsdFZpZXcpCit7CisgICAgV2ViSW5zcGVjdG9yLkRPTU5vZGUuY2FsbCh0aGlzLCBudWxs
LAorICAgICAgICB7CisgICAgICAgICAgICBpZDogMCwKKyAgICAgICAgICAgIG5vZGVUeXBlOiBO
b2RlLkRPQ1VNRU5UX05PREUsCisgICAgICAgICAgICBub2RlTmFtZTogIiIsCisgICAgICAgICAg
ICBub2RlVmFsdWU6ICIiLAorICAgICAgICAgICAgYXR0cmlidXRlczogW10sCisgICAgICAgICAg
ICBjaGlsZE5vZGVDb3VudDogMAorICAgICAgICB9KTsKKyAgICB0aGlzLl9saXN0ZW5lcnMgPSB7
fTsKKyAgICB0aGlzLl9kb21BZ2VudCA9IGRvbUFnZW50OworICAgIHRoaXMuZGVmYXVsdFZpZXcg
PSBkZWZhdWx0VmlldzsKK30KKworV2ViSW5zcGVjdG9yLkRPTURvY3VtZW50LnByb3RvdHlwZSA9
IHsKKworICAgIGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uKG5hbWUsIGNhbGxiYWNrLCB1c2VD
YXB0dXJlKQorICAgIHsKKyAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tu
YW1lXTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIGxpc3RlbmVycyA9
IFtdOworICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdID0gbGlzdGVuZXJzOworICAg
ICAgICB9CisgICAgICAgIGxpc3RlbmVycy5wdXNoKGNhbGxiYWNrKTsKKyAgICB9LAorCisgICAg
cmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24obmFtZSwgY2FsbGJhY2ssIHVzZUNhcHR1cmUp
CisgICAgeworICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW25hbWVdOwor
ICAgICAgICBpZiAoIWxpc3RlbmVycykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2
YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihjYWxsYmFjayk7CisgICAgICAgIGlmIChpbmRl
eCAhPSAtMSkKKyAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpOworICAgIH0s
CisKKyAgICBfZmlyZURvbUV2ZW50OiBmdW5jdGlvbihuYW1lLCBldmVudCkKKyAgICB7CisgICAg
ICAgIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbbmFtZV07CisgICAgICAgIGlmICgh
bGlzdGVuZXJzKQorICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmb3IgKHZhciBpID0gMDsg
aSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICBsaXN0ZW5lcnNbaV0oZXZlbnQp
OworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkRPTURvY3VtZW50LnByb3RvdHlwZS5fX3Byb3Rv
X18gPSBXZWJJbnNwZWN0b3IuRE9NTm9kZS5wcm90b3R5cGU7CisKKworV2ViSW5zcGVjdG9yLkRP
TVdpbmRvdyA9IGZ1bmN0aW9uKGRvbUFnZW50KQoreworICAgIHRoaXMuX2RvbUFnZW50ID0gZG9t
QWdlbnQ7Cit9CisKK1dlYkluc3BlY3Rvci5ET01XaW5kb3cucHJvdG90eXBlID0geworICAgIGdl
dCBkb2N1bWVudCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fZG9tQWdlbnQuZG9jdW1l
bnQ7CisgICAgfSwKKyAgICBnZXQgTm9kZSgpCisgICAgeworICAgICAgICByZXR1cm4gV2ViSW5z
cGVjdG9yLkRPTU5vZGU7CisgICAgfSwKKworICAgIGdldCBFbGVtZW50KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBXZWJJbnNwZWN0b3IuRE9NTm9kZTsKKyAgICB9LAorCisgICAgT2JqZWN0OiBm
dW5jdGlvbigpCisgICAgeworICAgIH0sCisKKyAgICBnZXRDb21wdXRlZFN0eWxlOiBmdW5jdGlv
bihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUuX2NvbXB1dGVkU3R5bGU7CisgICAg
fSwKKworICAgIGdldE1hdGNoZWRDU1NSdWxlczogZnVuY3Rpb24obm9kZSwgcHNldWRvRWxlbWVu
dCwgYXV0aG9yT25seSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlLl9tYXRjaGVkQ1NTUnVs
ZXM7CisgICAgfQorfQorCitXZWJJbnNwZWN0b3IuRE9NQWdlbnQgPSBmdW5jdGlvbigpIHsKKyAg
ICB0aGlzLl93aW5kb3cgPSBuZXcgV2ViSW5zcGVjdG9yLkRPTVdpbmRvdyh0aGlzKTsKKyAgICB0
aGlzLl9pZFRvRE9NTm9kZSA9IG51bGw7CisgICAgdGhpcy5kb2N1bWVudCA9IG51bGw7CisKKyAg
ICAvLyBJbnN0YWxsIG9ucG9wdWxhdGUgaGFuZGxlci4gVGhpcyBpcyBhIHRlbXBvcmFyeSBtZWFz
dXJlLgorICAgIC8vIFRPRE86IGFkZCB0aGlzIGNvZGUgaW50byB0aGUgb3JpZ2luYWwgdXBkYXRl
Q2hpbGRyZW4gb25jZSBkb21BZ2VudAorICAgIC8vIGJlY29tZXMgcHJpbWFyeSBzb3VyY2Ugb2Yg
RE9NIGluZm9ybWF0aW9uLgorICAgIC8vIFRPRE8yOiB1cGRhdGUgRWxlbWVudHNQYW5lbCB0byBu
b3QgdHJhY2sgZW1iZWRkZWQgaWZyYW1lcyAtIGl0IGlzIGFscmVhZHkgYmVpbmcgaGFuZGxlZAor
ICAgIC8vIGluIHRoZSBhZ2VudCBiYWNrZW5kLgorICAgIHZhciBkb21BZ2VudCA9IHRoaXM7Cisg
ICAgdmFyIG9yaWdpbmFsVXBkYXRlQ2hpbGRyZW4gPSBXZWJJbnNwZWN0b3IuRWxlbWVudHNUcmVl
RWxlbWVudC5wcm90b3R5cGUudXBkYXRlQ2hpbGRyZW47CisgICAgV2ViSW5zcGVjdG9yLkVsZW1l
bnRzVHJlZUVsZW1lbnQucHJvdG90eXBlLnVwZGF0ZUNoaWxkcmVuID0gZnVuY3Rpb24oKQorICAg
IHsKKyAgICAgICAgZG9tQWdlbnQuZ2V0Q2hpbGROb2Rlc0FzeW5jKHRoaXMucmVwcmVzZW50ZWRP
YmplY3QsIG9yaWdpbmFsVXBkYXRlQ2hpbGRyZW4uYmluZCh0aGlzKSk7CisgICAgfTsKKworICAg
IC8vIE11dGUgY29uc29sZSBoYW5kbGUgdG8gYXZvaWQgY3Jhc2ggb24gc2VsZWN0aW9uIGNoYW5n
ZS4KKyAgICAvLyBUT0RPOiBSZS1pbXBsZW1lbnQgaW5zcGVjdG9yQ29uc29sZUFQSSB0byB3b3Jr
IGluIGEgc2VyaWFsaXplZCB3YXkgYW5kIHJlbW92ZSB0aGlzIHdvcmthcm91bmQuCisgICAgV2Vi
SW5zcGVjdG9yLkNvbnNvbGUucHJvdG90eXBlLmFkZEluc3BlY3RlZE5vZGUgPSBmdW5jdGlvbigp
CisgICAgeworICAgIH07CisKKyAgICAvLyBXaGl0ZXNwYWNlIGlzIGlnbm9yZWQgaW4gSW5zcGVj
dG9yRE9NQWdlbnQgYWxyZWFkeSAtPiBubyBuZWVkIHRvIGZpbHRlci4KKyAgICAvLyBUT0RPOiBF
aXRoZXIgcmVtb3ZlIGFsbCBvZiBpdHMgdXNhZ2VzIG9yIHB1c2ggdmFsdWUgaW50byB0aGUgYWdl
bnQgYmFja2VuZC4KKyAgICBQcmVmZXJlbmNlcy5pZ25vcmVXaGl0ZXNwYWNlID0gZmFsc2U7Cit9
CisKK1dlYkluc3BlY3Rvci5ET01BZ2VudC5wcm90b3R5cGUgPSB7CisgICAgZ2V0IGluc3BlY3Rl
ZFdpbmRvdygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93OworICAgIH0sCisK
KyAgICBnZXRDaGlsZE5vZGVzQXN5bmM6IGZ1bmN0aW9uKHBhcmVudCwgb3B0X2NhbGxiYWNrKQor
ICAgIHsKKyAgICAgICAgdmFyIGNoaWxkcmVuID0gcGFyZW50LmNoaWxkcmVuOworICAgICAgICBp
ZiAoY2hpbGRyZW4gJiYgb3B0X2NhbGxiYWNrKSB7CisgICAgICAgICAgb3B0X2NhbGxiYWNrKGNo
aWxkcmVuKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdmFyIG15Y2Fs
bGJhY2sgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChvcHRfY2FsbGJhY2spIHsKKyAg
ICAgICAgICAgICAgICBvcHRfY2FsbGJhY2socGFyZW50LmNoaWxkcmVuKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfTsKKyAgICAgICAgdmFyIGNhbGxJZCA9IFdlYkluc3BlY3Rvci5DYWxsYmFj
ay53cmFwKG15Y2FsbGJhY2spOworICAgICAgICBJbnNwZWN0b3JDb250cm9sbGVyLmdldENoaWxk
Tm9kZXMoY2FsbElkLCBwYXJlbnQuX2lkKTsKKyAgICB9LAorCisgICAgc2V0QXR0cmlidXRlQXN5
bmM6IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIHZhbHVlLCBjYWxsYmFjaykKKyAgICB7CisgICAgICAg
IHZhciBteWNhbGxiYWNrID0gdGhpcy5fZGlkQXBwbHlEb21DaGFuZ2UuYmluZCh0aGlzLCBub2Rl
LCBjYWxsYmFjayk7CisgICAgICAgIEluc3BlY3RvckNvbnRyb2xsZXIuc2V0QXR0cmlidXRlKFdl
Ykluc3BlY3Rvci5DYWxsYmFjay53cmFwKG15Y2FsbGJhY2spLCBub2RlLl9pZCwgbmFtZSwgdmFs
dWUpOworICAgIH0sCisKKyAgICByZW1vdmVBdHRyaWJ1dGVBc3luYzogZnVuY3Rpb24obm9kZSwg
bmFtZSwgY2FsbGJhY2spCisgICAgeworICAgICAgICB2YXIgbXljYWxsYmFjayA9IHRoaXMuX2Rp
ZEFwcGx5RG9tQ2hhbmdlLmJpbmQodGhpcywgbm9kZSwgY2FsbGJhY2spOworICAgICAgICBJbnNw
ZWN0b3JDb250cm9sbGVyLnJlbW92ZUF0dHJpYnV0ZShXZWJJbnNwZWN0b3IuQ2FsbGJhY2sud3Jh
cChteWNhbGxiYWNrKSwgbm9kZS5faWQsIG5hbWUpOworICAgIH0sCisKKyAgICBzZXRUZXh0Tm9k
ZVZhbHVlQXN5bmM6IGZ1bmN0aW9uKG5vZGUsIHRleHQsIGNhbGxiYWNrKQorICAgIHsKKyAgICAg
ICAgdmFyIG15Y2FsbGJhY2sgPSB0aGlzLl9kaWRBcHBseURvbUNoYW5nZS5iaW5kKHRoaXMsIG5v
ZGUsIGNhbGxiYWNrKTsKKyAgICAgICAgSW5zcGVjdG9yQ29udHJvbGxlci5zZXRUZXh0Tm9kZVZh
bHVlKFdlYkluc3BlY3Rvci5DYWxsYmFjay53cmFwKG15Y2FsbGJhY2spLCBub2RlLl9pZCwgdGV4
dCk7CisgICAgfSwKKworICAgIF9kaWRBcHBseURvbUNoYW5nZTogZnVuY3Rpb24obm9kZSwgY2Fs
bGJhY2ssIHN1Y2Nlc3MpCisgICAgeworICAgICAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIC8vIFRPRE8ocGZlbGRtYW4p
OiBGaXggdGhpcyBoYWNrLgorICAgICAgICB2YXIgZWxlbSA9IFdlYkluc3BlY3Rvci5wYW5lbHMu
ZWxlbWVudHMudHJlZU91dGxpbmUuZmluZFRyZWVFbGVtZW50KG5vZGUpOworICAgICAgICBpZiAo
ZWxlbSkgeworICAgICAgICAgICAgZWxlbS5fdXBkYXRlVGl0bGUoKTsKKyAgICAgICAgfQorICAg
IH0sCisKKyAgICBfYXR0cmlidXRlc1VwZGF0ZWQ6IGZ1bmN0aW9uKG5vZGVJZCwgYXR0cnNBcnJh
eSkKKyAgICB7CisgICAgICAgIHZhciBub2RlID0gdGhpcy5faWRUb0RPTU5vZGVbbm9kZUlkXTsK
KyAgICAgICAgbm9kZS5fc2V0QXR0cmlidXRlc1BheWxvYWQoYXR0cnNBcnJheSk7CisgICAgfSwK
KworICAgIGdldE5vZGVGb3JJZDogZnVuY3Rpb24obm9kZUlkKSB7CisgICAgICAgIHJldHVybiB0
aGlzLl9pZFRvRE9NTm9kZVtub2RlSWRdOworICAgIH0sCisKKyAgICBfc2V0RG9jdW1lbnRFbGVt
ZW50OiBmdW5jdGlvbihwYXlsb2FkKQorICAgIHsKKyAgICAgICAgdGhpcy5kb2N1bWVudCA9IG5l
dyBXZWJJbnNwZWN0b3IuRE9NRG9jdW1lbnQodGhpcywgdGhpcy5fd2luZG93KTsKKyAgICAgICAg
dGhpcy5faWRUb0RPTU5vZGUgPSB7IDAgOiB0aGlzLmRvY3VtZW50IH07CisgICAgICAgIHRoaXMu
X3NldENoaWxkTm9kZXMoMCwgW3BheWxvYWRdKTsKKyAgICAgICAgdGhpcy5kb2N1bWVudC5kb2N1
bWVudEVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmZpcnN0Q2hpbGQ7CisgICAgICAgIHRoaXMuZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50Lm93bmVyRG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50OworICAg
ICAgICBXZWJJbnNwZWN0b3IucGFuZWxzLmVsZW1lbnRzLnJlc2V0KCk7CisgICAgfSwKKworICAg
IF9zZXRDaGlsZE5vZGVzOiBmdW5jdGlvbihwYXJlbnRJZCwgcGF5bG9hZHMpCisgICAgeworICAg
ICAgICB2YXIgcGFyZW50ID0gdGhpcy5faWRUb0RPTU5vZGVbcGFyZW50SWRdOworICAgICAgICBp
ZiAocGFyZW50LmNoaWxkcmVuKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAg
ICAgIHBhcmVudC5fc2V0Q2hpbGRyZW5QYXlsb2FkKHBheWxvYWRzKTsKKyAgICAgICAgdGhpcy5f
YmluZE5vZGVzKHBhcmVudC5jaGlsZHJlbik7CisgICAgfSwKKworICAgIF9iaW5kTm9kZXM6IGZ1
bmN0aW9uKGNoaWxkcmVuKQorICAgIHsKKyAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGls
ZHJlbi5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07
CisgICAgICAgICAgICB0aGlzLl9pZFRvRE9NTm9kZVtjaGlsZC5faWRdID0gY2hpbGQ7CisgICAg
ICAgICAgICBpZiAoY2hpbGQuY2hpbGRyZW4pCisgICAgICAgICAgICAgICAgdGhpcy5fYmluZE5v
ZGVzKGNoaWxkLmNoaWxkcmVuKTsKKyAgICAgICAgfQorICAgIH0sCisKKyAgICBfaGFzQ2hpbGRy
ZW5VcGRhdGVkOiBmdW5jdGlvbihub2RlSWQsIG5ld1ZhbHVlKQorICAgIHsKKyAgICAgICAgdmFy
IG5vZGUgPSB0aGlzLl9pZFRvRE9NTm9kZVtub2RlSWRdOworICAgICAgICB2YXIgb3V0bGluZSA9
IFdlYkluc3BlY3Rvci5wYW5lbHMuZWxlbWVudHMudHJlZU91dGxpbmU7CisgICAgICAgIHZhciB0
cmVlRWxlbWVudCA9IG91dGxpbmUuZmluZFRyZWVFbGVtZW50KG5vZGUpOworICAgICAgICBpZiAo
dHJlZUVsZW1lbnQpIHsKKyAgICAgICAgICAgIHRyZWVFbGVtZW50Lmhhc0NoaWxkcmVuID0gbmV3
VmFsdWU7CisgICAgICAgICAgICB0cmVlRWxlbWVudC53aGl0ZXNwYWNlSWdub3JlZCA9IFByZWZl
cmVuY2VzLmlnbm9yZVdoaXRlc3BhY2U7CisgICAgICAgIH0KKyAgICB9LAorCisgICAgX2NoaWxk
Tm9kZUluc2VydGVkOiBmdW5jdGlvbihwYXJlbnRJZCwgcHJldklkLCBwYXlsb2FkKQorICAgIHsK
KyAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuX2lkVG9ET01Ob2RlW3BhcmVudElkXTsKKyAgICAg
ICAgdmFyIHByZXYgPSB0aGlzLl9pZFRvRE9NTm9kZVtwcmV2SWRdOworICAgICAgICB2YXIgbm9k
ZSA9IHBhcmVudC5faW5zZXJ0Q2hpbGQocHJldiwgcGF5bG9hZCk7CisgICAgICAgIHRoaXMuX2lk
VG9ET01Ob2RlW25vZGUuX2lkXSA9IG5vZGU7CisgICAgICAgIHZhciBldmVudCA9IHsgdGFyZ2V0
IDogbm9kZSwgcmVsYXRlZE5vZGUgOiBwYXJlbnQgfTsKKyAgICAgICAgdGhpcy5kb2N1bWVudC5f
ZmlyZURvbUV2ZW50KCJET01Ob2RlSW5zZXJ0ZWQiLCBldmVudCk7CisgICAgfSwKKworICAgIF9j
aGlsZE5vZGVSZW1vdmVkOiBmdW5jdGlvbihwYXJlbnRJZCwgbm9kZUlkKQorICAgIHsKKyAgICAg
ICAgdmFyIHBhcmVudCA9IHRoaXMuX2lkVG9ET01Ob2RlW3BhcmVudElkXTsKKyAgICAgICAgdmFy
IG5vZGUgPSB0aGlzLl9pZFRvRE9NTm9kZVtub2RlSWRdOworICAgICAgICBwYXJlbnQucmVtb3Zl
Q2hpbGRfKG5vZGUpOworICAgICAgICB2YXIgZXZlbnQgPSB7IHRhcmdldCA6IG5vZGUsIHJlbGF0
ZWROb2RlIDogcGFyZW50IH07CisgICAgICAgIHRoaXMuZG9jdW1lbnQuX2ZpcmVEb21FdmVudCgi
RE9NTm9kZVJlbW92ZWQiLCBldmVudCk7CisgICAgICAgIGRlbGV0ZSB0aGlzLl9pZFRvRE9NTm9k
ZVtub2RlSWRdOworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLkNTU1N0eWxlRGVjbGFyYXRpb24g
PSBmdW5jdGlvbihwYXlsb2FkKSB7CisgICAgdGhpcy5faWQgPSBwYXlsb2FkLmlkOworICAgIHRo
aXMud2lkdGggPSBwYXlsb2FkLndpZHRoOworICAgIHRoaXMuaGVpZ2h0ID0gcGF5bG9hZC5oZWln
aHQ7CisgICAgdGhpcy5fX2Rpc2FibGVkUHJvcGVydGllcyA9IHBheWxvYWQuZGlzYWJsZWRQcm9w
ZXJ0aWVzOworICAgIHRoaXMuX19kaXNhYmxlZFByb3BlcnR5VmFsdWVzID0gcGF5bG9hZC5kaXNh
YmxlZFByb3BlcnR5VmFsdWVzOworICAgIHRoaXMuX19kaXNhYmxlZFByb3BlcnR5UHJpb3JpdGll
cyA9IHBheWxvYWQuZGlzYWJsZWRQcm9wZXJ0eVByaW9yaXRpZXM7CisKKyAgICB0aGlzLl9wcm9w
ZXJ0eU1hcCA9IHt9OworICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fcHJvcGVydGllcy5sZW5ndGg7
CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAg
dmFyIHByb3BlcnR5ID0gdGhpcy5fcHJvcGVydGllc1tpXTsKKyAgICAgICAgdmFyIG5hbWUgPSBw
cm9wZXJ0eS5uYW1lOworICAgICAgICB0aGlzW2ldID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcHJv
cGVydHlNYXBbbmFtZV0gPSBwcm9wZXJ0eTsKKyAgICB9Cit9CisKK1dlYkluc3BlY3Rvci5DU1NT
dHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSA9IHsKKyAgICBnZXRQcm9wZXJ0eVZhbHVlOiBmdW5j
dGlvbihuYW1lKQorICAgIHsKKyAgICAgICAgdmFyIHByb3BlcnR5ID0gdGhpcy5fcHJvcGVydHlN
YXBbbmFtZV07CisgICAgICAgIHJldHVybiBwcm9wZXJ0eSA/IHByb3BlcnR5LnZhbHVlIDogIiI7
CisgICAgfSwKKworICAgIGdldFByb3BlcnR5UHJpb3JpdHk6IGZ1bmN0aW9uKG5hbWUpCisgICAg
eworICAgICAgICB2YXIgcHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0eU1hcFtuYW1lXTsKKyAgICAg
ICAgcmV0dXJuIHByb3BlcnR5ID8gcHJvcGVydHkucHJpb3JpdHkgOiAiIjsKKyAgICB9LAorCisg
ICAgZ2V0UHJvcGVydHlTaG9ydGhhbmQ6IGZ1bmN0aW9uKG5hbWUpCisgICAgeworICAgICAgICB2
YXIgcHJvcGVydHkgPSB0aGlzLl9wcm9wZXJ0eU1hcFtuYW1lXTsKKyAgICAgICAgcmV0dXJuIHBy
b3BlcnR5ID8gcHJvcGVydHkuc2hvcnRoYW5kIDogIiI7CisgICAgfSwKKworICAgIGlzUHJvcGVy
dHlJbXBsaWNpdDogZnVuY3Rpb24obmFtZSkKKyAgICB7CisgICAgICAgIHZhciBwcm9wZXJ0eSA9
IHRoaXMuX3Byb3BlcnR5TWFwW25hbWVdOworICAgICAgICByZXR1cm4gcHJvcGVydHkgPyBwcm9w
ZXJ0eS5pbXBsaWNpdCA6ICIiOworICAgIH0KK30KKworV2ViSW5zcGVjdG9yLmF0dHJpYnV0ZXNV
cGRhdGVkID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuZG9tQWdlbnQuX2F0dHJpYnV0ZXNVcGRh
dGVkLmFwcGx5KHRoaXMuZG9tQWdlbnQsIGFyZ3VtZW50cyk7Cit9CisKK1dlYkluc3BlY3Rvci5z
ZXREb2N1bWVudEVsZW1lbnQgPSBmdW5jdGlvbigpCit7CisgICAgdGhpcy5kb21BZ2VudC5fc2V0
RG9jdW1lbnRFbGVtZW50LmFwcGx5KHRoaXMuZG9tQWdlbnQsIGFyZ3VtZW50cyk7Cit9CisKK1dl
Ykluc3BlY3Rvci5zZXRDaGlsZE5vZGVzID0gZnVuY3Rpb24oKQoreworICAgIHRoaXMuZG9tQWdl
bnQuX3NldENoaWxkTm9kZXMuYXBwbHkodGhpcy5kb21BZ2VudCwgYXJndW1lbnRzKTsKK30KKwor
V2ViSW5zcGVjdG9yLmhhc0NoaWxkcmVuVXBkYXRlZCA9IGZ1bmN0aW9uKCkKK3sKKyAgICB0aGlz
LmRvbUFnZW50Ll9oYXNDaGlsZHJlblVwZGF0ZWQuYXBwbHkodGhpcy5kb21BZ2VudCwgYXJndW1l
bnRzKTsKK30KKworV2ViSW5zcGVjdG9yLmNoaWxkTm9kZUluc2VydGVkID0gZnVuY3Rpb24oKQor
eworICAgIHRoaXMuZG9tQWdlbnQuX2NoaWxkTm9kZUluc2VydGVkLmFwcGx5KHRoaXMuZG9tQWdl
bnQsIGFyZ3VtZW50cyk7CisgICAgdGhpcy5fY2hpbGROb2RlSW5zZXJ0ZWQuYmluZCh0aGlzKTsK
K30KKworV2ViSW5zcGVjdG9yLmNoaWxkTm9kZVJlbW92ZWQgPSBmdW5jdGlvbigpCit7CisgICAg
dGhpcy5kb21BZ2VudC5fY2hpbGROb2RlUmVtb3ZlZC5hcHBseSh0aGlzLmRvbUFnZW50LCBhcmd1
bWVudHMpOworICAgIHRoaXMuX2NoaWxkTm9kZVJlbW92ZWQuYmluZCh0aGlzKTsKK30KKworV2Vi
SW5zcGVjdG9yLmRpZEdldENoaWxkTm9kZXMgPSBXZWJJbnNwZWN0b3IuQ2FsbGJhY2sucHJvY2Vz
c0NhbGxiYWNrOworV2ViSW5zcGVjdG9yLmRpZFBlcmZvcm1TZWFyY2ggPSBXZWJJbnNwZWN0b3Iu
Q2FsbGJhY2sucHJvY2Vzc0NhbGxiYWNrOworV2ViSW5zcGVjdG9yLmRpZEFwcGx5RG9tQ2hhbmdl
ID0gV2ViSW5zcGVjdG9yLkNhbGxiYWNrLnByb2Nlc3NDYWxsYmFjazsKK1dlYkluc3BlY3Rvci5k
aWRSZW1vdmVBdHRyaWJ1dGUgPSBXZWJJbnNwZWN0b3IuQ2FsbGJhY2sucHJvY2Vzc0NhbGxiYWNr
OworV2ViSW5zcGVjdG9yLmRpZFNldFRleHROb2RlVmFsdWUgPSBXZWJJbnNwZWN0b3IuQ2FsbGJh
Y2sucHJvY2Vzc0NhbGxiYWNrOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQt
ZW5kL0VsZW1lbnRzUGFuZWwuanMgYi9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvRWxlbWVu
dHNQYW5lbC5qcwppbmRleCA3NmQ5NzQ2Li41ODNhZmNjIDEwMDY0NAotLS0gYS9XZWJDb3JlL2lu
c3BlY3Rvci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcworKysgYi9XZWJDb3JlL2luc3BlY3Rv
ci9mcm9udC1lbmQvRWxlbWVudHNQYW5lbC5qcwpAQCAtNjAsNyArNjAsNiBAQCBXZWJJbnNwZWN0
b3IuRWxlbWVudHNQYW5lbCA9IGZ1bmN0aW9uKCkKICAgICAgICAgICAgIEluc3BlY3RvckNvbnRy
b2xsZXIudG9nZ2xlTm9kZVNlYXJjaCgpOwogICAgICAgICAgICAgdGhpcy5wYW5lbC5ub2RlU2Vh
cmNoQnV0dG9uLnJlbW92ZVN0eWxlQ2xhc3MoInRvZ2dsZWQtb24iKTsKICAgICAgICAgfQotCiAg
ICAgICAgIFdlYkluc3BlY3Rvci5jb25zb2xlLmFkZEluc3BlY3RlZE5vZGUodGhpcy5fZm9jdXNl
ZERPTU5vZGUpOwogICAgIH07CiAKQEAgLTE4MSw3ICsxODAsNyBAQCBXZWJJbnNwZWN0b3IuRWxl
bWVudHNQYW5lbC5wcm90b3R5cGUgPSB7CiAgICAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRRdWVy
eTsKICAgICAgICAgdGhpcy5zZWFyY2hDYW5jZWxlZCgpOwogCi0gICAgICAgIHZhciBpbnNwZWN0
ZWRXaW5kb3cgPSBJbnNwZWN0b3JDb250cm9sbGVyLmluc3BlY3RlZFdpbmRvdygpOworICAgICAg
ICB2YXIgaW5zcGVjdGVkV2luZG93ID0gUHJlZmVyZW5jZXMudXNlRE9NQWdlbnQgPyBXZWJJbnNw
ZWN0b3IuZG9tQWdlbnQuaW5zcGVjdGVkV2luZG93IDogSW5zcGVjdG9yQ29udHJvbGxlci5pbnNw
ZWN0ZWRXaW5kb3coKTsKICAgICAgICAgaWYgKCFpbnNwZWN0ZWRXaW5kb3cgfHwgIWluc3BlY3Rl
ZFdpbmRvdy5kb2N1bWVudCkKICAgICAgICAgICAgIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL1dlYktpdC5xcmMgYi9XZWJDb3JlL2luc3BlY3Rvci9m
cm9udC1lbmQvV2ViS2l0LnFyYwppbmRleCA2NjE5NDk5Li41MTFhMWJjIDEwMDY0NAotLS0gYS9X
ZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYworKysgYi9XZWJDb3JlL2luc3Bl
Y3Rvci9mcm9udC1lbmQvV2ViS2l0LnFyYwpAQCAtNCw2ICs0LDcgQEAKICAgICA8ZmlsZT5Cb3R0
b21VcFByb2ZpbGVEYXRhR3JpZFRyZWUuanM8L2ZpbGU+CiAgICAgPGZpbGU+QnJlYWtwb2ludC5q
czwvZmlsZT4KICAgICA8ZmlsZT5CcmVha3BvaW50c1NpZGViYXJQYW5lLmpzPC9maWxlPgorICAg
IDxmaWxlPkNhbGxiYWNrLmpzPC9maWxlPgogICAgIDxmaWxlPkNhbGxTdGFja1NpZGViYXJQYW5l
LmpzPC9maWxlPgogICAgIDxmaWxlPkNvbnNvbGUuanM8L2ZpbGU+CiAgICAgPGZpbGU+RGF0YWJh
c2UuanM8L2ZpbGU+CkBAIC0xMSw2ICsxMiw3IEBACiAgICAgPGZpbGU+RGF0YWJhc2VzUGFuZWwu
anM8L2ZpbGU+CiAgICAgPGZpbGU+RGF0YWJhc2VUYWJsZVZpZXcuanM8L2ZpbGU+CiAgICAgPGZp
bGU+RGF0YUdyaWQuanM8L2ZpbGU+CisgICAgPGZpbGU+RE9NQWdlbnQuanM8L2ZpbGU+CiAgICAg
PGZpbGU+RE9NU3RvcmFnZS5qczwvZmlsZT4KICAgICA8ZmlsZT5ET01TdG9yYWdlRGF0YUdyaWQu
anM8L2ZpbGU+CiAgICAgPGZpbGU+RE9NU3RvcmFnZUl0ZW1zVmlldy5qczwvZmlsZT4KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbCBiL1dlYkNv
cmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuaHRtbAppbmRleCA3NjIwNzRlLi5kYzc2
YzQ4IDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmh0
bWwKKysrIGIvV2ViQ29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5odG1sCkBAIC0z
OSw2ICszOSw3IEBAIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQi
IHNyYz0iUGxhY2FyZC5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFz
Y3JpcHQiIHNyYz0iVmlldy5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2ph
dmFzY3JpcHQiIHNyYz0iQ29uc29sZS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCB0eXBlPSJ0
ZXh0L2phdmFzY3JpcHQiIHNyYz0iQ2FsbGJhY2suanMiPjwvc2NyaXB0PgogICAgIDxzY3JpcHQg
dHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IlJlc291cmNlLmpzIj48L3NjcmlwdD4KICAgICA8
c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJSZXNvdXJjZUNhdGVnb3J5LmpzIj48
L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJEYXRhYmFz
ZS5qcyI+PC9zY3JpcHQ+CkBAIC03OCw2ICs3OSw3IEBAIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgICAgPHNjcmlwdCB0
eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iQm90dG9tVXBQcm9maWxlRGF0YUdyaWRUcmVlLmpz
Ij48L3NjcmlwdD4KICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJUb3BE
b3duUHJvZmlsZURhdGFHcmlkVHJlZS5qcyI+PC9zY3JpcHQ+CiAgICAgPHNjcmlwdCB0eXBlPSJ0
ZXh0L2phdmFzY3JpcHQiIHNyYz0iUHJvZmlsZVZpZXcuanMiPjwvc2NyaXB0PgorICAgIDxzY3Jp
cHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IkRPTUFnZW50LmpzIj48L3NjcmlwdD4KIDwv
aGVhZD4KIDxib2R5IGNsYXNzPSJkZXRhY2hlZCI+CiAgICAgPGRpdiBpZD0idG9vbGJhciI+CmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpzIGIvV2Vi
Q29yZS9pbnNwZWN0b3IvZnJvbnQtZW5kL2luc3BlY3Rvci5qcwppbmRleCA3ZTIzNjkyLi5kYjVi
NmQwIDEwMDY0NAotLS0gYS9XZWJDb3JlL2luc3BlY3Rvci9mcm9udC1lbmQvaW5zcGVjdG9yLmpz
CisrKyBiL1dlYkNvcmUvaW5zcGVjdG9yL2Zyb250LWVuZC9pbnNwZWN0b3IuanMKQEAgLTM3LDcg
KzM3LDggQEAgdmFyIFByZWZlcmVuY2VzID0gewogICAgIG1pblNjcmlwdHNTaWRlYmFyV2lkdGg6
IDIwMCwKICAgICBzaG93SW5oZXJpdGVkQ29tcHV0ZWRTdHlsZVByb3BlcnRpZXM6IGZhbHNlLAog
ICAgIHN0eWxlUnVsZXNFeHBhbmRlZFN0YXRlOiB7fSwKLSAgICBzaG93TWlzc2luZ0xvY2FsaXpl
ZFN0cmluZ3M6IGZhbHNlCisgICAgc2hvd01pc3NpbmdMb2NhbGl6ZWRTdHJpbmdzOiBmYWxzZSwK
KyAgICB1c2VET01BZ2VudDogZmFsc2UKIH0KIAogdmFyIFdlYkluc3BlY3RvciA9IHsKQEAgLTI5
OSw2ICszMDAsOCBAQCBXZWJJbnNwZWN0b3IubG9hZGVkID0gZnVuY3Rpb24oKQogICAgIGRvY3Vt
ZW50LmJvZHkuYWRkU3R5bGVDbGFzcygicGxhdGZvcm0tIiArIHBsYXRmb3JtKTsKIAogICAgIHRo
aXMuY29uc29sZSA9IG5ldyBXZWJJbnNwZWN0b3IuQ29uc29sZSgpOworICAgIGlmIChQcmVmZXJl
bmNlcy51c2VET01BZ2VudCkKKyAgICAgICAgdGhpcy5kb21BZ2VudCA9IG5ldyBXZWJJbnNwZWN0
b3IuRE9NQWdlbnQoKTsKIAogICAgIHRoaXMucGFuZWxzID0ge307CiAgICAgdGhpcy5fY3JlYXRl
UGFuZWxzKCk7CkBAIC0zNzgsNyArMzgxLDcgQEAgV2ViSW5zcGVjdG9yLmxvYWRlZCA9IGZ1bmN0
aW9uKCkKICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9vbGJhciIpLmFkZEV2ZW50TGlz
dGVuZXIoIm1vdXNlZG93biIsIHRoaXMudG9vbGJhckRyYWdTdGFydCwgdHJ1ZSk7CiAgICAgZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNsb3NlLWJ1dHRvbiIpLmFkZEV2ZW50TGlzdGVuZXIoImNs
aWNrIiwgdGhpcy5jbG9zZSwgdHJ1ZSk7CiAKLSAgICBJbnNwZWN0b3JDb250cm9sbGVyLmxvYWRl
ZCgpOworICAgIEluc3BlY3RvckNvbnRyb2xsZXIubG9hZGVkKFByZWZlcmVuY2VzLnVzZURPTUFn
ZW50KTsKIH0KIAogdmFyIHdpbmRvd0xvYWRlZCA9IGZ1bmN0aW9uKCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>