<?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>3275</bug_id>
          
          <creation_ts>2005-06-04 20:39:19 -0700</creation_ts>
          <short_desc>Support Mozilla&apos;s XSLTProcessor JS object</short_desc>
          <delta_ts>2006-08-13 19:10:19 -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>XML</component>
          <version>412</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc>http://www.mozilla.org/projects/xslt/js-interface.html</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>5404</dependson>
          <blocked>5446</blocked>
    
    <blocked>5492</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Dave Hyatt">hyatt</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          <cc>ap</cc>
    
    <cc>arthur_webkit</cc>
    
    <cc>dan</cc>
    
    <cc>darin</cc>
    
    <cc>j_mckitrick</cc>
    
    <cc>vicki</cc>
    
    <cc>webkit</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>10735</commentid>
    <comment_count>0</comment_count>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2005-06-04 20:39:19 -0700</bug_when>
    <thetext>Right now the only way XSLT can be used in Web Kit is through the use of client-side processing 
instructions in the source XML.  Mozilla offers a programmatic API for performing transformations from JS 
through an &lt;tt&gt;XSLTProcessor&lt;/tt&gt; object.  The following &lt;a href=&quot;http://www.mozilla.org/projects/
xslt/js-interface.html&quot;&gt;document&lt;/a&gt; on the Mozilla Web site describes this JS API.  We would like to 
match this API exactly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>11498</commentid>
    <comment_count>1</comment_count>
    <who name="Stuart Morgan">stuartmorgan</who>
    <bug_when>2005-06-11 15:17:22 -0700</bug_when>
    <thetext>Apple Bug: rdar://3642402</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>20684</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-09-27 16:39:34 -0700</bug_when>
    <thetext>Major sites depend on this functionality, bumping priority.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>21148</commentid>
    <comment_count>3</comment_count>
    <who name="Bert JW Regeer">webkit</who>
    <bug_when>2005-10-02 09:10:46 -0700</bug_when>
    <thetext>Adding CC. Very much interested in seeing this go through. Would be nice to take
advantage of it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22205</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-18 00:55:31 -0700</bug_when>
    <thetext>Ok, so I have this all coded up, and working.  Although my testing up until now has been *extremely 
limited*.  I took a moment tonight and thought up some potential test cases for this new API.  Hopefully 
I will get a chance to code all of these tests up.  However I also would not complain if someone took the 
liberty of making some of their own tests.  Particularly any of you who are skilled web designers 
desiring of this feature.

Things I thought might be useful to test:

void importStylesheet(in DOMNode style);
- Import two different stylesheets (last one wins)
- Import same stylesheet twice
- Import undefined stylesheet
- Import invalid stylesheet (not wellformed xlst)
- Don&apos;t import stylesheet

DOMDocumentFragment transformToFragment(in DOMNode source, in DOMDocument output);
- use undefined source
- use non-DOMDocument output parameter
- transform twice

DOMDocument transformToDocument(in DOMNode source);
- use undefined source
- transform twice

void setParameter(in DOMString namespaceURI, in DOMString localName, in Value value);
- pass same localname, different namespaces
- pass undefined namespace
- pass undefined name
- pass undefined value
- pass unsupported value (object, for instance?)

Value getParameter(in DOMString namespaceURI, in DOMString localName);
- pass same localname, different namespaces
- pass undefined namespace
- pass undefined name
- pass name which has not been set

void removeParameter(in DOMString namespaceURI, in DOMString localName);
- pass same localname, different namespaces
- pass undefined namespace
- pass undefined name
- pass name which has not been set

void clearParameters();
- call, verify that parameters have been cleared.

void reset();
- call, verify that parameters have been cleared.
- call, verify that stylesheet has been cleared.

I&apos;ve been using the very minimalist docs found here:
http://www.mozilla.org/projects/xslt/js-interface.html
http://lxr.mozilla.org/seamonkey/source/content/xsl/public/nsIXSLTProcessor.idl</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22207</commentid>
    <comment_count>5</comment_count>
      <attachid>4395</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-18 02:47:32 -0700</bug_when>
    <thetext>Created attachment 4395
First stab at a test document.

This needs to be placed in LayoutTests/fast/xsl to work (as it currently
depends on resources there.

This document is not quite done.  Particularly, I&apos;m not yet testing any
parameter based transforms.

Also, I&apos;m not yet testing &quot;null&quot; values for most things.  I figure I probably
need to test both null and undefined...

Several tests &quot;pass&quot; under Safari, but throw exceptions under FireFox, not sure
why yet, not sure what exceptions we should be throwing.  Comments welcome.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22208</commentid>
    <comment_count>6</comment_count>
      <attachid>4396</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-18 03:14:31 -0700</bug_when>
    <thetext>Created attachment 4396
My preliminary patch (minus xcode changes) for XSLTProcessor support

This is a pretty function patch... including a bunch of fixes to our
serialization code... I&apos;ll probably clean it up a bit before landing.  And I
still need to have better exception throwing and possibly namespace support.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22379</commentid>
    <comment_count>7</comment_count>
      <attachid>4427</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-20 13:40:19 -0700</bug_when>
    <thetext>Created attachment 4427
Patch for XSLTProcessor support</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22380</commentid>
    <comment_count>8</comment_count>
      <attachid>4428</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-20 13:40:59 -0700</bug_when>
    <thetext>Created attachment 4428
XLSTProcessor test cases

Note, we fail some of these tests.  This is known and will be tracked by other
bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22496</commentid>
    <comment_count>9</comment_count>
      <attachid>4427</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2005-10-22 08:43:38 -0700</bug_when>
    <thetext>Comment on attachment 4427
Patch for XSLTProcessor support

On this line:

+    XSLTProcessorConstructorImp(ExecState *) : ObjectImp() { }

there&apos;s no need to mention ObjectImp explicitly. The default is to
default-construct the base classes.

In this line:

     , m_transformSourceDocument(0)

there&apos;s no need to explicitly initialize a SharedPtr. They all get
ininitialized to 0.

In this line:

+    SharedPtr&lt;XSLTProcessorImpl&gt; processor = new XSLTProcessorImpl();

there&apos;s no need to have the () after the class name.

Here:

+void *xmlDocPtrForString(const QString &amp;source, QString url)

the URL parameter should also be &quot;const QString &amp;&quot;.

In parseErrorFunc you need to free the errorMessage allocated by vasprintf,
this line:

+    ERROR(errorMessage);

should be:

+    ERROR(&quot;%s&quot;, errorMessage);

and the entire thing should be inside #if !ERROR_DISABLED to avoid creating the
error message and doing nothing with it in production builds.

This code:

+    if (retval &lt; 0)
+	 return false;
+    return true;

should just be:

    return retval &gt;= 0;

This line:

+    if(parameters.count())

is missing a space after the if.

And this line:

+    for(it.toFirst(); it.current(); ++it) {

is missing a space after the for.

And this line:

+    parameterArray[index] = NULL;

should use 0, not NULL (yes, I know these are not new lines of code you wrote).

Same here:

+    if(!params)

and here:

+    while(*temp) {

In this line:

+    bool sourceIsDocument = (sourceNode == ownerDocument.get());

There&apos;s no need for the &quot;get()&quot;. You can just compare raw pointers and
SharedPtrs directly.

In this line:

+    if (sourceMIMEType == QString::fromLatin1(&quot;text/html&quot;))
+    if (sourceMIMEType == QString::fromLatin1(&quot;text/plain&quot;))

there&apos;s no need to call fromLatin1, and in fact it makes the code smaller. You
can just compare a QString and C-style literal directly.

Also, I suggest the &quot;text/plain&quot; code go inside the else, since the MIME type
can&apos;t be both text/html and text/plain.

Here:

+SharedPtr&lt;DocumentImpl&gt; XSLTProcessorImpl::createDocumentFromSource(QString
documentSource, QString sourceMIMEType, NodeImpl *sourceNode, KHTMLView *view)
+static inline SharedPtr&lt;DocumentFragmentImpl&gt; createFragmentFromSource(QString
sourceString, QString sourceMIMEType, NodeImpl *sourceNode, DocumentImpl
*ouputDoc)

the parameters should be const QString&amp;, not QString.

Are there bug reports about getParameter, setParameter, and removeParameter
ignoring the namespace?

I really think that m_parameters should be using a KXMLCore hash table, and not
a QDict. Use of QDict is deprecated.

Otherwise, looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22497</commentid>
    <comment_count>10</comment_count>
      <attachid>4428</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2005-10-22 08:46:15 -0700</bug_when>
    <thetext>Comment on attachment 4428
XLSTProcessor test cases

I think that this:

+if (resultDocument != undefined)

isn&apos;t great code. You&apos;d normally do if (resultDocument) or if (resultDocument
!= null).

In general I think we are using undefined in some places we should be using
null (in our code, not our test cases).

I&apos;d like to see test cases that use namespace URIs, even if the test results
are &quot;wrong&quot;, so we can detect changes to our behavior in those cases.

But this seems like a good start. r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22838</commentid>
    <comment_count>11</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2005-10-24 14:30:24 -0700</bug_when>
    <thetext>Eric said this weekend he was going to land this after he made some tweaks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22839</commentid>
    <comment_count>12</comment_count>
    <who name="Timothy Hatcher">timothy</who>
    <bug_when>2005-10-24 14:31:21 -0700</bug_when>
    <thetext>Didn&apos;t mean to change the resolution. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22873</commentid>
    <comment_count>13</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-24 21:55:29 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; I really think that m_parameters should be using a KXMLCore hash table, and not
&gt; a QDict. Use of QDict is deprecated.

Agreed.  I fought with HashSet for quite a while.   Unfortunately it&apos;s not ready to support 
SharedPtr&lt;DOMStringImpl&gt; as key/values correctly yet.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22874</commentid>
    <comment_count>14</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-24 22:01:27 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; In this line:
&gt; 
&gt; +    bool sourceIsDocument = (sourceNode == ownerDocument.get());
&gt; 
&gt; There&apos;s no need for the &quot;get()&quot;. You can just compare raw pointers and
&gt; SharedPtrs directly.

The compile fails if I don&apos;t include .get() in that line.  Something about the compare being ambigious.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22875</commentid>
    <comment_count>15</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-24 22:03:03 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; +SharedPtr&lt;DocumentImpl&gt; XSLTProcessorImpl::createDocumentFromSource(QString
&gt; documentSource, QString sourceMIMEType, NodeImpl *sourceNode, KHTMLView *view)
&gt; +static inline SharedPtr&lt;DocumentFragmentImpl&gt; createFragmentFromSource(QString
&gt; sourceString, QString sourceMIMEType, NodeImpl *sourceNode, DocumentImpl
&gt; *ouputDoc)
&gt; 
&gt; the parameters should be const QString&amp;, not QString.

I intentionally have left QString documentSource not passed const &amp;, as I change that parameter locally.  
I guess it might be slightly more efficient only to cause the copy *if* I&apos;m about to change the parameter 
locally, however that would complicate the code a bit, I think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>22929</commentid>
    <comment_count>16</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2005-10-25 10:26:23 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; I intentionally have left QString documentSource not passed const &amp;, as I change that parameter locally.  

In my opinion that&apos;s not a compelling argument. You should not determine the types of the parameters 
based on this issue. Generally it&apos;s bad style to modify your parameters, although the language does allow 
it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>23052</commentid>
    <comment_count>17</comment_count>
      <attachid>4486</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-26 23:47:32 -0700</bug_when>
    <thetext>Created attachment 4486
Patch fixing darin&apos;s complaints.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>23082</commentid>
    <comment_count>18</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2005-10-27 14:23:20 -0700</bug_when>
    <thetext>Darin, did you mean to r+ the patch instead of the layout test?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>23083</commentid>
    <comment_count>19</comment_count>
      <attachid>4486</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2005-10-27 14:48:16 -0700</bug_when>
    <thetext>Comment on attachment 4486
Patch fixing darin&apos;s complaints.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>23089</commentid>
    <comment_count>20</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2005-10-27 15:41:59 -0700</bug_when>
    <thetext>Done!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>52407</commentid>
    <comment_count>21</comment_count>
    <who name="">j_mckitrick</who>
    <bug_when>2006-08-12 08:41:35 -0700</bug_when>
    <thetext>I&apos;m having problems with transformToFragment().  Here&apos;s a snippet:

	var t = new XSLTProcessor(); alert(t);
	t.importStylesheet(x);

	var f = t.transformToFragment(s, document); alert(f);
	d.innerHTML = &quot;&quot;;
	d.appendChild(f);

where:
 s = source node to be transformed
x = xslt node
d = destination for result

The XSLTProcessor object instantiates, and importStylesheet() works.  But the resulting fragment is null.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>52481</commentid>
    <comment_count>22</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2006-08-13 02:46:21 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; I&apos;m having problems with transformToFragment().

Could you please file a new bug for this, preferably with a test case? That would greatly simplify tracking and, ultimately, resolving the issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>52504</commentid>
    <comment_count>23</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-08-13 19:10:19 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; I&apos;m having problems with transformToFragment().  Here&apos;s a snippet:
&gt; 
&gt;         var t = new XSLTProcessor(); alert(t);
&gt;         t.importStylesheet(x);
&gt; 
&gt;         var f = t.transformToFragment(s, document); alert(f);
&gt;         d.innerHTML = &quot;&quot;;
&gt;         d.appendChild(f);
&gt; 
&gt; where:
&gt;  s = source node to be transformed
&gt; x = xslt node
&gt; d = destination for result
&gt; 
&gt; The XSLTProcessor object instantiates, and importStylesheet() works.  But the
&gt; resulting fragment is null.
&gt; 

Yes, please post a new bug.  There are certainly issues in our first-pass implementation.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>4395</attachid>
            <date>2005-10-18 02:47:32 -0700</date>
            <delta_ts>2005-10-20 13:40:59 -0700</delta_ts>
            <desc>First stab at a test document.</desc>
            <filename>xslt-processer.html</filename>
            <type>text/html</type>
            <size>6534</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">PGh0bWw+CjxoZWFkPgo8U1RZTEU+CiAgICBwcmUgeyBib3JkZXI6MXB4IHNvbGlkIGJsdWUgfQog
ICAgc3BhbiB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KPC9TVFlMRT4KPC9oZWFkPgo8Ym9keSBpZD0i
Ym9keSI+Cgo8c2NyaXB0Pgp2YXIgcmVxdWVzdGVyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CnZh
ciBwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3NvcigpOwp2YXIgc2VyaWFsaXplciA9IG5ldyBY
TUxTZXJpYWxpemVyKCk7CgpmdW5jdGlvbiBnZXRYTUxEb2N1bWVudChuYW1lKQp7CglyZXF1ZXN0
ZXIub3BlbigiR0VUIiwgbmFtZSwgZmFsc2UpOwoJcmVxdWVzdGVyLnNlbmQobnVsbCk7CglyZXR1
cm4gcmVxdWVzdGVyLnJlc3BvbnNlWE1MOwp9Cgp2YXIgY3VycmVudElkID0gMDsKCmZ1bmN0aW9u
IGFkZFN0cmluZ1Jlc3VsdChuYW1lLCByZXN1bHQpCnsKCWRvY3VtZW50LndyaXRlbG4oIjxzcGFu
PiIgKyBuYW1lICsgIjo8L3NwYW4+Iik7Cglkb2N1bWVudC53cml0ZWxuKCI8cHJlIGlkPVwiaWQi
ICsgY3VycmVudElkICsgIlwiPkBATk8gVkFMVUVAQDwvcHJlPiIpOwoJZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoImlkIiArIGN1cnJlbnRJZCkuZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSByZXN1bHQ7
CgljdXJyZW50SWQrKzsKfQoKZnVuY3Rpb24gYWRkWE1MUmVzdWx0KG5hbWUsIHJlc3VsdCkKewoJ
dmFyIHN0cjsKCWlmIChyZXN1bHQgIT0gdW5kZWZpbmVkKQoJCXN0ciA9IHNlcmlhbGl6ZXIuc2Vy
aWFsaXplVG9TdHJpbmcocmVzdWx0KTsKCWFkZFN0cmluZ1Jlc3VsdChuYW1lLCBzdHIpOwp9Cgp2
YXIgeG1sID0gZ2V0WE1MRG9jdW1lbnQoInhzbHQtdGV4dC54bWwiKTsKYWRkWE1MUmVzdWx0KCJv
cmlnaW5hbCB4bWwiLCB4bWwpOwp2YXIgeHNsMSA9IGdldFhNTERvY3VtZW50KCJ4c2x0LXRleHQu
eHNsIik7CmFkZFhNTFJlc3VsdCgieHNsMSIsIHhzbDEpOwp2YXIgeHNsMiA9IGdldFhNTERvY3Vt
ZW50KCJyZXNvdXJjZXMveHNsdC1lbmMueHNsIik7CmFkZFhNTFJlc3VsdCgieHNsMiIsIHhzbDIp
OwoKCgovLyAxLjAgdm9pZCBpbXBvcnRTdHlsZXNoZWV0KGluIERPTU5vZGUgc3R5bGUpOwovLyAx
LjEgSW1wb3J0IHR3byBkaWZmZXJlbnQgc3R5bGVzaGVldHMgKGxhc3Qgb25lIHdpbnMpCgpwcm9j
ZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2wxKTsKcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQo
eHNsMik7CnZhciBuZXdYTUwgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOwph
ZGRYTUxSZXN1bHQoIkltcG9ydCB0d28gZGlmZmVyZW50IHN0eWxlc2hlZXRzIiwgbmV3WE1MKTsK
Ci8vIDEuMiBJbXBvcnQgc2FtZSBzdHlsZXNoZWV0IHR3aWNlCgpwcm9jZXNzb3IgPSBuZXcgWFNM
VFByb2Nlc3NvcigpOwpwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2wxKTsKcHJvY2Vzc29y
LmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Cgp2YXIgbmV3WE1MID0gcHJvY2Vzc29yLnRyYW5zZm9y
bVRvRG9jdW1lbnQoeG1sKTsKYWRkWE1MUmVzdWx0KCJJbXBvcnQgc2FtZSBzdHlsZXNoZWV0IHR3
aWNlIiwgbmV3WE1MKTsKCi8vIDEuMyBJbXBvcnQgdW5kZWZpbmVkIHN0eWxlc2hlZXQKCnByb2Nl
c3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CnByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHVu
ZGVmaW5lZCk7CnZhciBuZXdYTUwgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwp
OwphZGRYTUxSZXN1bHQoIkltcG9ydCB1bmRlZmluZWQgc3R5bGVzaGVldCIsIG5ld1hNTCk7Cgov
LyAxLjQgSW1wb3J0IGludmFsaWQgc3R5bGVzaGVldCAobm90IHdlbGxmb3JtZWQgeGxzdCkKCnBy
b2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CnByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0
KHhtbCk7CnZhciBuZXdYTUwgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOwph
ZGRYTUxSZXN1bHQoIkltcG9ydCBpbnZhbGlkIHN0eWxlc2hlZXQiLCBuZXdYTUwpOwoKLy8gMS41
IERvbid0IGltcG9ydCBzdHlsZXNoZWV0Cgpwcm9jZXNzb3IgPSBuZXcgWFNMVFByb2Nlc3Nvcigp
Owp2YXIgbmV3WE1MID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9jdW1lbnQoeG1sKTsKYWRkWE1M
UmVzdWx0KCJEb24ndCBpbXBvcnQgc3R5bGVzaGVldCIsIG5ld1hNTCk7CgoKCi8vIDIuMCBET01E
b2N1bWVudEZyYWdtZW50IHRyYW5zZm9ybVRvRnJhZ21lbnQoaW4gRE9NTm9kZSBzb3VyY2UsIGlu
IERPTURvY3VtZW50IG91dHB1dCk7Ci8vIDIuMSBmcmFnbWVudCB3aXRoIHVuZGVmaW5lZCBzb3Vy
Y2UKCnByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CnByb2Nlc3Nvci5pbXBvcnRTdHls
ZXNoZWV0KHhzbDEpOwp2YXIgb3duZXJEb2N1bWVudCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9u
LmNyZWF0ZURvY3VtZW50KCIiLCAidGVzdCIsIG51bGwpOwpuZXdGcmFnbWVudCA9IHByb2Nlc3Nv
ci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHVuZGVmaW5lZCwgb3duZXJEb2N1bWVudCk7CmFkZFhNTFJl
c3VsdCgiZnJhZ21lbnQgd2l0aCB1bmRlZmluZWQgc291cmNlIiwgbmV3RnJhZ21lbnQpOwoKLy8g
Mi4yIGZyYWdtZW50IHdpdGggdW5kZWZpbmVkIG91dHB1dCBkb2N1bWVudAoKb3duZXJEb2N1bWVu
dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCAidGVzdCIsIG51
bGwpOwpuZXdGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbCwgdW5k
ZWZpbmVkKTsKYWRkWE1MUmVzdWx0KCJmcmFnbWVudCB3aXRoIHVuZGVmaW5lZCBvdXRwdXQgZG9j
dW1lbnQiLCBuZXdGcmFnbWVudCk7CgovLyAyLjMgdXNlIG5vbi1ET01Eb2N1bWVudCBvdXRwdXQg
cGFyYW1ldGVyCgpuZXdGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHht
bCwgImVycm9yIik7CmFkZFhNTFJlc3VsdCgidXNlIG5vbi1ET01Eb2N1bWVudCBvdXRwdXQgcGFy
YW1ldGVyIiwgbmV3RnJhZ21lbnQpOwoKLy8gMi40IHRyYW5zZm9ybSB0byBzYW1lIGZyYWdtZW50
IHR3aWNlCgpvd25lckRvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9j
dW1lbnQoIiIsICJ0ZXN0IiwgbnVsbCk7CnZhciBzZWNvbmREb2N1bWVudCA9IGRvY3VtZW50Lmlt
cGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCAidGVzdCIsIG51bGwpOwpuZXdGcmFnbWVu
dCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbCwgb3duZXJEb2N1bWVudCk7CnZh
ciBzZWNvbmRGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbCwgc2Vj
b25kRG9jdW1lbnQpOwphZGRYTUxSZXN1bHQoInRyYW5zZm9ybSB0byBzYW1lIGZyYWdtZW50IHR3
aWNlIiwgc2Vjb25kRnJhZ21lbnQpOwoKCgovLyAzLjAgRE9NRG9jdW1lbnQgdHJhbnNmb3JtVG9E
b2N1bWVudChpbiBET01Ob2RlIHNvdXJjZSk7Ci8vIDMuMSBkb2N1bWVudCBmcm9tIHVuZGVmaW5l
ZCBzb3VyY2UKCnByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CnByb2Nlc3Nvci5pbXBv
cnRTdHlsZXNoZWV0KHhzbDEpOwp2YXIgbmV3WE1MID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9j
dW1lbnQodW5kZWZpbmVkKTsKYWRkWE1MUmVzdWx0KCJkb2N1bWVudCBmcm9tIHVuZGVmaW5lZCBz
b3VyY2UiLCBuZXdYTUwpOwoKLy8gMy4yIHRyYW5zZm9ybSB0d2ljZQoKcHJvY2Vzc29yID0gbmV3
IFhTTFRQcm9jZXNzb3IoKTsKcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7CnZhciBu
ZXdYTUwgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOwp2YXIgbmV3WE1MID0g
cHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9jdW1lbnQoeG1sKTsKYWRkWE1MUmVzdWx0KCJkb2N1bWVu
dCBmcm9tIHVuZGVmaW5lZCBzb3VyY2UiLCBuZXdYTUwpOwoKCi8vIDQuMCB2b2lkIHNldFBhcmFt
ZXRlcihpbiBET01TdHJpbmcgbmFtZXNwYWNlVVJJLCBpbiBET01TdHJpbmcgbG9jYWxOYW1lLCBp
biBWYWx1ZSB2YWx1ZSk7CnByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7Ci8vIDQuMSBw
YXNzIHNhbWUgbG9jYWxuYW1lLCBkaWZmZXJlbnQgbmFtZXNwYWNlcwoKLy8gNC4yIHBhc3MgdW5k
ZWZpbmVkIG5hbWVzcGFjZQoKLy8gNC4zIHBhc3MgdW5kZWZpbmVkIG5hbWUKCi8vIDQuNCBwYXNz
IHVuZGVmaW5lZCB2YWx1ZQoKLy8gNC41IHBhc3MgdW5zdXBwb3J0ZWQgdmFsdWUgKG9iamVjdCwg
Zm9yIGluc3RhbmNlPykKCgoKLy8gNS4wIFZhbHVlIGdldFBhcmFtZXRlcihpbiBET01TdHJpbmcg
bmFtZXNwYWNlVVJJLCBpbiBET01TdHJpbmcgbG9jYWxOYW1lKTsKLy8gNS4xIHBhc3Mgc2FtZSBs
b2NhbG5hbWUsIGRpZmZlcmVudCBuYW1lc3BhY2VzCgovLyA1LjIgcGFzcyB1bmRlZmluZWQgbmFt
ZXNwYWNlCgovLyA1LjMgcGFzcyB1bmRlZmluZWQgbmFtZQoKLy8gNS40IHBhc3MgbmFtZSB3aGlj
aCBoYXMgbm90IGJlZW4gc2V0CgovLyA1LjQgdmVyaWZ5IGdldFBhcmFtZXRlciBhY3R1YWxseSBn
ZXRzIChhbmQgc2V0IHNldHMpCnByb2Nlc3Nvci5zZXRQYXJhbWV0ZXIobnVsbCwgInRlc3QiLCAi
dGVzdFZhbHVlIik7CnZhciB0ZXN0TmFtZSA9ICJ2ZXJpZnkgZ2V0UGFyYW1ldGVyIGFjdHVhbGx5
IGdldHMgKGFuZCBzZXQgc2V0cykiOwp2YXIgZ2V0UmVzdWx0ID0gcHJvY2Vzc29yLmdldFBhcmFt
ZXRlcihudWxsLCAidGVzdCIpOwppZiAoZ2V0UmVzdWx0ID09ICJ0ZXN0VmFsdWUiKQoJYWRkU3Ry
aW5nUmVzdWx0KHRlc3ROYW1lLCAiU3VjY2VzcyIpOwplbHNlCglhZGRTdHJpbmdSZXN1bHQodGVz
dE5hbWUsICJGYWlsdXJlIChhY3R1YWw6ICIgKyBnZXRSZXN1bHQgKyAiKSIpOwoKCgovLyA2LjAg
dm9pZCByZW1vdmVQYXJhbWV0ZXIoaW4gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwgaW4gRE9NU3Ry
aW5nIGxvY2FsTmFtZSk7Ci8vIDYuMSBwYXNzIHNhbWUgbG9jYWxuYW1lLCBkaWZmZXJlbnQgbmFt
ZXNwYWNlcwoKLy8gNi4yIHBhc3MgdW5kZWZpbmVkIG5hbWVzcGFjZQoKLy8gNi4zIHBhc3MgdW5k
ZWZpbmVkIG5hbWUKCi8vIDYuNCBwYXNzIG5hbWUgd2hpY2ggaGFzIG5vdCBiZWVuIHNldAoKLy8g
Ni41IHZlcmlmeSByZW1vdmVQYXJhbWV0ZXIgYWN0dWFsbHkgcmVtb3Zlcwpwcm9jZXNzb3Iuc2V0
UGFyYW1ldGVyKG51bGwsICJ0ZXN0IiwgInRlc3RWYWx1ZSIpOwpwcm9jZXNzb3IucmVtb3ZlUGFy
YW1ldGVyKG51bGwsICJ0ZXN0Iik7CnZhciB0ZXN0TmFtZSA9ICJ2ZXJpZnkgcmVtb3ZlUGFyYW1l
dGVyIGFjdHVhbGx5IHJlbW92ZXMiOwppZiAocHJvY2Vzc29yLmdldFBhcmFtZXRlcihudWxsLCAi
dGVzdCIpKQoJYWRkU3RyaW5nUmVzdWx0KHRlc3ROYW1lLCAiRmFpbHVyZSIpOwplbHNlCglhZGRT
dHJpbmdSZXN1bHQodGVzdE5hbWUsICJTdWNjZXNzIik7CgoKCi8vIDcuMCB2b2lkIGNsZWFyUGFy
YW1ldGVycygpOwoKLy8gNy4xIGNhbGwsIHZlcmlmeSB0aGF0IHBhcmFtZXRlcnMgaGF2ZSBiZWVu
IGNsZWFyZWQKcHJvY2Vzc29yLnNldFBhcmFtZXRlcihudWxsLCAidGVzdCIsICJ0ZXN0VmFsdWUi
KTsKcHJvY2Vzc29yLmNsZWFyUGFyYW1ldGVycygpOwp2YXIgdGVzdE5hbWUgPSAidmVyaWZ5IHRo
YXQgY2xlYXJQYXJhbWV0ZXJzIGRvZXMiOwppZiAocHJvY2Vzc29yLmdldFBhcmFtZXRlcihudWxs
LCAidGVzdCIpKQoJYWRkU3RyaW5nUmVzdWx0KHRlc3ROYW1lLCAiRmFpbHVyZSIpOwplbHNlCglh
ZGRTdHJpbmdSZXN1bHQodGVzdE5hbWUsICJTdWNjZXNzIik7CgoKCi8vIDguMCB2b2lkIHJlc2V0
KCk7CnByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29yKCk7CnByb2Nlc3Nvci5pbXBvcnRTdHls
ZXNoZWV0KHhzbDEpOwpwcm9jZXNzb3Iuc2V0UGFyYW1ldGVyKG51bGwsICJ0ZXN0IiwgInRlc3RW
YWx1ZSIpOwpwcm9jZXNzb3IucmVzZXQoKTsKCi8vIDguMSBjYWxsLCB2ZXJpZnkgdGhhdCBwYXJh
bWV0ZXJzIGFyZSBjbGVhcmVkIGFmdGVyIHJlc2V0KCkKdmFyIHRlc3ROYW1lID0gInZlcmlmeSB0
aGF0IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNsZWFyZWQiOwppZiAocHJvY2Vzc29yLmdldFBhcmFt
ZXRlcihudWxsLCAidGVzdCIpKQoJYWRkU3RyaW5nUmVzdWx0KHRlc3ROYW1lLCAiRmFpbHVyZSIp
OwplbHNlCglhZGRTdHJpbmdSZXN1bHQodGVzdE5hbWUsICJTdWNjZXNzIik7CgovLyA4LjIgY2Fs
bCwgdmVyaWZ5IHRoYXQgc3R5bGVzaGVldCBoYXMgYmVlbiBjbGVhcmVkIGFmdGVyIHJlc2V0KCkK
dmFyIHRlc3ROYW1lID0gInZlcmlmeSB0aGF0IHN0eWxlc2hlZXQgaGFzIGJlZW4gY2xlYXJlZCI7
CnZhciByZXN1bHREb2N1bWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0RvY3VtZW50KHhtbCk7
CmlmIChyZXN1bHREb2N1bWVudCAhPSB1bmRlZmluZWQpCglhZGRTdHJpbmdSZXN1bHQodGVzdE5h
bWUsICJGYWlsdXJlIChhY3R1YWw6ICIgKyBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHJl
c3VsdERvY3VtZW50KSArICIpIik7CmVsc2UKCWFkZFN0cmluZ1Jlc3VsdCh0ZXN0TmFtZSwgIlN1
Y2Nlc3MiKTsKCjwvc2NyaXB0PgoKPC9ib2R5Pgo8L2h0bWw+
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>4396</attachid>
            <date>2005-10-18 03:14:31 -0700</date>
            <delta_ts>2005-10-20 13:40:19 -0700</delta_ts>
            <desc>My preliminary patch (minus xcode changes) for XSLTProcessor support</desc>
            <filename>xsltprocessor.patch</filename>
            <type>text/plain</type>
            <size>60160</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sX3BhcnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJD
b3JlL2todG1sL2todG1sX3BhcnQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjM0NgpkaWZm
IC1wIC11IC1yMS4zNDYga2h0bWxfcGFydC5jcHAKLS0tIGtodG1sX3BhcnQuY3BwCTcgT2N0IDIw
MDUgMDE6MjE6NDAgLTAwMDAJMS4zNDYKKysrIGtodG1sX3BhcnQuY3BwCTE4IE9jdCAyMDA1IDEw
OjExOjAzIC0wMDAwCkBAIC0xMTEsNiArMTExLDkgQEAgdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1l
czsKIAogI2lmIEFQUExFX0NIQU5HRVMKICNpbmNsdWRlIDxDb3JlU2VydmljZXMvQ29yZVNlcnZp
Y2VzLmg+CisjaWYgU1ZHX1NVUFBPUlQKKyNpbmNsdWRlICJHWmlwSW5mbGF0ZXIuaCIKKyNlbmRp
ZgogI2VuZGlmCiAKIHVzaW5nIG5hbWVzcGFjZSBET006OkV2ZW50TmFtZXM7CkBAIC02OTUsMjMg
KzY5OCw2IEBAIGJvb2wgS0hUTUxQYXJ0OjpjbG9zZVVSTCgpCiAgIHJldHVybiB0cnVlOwogfQog
Ci0jaWYgIUtIVE1MX05PX0NQTFVTUExVU19ET00KLQotRE9NOjpIVE1MRG9jdW1lbnQgS0hUTUxQ
YXJ0OjpodG1sRG9jdW1lbnQoKSBjb25zdAotewotICBpZiAoZC0+bV9kb2MgJiYgZC0+bV9kb2Mt
PmlzSFRNTERvY3VtZW50KCkpCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudElt
cGwqPihkLT5tX2RvYyk7Ci0gIGVsc2UKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTERvY3Vt
ZW50SW1wbCo+KDApOwotfQotCi1ET006OkRvY3VtZW50IEtIVE1MUGFydDo6ZG9jdW1lbnQoKSBj
b25zdAotewotICAgIHJldHVybiBkLT5tX2RvYzsKLX0KLQotI2VuZGlmCi0KIEtQYXJ0czo6QnJv
d3NlckV4dGVuc2lvbiAqS0hUTUxQYXJ0Ojpicm93c2VyRXh0ZW5zaW9uKCkgY29uc3QKIHsKICAg
cmV0dXJuIGQtPm1fZXh0ZW5zaW9uOwpAQCAtMTE4OSw4ICsxMTc1LDEwIEBAIHZvaWQgS0hUTUxQ
YXJ0OjpyZXBsYWNlRG9jSW1wbChEb2N1bWVudEkKICAgICAgICAgICAgIGQtPm1fZG9jLT5kZXJl
ZigpOwogICAgICAgICB9CiAgICAgICAgIGQtPm1fZG9jID0gbmV3RG9jOwotICAgICAgICBpZiAo
bmV3RG9jKQorICAgICAgICBpZiAobmV3RG9jKSB7CiAgICAgICAgICAgICBuZXdEb2MtPnJlZigp
OworICAgICAgICAgICAgbmV3RG9jLT5hdHRhY2goKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApA
QCAtMTY4OCw2ICsxNjc2LDEwIEBAIHZvaWQgS0hUTUxQYXJ0Ojp3cml0ZSggY29uc3QgY2hhciAq
c3RyLCAKICNpZiBBUFBMRV9DSEFOR0VTCiAgICAgICAgIGlmIChkLT5tX2RvYykKICAgICAgICAg
ICAgIGQtPm1fZG9jLT5zZXREZWNvZGVyKGQtPm1fZGVjb2Rlcik7CisjaWYgU1ZHX1NVUFBPUlQK
KyAgICAgICAgaWYgKGtodG1sOjpHWmlwSW5mbGF0ZXI6Omhhc0daaXBIZWFkZXIoKGNvbnN0IHVu
c2lnbmVkIGNoYXIgKilzdHIsIGxlbikpCisgICAgICAgICAgICBLV1EodGhpcyktPm1fZ3ppcElu
ZmxhdGVyID0gbmV3IGtodG1sOjpHWmlwSW5mbGF0ZXIoKTsKKyNlbmRpZgogI2VuZGlmCiAgICAg
fQogICBpZiAoIGxlbiA9PSAwICkKQEAgLTE2OTUsNiArMTY4NywxNSBAQCB2b2lkIEtIVE1MUGFy
dDo6d3JpdGUoIGNvbnN0IGNoYXIgKnN0ciwgCiAKICAgaWYgKCBsZW4gPT0gLTEgKQogICAgIGxl
biA9IHN0cmxlbiggc3RyICk7CisgICAgCisjaWYgU1ZHX1NVUFBPUlQKKyAgUUNTdHJpbmcgaW5m
bGF0ZWREYXRhOworICBpZiAoS1dRKHRoaXMpLT5tX2d6aXBJbmZsYXRlcikgeworICAgICBpbmZs
YXRlZERhdGEgPSBLV1EodGhpcyktPm1fZ3ppcEluZmxhdGVyLT5pbmZsYXRlKChjb25zdCB1bnNp
Z25lZCBjaGFyICopc3RyLCBsZW4pOworICAgICBzdHIgPSBpbmZsYXRlZERhdGEuZGF0YSgpOwor
ICAgICBsZW4gPSBpbmZsYXRlZERhdGEuY291bnQoKTsKKyAgfQorI2VuZGlmCiAKICAgUVN0cmlu
ZyBkZWNvZGVkID0gZC0+bV9kZWNvZGVyLT5kZWNvZGUoIHN0ciwgbGVuICk7CiAKSW5kZXg6IGVj
bWEvWFNMVFByb2Nlc3Nvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogZWNtYS9YU0xUUHJvY2Vz
c29yLmNwcApkaWZmIC1OIGVjbWEvWFNMVFByb2Nlc3Nvci5jcHAKLS0tIGVjbWEvWFNMVFByb2Nl
c3Nvci5jcHAJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgZWNtYS9YU0xUUHJvY2Vzc29y
LmNwcAkxOCBPY3QgMjAwNSAxMDoxMTowMyAtMDAwMApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNSBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiWFNMVFByb2Nl
c3Nvci5oIgorI2luY2x1ZGUgInhzbHRfcHJvY2Vzc29yaW1wbC5oIgorI2luY2x1ZGUgIlhTTFRQ
cm9jZXNzb3IubHV0LmgiCisjaW5jbHVkZSAia2pzX2RvbS5oIgorI2luY2x1ZGUgImRvbV9kb2Np
bXBsLmgiCisKKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9sb29rdXAuaD4KKwordXNpbmcgbmFt
ZXNwYWNlIERPTTsKKworbmFtZXNwYWNlIEtKUyB7CisKK2NvbnN0IENsYXNzSW5mbyBYU0xUUHJv
Y2Vzc29yOjppbmZvID0geyAiWFNMVFByb2Nlc3NvciIsIDAsIDAsIDAgfTsKKworLyoKK0BiZWdp
biBYU0xUUHJvY2Vzc29yUHJvdG9UYWJsZSA3CisgIGltcG9ydFN0eWxlc2hlZXQgICAgICBYU0xU
UHJvY2Vzc29yOjpJbXBvcnRTdHlsZXNoZWV0ICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDEKKyAg
dHJhbnNmb3JtVG9GcmFnbWVudCAgIFhTTFRQcm9jZXNzb3I6OlRyYW5zZm9ybVRvRnJhZ21lbnQg
IERvbnREZWxldGV8RnVuY3Rpb24gMgorICB0cmFuc2Zvcm1Ub0RvY3VtZW50ICAgWFNMVFByb2Nl
c3Nvcjo6VHJhbnNmb3JtVG9Eb2N1bWVudCAgRG9udERlbGV0ZXxGdW5jdGlvbiAyCisgIHNldFBh
cmFtZXRlciAgICAgICAgICBYU0xUUHJvY2Vzc29yOjpTZXRQYXJhbWV0ZXIgICAgICAgICBEb250
RGVsZXRlfEZ1bmN0aW9uIDMKKyAgZ2V0UGFyYW1ldGVyICAgICAgICAgIFhTTFRQcm9jZXNzb3I6
OkdldFBhcmFtZXRlciAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMgorICByZW1vdmVQYXJh
bWV0ZXIgICAgICAgWFNMVFByb2Nlc3Nvcjo6UmVtb3ZlUGFyYW1ldGVyICAgICAgRG9udERlbGV0
ZXxGdW5jdGlvbiAyCisgIGNsZWFyUGFyYW1ldGVycyAgICAgICBYU0xUUHJvY2Vzc29yOjpDbGVh
clBhcmFtZXRlcnMgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDAKKyAgcmVzZXQgICAgICAgICAg
ICAgICAgIFhTTFRQcm9jZXNzb3I6OlJlc2V0ICAgICAgICAgICAgICAgIERvbnREZWxldGV8RnVu
Y3Rpb24gMAorQGVuZAorKi8KKworREVGSU5FX1BST1RPVFlQRSgiWFNMVFByb2Nlc3NvciIsIFhT
TFRQcm9jZXNzb3JQcm90bykKK0lNUExFTUVOVF9QUk9UT0ZVTkMoWFNMVFByb2Nlc3NvclByb3Rv
RnVuYykKK0lNUExFTUVOVF9QUk9UT1RZUEUoWFNMVFByb2Nlc3NvclByb3RvLCBYU0xUUHJvY2Vz
c29yUHJvdG9GdW5jKQorCitYU0xUUHJvY2Vzc29yOjpYU0xUUHJvY2Vzc29yKEV4ZWNTdGF0ZSAq
ZXhlYykgOiBtX2ltcGwobmV3IFhTTFRQcm9jZXNzb3JJbXBsKCkpCit7CisgICAgc2V0UHJvdG90
eXBlKFhTTFRQcm9jZXNzb3JQcm90bzo6c2VsZihleGVjKSk7Cit9CisKK1hTTFRQcm9jZXNzb3I6
On5YU0xUUHJvY2Vzc29yKCkKK3sKKyAgICBTY3JpcHRJbnRlcnByZXRlcjo6Zm9yZ2V0RE9NT2Jq
ZWN0KG1faW1wbC5nZXQoKSk7Cit9CisKK1ZhbHVlSW1wICpYU0xUUHJvY2Vzc29yUHJvdG9GdW5j
OjpjYWxsQXNGdW5jdGlvbihFeGVjU3RhdGUgKmV4ZWMsIE9iamVjdEltcCAqdGhpc09iaiwgY29u
c3QgTGlzdCAmYXJncykKK3sKKyAgICBpZiAoIXRoaXNPYmotPmluaGVyaXRzKCZLSlM6OlhTTFRQ
cm9jZXNzb3I6OmluZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihleGVjLCBUeXBlRXJy
b3IpOworICAgIFhTTFRQcm9jZXNzb3JJbXBsICZwcm9jZXNzb3IgPSAqc3RhdGljX2Nhc3Q8WFNM
VFByb2Nlc3NvciAqPih0aGlzT2JqKS0+aW1wbCgpOworICAgIHN3aXRjaCAoaWQpIHsKKyAgICAg
ICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpJbXBvcnRTdHlsZXNoZWV0OgorICAgICAgICB7CisgICAg
ICAgICAgICBWYWx1ZUltcCAqbm9kZVZhbCA9IGFyZ3NbMF07CisgICAgICAgICAgICBpZiAobm9k
ZVZhbC0+aXNPYmplY3QoJkRPTU5vZGU6OmluZm8pKSB7CisgICAgICAgICAgICAgICAgRE9NTm9k
ZSAqbm9kZSA9IHN0YXRpY19jYXN0PERPTU5vZGUgKj4obm9kZVZhbCk7CisgICAgICAgICAgICAg
ICAgcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQobm9kZS0+aW1wbCgpKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgWFNMVFByb2Nlc3Nvcjo6VHJhbnNmb3JtVG9G
cmFnbWVudDoKKyAgICAgICAgeworICAgICAgICAgICAgVmFsdWVJbXAgKm5vZGVWYWwgPSBhcmdz
WzBdOworICAgICAgICAgICAgVmFsdWVJbXAgKmRvY1ZhbCA9IGFyZ3NbMV07CisgICAgICAgICAg
ICBpZiAobm9kZVZhbC0+aXNPYmplY3QoJkRPTU5vZGU6OmluZm8pICYmIGRvY1ZhbC0+aXNPYmpl
Y3QoJkRPTURvY3VtZW50OjppbmZvKSkgeworICAgICAgICAgICAgICAgIERPTU5vZGUgKm5vZGUg
PSBzdGF0aWNfY2FzdDxET01Ob2RlICo+KG5vZGVWYWwpOworICAgICAgICAgICAgICAgIERPTURv
Y3VtZW50ICpkb2MgPSBzdGF0aWNfY2FzdDxET01Eb2N1bWVudCAqPihkb2NWYWwpOworICAgICAg
ICAgICAgICAgIERvY3VtZW50SW1wbCAqZG9jSW1wbCA9IHN0YXRpY19jYXN0PERvY3VtZW50SW1w
bCAqPihkb2MtPmltcGwoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldERPTU5vZGUoZXhl
YywgcHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQobm9kZS0+aW1wbCgpLCBkb2NJbXBsKS5n
ZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6OlRyYW5zZm9ybVRvRG9jdW1lbnQ6CisgICAgICAgIHsK
KyAgICAgICAgICAgIFZhbHVlSW1wICpub2RlVmFsID0gYXJnc1swXTsKKyAgICAgICAgICAgIGlm
IChub2RlVmFsLT5pc09iamVjdCgmRE9NTm9kZTo6aW5mbykpIHsKKyAgICAgICAgICAgICAgICBE
T01Ob2RlICpub2RlID0gc3RhdGljX2Nhc3Q8RE9NTm9kZSAqPihub2RlVmFsKTsKKyAgICAgICAg
ICAgICAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiByZXN1bHREb2N1bWVudCA9IHByb2Nlc3Nv
ci50cmFuc2Zvcm1Ub0RvY3VtZW50KG5vZGUtPmltcGwoKSk7CisgICAgICAgICAgICAgICAgaWYg
KHJlc3VsdERvY3VtZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RE9NRG9jdW1l
bnROb2RlKGV4ZWMsIHJlc3VsdERvY3VtZW50LmdldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1
cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNhc2UgWFNMVFByb2Nlc3Nvcjo6U2V0UGFyYW1ldGVyOgorICAgICAg
ICB7CisgICAgICAgICAgICBET01TdHJpbmcgbmFtZXNwYWNlVVJJID0gYXJnc1swXS0+dG9TdHJp
bmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBET01TdHJpbmcgbG9jYWxOYW1lID0g
YXJnc1sxXS0+dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBET01TdHJp
bmcgdmFsdWUgPSBhcmdzWzJdLT50b1N0cmluZyhleGVjKS5kb21TdHJpbmcoKTsKKyAgICAgICAg
ICAgIHByb2Nlc3Nvci5zZXRQYXJhbWV0ZXIobmFtZXNwYWNlVVJJLmltcGwoKSwgbG9jYWxOYW1l
LmltcGwoKSwgdmFsdWUuaW1wbCgpKTsKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgp
OworICAgICAgICB9CisgICAgICAgIGNhc2UgWFNMVFByb2Nlc3Nvcjo6R2V0UGFyYW1ldGVyOgor
ICAgICAgICB7CisgICAgICAgICAgICBET01TdHJpbmcgbmFtZXNwYWNlVVJJID0gYXJnc1swXS0+
dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBET01TdHJpbmcgbG9jYWxO
YW1lID0gYXJnc1sxXS0+dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBy
ZXR1cm4ganNTdHJpbmcoVVN0cmluZyhwcm9jZXNzb3IuZ2V0UGFyYW1ldGVyKG5hbWVzcGFjZVVS
SS5pbXBsKCksIGxvY2FsTmFtZS5pbXBsKCkpLmdldCgpKSk7CisgICAgICAgIH0KKyAgICAgICAg
Y2FzZSBYU0xUUHJvY2Vzc29yOjpSZW1vdmVQYXJhbWV0ZXI6CisgICAgICAgIHsKKyAgICAgICAg
ICAgIERPTVN0cmluZyBuYW1lc3BhY2VVUkkgPSBhcmdzWzBdLT50b1N0cmluZyhleGVjKS5kb21T
dHJpbmcoKTsKKyAgICAgICAgICAgIERPTVN0cmluZyBsb2NhbE5hbWUgPSBhcmdzWzFdLT50b1N0
cmluZyhleGVjKS5kb21TdHJpbmcoKTsKKyAgICAgICAgICAgIHByb2Nlc3Nvci5yZW1vdmVQYXJh
bWV0ZXIobmFtZXNwYWNlVVJJLmltcGwoKSwgbG9jYWxOYW1lLmltcGwoKSk7CisgICAgICAgICAg
ICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFhTTFRQcm9j
ZXNzb3I6OkNsZWFyUGFyYW1ldGVyczoKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jbGVhclBhcmFt
ZXRlcnMoKTsKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgICBjYXNl
IFhTTFRQcm9jZXNzb3I6OlJlc2V0OgorICAgICAgICAgICAgcHJvY2Vzc29yLnJlc2V0KCk7Cisg
ICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7Cit9CisKK307CisKSW5kZXg6IGVjbWEvWFNMVFByb2Nlc3Nvci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IGVjbWEvWFNMVFByb2Nlc3Nvci5oCmRpZmYgLU4gZWNtYS9YU0xUUHJvY2Vz
c29yLmgKLS0tIGVjbWEvWFNMVFByb2Nlc3Nvci5oCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAK
KysrIGVjbWEvWFNMVFByb2Nlc3Nvci5oCTE4IE9jdCAyMDA1IDEwOjExOjAzIC0wMDAwCkBAIC0w
LDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgWFNMVFByb2Nlc3Nvcl9I
CisjZGVmaW5lIFhTTFRQcm9jZXNzb3JfSAorCisjaW5jbHVkZSA8a3htbGNvcmUvU2hhcmVkUHRy
Lmg+CisjaW5jbHVkZSAia2pzX2JpbmRpbmcuaCIKKworbmFtZXNwYWNlIERPTSB7CisgICAgY2xh
c3MgWFNMVFByb2Nlc3NvckltcGw7Cit9OworCituYW1lc3BhY2UgS0pTIHsKKworY2xhc3MgWFNM
VFByb2Nlc3NvciA6IHB1YmxpYyBET01PYmplY3QgeworcHVibGljOgorICAgIFhTTFRQcm9jZXNz
b3IoRXhlY1N0YXRlICpleGVjKTsKKyAgICB+WFNMVFByb2Nlc3NvcigpOworICAgIAorICAgIHZp
cnR1YWwgY29uc3QgQ2xhc3NJbmZvICpjbGFzc0luZm8oKSBjb25zdCB7IHJldHVybiAmaW5mbzsg
fQorICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8gaW5mbzsKKyAgICAKKyAgICBlbnVtIHsgSW1w
b3J0U3R5bGVzaGVldCwgVHJhbnNmb3JtVG9GcmFnbWVudCwgVHJhbnNmb3JtVG9Eb2N1bWVudCwg
U2V0UGFyYW1ldGVyLAorICAgICAgICAgICAgR2V0UGFyYW1ldGVyLCBSZW1vdmVQYXJhbWV0ZXIs
IENsZWFyUGFyYW1ldGVycywgUmVzZXQgfTsKKyAgICAKKyAgICBET006OlhTTFRQcm9jZXNzb3JJ
bXBsICppbXBsKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsLmdldCgpOyB9Citwcml2YXRlOgorICAg
IFNoYXJlZFB0cjxET006OlhTTFRQcm9jZXNzb3JJbXBsPiBtX2ltcGw7Cit9OworCitjbGFzcyBY
U0xUUHJvY2Vzc29yQ29uc3RydWN0b3JJbXAgOiBwdWJsaWMgT2JqZWN0SW1wIHsKK3B1YmxpYzoK
KyAgICBYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3JJbXAoRXhlY1N0YXRlICopIDogT2JqZWN0SW1w
KCkgeyB9CisgICAgdmlydHVhbCBib29sIGltcGxlbWVudHNDb25zdHJ1Y3QoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBPYmplY3RJbXAgKmNvbnN0cnVjdChFeGVjU3RhdGUg
KmV4ZWMsIGNvbnN0IExpc3QgJmFyZ3MpIHsgcmV0dXJuIG5ldyBYU0xUUHJvY2Vzc29yKGV4ZWMp
OyB9Cit9OworCit9OworCisjZW5kaWYKSW5kZXg6IGVjbWEva2pzX3dpbmRvdy5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dlYkNvcmUva2h0bWwvZWNtYS9ranNfd2luZG93LmNw
cCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xODMKZGlmZiAtcCAtdSAtcjEuMTgzIGVjbWEva2pz
X3dpbmRvdy5jcHAKLS0tIGVjbWEva2pzX3dpbmRvdy5jcHAJMTEgT2N0IDIwMDUgMDY6NTU6Mjkg
LTAwMDAJMS4xODMKKysrIGVjbWEva2pzX3dpbmRvdy5jcHAJMTggT2N0IDIwMDUgMTA6MTE6MDUg
LTAwMDAKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlICJranNfZXZlbnRzLmgiCiAjaW5jbHVk
ZSAieG1saHR0cHJlcXVlc3QuaCIKICNpbmNsdWRlICJ4bWxzZXJpYWxpemVyLmgiCisjaW5jbHVk
ZSAiWFNMVFByb2Nlc3Nvci5oIgogI2luY2x1ZGUgImRvbXBhcnNlci5oIgogCiAjaW5jbHVkZSAi
a2h0bWx2aWV3LmgiCkBAIC0yMTIsNyArMjEzLDcgQEAgVmFsdWVJbXAgKlNjcmVlbjo6Z2V0VmFs
dWVQcm9wZXJ0eShFeGVjUwogY29uc3QgQ2xhc3NJbmZvIFdpbmRvdzo6aW5mbyA9IHsgIldpbmRv
dyIsIDAsICZXaW5kb3dUYWJsZSwgMCB9OwogCiAvKgotQGJlZ2luIFdpbmRvd1RhYmxlIDkxCitA
YmVnaW4gV2luZG93VGFibGUgMTAzCiAgIGNsb3NlZAlXaW5kb3c6OkNsb3NlZAkJRG9udERlbGV0
ZXxSZWFkT25seQogICBjcnlwdG8JV2luZG93OjpDcnlwdG8JCURvbnREZWxldGV8UmVhZE9ubHkK
ICAgZGVmYXVsdFN0YXR1cwlXaW5kb3c6OkRlZmF1bHRTdGF0dXMJRG9udERlbGV0ZQpAQCAtMjcw
LDYgKzI3MSw3IEBAIGNvbnN0IENsYXNzSW5mbyBXaW5kb3c6OmluZm8gPSB7ICJXaW5kb3cKICAg
WE1MSHR0cFJlcXVlc3QJV2luZG93OjpYTUxIdHRwUmVxdWVzdAlEb250RGVsZXRlfFJlYWRPbmx5
CiAgIFhNTFNlcmlhbGl6ZXIJV2luZG93OjpYTUxTZXJpYWxpemVyCURvbnREZWxldGV8UmVhZE9u
bHkKICAgRE9NUGFyc2VyCVdpbmRvdzo6RE9NUGFyc2VyCURvbnREZWxldGV8UmVhZE9ubHkKKyAg
WFNMVFByb2Nlc3NvcglXaW5kb3c6OlhTTFRQcm9jZXNzb3IJRG9udERlbGV0ZXxSZWFkT25seQog
ICBhbGVydAkJV2luZG93OjpBbGVydAkJRG9udERlbGV0ZXxGdW5jdGlvbiAxCiAgIGNvbmZpcm0J
V2luZG93OjpDb25maXJtCQlEb250RGVsZXRlfEZ1bmN0aW9uIDEKICAgcHJvbXB0CVdpbmRvdzo6
UHJvbXB0CQlEb250RGVsZXRlfEZ1bmN0aW9uIDIKQEAgLTg2Niw2ICs4NjgsOCBAQCBWYWx1ZUlt
cCAqV2luZG93OjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTCiAgICAgICByZXR1cm4gbmV3IFhNTFNl
cmlhbGl6ZXJDb25zdHJ1Y3RvckltcChleGVjKTsKICAgICBjYXNlIERPTVBhcnNlcjoKICAgICAg
IHJldHVybiBuZXcgRE9NUGFyc2VyQ29uc3RydWN0b3JJbXAoZXhlYywgbV9wYXJ0LT54bWxEb2NJ
bXBsKCkpOworICAgIGNhc2UgWFNMVFByb2Nlc3NvcjoKKyAgICAgIHJldHVybiBuZXcgWFNMVFBy
b2Nlc3NvckNvbnN0cnVjdG9ySW1wKGV4ZWMpOwogICAgIGNhc2UgRnJhbWVFbGVtZW50OgogICAg
ICAgaWYgKERvY3VtZW50SW1wbCAqZG9jID0gbV9wYXJ0LT54bWxEb2NJbXBsKCkpCiAgICAgICAg
IGlmIChFbGVtZW50SW1wbCAqZmUgPSBkb2MtPm93bmVyRWxlbWVudCgpKQpJbmRleDogZWNtYS9r
anNfd2luZG93LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dlYkNvcmUva2h0bWwv
ZWNtYS9ranNfd2luZG93LmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNTMKZGlmZiAtcCAtdSAt
cjEuNTMgZWNtYS9ranNfd2luZG93LmgKLS0tIGVjbWEva2pzX3dpbmRvdy5oCTE5IFNlcCAyMDA1
IDE4OjUyOjExIC0wMDAwCTEuNTMKKysrIGVjbWEva2pzX3dpbmRvdy5oCTE4IE9jdCAyMDA1IDEw
OjExOjA2IC0wMDAwCkBAIC0xNDYsNyArMTQ2LDggQEAgbmFtZXNwYWNlIEtKUyB7CiAgICAgICAg
ICAgIFNjcm9sbFRvLCBTY3JvbGxYLCBTY3JvbGxZLCBNb3ZlQnksIE1vdmVUbywgUmVzaXplQnks
IFJlc2l6ZVRvLCBTZWxmLCBfV2luZG93LCBUb3AsIF9TY3JlZW4sCiAgICAgICAgICAgIEltYWdl
LCBPcHRpb24sIEFsZXJ0LCBDb25maXJtLCBQcm9tcHQsIE9wZW4sIFByaW50LCBTZXRUaW1lb3V0
LCBDbGVhclRpbWVvdXQsCiAgICAgICAgICAgIEZvY3VzLCBHZXRTZWxlY3Rpb24sIEJsdXIsIENs
b3NlLCBTZXRJbnRlcnZhbCwgQ2xlYXJJbnRlcnZhbCwgQ2FwdHVyZUV2ZW50cywgCi0gICAgICAg
ICAgIFJlbGVhc2VFdmVudHMsIEFkZEV2ZW50TGlzdGVuZXIsIFJlbW92ZUV2ZW50TGlzdGVuZXIs
IFhNTEh0dHBSZXF1ZXN0LCBYTUxTZXJpYWxpemVyLCBET01QYXJzZXIsCisgICAgICAgICAgIFJl
bGVhc2VFdmVudHMsIEFkZEV2ZW50TGlzdGVuZXIsIFJlbW92ZUV2ZW50TGlzdGVuZXIsCisgICAg
ICAgICAgIFhNTEh0dHBSZXF1ZXN0LCBYTUxTZXJpYWxpemVyLCBET01QYXJzZXIsIFhTTFRQcm9j
ZXNzb3IsCiAJICAgT25hYm9ydCwgT25ibHVyLCBPbmNoYW5nZSwgT25jbGljaywgT25kYmxjbGlj
aywgT25kcmFnZHJvcCwgT25lcnJvciwgCiAJICAgT25mb2N1cywgT25rZXlkb3duLCBPbmtleXBy
ZXNzLCBPbmtleXVwLCBPbmxvYWQsIE9ubW91c2Vkb3duLCBPbm1vdXNlbW92ZSwKICAgICAgICAg
ICAgT25tb3VzZW91dCwgT25tb3VzZW92ZXIsIE9ubW91c2V1cCwgT25XaW5kb3dNb3VzZVdoZWVs
LCBPbm1vdmUsIE9ucmVzZXQsIE9ucmVzaXplLCBPbnNjcm9sbCwgT25zZWFyY2gsCkluZGV4OiBl
ZGl0aW5nL21hcmt1cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dlYkNvcmUv
a2h0bWwvZWRpdGluZy9tYXJrdXAuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjM3CmRpZmYg
LXAgLXUgLXIxLjM3IGVkaXRpbmcvbWFya3VwLmNwcAotLS0gZWRpdGluZy9tYXJrdXAuY3BwCTMg
T2N0IDIwMDUgMjE6MTI6MjAgLTAwMDAJMS4zNworKysgZWRpdGluZy9tYXJrdXAuY3BwCTE4IE9j
dCAyMDA1IDEwOjExOjA2IC0wMDAwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiZWRpdGlu
Zy92aXNpYmxlX3VuaXRzLmgiCiAjaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCiAj
aW5jbHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgorI2luY2x1ZGUgInhtbC9kb21feG1saW1wbC5o
IgogI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9y
ZW5kZXJfdGV4dC5oIgogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgpAQCAtNDIsNiArNDMsNyBAQCB1
c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CiAKIHVzaW5nIERPTTo6QXR0cmlidXRlSW1w
bDsKIHVzaW5nIERPTTo6Q29tbWVudEltcGw7Cit1c2luZyBET006OlByb2Nlc3NpbmdJbnN0cnVj
dGlvbkltcGw7CiB1c2luZyBET006OkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbkltcGw7CiB1
c2luZyBET006OkNTU011dGFibGVTdHlsZURlY2xhcmF0aW9uSW1wbDsKIHVzaW5nIERPTTo6RG9j
dW1lbnRGcmFnbWVudEltcGw7CkBAIC0xNzMsNiArMTc1LDcgQEAgc3RhdGljIFFTdHJpbmcgcmVu
ZGVyZWRUZXh0KGNvbnN0IE5vZGVJbQogCiBzdGF0aWMgUVN0cmluZyBzdGFydE1hcmt1cChjb25z
dCBOb2RlSW1wbCAqbm9kZSwgY29uc3QgUmFuZ2VJbXBsICpyYW5nZSwgRUFubm90YXRlRm9ySW50
ZXJjaGFuZ2UgYW5ub3RhdGUsIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uSW1wbCAqZGVmYXVs
dFN0eWxlKQogeworICAgIGJvb2wgZG9jdW1lbnRJc0hUTUwgPSBub2RlLT5nZXREb2N1bWVudCgp
LT5pc0hUTUxEb2N1bWVudCgpOwogICAgIHVuc2lnbmVkIHNob3J0IHR5cGUgPSBub2RlLT5ub2Rl
VHlwZSgpOwogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIE5vZGU6OlRFWFRfTk9E
RTogewpAQCAtMTg3LDE4ICsxOTAsMTQgQEAgc3RhdGljIFFTdHJpbmcgc3RhcnRNYXJrdXAoY29u
c3QgTm9kZUltcAogICAgICAgICAgICAgaWYgKGRlZmF1bHRTdHlsZSkgewogICAgICAgICAgICAg
ICAgIE5vZGVJbXBsICplbGVtZW50ID0gbm9kZS0+cGFyZW50Tm9kZSgpOwogICAgICAgICAgICAg
ICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIENTU0NvbXB1dGVkU3R5bGVE
ZWNsYXJhdGlvbkltcGwgKmNvbXB1dGVkU3R5bGUgPSBQb3NpdGlvbihlbGVtZW50LCAwKS5jb21w
dXRlZFN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkU3R5bGUtPnJlZigpOwot
ICAgICAgICAgICAgICAgICAgICBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbkltcGwgKnN0eWxl
ID0gY29tcHV0ZWRTdHlsZS0+Y29weUluaGVyaXRhYmxlUHJvcGVydGllcygpOwotICAgICAgICAg
ICAgICAgICAgICBjb21wdXRlZFN0eWxlLT5kZXJlZigpOwotICAgICAgICAgICAgICAgICAgICBz
dHlsZS0+cmVmKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTdHlsZS0+ZGlmZihzdHls
ZSk7CisgICAgICAgICAgICAgICAgICAgIFNoYXJlZFB0cjxDU1NDb21wdXRlZFN0eWxlRGVjbGFy
YXRpb25JbXBsPiBjb21wdXRlZFN0eWxlID0gUG9zaXRpb24oZWxlbWVudCwgMCkuY29tcHV0ZWRT
dHlsZSgpOworICAgICAgICAgICAgICAgICAgICBTaGFyZWRQdHI8Q1NTTXV0YWJsZVN0eWxlRGVj
bGFyYXRpb25JbXBsPiBzdHlsZSA9IGNvbXB1dGVkU3R5bGUtPmNvcHlJbmhlcml0YWJsZVByb3Bl
cnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN0eWxlLT5kaWZmKHN0eWxlLmdl
dCgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLT5sZW5ndGgoKSA+IDApIHsKICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBIYW5kbGUgY2FzZSB3aGVyZSBzdHlsZS0+
Y3NzVGV4dCgpIGhhcyBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gaXQsIGxpa2UgIgogICAgICAgICAg
ICAgICAgICAgICAgICAgUVN0cmluZyBvcGVuVGFnID0gUVN0cmluZygiPHNwYW4gY2xhc3M9XCIi
KSArIEFwcGxlU3R5bGVTcGFuQ2xhc3MgKyAiXCIgc3R5bGU9XCIiICsgc3R5bGUtPmNzc1RleHQo
KS5xc3RyaW5nKCkgKyAiXCI+IjsKICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmt1cCA9IG9w
ZW5UYWcgKyBtYXJrdXAgKyAiPC9zcGFuPiI7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgc3R5bGUtPmRlcmVmKCk7CiAgICAgICAgICAgICAgICAgfSAgICAgICAg
ICAgIAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlID8gY29udmVy
dEhUTUxUZXh0VG9JbnRlcmNoYW5nZUZvcm1hdChtYXJrdXApIDogbWFya3VwOwpAQCAtMjA3LDI1
ICsyMDYsMjMgQEAgc3RhdGljIFFTdHJpbmcgc3RhcnRNYXJrdXAoY29uc3QgTm9kZUltcAogICAg
ICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IENvbW1lbnRJbXBsICo+KG5vZGUpLT50
b1N0cmluZygpLnFzdHJpbmcoKTsKICAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOgog
ICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICBjYXNlIE5vZGU6OlBST0NFU1NJTkdfSU5T
VFJVQ1RJT05fTk9ERToKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBQcm9j
ZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsICo+KG5vZGUpLT50b1N0cmluZygpLnFzdHJpbmcoKTsKICAg
ICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgUVN0cmluZyBtYXJrdXAgPSBRQ2hhcignPCcp
ICsgbm9kZS0+bm9kZU5hbWUoKS5xc3RyaW5nKCk7CiAgICAgICAgICAgICBpZiAodHlwZSA9PSBO
b2RlOjpFTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgICBjb25zdCBFbGVtZW50SW1wbCAq
ZWwgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPihub2RlKTsKICAgICAgICAgICAg
ICAgICBET01TdHJpbmcgYWRkaXRpb25hbFN0eWxlOwogICAgICAgICAgICAgICAgIGlmIChkZWZh
dWx0U3R5bGUgJiYgZWwtPmlzSFRNTEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgICAgICBD
U1NDb21wdXRlZFN0eWxlRGVjbGFyYXRpb25JbXBsICpjb21wdXRlZFN0eWxlID0gUG9zaXRpb24o
Y29uc3RfY2FzdDxFbGVtZW50SW1wbCAqPihlbCksIDApLmNvbXB1dGVkU3R5bGUoKTsKLSAgICAg
ICAgICAgICAgICAgICAgY29tcHV0ZWRTdHlsZS0+cmVmKCk7Ci0gICAgICAgICAgICAgICAgICAg
IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uSW1wbCAqc3R5bGUgPSBjb21wdXRlZFN0eWxlLT5j
b3B5SW5oZXJpdGFibGVQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXB1dGVk
U3R5bGUtPmRlcmVmKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlLT5yZWYoKTsKLSAgICAg
ICAgICAgICAgICAgICAgZGVmYXVsdFN0eWxlLT5kaWZmKHN0eWxlKTsKKyAgICAgICAgICAgICAg
ICAgICAgU2hhcmVkUHRyPENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbkltcGw+IGNvbXB1dGVk
U3R5bGUgPSBQb3NpdGlvbihjb25zdF9jYXN0PEVsZW1lbnRJbXBsICo+KGVsKSwgMCkuY29tcHV0
ZWRTdHlsZSgpOworICAgICAgICAgICAgICAgICAgICBTaGFyZWRQdHI8Q1NTTXV0YWJsZVN0eWxl
RGVjbGFyYXRpb25JbXBsPiBzdHlsZSA9IGNvbXB1dGVkU3R5bGUtPmNvcHlJbmhlcml0YWJsZVBy
b3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFN0eWxlLT5kaWZmKHN0eWxl
LmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlLT5sZW5ndGgoKSA+IDApIHsK
ICAgICAgICAgICAgICAgICAgICAgICAgIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uSW1wbCAq
aW5saW5lU3R5bGVEZWNsID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTEVsZW1lbnRJbXBsICo+KGVs
KS0+aW5saW5lU3R5bGVEZWNsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5saW5l
U3R5bGVEZWNsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZVN0eWxlRGVjbC0+
ZGlmZihzdHlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5saW5lU3R5bGVEZWNs
LT5kaWZmKHN0eWxlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxT
dHlsZSA9IHN0eWxlLT5jc3NUZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICAgICAgc3R5bGUtPmRlcmVmKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gZWwtPmF0dHJpYnV0ZXMoKTsKICAgICAg
ICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhdHRycy0+bGVuZ3RoKCk7CkBAIC0yNDAsMjUg
KzIzNywzNSBAQCBzdGF0aWMgUVN0cmluZyBzdGFydE1hcmt1cChjb25zdCBOb2RlSW1wCiAgICAg
ICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ci0+bmFtZSgpID09IHN0eWxlQXR0ciAmJiBhZGRp
dGlvbmFsU3R5bGUubGVuZ3RoKCkgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh
bHVlICs9ICI7ICIgKyBhZGRpdGlvbmFsU3R5bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAv
LyBGSVhNRTogSGFuZGxlIGNhc2Ugd2hlcmUgdmFsdWUgaGFzIGlsbGVnYWwgY2hhcmFjdGVycyBp
biBpdCwgbGlrZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogTmFtZXNwYWNl
cyEgWE1MISBBY2shCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrdXAgKz0gIiAiICsgYXR0
ci0+bmFtZSgpLmxvY2FsTmFtZSgpLnFzdHJpbmcoKSArICI9XCIiICsgdmFsdWUucXN0cmluZygp
ICsgIlwiIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudElzSFRNTCkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrdXAgKz0gIiAiICsgYXR0ci0+bmFtZSgpLmxv
Y2FsTmFtZSgpLnFzdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtYXJrdXAgKz0gIiAiICsgYXR0ci0+bmFtZSgpLnRvU3Ry
aW5nKCkucXN0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgbWFya3VwICs9ICI9XCIi
ICsgdmFsdWUucXN0cmluZygpICsgIlwiIjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hcmt1cCArPSBub2RlLT5p
c0hUTUxFbGVtZW50KCkgPyAiPiIgOiAiLz4iOworICAgICAgICAgICAgaWYgKCFkb2N1bWVudElz
SFRNTCAmJiAhbm9kZS0+aGFzQ2hpbGROb2RlcygpKQorICAgICAgICAgICAgICAgIG1hcmt1cCAr
PSAiLz4iOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBtYXJrdXAgKz0gIj4i
OwogICAgICAgICAgICAgcmV0dXJuIG1hcmt1cDsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3Rh
dGljIFFTdHJpbmcgZW5kTWFya3VwKGNvbnN0IE5vZGVJbXBsICpub2RlKQorc3RhdGljIGlubGlu
ZSBib29sIGRvZXNIVE1MRm9yYmlkRW5kVGFnKGNvbnN0IE5vZGVJbXBsICpub2RlKQogewotICAg
IGJvb2wgaGFzRW5kVGFnID0gbm9kZS0+aXNFbGVtZW50Tm9kZSgpOwogICAgIGlmIChub2RlLT5p
c0hUTUxFbGVtZW50KCkpIHsKICAgICAgICAgY29uc3QgSFRNTEVsZW1lbnRJbXBsKiBodG1sRWx0
ID0gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTEVsZW1lbnRJbXBsKj4obm9kZSk7Ci0gICAgICAgIGhh
c0VuZFRhZyA9IChodG1sRWx0LT5lbmRUYWdSZXF1aXJlbWVudCgpICE9IFRhZ1N0YXR1c0ZvcmJp
ZGRlbik7CisgICAgICAgIHJldHVybiAoaHRtbEVsdC0+ZW5kVGFnUmVxdWlyZW1lbnQoKSA9PSBU
YWdTdGF0dXNGb3JiaWRkZW4pOwogICAgIH0KLSAgICBpZiAoaGFzRW5kVGFnKQorICAgIHJldHVy
biBmYWxzZTsKK30KKworc3RhdGljIFFTdHJpbmcgZW5kTWFya3VwKGNvbnN0IE5vZGVJbXBsICpu
b2RlKQoreworICAgIGlmIChub2RlLT5pc0VsZW1lbnROb2RlKCkgJiYgbm9kZS0+aGFzQ2hpbGRO
b2RlcygpICYmICFkb2VzSFRNTEZvcmJpZEVuZFRhZyhub2RlKSkKICAgICAgICAgcmV0dXJuICI8
LyIgKyBub2RlLT5ub2RlTmFtZSgpLnFzdHJpbmcoKSArICI+IjsKICAgICByZXR1cm4gIiI7CiB9
CkBAIC0yNzAsMjcgKzI3NywxOCBAQCBzdGF0aWMgUVN0cmluZyBtYXJrdXAoY29uc3QgTm9kZUlt
cGwgKnN0CiAgICAgUVN0cmluZyBtZSA9ICIiOwogICAgIGZvciAoY29uc3QgTm9kZUltcGwgKmN1
cnJlbnQgPSBzdGFydE5vZGU7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGluY2x1ZGVTaWJs
aW5ncyA/IGN1cnJlbnQtPm5leHRTaWJsaW5nKCkgOiBOVUxMKSB7CiAgICAgICAgIGlmICghb25s
eUluY2x1ZGVDaGlsZHJlbikgewotICAgICAgICAgICAgaWYgKG5vZGVzKSB7CisgICAgICAgICAg
ICBpZiAobm9kZXMpCiAgICAgICAgICAgICAgICAgbm9kZXMtPmFwcGVuZChjdXJyZW50KTsKLSAg
ICAgICAgICAgIH0KICAgICAgICAgICAgIG1lICs9IHN0YXJ0TWFya3VwKGN1cnJlbnQsIDAsIERv
Tm90QW5ub3RhdGVGb3JJbnRlcmNoYW5nZSwgMCk7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAg
ICAgIGJvb2wgY29udGFpbmVyID0gdHJ1ZTsKLSAgICAgICAgaWYgKGN1cnJlbnQtPmlzSFRNTEVs
ZW1lbnQoKSkgewotICAgICAgICAgICAgY29uc3QgSFRNTEVsZW1lbnRJbXBsKiBoID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgSFRNTEVsZW1lbnRJbXBsKj4oY3VycmVudCk7Ci0gICAgICAgICAgICBjb250
YWluZXIgPSBoLT5lbmRUYWdSZXF1aXJlbWVudCgpICE9IFRhZ1N0YXR1c0ZvcmJpZGRlbjsKLSAg
ICAgICAgfQotICAgICAgICBpZiAoY29udGFpbmVyKSB7Ci0gICAgICAgICAgICAvLyBwcmludCBj
aGlsZHJlbgotICAgICAgICAgICAgaWYgKE5vZGVJbXBsICpuID0gY3VycmVudC0+Zmlyc3RDaGls
ZCgpKSB7CisgICAgICAgIC8vIHByaW50IGNoaWxkcmVuCisgICAgICAgIGlmIChOb2RlSW1wbCAq
biA9IGN1cnJlbnQtPmZpcnN0Q2hpbGQoKSkKKyAgICAgICAgICAgIGlmICghZG9lc0hUTUxGb3Ji
aWRFbmRUYWcoY3VycmVudCkpCiAgICAgICAgICAgICAgICAgbWUgKz0gbWFya3VwKG4sIGZhbHNl
LCB0cnVlLCBub2Rlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcmludCBteSBl
bmRpbmcgdGFnCi0gICAgICAgICAgICBpZiAoIW9ubHlJbmNsdWRlQ2hpbGRyZW4pIHsKLSAgICAg
ICAgICAgICAgICBtZSArPSBlbmRNYXJrdXAoY3VycmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLy8gUHJpbnQgbXkgZW5kaW5nIHRhZwor
ICAgICAgICBpZiAoIW9ubHlJbmNsdWRlQ2hpbGRyZW4pCisgICAgICAgICAgICBtZSArPSBlbmRN
YXJrdXAoY3VycmVudCk7CiAgICAgfQogICAgIHJldHVybiBtZTsKIH0KQEAgLTQ3Nyw2ICs0NzUs
NyBAQCBRU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBSYW5nZUltcGwgKnJhCiAKIERvY3VtZW50
RnJhZ21lbnRJbXBsICpjcmVhdGVGcmFnbWVudEZyb21NYXJrdXAoRG9jdW1lbnRJbXBsICpkb2N1
bWVudCwgY29uc3QgUVN0cmluZyAmbWFya3VwLCBjb25zdCBRU3RyaW5nICZiYXNlVVJMKQogewor
ICAgIEFTU0VSVChkb2N1bWVudC0+ZG9jdW1lbnRFbGVtZW50KCktPmlzSFRNTEVsZW1lbnQoKSk7
CiAgICAgLy8gRklYTUU6IFdoYXQgaWYgdGhlIGRvY3VtZW50IGVsZW1lbnQgaXMgbm90IGFuIEhU
TUwgZWxlbWVudD8KICAgICBIVE1MRWxlbWVudEltcGwgKmVsZW1lbnQgPSBzdGF0aWNfY2FzdDxI
VE1MRWxlbWVudEltcGwgKj4oZG9jdW1lbnQtPmRvY3VtZW50RWxlbWVudCgpKTsKIApAQCAtNDkz
LDE0ICs0OTIsNyBAQCBRU3RyaW5nIGNyZWF0ZU1hcmt1cChjb25zdCBET006Ok5vZGVJbXBsCiAg
ICAgUVB0ckxpc3Q8RE9NOjpOb2RlSW1wbD4gKm5vZGVzLCBFQW5ub3RhdGVGb3JJbnRlcmNoYW5n
ZSBhbm5vdGF0ZSkKIHsKICAgICBBU1NFUlQoYW5ub3RhdGUgPT0gRG9Ob3RBbm5vdGF0ZUZvcklu
dGVyY2hhbmdlKTsgLy8gYW5ub3RhdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIGZvciB0aGlzIGNv
ZGUgcGF0aAotCi0gICAgLy8gRklYTUU6IFdlIGNvdWxkIHRha2Ugb3V0IHRoaXMgaWYgc3RhdGVt
ZW50IGlmIHdlIGhhZCBtb3JlIHRpbWUgdG8gdGVzdC4KLSAgICAvLyBJJ20gY29uY2VybmVkIHRo
YXQgbWFraW5nIHRoaXMgY3Jhc2ggd2hlbiB0aGUgZG9jdW1lbnQgaXMgbmlsIG1pZ2h0IGJlIHRv
byByaXNreSBhIGNoYW5nZSBhdCB0aGUgbW9tZW50LgotICAgIERvY3VtZW50SW1wbCAqZG9jID0g
bm9kZS0+Z2V0RG9jdW1lbnQoKTsKLSAgICBhc3NlcnQoZG9jKTsKLSAgICBpZiAoZG9jKQotICAg
ICAgICBkb2MtPnVwZGF0ZUxheW91dCgpOwotCisgICAgbm9kZS0+Z2V0RG9jdW1lbnQoKS0+dXBk
YXRlTGF5b3V0KCk7CiAgICAgcmV0dXJuIG1hcmt1cChub2RlLCBpbmNsdWRlQ2hpbGRyZW4sIGZh
bHNlLCBub2Rlcyk7CiB9CiAKSW5kZXg6IGh0bWwvaHRtbF9lbGVtZW50aW1wbC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dlYkNvcmUva2h0bWwvaHRtbC9odG1sX2VsZW1lbnRp
bXBsLmNwcCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMDgKZGlmZiAtcCAtdSAtcjEuMTA4IGh0
bWwvaHRtbF9lbGVtZW50aW1wbC5jcHAKLS0tIGh0bWwvaHRtbF9lbGVtZW50aW1wbC5jcHAJOSBP
Y3QgMjAwNSAwMjoxNDowNSAtMDAwMAkxLjEwOAorKysgaHRtbC9odG1sX2VsZW1lbnRpbXBsLmNw
cAkxOCBPY3QgMjAwNSAxMDoxMTowNyAtMDAwMApAQCAtMjg2LDIyICsyODYsMTYgQEAgRG9jdW1l
bnRGcmFnbWVudEltcGwgKkhUTUxFbGVtZW50SW1wbDo6YwogICAgIERvY3VtZW50RnJhZ21lbnRJ
bXBsICpmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbChkb2NQdHIoKSk7CiAgICAg
ZnJhZ21lbnQtPnJlZigpOwogICAgIAotICAgIGlmICghZ2V0RG9jdW1lbnQoKS0+aXNIVE1MRG9j
dW1lbnQoKSkgewotICAgICAgICBib29sIHJldCA9IHBhcnNlWE1MRG9jdW1lbnRGcmFnbWVudCho
dG1sLCBmcmFnbWVudCwgdGhpcyk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXJldCkgewotICAg
ICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBwcm9wYWdhdGUgYSBzeW50YXggZXJyb3IgZXhj
ZXB0aW9uIG91dCBoZXJlLgotICAgICAgICAgICAgZnJhZ21lbnQtPmRlcmVmKCk7Ci0gICAgICAg
ICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KKyAgICBib29sIHN1Y2Nlc3NmdWxQYXJz
ZSA9IGZhbHNlOworICAgIGlmIChnZXREb2N1bWVudCgpLT5pc0hUTUxEb2N1bWVudCgpKQorICAg
ICAgICBzdWNjZXNzZnVsUGFyc2UgPSBwYXJzZUhUTUxEb2N1bWVudEZyYWdtZW50KGh0bWwsIGZy
YWdtZW50KTsKICAgICBlbHNlCi0gICAgewotICAgICAgICBIVE1MVG9rZW5pemVyIHRvayhkb2NQ
dHIoKSwgZnJhZ21lbnQpOwotICAgICAgICB0b2suc2V0Rm9yY2VTeW5jaHJvbm91cyh0cnVlKTsg
ICAgICAgICAgICAvLyBkaXNhYmxlIGFzeW5jaHJvbm91cyBwYXJzaW5nCi0gICAgICAgIHRvay53
cml0ZSggaHRtbC5xc3RyaW5nKCksIHRydWUgKTsKLSAgICAgICAgdG9rLmZpbmlzaCgpOwotICAg
ICAgICBhc3NlcnQoIXRvay5wcm9jZXNzaW5nRGF0YSgpKTsgICAgICAgICAgICAvLyBtYWtlIHN1
cmUgd2UncmUgZG9uZSAoc2VlIDM5NjMxNTEpCisgICAgICAgIHN1Y2Nlc3NmdWxQYXJzZSA9IHBh
cnNlWE1MRG9jdW1lbnRGcmFnbWVudChodG1sLCBmcmFnbWVudCwgdGhpcyk7CisgICAgCisgICAg
aWYgKCFzdWNjZXNzZnVsUGFyc2UpIHsKKyAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBwcm9w
YWdhdGUgYSBzeW50YXggZXJyb3IgZXhjZXB0aW9uIG91dCBoZXJlLgorICAgICAgICBmcmFnbWVu
dC0+ZGVyZWYoKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgLy8gRXhjZXB0aW9u
cyBhcmUgaWdub3JlZCBiZWNhdXNlIG5vbmUgb3VnaHQgdG8gaGFwcGVuIGhlcmUuCkBAIC02MDMs
NyArNTk3LDcgQEAgdm9pZCBIVE1MRWxlbWVudEltcGw6OmFjY2Vzc0tleUFjdGlvbihibwogCiBE
T01TdHJpbmcgSFRNTEVsZW1lbnRJbXBsOjp0b1N0cmluZygpIGNvbnN0CiB7Ci0gICAgaWYgKCFo
YXNDaGlsZE5vZGVzKCkpIHsKKyAgICBpZiAoIWhhc0NoaWxkTm9kZXMoKSAmJiBnZXREb2N1bWVu
dCgpLT5pc0hUTUxEb2N1bWVudCgpKSB7CiAJRE9NU3RyaW5nIHJlc3VsdCA9IG9wZW5UYWdTdGFy
dFRvU3RyaW5nKCk7CiAJcmVzdWx0ICs9ICI+IjsKIApJbmRleDogaHRtbC9odG1sdG9rZW5pemVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC9odG1sL2h0
bWx0b2tlbml6ZXIuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjExOQpkaWZmIC1wIC11IC1y
MS4xMTkgaHRtbC9odG1sdG9rZW5pemVyLmNwcAotLS0gaHRtbC9odG1sdG9rZW5pemVyLmNwcAkx
OCBPY3QgMjAwNSAwMzoxNToyOCAtMDAwMAkxLjExOQorKysgaHRtbC9odG1sdG9rZW5pemVyLmNw
cAkxOCBPY3QgMjAwNSAxMDoxMTowOSAtMDAwMApAQCAtMTg2MSw0ICsxODYxLDE0IEBAIHZvaWQg
SFRNTFRva2VuaXplcjo6c2V0T25Ib2xkKGJvb2wgX29uSG8KICAgICBvbkhvbGQgPSBfb25Ib2xk
OwogfQogCitib29sIHBhcnNlSFRNTERvY3VtZW50RnJhZ21lbnQoY29uc3QgRE9NOjpET01TdHJp
bmcgJnNvdXJjZSwgRE9NOjpEb2N1bWVudEZyYWdtZW50SW1wbCAqZnJhZ21lbnQpCit7CisgICAg
SFRNTFRva2VuaXplciB0b2soZnJhZ21lbnQtPmRvY1B0cigpLCBmcmFnbWVudCk7CisgICAgdG9r
LnNldEZvcmNlU3luY2hyb25vdXModHJ1ZSk7CisgICAgdG9rLndyaXRlKHNvdXJjZS5xc3RyaW5n
KCksIHRydWUpOworICAgIHRvay5maW5pc2goKTsKKyAgICBhc3NlcnQoIXRvay5wcm9jZXNzaW5n
RGF0YSgpKTsgICAgICAvLyBtYWtlIHN1cmUgd2UncmUgZG9uZSAoc2VlIDM5NjMxNTEpCisgICAg
cmV0dXJuIHRydWU7Cit9CisKIH0KSW5kZXg6IGh0bWwvaHRtbHRva2VuaXplci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL2h0bWwvaHRtbHRva2VuaXplci5o
LHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQyCmRpZmYgLXAgLXUgLXIxLjQyIGh0bWwvaHRtbHRv
a2VuaXplci5oCi0tLSBodG1sL2h0bWx0b2tlbml6ZXIuaAkxOCBPY3QgMjAwNSAwMzoxNToyOSAt
MDAwMAkxLjQyCisrKyBodG1sL2h0bWx0b2tlbml6ZXIuaAkxOCBPY3QgMjAwNSAxMDoxMTowOSAt
MDAwMApAQCAtMzgxLDYgKzM4MSw4IEBAIHByb3RlY3RlZDoKICAgICBib29sIGluV3JpdGU7CiB9
OwogCitib29sIHBhcnNlSFRNTERvY3VtZW50RnJhZ21lbnQoY29uc3QgRE9NOjpET01TdHJpbmcg
JiwgRE9NOjpEb2N1bWVudEZyYWdtZW50SW1wbCAqKTsKKwogfQogCiAjaWYgQVBQTEVfQ0hBTkdF
UwpJbmRleDogeG1sL2RvbV9kb2NpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jv
b3QvV2ViQ29yZS9raHRtbC94bWwvZG9tX2RvY2ltcGwuY3BwLHYKcmV0cmlldmluZyByZXZpc2lv
biAxLjI2MApkaWZmIC1wIC11IC1yMS4yNjAgeG1sL2RvbV9kb2NpbXBsLmNwcAotLS0geG1sL2Rv
bV9kb2NpbXBsLmNwcAkxMCBPY3QgMjAwNSAyMzo0ODo1MyAtMDAwMAkxLjI2MAorKysgeG1sL2Rv
bV9kb2NpbXBsLmNwcAkxOCBPY3QgMjAwNSAxMDoxMToxMiAtMDAwMApAQCAtMzA0LDcgKzMwNCw3
IEBAIERvY3VtZW50SW1wbDo6RG9jdW1lbnRJbXBsKERPTUltcGxlbWVudGEKICAgICAgICwgbV9i
aW5kaW5nTWFuYWdlcihuZXcgWEJMQmluZGluZ01hbmFnZXIodGhpcykpCiAjZW5kaWYKICNpZmRl
ZiBLSFRNTF9YU0xUCi0gICAgLCBtX3RyYW5zZm9ybVNvdXJjZShOVUxMKQorICAgICwgbV90cmFu
c2Zvcm1Tb3VyY2UoMCkKICAgICAsIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoMCkKICNlbmRp
ZgogI2lmIEFQUExFX0NIQU5HRVMKQEAgLTQ2MCw4ICs0NjAsNiBAQCBEb2N1bWVudEltcGw6On5E
b2N1bWVudEltcGwoKQogCiAjaWZkZWYgS0hUTUxfWFNMVAogICAgIHhtbEZyZWVEb2MoKHhtbERv
Y1B0ciltX3RyYW5zZm9ybVNvdXJjZSk7Ci0gICAgaWYgKG1fdHJhbnNmb3JtU291cmNlRG9jdW1l
bnQpCi0gICAgICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQtPmRlcmVmKCk7CiAjZW5kaWYK
IAogI2lmbmRlZiBLSFRNTF9OT19YQkwKQEAgLTI3MjUsNiArMjcyMyw4IEBAIGJvb2wgRG9jdW1l
bnRJbXBsOjpzaG91bGRDcmVhdGVSZW5kZXJlcnMKIERPTVN0cmluZyBEb2N1bWVudEltcGw6OnRv
U3RyaW5nKCkgY29uc3QKIHsKICAgICBET01TdHJpbmcgcmVzdWx0OworICAgIAorICAgIHJlc3Vs
dCArPSBtX2RvY3R5cGUtPnRvU3RyaW5nKCk7CiAKICAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9
IGZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmco
KSkgewogCXJlc3VsdCArPSBjaGlsZC0+dG9TdHJpbmcoKTsKQEAgLTMwMjMsMjAgKzMwMjMsMTUg
QEAgdm9pZCBEb2N1bWVudEltcGw6OnNoaWZ0TWFya2VycyhOb2RlSW1wbAogCiB2b2lkIERvY3Vt
ZW50SW1wbDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCogcGkp
CiB7Ci0gICAgLy8gRklYTUU6IEJlIHN1cmUgdG8gY2hhbmdlIHRoaXMgbmV4dCBsaW5lIHRvIHVz
ZSBhIFNoYXJlZFB0ciBpbnN0ZWFkIG9mIGEgc3RhY2stYWxsb2NhdGVkCi0gICAgLy8gb2JqZWN0
IG9uY2UgWFNMVFByb2Nlc3NvckltcGwgZ2V0cyBhIHJlZiBjb3VudC4KLSAgICBYU0xUUHJvY2Vz
c29ySW1wbCBwcm9jZXNzb3Ioc3RhdGljX2Nhc3Q8WFNMU3R5bGVTaGVldEltcGwqPihwaS0+c2hl
ZXQoKSksIHRoaXMpOwotICAgIHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCh0aGlzKTsKKyAg
ICBTaGFyZWRQdHI8WFNMVFByb2Nlc3NvckltcGw+IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vz
c29ySW1wbCgpOworICAgIHByb2Nlc3Nvci0+c2V0WFNMU3R5bGVzaGVldChzdGF0aWNfY2FzdDxY
U0xTdHlsZVNoZWV0SW1wbCo+KHBpLT5zaGVldCgpKSk7CisgICAgCisgICAgUVN0cmluZyByZXN1
bHRNSU1FVHlwZTsKKyAgICBRU3RyaW5nIG5ld1NvdXJjZTsKKyAgICBpZiAoIXByb2Nlc3Nvci0+
dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1NvdXJjZSkpCisgICAg
ICAgIHJldHVybjsKICAgICAvLyBGSVhNRTogSWYgdGhlIHRyYW5zZm9ybSBmYWlsZWQgd2Ugc2hv
dWxkIHByb2JhYmx5IHJlcG9ydCBhbiBlcnJvciAobGlrZSBNb3ppbGxhIGRvZXMpLgotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6c2V0VHJhbnNmb3JtU291cmNlRG9jdW1lbnQoRG9jdW1lbnRJbXBs
KiBkb2MpCi17IAotICAgIGlmIChkb2MpCi0gICAgICAgIGRvYy0+cmVmKCk7Ci0gICAgaWYgKG1f
dHJhbnNmb3JtU291cmNlRG9jdW1lbnQpCi0gICAgICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1l
bnQtPmRlcmVmKCk7IAotICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBkb2M7CisgICAg
cHJvY2Vzc29yLT5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UobmV3U291cmNlLCByZXN1bHRNSU1F
VHlwZSwgdGhpcywgdmlldygpKTsKIH0KIAogI2VuZGlmCkluZGV4OiB4bWwvZG9tX2RvY2ltcGwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94bWwvZG9tX2Rv
Y2ltcGwuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMzAKZGlmZiAtcCAtdSAtcjEuMTMwIHht
bC9kb21fZG9jaW1wbC5oCi0tLSB4bWwvZG9tX2RvY2ltcGwuaAk1IE9jdCAyMDA1IDEwOjMxOjEy
IC0wMDAwCTEuMTMwCisrKyB4bWwvZG9tX2RvY2ltcGwuaAkxOCBPY3QgMjAwNSAxMDoxMToxMiAt
MDAwMApAQCAtNTY3LDggKzU2Nyw4IEBAIHB1YmxpYzoKICAgICB2b2lkIGFwcGx5WFNMVHJhbnNm
b3JtKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwqIHBpKTsKICAgICB2b2lkIHNldFRyYW5zZm9y
bVNvdXJjZSh2b2lkKiBkb2MpIHsgbV90cmFuc2Zvcm1Tb3VyY2UgPSBkb2M7IH0KICAgICBjb25z
dCB2b2lkKiB0cmFuc2Zvcm1Tb3VyY2UoKSB7IHJldHVybiBtX3RyYW5zZm9ybVNvdXJjZTsgfQot
ICAgIERvY3VtZW50SW1wbCogdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSB7IHJldHVybiBtX3Ry
YW5zZm9ybVNvdXJjZURvY3VtZW50OyB9Ci0gICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1
bWVudChEb2N1bWVudEltcGwqIGRvYyk7CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gdHJh
bnNmb3JtU291cmNlRG9jdW1lbnQoKSB7IHJldHVybiBtX3RyYW5zZm9ybVNvdXJjZURvY3VtZW50
OyB9CisgICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1bWVudChEb2N1bWVudEltcGwgKmRv
YykgeyBtX3RyYW5zZm9ybVNvdXJjZURvY3VtZW50ID0gZG9jOyB9CiAjZW5kaWYKIAogI2lmbmRl
ZiBLSFRNTF9OT19YQkwKQEAgLTY4OSw4ICs2ODksOCBAQCBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBt
X292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkOwogICAgIAogI2lmZGVmIEtIVE1MX1hTTFQKLSAg
ICB2b2lkKiBtX3RyYW5zZm9ybVNvdXJjZTsKLSAgICBEb2N1bWVudEltcGwqIG1fdHJhbnNmb3Jt
U291cmNlRG9jdW1lbnQ7CisgICAgdm9pZCAqbV90cmFuc2Zvcm1Tb3VyY2U7CisgICAgU2hhcmVk
UHRyPERvY3VtZW50SW1wbD4gbV90cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudDsKICNlbmRpZgogCiAj
aWZuZGVmIEtIVE1MX05PX1hCTApJbmRleDogeG1sL2RvbV9xbmFtZS5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT
IGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL3htbC9kb21fcW5hbWUuaCx2CnJldHJpZXZp
bmcgcmV2aXNpb24gMS40CmRpZmYgLXAgLXUgLXIxLjQgeG1sL2RvbV9xbmFtZS5oCi0tLSB4bWwv
ZG9tX3FuYW1lLmgJMTggSnVsIDIwMDUgMjE6NDQ6MjkgLTAwMDAJMS40CisrKyB4bWwvZG9tX3Fu
YW1lLmgJMTggT2N0IDIwMDUgMTA6MTE6MTMgLTAwMDAKQEAgLTU5LDEzICs1OSwxNSBAQCBwdWJs
aWM6CiAKICAgICAvLyBJbml0IHJvdXRpbmUgZm9yIGdsb2JhbHMKICAgICBzdGF0aWMgdm9pZCBp
bml0KCk7CisgICAgCisgICAgUXVhbGlmaWVkTmFtZUltcGwgKmltcGwoKSB7IHJldHVybiBtX2lt
cGw7IH0KIAogcHJpdmF0ZToKIAogICAgIHZvaWQgcmVmKCkgeyBtX2ltcGwtPnJlZigpOyB9IAog
ICAgIHZvaWQgZGVyZWYoKTsKICAgICAKLSAgICBRdWFsaWZpZWROYW1lSW1wbCogbV9pbXBsOwor
ICAgIFF1YWxpZmllZE5hbWVJbXBsICptX2ltcGw7CiB9OwogCiAjaWYgIUtIVE1MX1FOQU1FX0hJ
REVfR0xPQkFMUwpJbmRleDogeG1sL2RvbV94bWxpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxl
OiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94bWwvZG9tX3htbGltcGwuY3BwLHYKcmV0cmlldmlu
ZyByZXZpc2lvbiAxLjE2CmRpZmYgLXAgLXUgLXIxLjE2IHhtbC9kb21feG1saW1wbC5jcHAKLS0t
IHhtbC9kb21feG1saW1wbC5jcHAJMyBPY3QgMjAwNSAyMToxMjo1NCAtMDAwMAkxLjE2CisrKyB4
bWwvZG9tX3htbGltcGwuY3BwCTE4IE9jdCAyMDA1IDEwOjExOjEzIC0wMDAwCkBAIC0zMDMsNyAr
MzAzLDYgQEAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDo6UHJvY2Vzc2luZ0lucwogICAgIG1f
dGFyZ2V0ID0gMDsKICAgICBtX2RhdGEgPSAwOwogICAgIG1fbG9jYWxIcmVmID0gMDsKLSAgICBt
X3NoZWV0ID0gMDsKICAgICBtX2NhY2hlZFNoZWV0ID0gMDsKICAgICBtX2xvYWRpbmcgPSBmYWxz
ZTsKICNpZmRlZiBLSFRNTF9YU0xUCkBAIC0zMTksNyArMzE4LDYgQEAgUHJvY2Vzc2luZ0luc3Ry
dWN0aW9uSW1wbDo6UHJvY2Vzc2luZ0lucwogICAgIG1fZGF0YSA9IF9kYXRhLmltcGwoKTsKICAg
ICBpZiAobV9kYXRhKQogICAgICAgICBtX2RhdGEtPnJlZigpOwotICAgIG1fc2hlZXQgPSAwOwog
ICAgIG1fY2FjaGVkU2hlZXQgPSAwOwogICAgIG1fbG9jYWxIcmVmID0gMDsKICNpZmRlZiBLSFRN
TF9YU0xUCkBAIC0zMzUsOCArMzMzLDYgQEAgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDo6flBy
b2Nlc3NpbmdJbgogICAgICAgICBtX2RhdGEtPmRlcmVmKCk7CiAgICAgaWYgKG1fY2FjaGVkU2hl
ZXQpCiAJbV9jYWNoZWRTaGVldC0+ZGVyZWYodGhpcyk7Ci0gICAgaWYgKG1fc2hlZXQpCi0JbV9z
aGVldC0+ZGVyZWYoKTsKIH0KIAogRE9NU3RyaW5nIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGw6
OnRhcmdldCgpIGNvbnN0CkBAIC00OTQsNyArNDkwLDcgQEAgYm9vbCBQcm9jZXNzaW5nSW5zdHJ1
Y3Rpb25JbXBsOjpjaGVja1N0eQogCiBTdHlsZVNoZWV0SW1wbCogUHJvY2Vzc2luZ0luc3RydWN0
aW9uSW1wbDo6c2hlZXQoKSBjb25zdAogewotICAgIHJldHVybiBtX3NoZWV0OworICAgIHJldHVy
biBtX3NoZWV0LmdldCgpOwogfQogCiBib29sIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGw6Omlz
TG9hZGluZygpIGNvbnN0CkBAIC01MzUsMjIgKzUzMSwxMyBAQCB2b2lkIFByb2Nlc3NpbmdJbnN0
cnVjdGlvbkltcGw6OnNldFN0eWxlCiAgICAgICAgIGdldERvY3VtZW50KCktPnN0eWxlc2hlZXRM
b2FkZWQoKTsKIH0KIAotdm9pZCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsOjpzZXRTdHlsZVNo
ZWV0KENTU1N0eWxlU2hlZXRJbXBsKiBzaGVldCkKLXsKLSAgICBpZiAobV9zaGVldCkKLSAgICAg
ICAgbV9zaGVldC0+ZGVyZWYoKTsKLSAgICBtX3NoZWV0ID0gc2hlZXQ7Ci0gICAgaWYgKG1fc2hl
ZXQpCi0gICAgICAgIG1fc2hlZXQtPnJlZigpOwotfQotCiBET01TdHJpbmcgUHJvY2Vzc2luZ0lu
c3RydWN0aW9uSW1wbDo6dG9TdHJpbmcoKSBjb25zdAogewogICAgIERPTVN0cmluZyByZXN1bHQg
PSAiPD8iOwogICAgIHJlc3VsdCArPSBtX3RhcmdldDsKICAgICByZXN1bHQgKz0gIiAiOwogICAg
IHJlc3VsdCArPSBtX2RhdGE7Ci0gICAgcmVzdWx0ICs9ICI+IjsKKyAgICByZXN1bHQgKz0gIj8+
IjsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkluZGV4OiB4bWwvZG9tX3htbGltcGwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94bWwvZG9tX3htbGltcGwu
aCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC1wIC11IC1yMS4xMyB4bWwvZG9tX3ht
bGltcGwuaAotLS0geG1sL2RvbV94bWxpbXBsLmgJMTAgTWF5IDIwMDUgMjE6NTk6MTUgLTAwMDAJ
MS4xMworKysgeG1sL2RvbV94bWxpbXBsLmgJMTggT2N0IDIwMDUgMTA6MTE6MTMgLTAwMDAKQEAg
LTIzLDYgKzIzLDcgQEAKICNpZm5kZWYgX0RPTV9YbWxJbXBsX2hfCiAjZGVmaW5lIF9ET01fWG1s
SW1wbF9oXwogCisjaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCiAjaW5jbHVkZSAieG1s
L2RvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgIm1pc2MvbG9hZGVyX2NsaWVudC5oIgogCkBAIC0z
Myw4ICszNCw2IEBAIGNsYXNzIENhY2hlZENTU1N0eWxlU2hlZXQ7CiBuYW1lc3BhY2UgRE9NIHsK
IAogY2xhc3MgRG9jdW1lbnRJbXBsOwotY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci1jbGFzcyBT
dHlsZVNoZWV0SW1wbDsKIGNsYXNzIERPTVN0cmluZzsKICNpZiBBUFBMRV9DSEFOR0VTCiBjbGFz
cyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb247CkBAIC0xNTMsNyArMTUyLDcgQEAgcHVibGljOgogICAg
IFN0eWxlU2hlZXRJbXBsICpzaGVldCgpIGNvbnN0OwogICAgIGJvb2wgY2hlY2tTdHlsZVNoZWV0
KCk7CiAgICAgdmlydHVhbCB2b2lkIHNldFN0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICZ1cmws
IGNvbnN0IERPTVN0cmluZyAmc2hlZXQpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0
KENTU1N0eWxlU2hlZXRJbXBsKiBzaGVldCk7CisgICAgdmlydHVhbCB2b2lkIHNldFN0eWxlU2hl
ZXQoQ1NTU3R5bGVTaGVldEltcGwgKnNoZWV0KSB7IG1fc2hlZXQgPSBzaGVldDsgfQogICAgIGJv
b2wgaXNMb2FkaW5nKCkgY29uc3Q7CiAgICAgdm9pZCBzaGVldExvYWRlZCgpOwogCkBAIC0xNjgs
NyArMTY3LDcgQEAgcHJvdGVjdGVkOgogICAgIERPTVN0cmluZ0ltcGwgKm1fZGF0YTsKICAgICBE
T01TdHJpbmdJbXBsICptX2xvY2FsSHJlZjsKICAgICBraHRtbDo6Q2FjaGVkT2JqZWN0ICptX2Nh
Y2hlZFNoZWV0OwotICAgIFN0eWxlU2hlZXRJbXBsICptX3NoZWV0OworICAgIFNoYXJlZFB0cjxT
dHlsZVNoZWV0SW1wbD4gbV9zaGVldDsKICAgICBib29sIG1fbG9hZGluZzsKICNpZmRlZiBLSFRN
TF9YU0xUCiAgICAgYm9vbCBtX2lzWFNMOwpJbmRleDogeG1sL3htbF90b2tlbml6ZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL3htbC94bWxfdG9rZW5p
emVyLmNwcCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS40NQpkaWZmIC1wIC11IC1yMS40NSB4bWwv
eG1sX3Rva2VuaXplci5jcHAKLS0tIHhtbC94bWxfdG9rZW5pemVyLmNwcAkxMCBPY3QgMjAwNSAy
Mzo0ODo1NCAtMDAwMAkxLjQ1CisrKyB4bWwveG1sX3Rva2VuaXplci5jcHAJMTggT2N0IDIwMDUg
MTA6MTE6MTQgLTAwMDAKQEAgLTQyLDYgKzQyLDkgQEAKIAogI2luY2x1ZGUgPHFwdHJzdGFjay5o
PgogCisvLyBmb3IgeGh0bWwgZW50aXR5IG5hbWUgbG9va3VwCisjaW5jbHVkZSAia2VudGl0aWVz
LmMiCisKIHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKIAogdXNpbmcgRE9NOjpBdHRy
aWJ1dGVJbXBsOwpAQCAtODIsNiArODUsOSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGZp
bmlzaCgpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRPbkhvbGQoYm9vbCBvbkhvbGQpOwogICAgIHZp
cnR1YWwgYm9vbCBpc1dhaXRpbmdGb3JTY3JpcHRzKCkgY29uc3Q7CisgICAgCisgICAgdm9pZCBz
ZXRJc1hIVE1MRG9jdW1lbnQoYm9vbCBpc1hIVE1MKSB7IG1faXNYSFRNTERvY3VtZW50ID0gaXNY
SFRNTDsgfQorICAgIGJvb2wgaXNYSFRNTERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9pc1hI
VE1MRG9jdW1lbnQ7IH0KIAogI2lmZGVmIEtIVE1MX1hTTFQKICAgICB2b2lkIHNldFRyYW5zZm9y
bVNvdXJjZShEb2N1bWVudEltcGwqIGRvYyk7CkBAIC0xMjUsNiArMTMxLDcgQEAgcHJpdmF0ZToK
ICAgICBib29sIG1fc2F3RXJyb3I7CiAgICAgYm9vbCBtX3BhcnNlclN0b3BwZWQ7CiAgICAgYm9v
bCBtX3Nhd1hTTFRyYW5zZm9ybTsKKyAgICBib29sIG1faXNYSFRNTERvY3VtZW50OwogICAgIAog
ICAgIGludCBtX2Vycm9yQ291bnQ7CiAgICAgaW50IG1fbGFzdEVycm9yTGluZTsKQEAgLTYwMiwy
MiArNjA5LDg0IEBAIHN0YXRpYyB2b2lkIG5vcm1hbEVycm9ySGFuZGxlcih2b2lkICpjbG8KICAg
ICB2YV9lbmQoYXJncyk7CiB9CiAKKy8vIE5PVEU6IFRoaXMgaXMgYSBzb21ld2hhdCBkYW5nZXJv
dXMgaGFjayB0byBhdm9pZAorLy8gbWFsbG9jL2ZyZWUgb3ZlcmhlYWQgd2hlbiBwYXNzaW5nIGVu
dGl0eSBkYXRhIHRvIGxpYnhtbC4KK3N0YXRpYyB4bWxDaGFyIHNoYXJlZFhIVE1MRW50aXR5UmVz
dWx0WzNdID0geydcMCcsJ1wwJywnXDAnfTsKK3N0YXRpYyB4bWxFbnRpdHkgc2hhcmVkWEhUTUxF
bnRpdHkgPSB7CisgICAgMCwgWE1MX0VOVElUWV9ERUNMLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAK
KyAgICBzaGFyZWRYSFRNTEVudGl0eVJlc3VsdCwgc2hhcmVkWEhUTUxFbnRpdHlSZXN1bHQsIDAs
CisgICAgWE1MX0lOVEVSTkFMX1BSRURFRklORURfRU5USVRZLCAwLCAwLCAwLCAwLCAwCit9Owor
CitzdGF0aWMgeG1sRW50aXR5UHRyIGdldFhIVE1MRW50aXR5KGNvbnN0IHhtbENoYXIgKm5hbWUp
Cit7CisgICAgdW5zaWduZWQgaW50IHVuaWNvZGVWYWx1ZSA9IDA7CisgICAgCisgICAgY29uc3Qg
Y2hhciAqbmFtZVBvc2l0aW9uID0gKGNvbnN0IGNoYXIgKiluYW1lOworICAgIAorICAgIGlmKCpu
YW1lUG9zaXRpb24gPT0gJyMnKSB7CisgICAgICAgIGludCBiYXNlID0gMTA7CisgICAgICAgICsr
bmFtZVBvc2l0aW9uOworICAgICAgICBpZigqbmFtZVBvc2l0aW9uID09ICd4JykgeworICAgICAg
ICAgICAgKytuYW1lUG9zaXRpb247CisgICAgICAgICAgICBiYXNlID0gMTY7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKCpuYW1lUG9zaXRpb24gPT0gJyAnKQorICAgICAgICAgICAgcmV0dXJuIDA7
IC8vIHN0cnRvbCBhbGxvd3MgZm9yIGxlYWRpbmcgc3BhY2VzLCBidXQgWE1MIGRvZXNuJ3QKKyAg
ICAgICAgCisgICAgICAgIGNoYXIgKmVuZFB0cjsKKyAgICAgICAgdW5pY29kZVZhbHVlID0gc3Ry
dG9sKG5hbWVQb3NpdGlvbiwgJmVuZFB0ciwgYmFzZSk7CisgICAgICAgIGlmIChlbmRQdHIgIT0g
J1wwJykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0
IGVudGl0eSAqZSA9IGZpbmRFbnRpdHkobmFtZVBvc2l0aW9uLCBzdHJsZW4obmFtZVBvc2l0aW9u
KSk7CisgICAgICAgIGlmKCFlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVuaWNv
ZGVWYWx1ZSA9IGUtPmNvZGU7CisgICAgfQorICAgIAorICAgIC8vIERvbid0IGFsbG93IHN1cnJv
Z2F0ZSBjb2RlIHBvaW50cywgb3IgdmFsdWVzIHRoYXQgYXJlIG1vcmUgdGhhbiAyMSBiaXRzLgor
ICAgIGlmICgodW5pY29kZVZhbHVlID4gMCAmJiB1bmljb2RlVmFsdWUgPCAweEQ4MDApIHx8ICh1
bmljb2RlVmFsdWUgPj0gMHhFMDAwICYmIHVuaWNvZGVWYWx1ZSA8PSAweDFGRkZGRikpIHsKKyAg
ICAgICAgaWYgKHVuaWNvZGVWYWx1ZSA8PSAweEZGRkYpIHsKKyAgICAgICAgICAgIHNoYXJlZFhI
VE1MRW50aXR5UmVzdWx0WzBdID0gdW5pY29kZVZhbHVlOworICAgICAgICAgICAgc2hhcmVkWEhU
TUxFbnRpdHkubGVuZ3RoID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENv
bnZlcnQgdG8gVVRGLTE2LCB1c2luZyBzdXJyb2dhdGUgY29kZSBwb2ludHMuCisgICAgICAgICAg
ICBzaGFyZWRYSFRNTEVudGl0eVJlc3VsdFswXSA9ICgweEQ4MDAgfCAoKCh1bmljb2RlVmFsdWUg
Pj4gMTYpIC0gMSkgPDwgNikgfCAoKHVuaWNvZGVWYWx1ZSA+PiAxMCkgJiAweDNGKSk7CisgICAg
ICAgICAgICBzaGFyZWRYSFRNTEVudGl0eVJlc3VsdFsxXSA9ICh1bmljb2RlVmFsdWUgJiAweDNG
Rik7CisgICAgICAgICAgICBzaGFyZWRYSFRNTEVudGl0eS5sZW5ndGggPSAyOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIHNoYXJlZFhIVE1MRW50aXR5Lm5hbWUgPSBuYW1lOworICAgIAor
ICAgIHJldHVybiAmc2hhcmVkWEhUTUxFbnRpdHk7Cit9CisKIHN0YXRpYyB4bWxFbnRpdHlQdHIg
Z2V0RW50aXR5SGFuZGxlcih2b2lkICpjbG9zdXJlLCBjb25zdCB4bWxDaGFyICpuYW1lKQogewog
ICAgIHhtbFBhcnNlckN0eHRQdHIgY3R4dCA9IHN0YXRpY19jYXN0PHhtbFBhcnNlckN0eHRQdHI+
KGNsb3N1cmUpOwogICAgIHhtbEVudGl0eVB0ciBlbnQgPSB4bWxHZXRQcmVkZWZpbmVkRW50aXR5
KG5hbWUpOwogICAgIGlmKGVudCkKICAgICAgICAgcmV0dXJuIGVudDsKKyAgICAgICAgCisgICAg
ZW50ID0geG1sR2V0RG9jRW50aXR5KGN0eHQtPm15RG9jLCBuYW1lKTsKKyAgICBpZiAoIWVudCAm
JiBnZXRUb2tlbml6ZXIoY2xvc3VyZSktPmlzWEhUTUxEb2N1bWVudCgpKQorICAgICAgICBlbnQg
PSBnZXRYSFRNTEVudGl0eShuYW1lKTsKIAogICAgIC8vIFdvcmthcm91bmQgYSBsaWJ4bWwgU0FY
MiBidWcgd2hlcmVieSBjaGFyYWN0ZXJzSGFuZGxlciBpcyBjYWxsZWQgdHdpY2UKLSAgICBib29s
IGluQXR0ciA9IGN0eHQtPmluc3RhdGUgPT0gWE1MX1BBUlNFUl9BVFRSSUJVVEVfVkFMVUU7Ci0g
ICAgZW50ID0geG1sR2V0RG9jRW50aXR5KGN0eHQtPm15RG9jLCBuYW1lKTsKICAgICBpZihlbnQp
Ci0gICAgICAgIGN0eHQtPnJlcGxhY2VFbnRpdGllcyA9IGluQXR0ciB8fCAoZW50LT5ldHlwZSAh
PSBYTUxfSU5URVJOQUxfR0VORVJBTF9FTlRJVFkpOworICAgICAgICBjdHh0LT5yZXBsYWNlRW50
aXRpZXMgPSAoY3R4dC0+aW5zdGF0ZSA9PSBYTUxfUEFSU0VSX0FUVFJJQlVURV9WQUxVRSkgfHwg
KGVudC0+ZXR5cGUgIT0gWE1MX0lOVEVSTkFMX0dFTkVSQUxfRU5USVRZKTsKICAgICAKICAgICBy
ZXR1cm4gZW50OwogfQogCitzdGF0aWMgdm9pZCBleHRlcm5hbFN1YnNldEhhbmRsZXIodm9pZCAq
Y2xvc3VyZSwgY29uc3QgeG1sQ2hhciAqbmFtZSwgY29uc3QgeG1sQ2hhciAqZXh0ZXJuYWxJZCwg
Y29uc3QgeG1sQ2hhciAqc3lzdGVtSWQpCit7CisgICAgaWYgKHRvUVN0cmluZyhuYW1lKS5jb250
YWlucygiaHRtbCIpKQorICAgICAgICBnZXRUb2tlbml6ZXIoY2xvc3VyZSktPnNldElzWEhUTUxE
b2N1bWVudCh0cnVlKTsKK30KKwogdm9pZCBYTUxUb2tlbml6ZXI6OmZpbmlzaCgpCiB7CiAgICAg
eG1sU0FYSGFuZGxlciBzYXg7CkBAIC02MzQsNiArNzAzLDcgQEAgdm9pZCBYTUxUb2tlbml6ZXI6
OmZpbmlzaCgpCiAgICAgc2F4LmdldEVudGl0eSA9IGdldEVudGl0eUhhbmRsZXI7CiAgICAgc2F4
LnN0YXJ0RG9jdW1lbnQgPSB4bWxTQVgyU3RhcnREb2N1bWVudDsKICAgICBzYXguaW50ZXJuYWxT
dWJzZXQgPSB4bWxTQVgySW50ZXJuYWxTdWJzZXQ7CisgICAgc2F4LmV4dGVybmFsU3Vic2V0ID0g
ZXh0ZXJuYWxTdWJzZXRIYW5kbGVyOwogICAgIHNheC5lbnRpdHlEZWNsID0geG1sU0FYMkVudGl0
eURlY2w7CiAgICAgc2F4LmluaXRpYWxpemVkID0gWE1MX1NBWDJfTUFHSUM7CiAgICAgCkBAIC02
NDYsNiArNzE2LDggQEAgdm9pZCBYTUxUb2tlbml6ZXI6OmZpbmlzaCgpCiAgICAgICAgIHhtbEZy
ZWVEb2MobV9jb250ZXh0LT5teURvYyk7CiAgICAgeG1sRnJlZVBhcnNlckN0eHQobV9jb250ZXh0
KTsKICAgICBtX2NvbnRleHQgPSBOVUxMOworICAgIAorICAgIFNoYXJlZFB0cjxEb2N1bWVudElt
cGw+IGRvYyA9IG1fZG9jLT5kb2N1bWVudCgpOwogCiAgICAgaWYgKG1fc2F3RXJyb3IpIHsKICAg
ICAgICAgaW5zZXJ0RXJyb3JNZXNzYWdlQmxvY2soKTsKQEAgLTc4MiwyMCArODU0LDI1IEBAIGJv
b2wgWE1MVG9rZW5pemVyOjppc1dhaXRpbmdGb3JTY3JpcHRzKCkKIH0KIAogI2lmZGVmIEtIVE1M
X1hTTFQKLXZvaWQgWE1MVG9rZW5pemVyOjpzZXRUcmFuc2Zvcm1Tb3VyY2UoRG9jdW1lbnRJbXBs
KiBkb2MpCit2b2lkICp4bWxEb2NQdHJGb3JTdHJpbmcoY29uc3QgUVN0cmluZyAmc291cmNlLCBR
U3RyaW5nIHVybCkKIHsKLSAgICAvLyBUaW1lIHRvIHNwaW4gdXAgYSBuZXcgcGFyc2UgYW5kIHNh
dmUgdGhlIHhtbERvY1B0ci4KICAgICAvLyBQYXJzZSBpbiBhIHNpbmdsZSBjaHVuayBpbnRvIGFu
IHhtbERvY1B0cgogICAgIC8vIEZJWE1FOiBIb29rIHVwIGVycm9yIGhhbmRsZXJzIHNvIHRoYXQg
YSBmYWlsdXJlIHRvIHBhcnNlIHRoZSBtYWluIGRvY3VtZW50IHJlc3VsdHMgaW4KICAgICAvLyBn
b29kIGVycm9yIG1lc3NhZ2VzLgogICAgIGNvbnN0IFFDaGFyIEJPTSgweEZFRkYpOwogICAgIGNv
bnN0IHVuc2lnbmVkIGNoYXIgQk9NSGlnaEJ5dGUgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
bnNpZ25lZCBjaGFyICo+KCZCT00pOwotICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSB4bWxSZWFk
TWVtb3J5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihtX3htbENvZGUudW5pY29kZSgp
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3htbENvZGUubGVu
Z3RoKCkgKiBzaXplb2YoUUNoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGRvYy0+VVJMKCkuYXNjaWkoKSwKKyAgICB4bWxEb2NQdHIgc291cmNlRG9jID0geG1s
UmVhZE1lbW9yeShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oc291cmNlLnVuaWNvZGUo
KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmxlbmd0
aCgpICogc2l6ZW9mKFFDaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB1cmwuYXNjaWkoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBCT01IaWdoQnl0ZSA9PSAweEZGID8gIlVURi0xNkxFIiA6ICJVVEYtMTZCRSIsIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTF9QQVJTRV9OT0NEQVRBfFhNTF9Q
QVJTRV9EVERBVFRSfFhNTF9QQVJTRV9OT0VOVCk7Ci0gICAgZG9jLT5zZXRUcmFuc2Zvcm1Tb3Vy
Y2Uoc291cmNlRG9jKTsKKyAgICByZXR1cm4gc291cmNlRG9jOworfQorCit2b2lkIFhNTFRva2Vu
aXplcjo6c2V0VHJhbnNmb3JtU291cmNlKERvY3VtZW50SW1wbCAqZG9jKQoreworICAgIC8vIFRp
bWUgdG8gc3BpbiB1cCBhIG5ldyBwYXJzZSBhbmQgc2F2ZSB0aGUgeG1sRG9jUHRyLgorICAgIGRv
Yy0+c2V0VHJhbnNmb3JtU291cmNlKHhtbERvY1B0ckZvclN0cmluZyhtX3htbENvZGUsIGRvYy0+
VVJMKCkpKTsKIH0KICNlbmRpZgogCkluZGV4OiB4bWwveG1sX3Rva2VuaXplci5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL3htbC94bWxfdG9rZW5pemVyLmgs
dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTgKZGlmZiAtcCAtdSAtcjEuMTggeG1sL3htbF90b2tl
bml6ZXIuaAotLS0geG1sL3htbF90b2tlbml6ZXIuaAkxOSBBdWcgMjAwNSAxNjoyNzowMSAtMDAw
MAkxLjE4CisrKyB4bWwveG1sX3Rva2VuaXplci5oCTE4IE9jdCAyMDA1IDEwOjExOjE0IC0wMDAw
CkBAIC04NSw2ICs4NSw5IEBAIHByaXZhdGU6CiB9OwogCiBUb2tlbml6ZXIgKm5ld1hNTFRva2Vu
aXplcihET006OkRvY3VtZW50UHRyICosIEtIVE1MVmlldyAqID0gMCk7CisjaWZkZWYgS0hUTUxf
WFNMVAordm9pZCAqeG1sRG9jUHRyRm9yU3RyaW5nKGNvbnN0IFFTdHJpbmcgJnNvdXJjZSwgUVN0
cmluZyB1cmwgPSBRU3RyaW5nKCkpOworI2VuZGlmCiBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+IHBh
cnNlQXR0cmlidXRlcyhjb25zdCBET006OkRPTVN0cmluZyAmLCBib29sICZhdHRyc09LKTsKIGJv
b2wgcGFyc2VYTUxEb2N1bWVudEZyYWdtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nICYsIERPTTo6
RG9jdW1lbnRGcmFnbWVudEltcGwgKiwgRE9NOjpFbGVtZW50SW1wbCAqcGFyZW50ID0gMCk7CiB9
CkluZGV4OiB4c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAv
Y3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcCx2CnJldHJp
ZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC1wIC11IC1yMS4xMyB4c2wveHNsdF9wcm9jZXNzb3Jp
bXBsLmNwcAotLS0geHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJMTAgT2N0IDIwMDUgMjM6NDg6
NTUgLTAwMDAJMS4xMworKysgeHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJMTggT2N0IDIwMDUg
MTA6MTE6MTQgLTAwMDAKQEAgLTI0LDggKzI0LDExIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAj
aW5jbHVkZSAieHNsdF9wcm9jZXNzb3JpbXBsLmgiCiAjaW5jbHVkZSAieHNsX3N0eWxlc2hlZXRp
bXBsLmgiCisjaW5jbHVkZSAieG1sX3Rva2VuaXplci5oIgorI2luY2x1ZGUgImh0bWx0b2tlbml6
ZXIuaCIKICNpbmNsdWRlICJodG1sX2RvY3VtZW50aW1wbC5oIgogI2luY2x1ZGUgImxvYWRlci5o
IgorI2luY2x1ZGUgIm1hcmt1cC5oIgogI2luY2x1ZGUgImtodG1sdmlldy5oIgogI2luY2x1ZGUg
ImtodG1sX3BhcnQuaCIKICNpbmNsdWRlICJLV1FMb2FkZXIuaCIKQEAgLTM2LDI3ICszOSwyOCBA
QAogI2luY2x1ZGUgPGxpYnhzbHQvZG9jdW1lbnRzLmg+CiAjaW5jbHVkZSA8bGlieHNsdC9pbXBv
cnRzLmg+CiAKKyNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CisKIHVzaW5nIG5hbWVz
cGFjZSBraHRtbDsKIHVzaW5nIG5hbWVzcGFjZSBET007CiAKIG5hbWVzcGFjZSBET00gewotICAg
IAotWFNMVFByb2Nlc3NvckltcGw6OlhTTFRQcm9jZXNzb3JJbXBsKFhTTFN0eWxlU2hlZXRJbXBs
KiBzaGVldCwgRG9jdW1lbnRJbXBsKiBzb3VyY2UpCi0gICAgOiBtX3N0eWxlc2hlZXQoc2hlZXQp
LCBtX3NvdXJjZURvY3VtZW50KHNvdXJjZSkKLXsKLX0KLQotWFNMVFByb2Nlc3NvckltcGw6On5Y
U0xUUHJvY2Vzc29ySW1wbCgpCi17Ci19CiAKIHN0YXRpYyB2b2lkIHBhcnNlRXJyb3JGdW5jKHZv
aWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewogICAgIC8vIEZJWE1FOiBJdCB3b3Vs
ZCBiZSBuaWNlIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgc29tZXdoZXJlLgorICAgIGNoYXIg
KmVycm9yTWVzc2FnZSA9IDA7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3Ms
IG1zZyk7CisgICAgdmFzcHJpbnRmKCZlcnJvck1lc3NhZ2UsIG1zZywgYXJncyk7CisgICAgRVJS
T1IoZXJyb3JNZXNzYWdlKTsKKyAgICB2YV9lbmQoYXJncyk7CiB9CiAKKy8vIEZJWE1FOiBUaGVy
ZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gY29udHJvbCB0aGUgY3R4dCBwb2ludGVyIGZvciBsb2Fk
aW5nIGhlcmUsIHRodXMgd2UgaGF2ZSBnbG9iYWxzLgogc3RhdGljIFhTTFRQcm9jZXNzb3JJbXBs
ICpnbG9iYWxQcm9jZXNzb3IgPSAwOwotc3RhdGljIHhtbERvY1B0ciBzdHlsZXNoZWV0TG9hZEZ1
bmMoY29uc3QgeG1sQ2hhciogdXJpLAorc3RhdGljIGtodG1sOjpEb2NMb2FkZXIgKmdsb2JhbERv
Y0xvYWRlciA9IDA7CitzdGF0aWMgeG1sRG9jUHRyIHN0eWxlc2hlZXRMb2FkRnVuYyhjb25zdCB4
bWxDaGFyICp1cmksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxEaWN0
UHRyIGRpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9u
cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGN0eHQsCkBAIC03
Nyw3ICs4MSw3IEBAIHN0YXRpYyB4bWxEb2NQdHIgc3R5bGVzaGVldExvYWRGdW5jKGNvbnMKICAg
ICAgICAgICAgIHZvaWQgKm9sZEVycm9yQ29udGV4dCA9IHhtbEdlbmVyaWNFcnJvckNvbnRleHQ7
CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGRhdGEgPSBLV1FTZXJ2ZVN5bmNocm9ub3VzUmVx
dWVzdChraHRtbDo6Q2FjaGU6OmxvYWRlcigpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9jZXNzb3ItPnNvdXJjZURvY3VtZW50KCktPmRv
Y0xvYWRlcigpLCBqb2IsIGZpbmFsVVJMLCBoZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxEb2NMb2FkZXIsIGpvYiwgZmluYWxVUkws
IGhlYWRlcnMpOwogICAgICAgICAKICAgICAgICAgICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMo
MCwgcGFyc2VFcnJvckZ1bmMpOwogICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgc3BlY2lmeSBhbiBl
bmNvZGluZyBoZXJlLiBOZWl0aGVyIEdlY2tvIG5vciBXaW5JRSByZXNwZWN0cwpAQCAtODcsNyAr
OTEsNyBAQCBzdGF0aWMgeG1sRG9jUHRyIHN0eWxlc2hlZXRMb2FkRnVuYyhjb25zCiAgICAgICAg
ICAgICByZXR1cm4gZG9jOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgWFNMVF9MT0FEX1NUWUxF
U0hFRVQ6Ci0gICAgICAgICAgICByZXR1cm4gZ2xvYmFsUHJvY2Vzc29yLT5zdHlsZXNoZWV0KCkt
PmxvY2F0ZVN0eWxlc2hlZXRTdWJSZXNvdXJjZSgoKHhzbHRTdHlsZXNoZWV0UHRyKWN0eHQpLT5k
b2MsIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gZ2xvYmFsUHJvY2Vzc29yLT54c2xTdHlsZXNo
ZWV0KCktPmxvY2F0ZVN0eWxlc2hlZXRTdWJSZXNvdXJjZSgoKHhzbHRTdHlsZXNoZWV0UHRyKWN0
eHQpLT5kb2MsIHVyaSk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAg
ICB9CkBAIC05NSwxMjAgKzk5LDI1NSBAQCBzdGF0aWMgeG1sRG9jUHRyIHN0eWxlc2hlZXRMb2Fk
RnVuYyhjb25zCiAgICAgcmV0dXJuIDA7CiB9CiAKLVNoYXJlZFB0cjxEb2N1bWVudEltcGw+IFhT
TFRQcm9jZXNzb3JJbXBsOjp0cmFuc2Zvcm1Eb2N1bWVudChEb2N1bWVudEltcGwqIGRvYykKK3N0
YXRpYyBpbmxpbmUgdm9pZCBzZXRYU0xUTG9hZENhbGxCYWNrKHhzbHREb2NMb2FkZXJGdW5jIGZ1
bmMsIFhTTFRQcm9jZXNzb3JJbXBsICpwcm9jZXNzb3IsIGtodG1sOjpEb2NMb2FkZXIgKmxvYWRl
cikKIHsKLSAgICAvLyBGSVhNRTogUmlnaHQgbm93IHdlIGFzc3VtZSB8ZG9jfCBpcyB1bnBhcnNl
ZCwgYnV0IGlmIGl0IGhhcyBiZWVuIHBhcnNlZCB3ZSB3aWxsIG5lZWQgdG8gc2VyaWFsaXplIGl0
Ci0gICAgLy8gYW5kIHRoZW4gZmVlZCB0aGF0IHJlc3VsdGluZyBzb3VyY2UgdG8gbGlieHNsdC4K
LSAgICBtX3Jlc3VsdE91dHB1dCA9ICIiOworICAgIHhzbHRTZXRMb2FkZXJGdW5jKGZ1bmMpOwor
ICAgIGdsb2JhbFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAgICBnbG9iYWxEb2NMb2FkZXIgPSBs
b2FkZXI7Cit9CiAKLSAgICBpZiAoIW1fc3R5bGVzaGVldCB8fCAhbV9zdHlsZXNoZWV0LT5kb2N1
bWVudCgpKSByZXR1cm4gMDsKLSAgICAgICAgCi0gICAgZ2xvYmFsUHJvY2Vzc29yID0gdGhpczsK
LSAgICB4c2x0U2V0TG9hZGVyRnVuYyhzdHlsZXNoZWV0TG9hZEZ1bmMpOworc3RhdGljIGludCB3
cml0ZVRvUVN0cmluZyh2b2lkICpjb250ZXh0LCBjb25zdCBjaGFyICpidWZmZXIsIGludCBsZW4p
Cit7CisgICAgUVN0cmluZyAmcmVzdWx0T3V0cHV0ID0gKnN0YXRpY19jYXN0PFFTdHJpbmcgKj4o
Y29udGV4dCk7CisgICAgcmVzdWx0T3V0cHV0ICs9IFFTdHJpbmc6OmZyb21VdGY4KGJ1ZmZlciwg
bGVuKTsKKyAgICByZXR1cm4gbGVuOworfQogCi0gICAgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQg
PSBtX3N0eWxlc2hlZXQtPmNvbXBpbGVTdHlsZVNoZWV0KCk7CitzdGF0aWMgYm9vbCBzYXZlUmVz
dWx0VG9TdHJpbmcoeG1sRG9jUHRyIHJlc3VsdERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQs
IFFTdHJpbmcgJnJlc3VsdFN0cmluZykKK3sKKyAgICB4bWxPdXRwdXRCdWZmZXJQdHIgb3V0cHV0
QnVmID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoMCk7CisgICAgaWYgKCFvdXRwdXRCdWYpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBvdXRwdXRCdWYtPmNvbnRleHQgPSAmcmVzdWx0U3RyaW5n
OworICAgIG91dHB1dEJ1Zi0+d3JpdGVjYWxsYmFjayA9IHdyaXRlVG9RU3RyaW5nOworICAgIAor
ICAgIGludCByZXR2YWwgPSB4c2x0U2F2ZVJlc3VsdFRvKG91dHB1dEJ1ZiwgcmVzdWx0RG9jLCBz
aGVldCk7CisgICAgeG1sT3V0cHV0QnVmZmVyQ2xvc2Uob3V0cHV0QnVmKTsKKyAgICAKKyAgICBp
ZiAocmV0dmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOwor
fQogCi0gICAgaWYgKCFzaGVldCkgewotICAgICAgICBnbG9iYWxQcm9jZXNzb3IgPSAwOwotICAg
ICAgICB4c2x0U2V0TG9hZGVyRnVuYygwKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc2Zvcm1U
ZXh0U3RyaW5nVG9YSFRNTERvY3VtZW50U3RyaW5nKFFTdHJpbmcgJnRleHQpCit7ICAgIAorICAg
IC8vIE1vZGlmeSB0aGUgb3V0cHV0IHNvIHRoYXQgaXQgaXMgYSB3ZWxsLWZvcm1lZCBYSFRNTCBk
b2N1bWVudCB3aXRoIGEgPHByZT4gdGFnIGVuY2xvc2luZyB0aGUgdGV4dC4KKyAgICB0ZXh0LnJl
cGxhY2UoJyYnLCAiJmFtcDsiKTsKKyAgICB0ZXh0LnJlcGxhY2UoJzwnLCAiJmx0OyIpOworICAg
IHRleHQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iCisg
ICAgICAgICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3Ry
aWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0
LmR0ZFwiPlxuIgorICAgICAgICAiPGh0bWwgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5
L3hodG1sXCI+XG4iCisgICAgICAgICI8aGVhZD48dGl0bGUvPjwvaGVhZD5cbiIKKyAgICAgICAg
Ijxib2R5PlxuIgorICAgICAgICAiPHByZT4iICsgdGV4dCArICI8L3ByZT5cbiIKKyAgICAgICAg
IjwvYm9keT5cbiIKKyAgICAgICAgIjwvaHRtbD5cbiI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFy
ICoqeHNsdFBhcmFtQXJyYXlGcm9tUURpY3QoUURpY3Q8RE9NU3RyaW5nPiBwYXJhbWV0ZXJzKQor
eworICAgIGlmKHBhcmFtZXRlcnMuY291bnQoKSkKICAgICAgICAgcmV0dXJuIDA7CisgICAgY29u
c3QgY2hhciAqKnBhcmFtZXRlckFycmF5ID0gKGNvbnN0IGNoYXIgKiopbWFsbG9jKCgocGFyYW1l
dGVycy5jb3VudCgpICogMikgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKworICAgIFFEaWN0SXRl
cmF0b3I8RE9NU3RyaW5nPiBpdChwYXJhbWV0ZXJzKTsKKyAgICB1bnNpZ25lZCBpbmRleCA9IDA7
CisgICAgZm9yKGl0LnRvRmlyc3QoKTsgaXQuY3VycmVudCgpOyArK2l0KSB7CisgICAgICAgIHBh
cmFtZXRlckFycmF5WysraW5kZXhdID0gc3RyZHVwKGl0LmN1cnJlbnRLZXkoKS51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgcGFyYW1ldGVyQXJyYXlbKytpbmRleF0gPSBzdHJkdXAoaXQuY3VycmVu
dCgpLT5xc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CiAgICAgfQorICAgIHBhcmFtZXRlckFycmF5
W2luZGV4XSA9IE5VTEw7CisKKyAgICByZXR1cm4gcGFyYW1ldGVyQXJyYXk7Cit9CisKK3N0YXRp
YyB2b2lkIGZyZWVYc2x0UGFyYW1BcnJheShjb25zdCBjaGFyICoqcGFyYW1zKQoreworICAgIGNv
bnN0IGNoYXIgKip0ZW1wID0gcGFyYW1zOworICAgIGlmKCFwYXJhbXMpCisgICAgICAgIHJldHVy
bjsKICAgICAKLSAgICBtX3N0eWxlc2hlZXQtPmNsZWFyRG9jdW1lbnRzKCk7Ci0gIAotICAgIC8v
IEdldCB0aGUgcGFyc2VkIHNvdXJjZSBkb2N1bWVudC4KLSAgICB4bWxEb2NQdHIgc291cmNlRG9j
ID0gKHhtbERvY1B0cilkb2MtPnRyYW5zZm9ybVNvdXJjZSgpOwotICAgIHhtbERvY1B0ciByZXN1
bHREb2MgPSB4c2x0QXBwbHlTdHlsZXNoZWV0KHNoZWV0LCBzb3VyY2VEb2MsIDApOwotICAgIAot
ICAgIGdsb2JhbFByb2Nlc3NvciA9IDA7Ci0gICAgeHNsdFNldExvYWRlckZ1bmMoMCk7CisgICAg
d2hpbGUoKnRlbXApIHsKKyAgICAgICAgZnJlZSgodm9pZCAqKSoodGVtcCsrKSk7CisgICAgICAg
IGZyZWUoKHZvaWQgKikqKHRlbXArKykpOworICAgIH0KKyAgICBmcmVlKHBhcmFtcyk7Cit9CiAK
LSAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiByZXN1bHQgPSBkb2N1bWVudEZyb21YTUxEb2NQ
dHIocmVzdWx0RG9jLCBzaGVldCk7Ci0gICAgeHNsdEZyZWVTdHlsZXNoZWV0KHNoZWV0KTsKLSAg
ICB4bWxGcmVlRG9jKHJlc3VsdERvYyk7CiAKK1NoYXJlZFB0cjxEb2N1bWVudEltcGw+IFhTTFRQ
cm9jZXNzb3JJbXBsOjpjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoUVN0cmluZyBkb2N1bWVudFNv
dXJjZSwgUVN0cmluZyBzb3VyY2VNSU1FVHlwZSwgTm9kZUltcGwgKnNvdXJjZU5vZGUsIEtIVE1M
VmlldyAqdmlldykKK3sKKyAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBvd25lckRvY3VtZW50
ID0gc291cmNlTm9kZS0+Z2V0RG9jdW1lbnQoKTsKKyAgICBib29sIHNvdXJjZUlzRG9jdW1lbnQg
PSAoc291cmNlTm9kZSA9PSBvd25lckRvY3VtZW50LmdldCgpKTsKKworICAgIFNoYXJlZFB0cjxE
b2N1bWVudEltcGw+IHJlc3VsdDsKKyAgICBpZiAoc291cmNlTUlNRVR5cGUgPT0gUVN0cmluZzo6
ZnJvbUxhdGluMSgidGV4dC9odG1sIikpCisgICAgICAgIHJlc3VsdCA9IG93bmVyRG9jdW1lbnQt
PmltcGwoKS0+Y3JlYXRlSFRNTERvY3VtZW50KHZpZXcpOworICAgIGVsc2UKKyAgICAgICAgcmVz
dWx0ID0gb3duZXJEb2N1bWVudC0+aW1wbCgpLT5jcmVhdGVEb2N1bWVudCh2aWV3KTsKKyAgICBp
ZiAoc291cmNlTUlNRVR5cGUgPT0gUVN0cmluZzo6ZnJvbUxhdGluMSgidGV4dC9wbGFpbiIpKQor
ICAgICAgICB0cmFuc2Zvcm1UZXh0U3RyaW5nVG9YSFRNTERvY3VtZW50U3RyaW5nKGRvY3VtZW50
U291cmNlKTsKKyAgICAKKyAgICByZXN1bHQtPmRvY0xvYWRlcigpLT5zZXRTaG93QW5pbWF0aW9u
cyhvd25lckRvY3VtZW50LT5kb2NMb2FkZXIoKS0+c2hvd0FuaW1hdGlvbnMoKSk7CisgICAgCisg
ICAgLy8gQmVmb3JlIHBhcnNpbmcsIHdlIG5lZWQgdG8gc2F2ZSAmIGRldGFjaCB0aGUgb2xkIGRv
Y3VtZW50IGFuZCBnZXQgdGhlIG5ldyBkb2N1bWVudAorICAgIC8vIGluIHBsYWNlLiBXZSBoYXZl
IHRvIGRvIHRoaXMgb25seSBpZiB3ZSdyZSByZW5kZXJpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4K
KyAgICBpZiAodmlldykgeworICAgICAgICB2aWV3LT5jbGVhcigpOworICAgICAgICByZXN1bHQt
PnNldFRyYW5zZm9ybVNvdXJjZURvY3VtZW50KHZpZXctPnBhcnQoKS0+eG1sRG9jSW1wbCgpKTsK
KyAgICAgICAgdmlldy0+cGFydCgpLT5yZXBsYWNlRG9jSW1wbChyZXN1bHQuZ2V0KCkpOworICAg
IH0KKyAgICAKKyAgICByZXN1bHQtPm9wZW4oKTsKKyAgICBpZiAoc291cmNlSXNEb2N1bWVudCkg
eworICAgICAgICByZXN1bHQtPnNldFVSTChvd25lckRvY3VtZW50LT5VUkwoKSk7CisgICAgICAg
IHJlc3VsdC0+c2V0QmFzZVVSTChvd25lckRvY3VtZW50LT5iYXNlVVJMKCkpOworICAgIH0KKyAg
ICByZXN1bHQtPmRldGVybWluZVBhcnNlTW9kZShkb2N1bWVudFNvdXJjZSk7IC8vIE1ha2Ugc3Vy
ZSB3ZSBwYXJzZSBpbiB0aGUgY29ycmVjdCBtb2RlLgorICAgIHJlc3VsdC0+d3JpdGUoZG9jdW1l
bnRTb3VyY2UpOworICAgIHJlc3VsdC0+ZmluaXNoUGFyc2luZygpOworICAgIHJlc3VsdC0+c2V0
UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKHZpZXcpCisgICAgICAgIHZpZXctPnBhcnQoKS0+Y2hl
Y2tDb21wbGV0ZWQoKTsKKyAgICBlbHNlCisgICAgICAgIHJlc3VsdC0+Y2xvc2UoKTsgLy8gRklY
TUU6IEV2ZW4gdmlld2xlc3MgZG9jcyBjYW4gbG9hZCBzdWJyZXNvdXJjZXMuIG9ubG9hZCB3aWxs
IGZpcmUgdG9vIGVhcmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcHJv
YmFibHkgYSBidWcgaW4gWE1MSHR0cFJlcXVlc3RPYmplY3RzIGFzIHdlbGwuCiAgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBidWZmZXJXcml0ZSh2b2lkKiBjb250ZXh0LCBjb25z
dCBjaGFyKiBidWZmZXIsIGludCBsZW4pCitzdGF0aWMgaW5saW5lIFNoYXJlZFB0cjxEb2N1bWVu
dEZyYWdtZW50SW1wbD4gY3JlYXRlRnJhZ21lbnRGcm9tU291cmNlKFFTdHJpbmcgc291cmNlU3Ry
aW5nLCBRU3RyaW5nIHNvdXJjZU1JTUVUeXBlLCBOb2RlSW1wbCAqc291cmNlTm9kZSwgRG9jdW1l
bnRJbXBsICpvdXB1dERvYykKIHsKLSAgICBzdGF0aWNfY2FzdDxYU0xUUHJvY2Vzc29ySW1wbCo+
KGNvbnRleHQpLT5hZGRUb1Jlc3VsdChidWZmZXIsIGxlbik7Ci0gICAgcmV0dXJuIGxlbjsKKyAg
ICBpZiAoc291cmNlTUlNRVR5cGUgPT0gUVN0cmluZzo6ZnJvbUxhdGluMSgidGV4dC9wbGFpbiIp
KQorICAgICAgICB0cmFuc2Zvcm1UZXh0U3RyaW5nVG9YSFRNTERvY3VtZW50U3RyaW5nKHNvdXJj
ZVN0cmluZyk7CisgICAgCisgICAgU2hhcmVkUHRyPERvY3VtZW50RnJhZ21lbnRJbXBsPiBmcmFn
bWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbChvdXB1dERvYy0+ZG9jUHRyKCkpOworICAg
IAorICAgIGJvb2wgc3VjY2Vzc2Z1bFBhcnNlID0gZmFsc2U7CisgICAgaWYgKHNvdXJjZU1JTUVU
eXBlID09IFFTdHJpbmc6OmZyb21MYXRpbjEoInRleHQvaHRtbCIpKQorICAgICAgICBzdWNjZXNz
ZnVsUGFyc2UgPSBwYXJzZUhUTUxEb2N1bWVudEZyYWdtZW50KHNvdXJjZVN0cmluZywgZnJhZ21l
bnQuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgc3VjY2Vzc2Z1bFBhcnNlID0gcGFyc2VYTUxE
b2N1bWVudEZyYWdtZW50KHNvdXJjZVN0cmluZywgZnJhZ21lbnQuZ2V0KCksIG91cHV0RG9jLT5k
b2N1bWVudEVsZW1lbnQoKSk7CisgICAgCisgICAgaWYgKCFzdWNjZXNzZnVsUGFyc2UpCisgICAg
ICAgIHJldHVybiBOVUxMOworICAgIAorICAgIC8vIEZJWE1FOiBEbyB3ZSBuZWVkIHRvIG1lc3Mg
d2l0aCBVUkxzIGhlcmU/CisgICAgICAgIAorICAgIHJldHVybiBmcmFnbWVudDsKIH0KIAotdm9p
ZCBYU0xUUHJvY2Vzc29ySW1wbDo6YWRkVG9SZXN1bHQoY29uc3QgY2hhciogYnVmZmVyLCBpbnQg
bGVuKQorc3RhdGljIHhzbHRTdHlsZXNoZWV0UHRyIHhzbHRTdHlsZXNoZWV0UG9pbnRlcihTaGFy
ZWRQdHI8WFNMU3R5bGVTaGVldEltcGw+ICZjYWNoZWRTdHlsZXNoZWV0LCBOb2RlSW1wbCAqc3R5
bGVzaGVldFJvb3ROb2RlKQogewotICAgIG1fcmVzdWx0T3V0cHV0ICs9IFFTdHJpbmc6OmZyb21V
dGY4KGJ1ZmZlciwgbGVuKTsKKyAgICBpZiAoIWNhY2hlZFN0eWxlc2hlZXQgJiYgc3R5bGVzaGVl
dFJvb3ROb2RlKSB7CisgICAgICAgIGNhY2hlZFN0eWxlc2hlZXQgPSBuZXcgWFNMU3R5bGVTaGVl
dEltcGwoc3R5bGVzaGVldFJvb3ROb2RlLT5wYXJlbnQoKSA/IHN0eWxlc2hlZXRSb290Tm9kZS0+
cGFyZW50KCkgOiBzdHlsZXNoZWV0Um9vdE5vZGUpOworICAgICAgICBjYWNoZWRTdHlsZXNoZWV0
LT5wYXJzZVN0cmluZyhjcmVhdGVNYXJrdXAoc3R5bGVzaGVldFJvb3ROb2RlKSk7CisgICAgfQor
ICAgIAorICAgIGlmICghY2FjaGVkU3R5bGVzaGVldCB8fCAhY2FjaGVkU3R5bGVzaGVldC0+ZG9j
dW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgcmV0dXJuIGNhY2hlZFN0eWxl
c2hlZXQtPmNvbXBpbGVTdHlsZVNoZWV0KCk7CiB9CiAKLVNoYXJlZFB0cjxEb2N1bWVudEltcGw+
IFhTTFRQcm9jZXNzb3JJbXBsOjpkb2N1bWVudEZyb21YTUxEb2NQdHIoeG1sRG9jUHRyIHJlc3Vs
dERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQpCitzdGF0aWMgaW5saW5lIHhtbERvY1B0ciB4
bWxEb2NQdHJGcm9tTm9kZShOb2RlSW1wbCAqc291cmNlTm9kZSkKIHsKLSAgICBpZiAoIXJlc3Vs
dERvYyB8fCAhc2hlZXQpCi0gICAgICAgIHJldHVybiAwOworICAgIFNoYXJlZFB0cjxEb2N1bWVu
dEltcGw+IG93bmVyRG9jdW1lbnQgPSBzb3VyY2VOb2RlLT5nZXREb2N1bWVudCgpOworICAgIGJv
b2wgc291cmNlSXNEb2N1bWVudCA9IChzb3VyY2VOb2RlID09IG93bmVyRG9jdW1lbnQuZ2V0KCkp
OworICAgIAorICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSAwOworICAgIGlmIChzb3VyY2VJc0Rv
Y3VtZW50KQorICAgICAgICBzb3VyY2VEb2MgPSAoeG1sRG9jUHRyKW93bmVyRG9jdW1lbnQtPnRy
YW5zZm9ybVNvdXJjZSgpOworICAgIGlmICghc291cmNlRG9jKQorICAgICAgICBzb3VyY2VEb2Mg
PSAoeG1sRG9jUHRyKXhtbERvY1B0ckZvclN0cmluZyhjcmVhdGVNYXJrdXAoc291cmNlTm9kZSks
IHNvdXJjZUlzRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LT5VUkwoKSA6IFFTdHJpbmcoKSk7Cisg
ICAgcmV0dXJuIHNvdXJjZURvYzsKK30KIAotICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IHJl
c3VsdDsKLSAgICB4bWxPdXRwdXRCdWZmZXJQdHIgb3V0cHV0QnVmID0geG1sQWxsb2NPdXRwdXRC
dWZmZXIoMCk7Ci0gICAgaWYgKG91dHB1dEJ1ZikgewotICAgICAgICBvdXRwdXRCdWYtPmNvbnRl
eHQgPSB0aGlzOwotICAgICAgICBvdXRwdXRCdWYtPndyaXRlY2FsbGJhY2sgPSBidWZmZXJXcml0
ZTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXR2YWwgPSB4c2x0U2F2ZVJlc3VsdFRvKG91dHB1
dEJ1ZiwgcmVzdWx0RG9jLCBzaGVldCk7Ci0gICAgICAgIHhtbE91dHB1dEJ1ZmZlckNsb3NlKG91
dHB1dEJ1Zik7Ci0gICAgICAgIAotICAgICAgICBpZiAocmV0dmFsIDwgMCkKLSAgICAgICAgICAg
IHJldHVybiAwOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9m
IG91dHB1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoOgotICAgICAgICAvLyBIVE1M
IChjcmVhdGUgYW4gSFRNTCBkb2N1bWVudCksIFhNTCAoY3JlYXRlIGFuIFhNTCBkb2N1bWVudCks
Ci0gICAgICAgIC8vIGFuZCB0ZXh0ICh3cmFwIGluIGEgPHByZT4gYW5kIGNyZWF0ZSBhbiBYTUwg
ZG9jdW1lbnQpLgotICAgICAgICBLSFRNTFZpZXcgKnZpZXcgPSBtX3NvdXJjZURvY3VtZW50LT52
aWV3KCk7Ci0gICAgICAgIGNvbnN0IHhtbENoYXIgKm1ldGhvZDsKLSAgICAgICAgWFNMVF9HRVRf
SU1QT1JUX1BUUihtZXRob2QsIHNoZWV0LCBtZXRob2QpOwotICAgICAgICBpZiAobWV0aG9kID09
IDAgJiYgcmVzdWx0RG9jLT50eXBlID09IFhNTF9IVE1MX0RPQ1VNRU5UX05PREUpCi0gICAgICAg
ICAgICBtZXRob2QgPSAoY29uc3QgeG1sQ2hhciAqKSJodG1sIjsKLSAgICAgICAgaWYgKHhtbFN0
ckVxdWFsKG1ldGhvZCwgKGNvbnN0IHhtbENoYXIgKikiaHRtbCIpKQotICAgICAgICAgICAgcmVz
dWx0ID0gbV9zb3VyY2VEb2N1bWVudC0+aW1wbCgpLT5jcmVhdGVIVE1MRG9jdW1lbnQodmlldyk7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IG1fc291cmNlRG9jdW1lbnQtPmlt
cGwoKS0+Y3JlYXRlRG9jdW1lbnQodmlldyk7Ci0gICAgICAgIHJlc3VsdC0+YXR0YWNoKCk7Ci0g
ICAgICAgIHJlc3VsdC0+ZG9jTG9hZGVyKCktPnNldFNob3dBbmltYXRpb25zKG1fc291cmNlRG9j
dW1lbnQtPmRvY0xvYWRlcigpLT5zaG93QW5pbWF0aW9ucygpKTsKLSAgICAgICAgcmVzdWx0LT5z
ZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1bWVudChtX3NvdXJjZURvY3VtZW50LmdldCgpKTsKLQotICAg
ICAgICBpZiAoeG1sU3RyRXF1YWwobWV0aG9kLCAoY29uc3QgeG1sQ2hhciAqKSJ0ZXh0IikpIHsK
LSAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgb3V0cHV0IHNvIHRoYXQgaXQgaXMgYSB3ZWxsLWZv
cm1lZCBYSFRNTCBkb2N1bWVudCB3aXRoIGEgPHByZT4gdGFnIGVuY2xvc2luZyB0aGUgdGV4dC4K
LSAgICAgICAgICAgIG1fcmVzdWx0T3V0cHV0LnJlcGxhY2UoJyYnLCAiJmFtcDsiKTsKLSAgICAg
ICAgICAgIG1fcmVzdWx0T3V0cHV0LnJlcGxhY2UoJzwnLCAiJmx0OyIpOwotICAgICAgICAgICAg
bV9yZXN1bHRPdXRwdXQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThc
Ij8+XG4iCi0gICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sIFBVQkxJQyBcIi0vL1czQy8v
RFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIgXCJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEv
RFREL3hodG1sMS1zdHJpY3QuZHRkXCI+XG4iCi0gICAgICAgICAgICAgICAgIjxodG1sIHhtbG5z
PVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPlxuIgotICAgICAgICAgICAgICAgICI8
aGVhZD48dGl0bGUvPjwvaGVhZD5cbiIKLSAgICAgICAgICAgICAgICAiPGJvZHk+XG4iCi0gICAg
ICAgICAgICAgICAgIjxwcmU+IiArIG1fcmVzdWx0T3V0cHV0ICsgIjwvcHJlPlxuIgotICAgICAg
ICAgICAgICAgICI8L2JvZHk+XG4iCi0gICAgICAgICAgICAgICAgIjwvaHRtbD5cbiI7Ci0gICAg
ICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEJlZm9yZSBwYXJzaW5nLCB3ZSBuZWVkIHRvIGRl
dGFjaCB0aGUgb2xkIGRvY3VtZW50IGNvbXBsZXRlbHkgYW5kIGdldCB0aGUgbmV3IGRvY3VtZW50
Ci0gICAgICAgIC8vIGluIHBsYWNlLiBXZSBoYXZlIHRvIGRvIHRoaXMgb25seSBpZiB3ZSdyZSBy
ZW5kZXJpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAgICAgaWYgKHZpZXcpIHsKLSAgICAg
ICAgICAgIHZpZXctPmNsZWFyKCk7Ci0gICAgICAgICAgICB2aWV3LT5wYXJ0KCktPnJlcGxhY2VE
b2NJbXBsKHJlc3VsdC5nZXQoKSk7Ci0gICAgICAgIH0KK3N0YXRpYyBpbmxpbmUgUVN0cmluZyBy
ZXN1bHRNSU1FVHlwZSh4bWxEb2NQdHIgcmVzdWx0RG9jLCB4c2x0U3R5bGVzaGVldFB0ciBzaGVl
dCkKK3sKKyAgICAvLyBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb3V0cHV0IHdlIG5lZWQgdG8g
YmUgYWJsZSB0byBkZWFsIHdpdGg6CisgICAgLy8gSFRNTCAoY3JlYXRlIGFuIEhUTUwgZG9jdW1l
bnQpLCBYTUwgKGNyZWF0ZSBhbiBYTUwgZG9jdW1lbnQpLAorICAgIC8vIGFuZCB0ZXh0ICh3cmFw
IGluIGEgPHByZT4gYW5kIGNyZWF0ZSBhbiBYTUwgZG9jdW1lbnQpLgorCisgICAgY29uc3QgeG1s
Q2hhciAqcmVzdWx0VHlwZSA9IDA7CisgICAgWFNMVF9HRVRfSU1QT1JUX1BUUihyZXN1bHRUeXBl
LCBzaGVldCwgbWV0aG9kKTsKKyAgICBpZiAocmVzdWx0VHlwZSA9PSAwICYmIHJlc3VsdERvYy0+
dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKQorICAgICAgICByZXN1bHRUeXBlID0gKGNv
bnN0IHhtbENoYXIgKikiaHRtbCI7CisgICAgCisgICAgaWYgKHhtbFN0ckVxdWFsKHJlc3VsdFR5
cGUsIChjb25zdCB4bWxDaGFyICopImh0bWwiKSkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmc6OmZy
b21MYXRpbjEoInRleHQvaHRtbCIpOworICAgIGVsc2UgaWYgKHhtbFN0ckVxdWFsKHJlc3VsdFR5
cGUsIChjb25zdCB4bWxDaGFyICopInRleHQiKSkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmc6OmZy
b21MYXRpbjEoInRleHQvcGxhaW4iKTsKICAgICAgICAgCi0gICAgICAgIHJlc3VsdC0+b3Blbigp
OwotICAgICAgICByZXN1bHQtPnNldFVSTChtX3NvdXJjZURvY3VtZW50LT5VUkwoKSk7Ci0gICAg
ICAgIHJlc3VsdC0+c2V0QmFzZVVSTChtX3NvdXJjZURvY3VtZW50LT5iYXNlVVJMKCkpOwotICAg
ICAgICByZXN1bHQtPmRldGVybWluZVBhcnNlTW9kZShtX3Jlc3VsdE91dHB1dCk7IC8vIE1ha2Ug
c3VyZSB3ZSBwYXJzZSBpbiB0aGUgY29ycmVjdCBtb2RlLgotICAgICAgICByZXN1bHQtPndyaXRl
KG1fcmVzdWx0T3V0cHV0KTsKLSAgICAgICAgcmVzdWx0LT5maW5pc2hQYXJzaW5nKCk7Ci0gICAg
ICAgIHJlc3VsdC0+c2V0UGFyc2luZyhmYWxzZSk7Ci0gICAgICAgIGlmICh2aWV3KQotICAgICAg
ICAgICAgdmlldy0+cGFydCgpLT5jaGVja0NvbXBsZXRlZCgpOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICByZXN1bHQtPmNsb3NlKCk7IC8vIEZJWE1FOiBFdmVuIHZpZXdsZXNzIGRvY3MgY2Fu
IGxvYWQgc3VicmVzb3VyY2VzLiBvbmxvYWQgd2lsbCBmaXJlIHRvbyBlYXJseS4KLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBYTUxIdHRw
UmVxdWVzdE9iamVjdHMgYXMgd2VsbC4KKyAgICByZXR1cm4gUVN0cmluZzo6ZnJvbUxhdGluMSgi
YXBwbGljYXRpb24veG1sIik7Cit9CisKK2Jvb2wgWFNMVFByb2Nlc3NvckltcGw6OnRyYW5zZm9y
bVRvU3RyaW5nKE5vZGVJbXBsICpzb3VyY2VOb2RlLCBRU3RyaW5nICZtaW1lVHlwZSwgUVN0cmlu
ZyAmcmVzdWx0U3RyaW5nKQoreworICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG93bmVyRG9j
dW1lbnQgPSBzb3VyY2VOb2RlLT5nZXREb2N1bWVudCgpOworICAgIFNoYXJlZFB0cjxYU0xTdHls
ZVNoZWV0SW1wbD4gY2FjaGVkU3R5bGVzaGVldCA9IG1fc3R5bGVzaGVldDsKKyAgICAKKyAgICBz
ZXRYU0xUTG9hZENhbGxCYWNrKHN0eWxlc2hlZXRMb2FkRnVuYywgdGhpcywgb3duZXJEb2N1bWVu
dC0+ZG9jTG9hZGVyKCkpOworICAgIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0ID0geHNsdFN0eWxl
c2hlZXRQb2ludGVyKGNhY2hlZFN0eWxlc2hlZXQsIG1fc3R5bGVzaGVldFJvb3ROb2RlLmdldCgp
KTsKKyAgICBpZiAoIXNoZWV0KSB7CisgICAgICAgIHNldFhTTFRMb2FkQ2FsbEJhY2soMCwgMCwg
MCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICBjYWNoZWRTdHlsZXNoZWV0LT5jbGVhckRvY3VtZW50cygpOworICAgIAorICAgIHhtbERvY1B0
ciBzb3VyY2VEb2MgPSB4bWxEb2NQdHJGcm9tTm9kZShzb3VyY2VOb2RlKTsKKyAgICBjb25zdCBj
aGFyICoqcGFyYW1zID0geHNsdFBhcmFtQXJyYXlGcm9tUURpY3QobV9wYXJhbWV0ZXJzKTsKKyAg
ICB4bWxEb2NQdHIgcmVzdWx0RG9jID0geHNsdEFwcGx5U3R5bGVzaGVldChzaGVldCwgc291cmNl
RG9jLCBwYXJhbXMpOworICAgIGZyZWVYc2x0UGFyYW1BcnJheShwYXJhbXMpOworICAgIAorICAg
IHNldFhTTFRMb2FkQ2FsbEJhY2soMCwgMCwgMCk7CisgICAgCisgICAgaWYgKCFzYXZlUmVzdWx0
VG9TdHJpbmcocmVzdWx0RG9jLCBzaGVldCwgcmVzdWx0U3RyaW5nKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIAorICAgIG1pbWVUeXBlID0gcmVzdWx0TUlNRVR5cGUocmVzdWx0RG9jLCBz
aGVldCk7CisgICAgCisgICAgeHNsdEZyZWVTdHlsZXNoZWV0KHNoZWV0KTsKKyAgICB4bWxGcmVl
RG9jKHJlc3VsdERvYyk7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKK1NoYXJlZFB0cjxE
b2N1bWVudEltcGw+IFhTTFRQcm9jZXNzb3JJbXBsOjp0cmFuc2Zvcm1Ub0RvY3VtZW50KE5vZGVJ
bXBsICpzb3VyY2VOb2RlKQoreworICAgIFFTdHJpbmcgcmVzdWx0TUlNRVR5cGU7CisgICAgUVN0
cmluZyByZXN1bHRTdHJpbmc7CisgICAgaWYgKCF0cmFuc2Zvcm1Ub1N0cmluZyhzb3VyY2VOb2Rl
LCByZXN1bHRNSU1FVHlwZSwgcmVzdWx0U3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShyZXN1bHRTdHJpbmcsIHJlc3VsdE1JTUVU
eXBlLCBzb3VyY2VOb2RlKTsKK30KKworU2hhcmVkUHRyPERvY3VtZW50RnJhZ21lbnRJbXBsPiBY
U0xUUHJvY2Vzc29ySW1wbDo6dHJhbnNmb3JtVG9GcmFnbWVudChOb2RlSW1wbCAqc291cmNlTm9k
ZSwgRG9jdW1lbnRJbXBsICpvdXRwdXREb2MpCit7CisgICAgUVN0cmluZyByZXN1bHRNSU1FVHlw
ZTsKKyAgICBRU3RyaW5nIHJlc3VsdFN0cmluZzsKKyAgICBpZiAoIXRyYW5zZm9ybVRvU3RyaW5n
KHNvdXJjZU5vZGUsIHJlc3VsdE1JTUVUeXBlLCByZXN1bHRTdHJpbmcpKQorICAgICAgICByZXR1
cm4gMDsKKyAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tU291cmNlKHJlc3VsdFN0cmluZywg
cmVzdWx0TUlNRVR5cGUsIHNvdXJjZU5vZGUsIG91dHB1dERvYyk7Cit9CisKK3ZvaWQgWFNMVFBy
b2Nlc3NvckltcGw6OnNldFBhcmFtZXRlcihET01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERP
TVN0cmluZ0ltcGwgKmxvY2FsTmFtZSwgRE9NU3RyaW5nSW1wbCAqdmFsdWUpCit7CisgICAgLy8g
RklYTUU6IG5hbWVzcGFjZSBzdXBwb3J0PworICAgIG1fcGFyYW1ldGVycy5yZXBsYWNlKERPTVN0
cmluZyhsb2NhbE5hbWUpLnFzdHJpbmcoKSwgbmV3IERPTVN0cmluZyh2YWx1ZSkpOworfQorCitT
aGFyZWRQdHI8RE9NU3RyaW5nSW1wbD4gWFNMVFByb2Nlc3NvckltcGw6OmdldFBhcmFtZXRlcihE
T01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmluZ0ltcGwgKmxvY2FsTmFtZSkgY29u
c3QKK3sKKyAgICAvLyBGSVhNRTogbmFtZXNwYWNlIHN1cHBvcnQ/CisgICAgaWYgKERPTVN0cmlu
ZyAqdmFsdWUgPSBtX3BhcmFtZXRlcnMuZmluZChET01TdHJpbmcobG9jYWxOYW1lKS5xc3RyaW5n
KCkpKQorICAgICAgICByZXR1cm4gdmFsdWUtPmltcGwoKTsKKyAgICByZXR1cm4gTlVMTDsKK30K
Kwordm9pZCBYU0xUUHJvY2Vzc29ySW1wbDo6cmVtb3ZlUGFyYW1ldGVyKERPTVN0cmluZ0ltcGwg
Km5hbWVzcGFjZVVSSSwgRE9NU3RyaW5nSW1wbCAqbG9jYWxOYW1lKQoreworICAgIC8vIEZJWE1F
OiBuYW1lc3BhY2Ugc3VwcG9ydD8KKyAgICBtX3BhcmFtZXRlcnMucmVtb3ZlKERPTVN0cmluZyhs
b2NhbE5hbWUpLnFzdHJpbmcoKSk7CiB9CiAKIH0KSW5kZXg6IHhzbC94c2x0X3Byb2Nlc3Nvcmlt
cGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94c2wveHNs
dF9wcm9jZXNzb3JpbXBsLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNApkaWZmIC1wIC11IC1y
MS40IHhzbC94c2x0X3Byb2Nlc3NvcmltcGwuaAotLS0geHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5o
CTEwIE9jdCAyMDA1IDIzOjQ4OjU1IC0wMDAwCTEuNAorKysgeHNsL3hzbHRfcHJvY2Vzc29yaW1w
bC5oCTE4IE9jdCAyMDA1IDEwOjExOjE0IC0wMDAwCkBAIC0yOSwzOCArMjksNzIgQEAKICNpbmNs
dWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CiAKICNpbmNsdWRlIDxsaWJ4c2x0L3RyYW5z
Zm9ybS5oPgorI2luY2x1ZGUgPGxpYnhzbHQvZG9jdW1lbnRzLmg+CiAKICNpbmNsdWRlIDxtaXNj
L3NoYXJlZC5oPgorI2luY2x1ZGUgImRvbV9xbmFtZS5oIgorI2luY2x1ZGUgImRvbV9zdHJpbmdp
bXBsLmgiCisjaW5jbHVkZSAieHNsX3N0eWxlc2hlZXRpbXBsLmgiCisjaW5jbHVkZSA8a3htbGNv
cmUvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHFzdHJpbmcuaD4KIAorc3RhdGljIERPTTo6UXVhbGlm
aWVkTmFtZSBib2d1cygiZGVsZXRlZCIsICJkZWxldGVkIiwgImRlbGV0ZWQiKTsKKworbmFtZXNw
YWNlIEtYTUxDb3JlIHsKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IEhhc2hUcmFpdHM8U2hh
cmVkUHRyPERPTTo6UXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZUltcGw+ID4geworICAgICAg
ICB0eXBlZGVmIFNoYXJlZFB0cjxET006OlF1YWxpZmllZE5hbWU6OlF1YWxpZmllZE5hbWVJbXBs
PiB0cmFpdFR5cGU7CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJc1plcm8g
PSB0cnVlOworICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBpc1BPRCA9IGZhbHNlOworICAgICAg
ICBzdGF0aWMgY29uc3QgYm9vbCBzcGVjaWFsRGVzdHJ1Y3REZWxldGVkID0gZmFsc2U7CisgICAg
ICAgIAorICAgICAgICBzdGF0aWMgdHJhaXRUeXBlIGVtcHR5VmFsdWUoKSB7CisgICAgICAgICAg
ICByZXR1cm4gU2hhcmVkUHRyPERPTTo6UXVhbGlmaWVkTmFtZTo6UXVhbGlmaWVkTmFtZUltcGw+
KCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljIHRyYWl0VHlwZSBkZWxldGVkVmFsdWUoKSB7
CisgICAgICAgICAgICByZXR1cm4gU2hhcmVkUHRyPERPTTo6UXVhbGlmaWVkTmFtZTo6UXVhbGlm
aWVkTmFtZUltcGw+KGJvZ3VzLmltcGwoKSk7CisgICAgICAgIH0KKyAgICB9OworfTsKKwogbmFt
ZXNwYWNlIERPTSB7CiAKLWNsYXNzIFhTTFN0eWxlU2hlZXRJbXBsOworY2xhc3MgTm9kZUltcGw7
CiBjbGFzcyBEb2N1bWVudEltcGw7Ci0gICAgCi1jbGFzcyBYU0xUUHJvY2Vzc29ySW1wbAorY2xh
c3MgRG9jdW1lbnRGcmFnbWVudEltcGw7CisKK2NsYXNzIFhTTFRQcm9jZXNzb3JJbXBsIDogcHVi
bGljIGtodG1sOjpTaGFyZWQ8WFNMVFByb2Nlc3NvckltcGw+CiB7CiBwdWJsaWM6Ci0gICAgLy8g
Q29uc3RydWN0b3JzCi0gICAgWFNMVFByb2Nlc3NvckltcGwoWFNMU3R5bGVTaGVldEltcGwqIHN0
eWxlc2hlZXQsIERvY3VtZW50SW1wbCogc291cmNlKTsKLSAgICB+WFNMVFByb2Nlc3NvckltcGwo
KTsKLSAgICAKLSAgICAvLyBNZXRob2QgZm9yIHRyYW5zZm9ybWluZyBhIHNvdXJjZSBkb2N1bWVu
dCBpbnRvIGEgcmVzdWx0IGRvY3VtZW50LgotICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IHRy
YW5zZm9ybURvY3VtZW50KERvY3VtZW50SW1wbCogc291cmNlRG9jKTsKKyAgICBYU0xUUHJvY2Vz
c29ySW1wbCgpIHsgbV9wYXJhbWV0ZXJzLnNldEF1dG9EZWxldGUodHJ1ZSk7IH07CiAKLSAgICAv
LyBDb252ZXJ0IGEgbGlieG1sIGRvYyBwdHIgdG8gYSBLSFRNTCBET00gRG9jdW1lbnQKLSAgICBT
aGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBkb2N1bWVudEZyb21YTUxEb2NQdHIoeG1sRG9jUHRyIHJl
c3VsdERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQpOworICAgIHZvaWQgc2V0WFNMU3R5bGVz
aGVldChYU0xTdHlsZVNoZWV0SW1wbCAqc3R5bGVTaGVldCkgeyBtX3N0eWxlc2hlZXQgPSBzdHls
ZVNoZWV0OyB9CisgICAgYm9vbCB0cmFuc2Zvcm1Ub1N0cmluZyhOb2RlSW1wbCAqc291cmNlLCBR
U3RyaW5nICZyZXN1bHRNSU1FVHlwZSwgUVN0cmluZyAmcmVzdWx0U3RyaW5nKTsKKyAgICBTaGFy
ZWRQdHI8RG9jdW1lbnRJbXBsPiBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoUVN0cmluZyBzb3Vy
Y2UsIFFTdHJpbmcgc291cmNlTUlNRVR5cGUsIE5vZGVJbXBsICpzb3VyY2VOb2RlLCBLSFRNTFZp
ZXcgKnZpZXcgPSAwKTsKKyAgICAKKyAgICAvLyBET00gbWV0aG9kcworICAgIHZvaWQgaW1wb3J0
U3R5bGVzaGVldChOb2RlSW1wbCAqc3R5bGUpIHsgbV9zdHlsZXNoZWV0Um9vdE5vZGUgPSBzdHls
ZTsgfQorICAgIFNoYXJlZFB0cjxEb2N1bWVudEZyYWdtZW50SW1wbD4gdHJhbnNmb3JtVG9GcmFn
bWVudChOb2RlSW1wbCAqc291cmNlLCBEb2N1bWVudEltcGwgKm91cHV0RG9jKTsKKyAgICBTaGFy
ZWRQdHI8RG9jdW1lbnRJbXBsPiB0cmFuc2Zvcm1Ub0RvY3VtZW50KE5vZGVJbXBsICpzb3VyY2Up
OwogICAgIAotICAgIC8vIEhlbHBlcnMKLSAgICB2b2lkIGFkZFRvUmVzdWx0KGNvbnN0IGNoYXIq
IGJ1ZmZlciwgaW50IGxlbik7CisgICAgdm9pZCBzZXRQYXJhbWV0ZXIoRE9NU3RyaW5nSW1wbCAq
bmFtZXNwYWNlVVJJLCBET01TdHJpbmdJbXBsICpsb2NhbE5hbWUsIERPTVN0cmluZ0ltcGwgKnZh
bHVlKTsKKyAgICBTaGFyZWRQdHI8RE9NU3RyaW5nSW1wbD4gZ2V0UGFyYW1ldGVyKERPTVN0cmlu
Z0ltcGwgKm5hbWVzcGFjZVVSSSwgRE9NU3RyaW5nSW1wbCAqbG9jYWxOYW1lKSBjb25zdDsKKyAg
ICB2b2lkIHJlbW92ZVBhcmFtZXRlcihET01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0
cmluZ0ltcGwgKmxvY2FsTmFtZSk7CisgICAgdm9pZCBjbGVhclBhcmFtZXRlcnMoKSB7IG1fcGFy
YW1ldGVycy5jbGVhcigpOyB9CisKKyAgICB2b2lkIHJlc2V0KCkgeyBtX3N0eWxlc2hlZXQgPSBO
VUxMOyBtX3N0eWxlc2hlZXRSb290Tm9kZSA9IE5VTEw7ICBtX3BhcmFtZXRlcnMuY2xlYXIoKTsg
fQogICAgIAotICAgIFhTTFN0eWxlU2hlZXRJbXBsICpzdHlsZXNoZWV0KCkgeyByZXR1cm4gbV9z
dHlsZXNoZWV0LmdldCgpOyB9Ci0gICAgRG9jdW1lbnRJbXBsICpzb3VyY2VEb2N1bWVudCgpIHsg
cmV0dXJuIG1fc291cmNlRG9jdW1lbnQuZ2V0KCk7IH0KK3B1YmxpYzoKKyAgICAvLyBPbmx5IGZv
ciBsaWJYU0xUIGNhbGxiYWNrcworICAgIFhTTFN0eWxlU2hlZXRJbXBsICp4c2xTdHlsZXNoZWV0
KCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZXNoZWV0LmdldCgpOyB9CiAgICAgCiBwcml2YXRlOgor
ICAgIC8vIENvbnZlcnQgYSBsaWJ4bWwgZG9jIHB0ciB0byBhIEtIVE1MIERPTSBEb2N1bWVudAor
ICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IGRvY3VtZW50RnJvbVhNTERvY1B0cih4bWxEb2NQ
dHIgcmVzdWx0RG9jLCB4c2x0U3R5bGVzaGVldFB0ciBzaGVldCwgRG9jdW1lbnRJbXBsICpvd25l
ckRvY3VtZW50LCBib29sIHNvdXJjZUlzRG9jdW1lbnQpOworCiAgICAgU2hhcmVkUHRyPFhTTFN0
eWxlU2hlZXRJbXBsPiBtX3N0eWxlc2hlZXQ7Ci0gICAgUVN0cmluZyBtX3Jlc3VsdE91dHB1dDsK
LSAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBtX3NvdXJjZURvY3VtZW50OworICAgIFNoYXJl
ZFB0cjxOb2RlSW1wbD4gbV9zdHlsZXNoZWV0Um9vdE5vZGU7CisgICAgUURpY3Q8RE9NU3RyaW5n
PiBtX3BhcmFtZXRlcnM7CiB9OwogCiB9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>4427</attachid>
            <date>2005-10-20 13:40:19 -0700</date>
            <delta_ts>2005-10-26 23:47:32 -0700</delta_ts>
            <desc>Patch for XSLTProcessor support</desc>
            <filename>xslt_processor.patch</filename>
            <type>text/plain</type>
            <size>39192</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sX3BhcnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJD
b3JlL2todG1sL2todG1sX3BhcnQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjM0NgpkaWZm
IC1wIC11IC1yMS4zNDYga2h0bWxfcGFydC5jcHAKLS0tIGtodG1sX3BhcnQuY3BwCTcgT2N0IDIw
MDUgMDE6MjE6NDAgLTAwMDAJMS4zNDYKKysrIGtodG1sX3BhcnQuY3BwCTIwIE9jdCAyMDA1IDIw
OjM2OjQxIC0wMDAwCkBAIC02OTUsMjMgKzY5NSw2IEBAIGJvb2wgS0hUTUxQYXJ0OjpjbG9zZVVS
TCgpCiAgIHJldHVybiB0cnVlOwogfQogCi0jaWYgIUtIVE1MX05PX0NQTFVTUExVU19ET00KLQot
RE9NOjpIVE1MRG9jdW1lbnQgS0hUTUxQYXJ0OjpodG1sRG9jdW1lbnQoKSBjb25zdAotewotICBp
ZiAoZC0+bV9kb2MgJiYgZC0+bV9kb2MtPmlzSFRNTERvY3VtZW50KCkpCi0gICAgcmV0dXJuIHN0
YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwqPihkLT5tX2RvYyk7Ci0gIGVsc2UKLSAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCo+KDApOwotfQotCi1ET006OkRvY3VtZW50
IEtIVE1MUGFydDo6ZG9jdW1lbnQoKSBjb25zdAotewotICAgIHJldHVybiBkLT5tX2RvYzsKLX0K
LQotI2VuZGlmCi0KIEtQYXJ0czo6QnJvd3NlckV4dGVuc2lvbiAqS0hUTUxQYXJ0Ojpicm93c2Vy
RXh0ZW5zaW9uKCkgY29uc3QKIHsKICAgcmV0dXJuIGQtPm1fZXh0ZW5zaW9uOwpAQCAtMTE4OSw4
ICsxMTcyLDEwIEBAIHZvaWQgS0hUTUxQYXJ0OjpyZXBsYWNlRG9jSW1wbChEb2N1bWVudEkKICAg
ICAgICAgICAgIGQtPm1fZG9jLT5kZXJlZigpOwogICAgICAgICB9CiAgICAgICAgIGQtPm1fZG9j
ID0gbmV3RG9jOwotICAgICAgICBpZiAobmV3RG9jKQorICAgICAgICBpZiAobmV3RG9jKSB7CiAg
ICAgICAgICAgICBuZXdEb2MtPnJlZigpOworICAgICAgICAgICAgbmV3RG9jLT5hdHRhY2goKTsK
KyAgICAgICAgfQogICAgIH0KIH0KIApJbmRleDogZWNtYS9YU0xUUHJvY2Vzc29yLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09ClJDUyBmaWxlOiBlY21hL1hTTFRQcm9jZXNzb3IuY3BwCmRpZmYgLU4gZWNtYS9YU0xU
UHJvY2Vzc29yLmNwcAotLS0gZWNtYS9YU0xUUHJvY2Vzc29yLmNwcAkxIEphbiAxOTcwIDAwOjAw
OjAwIC0wMDAwCisrKyBlY21hL1hTTFRQcm9jZXNzb3IuY3BwCTIwIE9jdCAyMDA1IDIwOjM2OjQx
IC0wMDAwCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxl
IENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisKKyNpbmNsdWRlICJYU0xUUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAieHNsdF9w
cm9jZXNzb3JpbXBsLmgiCisjaW5jbHVkZSAiWFNMVFByb2Nlc3Nvci5sdXQuaCIKKyNpbmNsdWRl
ICJranNfZG9tLmgiCisjaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKworI2luY2x1ZGUgPEphdmFT
Y3JpcHRDb3JlL2xvb2t1cC5oPgorCit1c2luZyBuYW1lc3BhY2UgRE9NOworCituYW1lc3BhY2Ug
S0pTIHsKKworY29uc3QgQ2xhc3NJbmZvIFhTTFRQcm9jZXNzb3I6OmluZm8gPSB7ICJYU0xUUHJv
Y2Vzc29yIiwgMCwgMCwgMCB9OworCisvKgorQGJlZ2luIFhTTFRQcm9jZXNzb3JQcm90b1RhYmxl
IDcKKyAgaW1wb3J0U3R5bGVzaGVldCAgICAgIFhTTFRQcm9jZXNzb3I6OkltcG9ydFN0eWxlc2hl
ZXQgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMQorICB0cmFuc2Zvcm1Ub0ZyYWdtZW50ICAgWFNM
VFByb2Nlc3Nvcjo6VHJhbnNmb3JtVG9GcmFnbWVudCAgRG9udERlbGV0ZXxGdW5jdGlvbiAyCisg
IHRyYW5zZm9ybVRvRG9jdW1lbnQgICBYU0xUUHJvY2Vzc29yOjpUcmFuc2Zvcm1Ub0RvY3VtZW50
ICBEb250RGVsZXRlfEZ1bmN0aW9uIDIKKyAgc2V0UGFyYW1ldGVyICAgICAgICAgIFhTTFRQcm9j
ZXNzb3I6OlNldFBhcmFtZXRlciAgICAgICAgIERvbnREZWxldGV8RnVuY3Rpb24gMworICBnZXRQ
YXJhbWV0ZXIgICAgICAgICAgWFNMVFByb2Nlc3Nvcjo6R2V0UGFyYW1ldGVyICAgICAgICAgRG9u
dERlbGV0ZXxGdW5jdGlvbiAyCisgIHJlbW92ZVBhcmFtZXRlciAgICAgICBYU0xUUHJvY2Vzc29y
OjpSZW1vdmVQYXJhbWV0ZXIgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDIKKyAgY2xlYXJQYXJh
bWV0ZXJzICAgICAgIFhTTFRQcm9jZXNzb3I6OkNsZWFyUGFyYW1ldGVycyAgICAgIERvbnREZWxl
dGV8RnVuY3Rpb24gMAorICByZXNldCAgICAgICAgICAgICAgICAgWFNMVFByb2Nlc3Nvcjo6UmVz
ZXQgICAgICAgICAgICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCitAZW5kCisqLworCitERUZJ
TkVfUFJPVE9UWVBFKCJYU0xUUHJvY2Vzc29yIiwgWFNMVFByb2Nlc3NvclByb3RvKQorSU1QTEVN
RU5UX1BST1RPRlVOQyhYU0xUUHJvY2Vzc29yUHJvdG9GdW5jKQorSU1QTEVNRU5UX1BST1RPVFlQ
RShYU0xUUHJvY2Vzc29yUHJvdG8sIFhTTFRQcm9jZXNzb3JQcm90b0Z1bmMpCisKK1hTTFRQcm9j
ZXNzb3I6OlhTTFRQcm9jZXNzb3IoRXhlY1N0YXRlICpleGVjKSA6IG1faW1wbChuZXcgWFNMVFBy
b2Nlc3NvckltcGwoKSkKK3sKKyAgICBzZXRQcm90b3R5cGUoWFNMVFByb2Nlc3NvclByb3RvOjpz
ZWxmKGV4ZWMpKTsKK30KKworWFNMVFByb2Nlc3Nvcjo6flhTTFRQcm9jZXNzb3IoKQoreworICAg
IFNjcmlwdEludGVycHJldGVyOjpmb3JnZXRET01PYmplY3QobV9pbXBsLmdldCgpKTsKK30KKwor
VmFsdWVJbXAgKlhTTFRQcm9jZXNzb3JQcm90b0Z1bmM6OmNhbGxBc0Z1bmN0aW9uKEV4ZWNTdGF0
ZSAqZXhlYywgT2JqZWN0SW1wICp0aGlzT2JqLCBjb25zdCBMaXN0ICZhcmdzKQoreworICAgIGlm
ICghdGhpc09iai0+aW5oZXJpdHMoJktKUzo6WFNMVFByb2Nlc3Nvcjo6aW5mbykpCisgICAgICAg
IHJldHVybiB0aHJvd0Vycm9yKGV4ZWMsIFR5cGVFcnJvcik7CisgICAgWFNMVFByb2Nlc3Nvcklt
cGwgJnByb2Nlc3NvciA9ICpzdGF0aWNfY2FzdDxYU0xUUHJvY2Vzc29yICo+KHRoaXNPYmopLT5p
bXBsKCk7CisgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6Oklt
cG9ydFN0eWxlc2hlZXQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFZhbHVlSW1wICpub2RlVmFs
ID0gYXJnc1swXTsKKyAgICAgICAgICAgIGlmIChub2RlVmFsLT5pc09iamVjdCgmRE9NTm9kZTo6
aW5mbykpIHsKKyAgICAgICAgICAgICAgICBET01Ob2RlICpub2RlID0gc3RhdGljX2Nhc3Q8RE9N
Tm9kZSAqPihub2RlVmFsKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3IuaW1wb3J0U3R5bGVz
aGVldChub2RlLT5pbXBsKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uPworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpUcmFu
c2Zvcm1Ub0ZyYWdtZW50OgorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZUltcCAqbm9kZVZh
bCA9IGFyZ3NbMF07CisgICAgICAgICAgICBWYWx1ZUltcCAqZG9jVmFsID0gYXJnc1sxXTsKKyAg
ICAgICAgICAgIGlmIChub2RlVmFsLT5pc09iamVjdCgmRE9NTm9kZTo6aW5mbykgJiYgZG9jVmFs
LT5pc09iamVjdCgmRE9NRG9jdW1lbnQ6OmluZm8pKSB7CisgICAgICAgICAgICAgICAgRE9NTm9k
ZSAqbm9kZSA9IHN0YXRpY19jYXN0PERPTU5vZGUgKj4obm9kZVZhbCk7CisgICAgICAgICAgICAg
ICAgRE9NRG9jdW1lbnQgKmRvYyA9IHN0YXRpY19jYXN0PERPTURvY3VtZW50ICo+KGRvY1ZhbCk7
CisgICAgICAgICAgICAgICAgRG9jdW1lbnRJbXBsICpkb2NJbXBsID0gc3RhdGljX2Nhc3Q8RG9j
dW1lbnRJbXBsICo+KGRvYy0+aW1wbCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RE9N
Tm9kZShleGVjLCBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudChub2RlLT5pbXBsKCksIGRv
Y0ltcGwpLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRocm93IGV4Y2Vw
dGlvbj8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgWFNMVFBy
b2Nlc3Nvcjo6VHJhbnNmb3JtVG9Eb2N1bWVudDoKKyAgICAgICAgeworICAgICAgICAgICAgVmFs
dWVJbXAgKm5vZGVWYWwgPSBhcmdzWzBdOworICAgICAgICAgICAgaWYgKG5vZGVWYWwtPmlzT2Jq
ZWN0KCZET01Ob2RlOjppbmZvKSkgeworICAgICAgICAgICAgICAgIERPTU5vZGUgKm5vZGUgPSBz
dGF0aWNfY2FzdDxET01Ob2RlICo+KG5vZGVWYWwpOworICAgICAgICAgICAgICAgIFNoYXJlZFB0
cjxEb2N1bWVudEltcGw+IHJlc3VsdERvY3VtZW50ID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9j
dW1lbnQobm9kZS0+aW1wbCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0RG9jdW1lbnQp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRET01Eb2N1bWVudE5vZGUoZXhlYywgcmVz
dWx0RG9jdW1lbnQuZ2V0KCkpOworICAgICAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uPworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpTZXRQ
YXJhbWV0ZXI6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhcmdzWzFdLT5pc1VuZGVmaW5l
ZE9yTnVsbCgpIHx8IGFyZ3NbMl0tPmlzVW5kZWZpbmVkT3JOdWxsKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7IC8vIFRocm93IGV4Y2VwdGlvbj8KKyAgICAgICAgICAg
IERPTVN0cmluZyBuYW1lc3BhY2VVUkkgPSBhcmdzWzBdLT50b1N0cmluZyhleGVjKS5kb21TdHJp
bmcoKTsKKyAgICAgICAgICAgIERPTVN0cmluZyBsb2NhbE5hbWUgPSBhcmdzWzFdLT50b1N0cmlu
ZyhleGVjKS5kb21TdHJpbmcoKTsKKyAgICAgICAgICAgIERPTVN0cmluZyB2YWx1ZSA9IGFyZ3Nb
Ml0tPnRvU3RyaW5nKGV4ZWMpLmRvbVN0cmluZygpOworICAgICAgICAgICAgcHJvY2Vzc29yLnNl
dFBhcmFtZXRlcihuYW1lc3BhY2VVUkkuaW1wbCgpLCBsb2NhbE5hbWUuaW1wbCgpLCB2YWx1ZS5p
bXBsKCkpOworICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAgIH0KKyAg
ICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpHZXRQYXJhbWV0ZXI6CisgICAgICAgIHsKKyAgICAg
ICAgICAgIGlmIChhcmdzWzFdLT5pc1VuZGVmaW5lZE9yTnVsbCgpKQorICAgICAgICAgICAgICAg
IHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAgICAgICAgRE9NU3RyaW5nIG5hbWVzcGFjZVVS
SSA9IGFyZ3NbMF0tPnRvU3RyaW5nKGV4ZWMpLmRvbVN0cmluZygpOworICAgICAgICAgICAgRE9N
U3RyaW5nIGxvY2FsTmFtZSA9IGFyZ3NbMV0tPnRvU3RyaW5nKGV4ZWMpLmRvbVN0cmluZygpOwor
ICAgICAgICAgICAgRE9NU3RyaW5nSW1wbCAqdmFsdWUgPSBwcm9jZXNzb3IuZ2V0UGFyYW1ldGVy
KG5hbWVzcGFjZVVSSS5pbXBsKCksIGxvY2FsTmFtZS5pbXBsKCkpLmdldCgpOworICAgICAgICAg
ICAgaWYgKHZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiBqc1N0cmluZyhVU3RyaW5nKHZh
bHVlKSk7CisgICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6OlJlbW92ZVBhcmFtZXRlcjoKKyAgICAgICAgeworICAg
ICAgICAgICAgaWYgKGFyZ3NbMV0tPmlzVW5kZWZpbmVkT3JOdWxsKCkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAgICAgICBET01TdHJpbmcgbmFtZXNwYWNl
VVJJID0gYXJnc1swXS0+dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBE
T01TdHJpbmcgbG9jYWxOYW1lID0gYXJnc1sxXS0+dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7
CisgICAgICAgICAgICBwcm9jZXNzb3IucmVtb3ZlUGFyYW1ldGVyKG5hbWVzcGFjZVVSSS5pbXBs
KCksIGxvY2FsTmFtZS5pbXBsKCkpOworICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7
CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpDbGVhclBhcmFtZXRlcnM6
CisgICAgICAgICAgICBwcm9jZXNzb3IuY2xlYXJQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBy
ZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpSZXNldDoK
KyAgICAgICAgICAgIHByb2Nlc3Nvci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIGpzVW5k
ZWZpbmVkKCk7CisgICAgfQorICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworfQorCit9OworCklu
ZGV4OiBlY21hL1hTTFRQcm9jZXNzb3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBlY21hL1hTTFRQ
cm9jZXNzb3IuaApkaWZmIC1OIGVjbWEvWFNMVFByb2Nlc3Nvci5oCi0tLSBlY21hL1hTTFRQcm9j
ZXNzb3IuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBlY21hL1hTTFRQcm9jZXNzb3Iu
aAkyMCBPY3QgMjAwNSAyMDozNjo0MSAtMDAwMApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaWZuZGVmIFhTTFRQcm9jZXNzb3JfSAorI2RlZmluZSBYU0xUUHJvY2Vzc29y
X0gKKworI2luY2x1ZGUgPGt4bWxjb3JlL1NoYXJlZFB0ci5oPgorI2luY2x1ZGUgImtqc19iaW5k
aW5nLmgiCisKK25hbWVzcGFjZSBET00geworICAgIGNsYXNzIFhTTFRQcm9jZXNzb3JJbXBsOwor
fTsKKworLy8gRXZlbnR1YWxseSB3ZSBzaG91bGQgaW1wbGVtZW50IFhTTFRFeGNlcHRpb246Cisv
LyBodHRwOi8vbHhyLm1vemlsbGEub3JnL3NlYW1vbmtleS9zb3VyY2UvY29udGVudC94c2wvcHVi
bGljL25zSVhTTFRFeGNlcHRpb24uaWRsCisvLyBodHRwOi8vYnVnemlsbGEub3BlbmRhcndpbi5v
cmcvc2hvd19idWcuY2dpP2lkPTU0NDYKKworbmFtZXNwYWNlIEtKUyB7CisKK2NsYXNzIFhTTFRQ
cm9jZXNzb3IgOiBwdWJsaWMgRE9NT2JqZWN0IHsKK3B1YmxpYzoKKyAgICBYU0xUUHJvY2Vzc29y
KEV4ZWNTdGF0ZSAqZXhlYyk7CisgICAgflhTTFRQcm9jZXNzb3IoKTsKKyAgICAKKyAgICB2aXJ0
dWFsIGNvbnN0IENsYXNzSW5mbyAqY2xhc3NJbmZvKCkgY29uc3QgeyByZXR1cm4gJmluZm87IH0K
KyAgICBzdGF0aWMgY29uc3QgQ2xhc3NJbmZvIGluZm87CisgICAgCisgICAgZW51bSB7IEltcG9y
dFN0eWxlc2hlZXQsIFRyYW5zZm9ybVRvRnJhZ21lbnQsIFRyYW5zZm9ybVRvRG9jdW1lbnQsIFNl
dFBhcmFtZXRlciwKKyAgICAgICAgICAgIEdldFBhcmFtZXRlciwgUmVtb3ZlUGFyYW1ldGVyLCBD
bGVhclBhcmFtZXRlcnMsIFJlc2V0IH07CisgICAgCisgICAgRE9NOjpYU0xUUHJvY2Vzc29ySW1w
bCAqaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbC5nZXQoKTsgfQorcHJpdmF0ZToKKyAgICBT
aGFyZWRQdHI8RE9NOjpYU0xUUHJvY2Vzc29ySW1wbD4gbV9pbXBsOworfTsKKworY2xhc3MgWFNM
VFByb2Nlc3NvckNvbnN0cnVjdG9ySW1wIDogcHVibGljIE9iamVjdEltcCB7CitwdWJsaWM6Cisg
ICAgWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9ySW1wKEV4ZWNTdGF0ZSAqKSA6IE9iamVjdEltcCgp
IHsgfQorICAgIHZpcnR1YWwgYm9vbCBpbXBsZW1lbnRzQ29uc3RydWN0KCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgT2JqZWN0SW1wICpjb25zdHJ1Y3QoRXhlY1N0YXRlICpl
eGVjLCBjb25zdCBMaXN0ICZhcmdzKSB7IHJldHVybiBuZXcgWFNMVFByb2Nlc3NvcihleGVjKTsg
fQorfTsKKworfTsKKworI2VuZGlmCkluZGV4OiBlY21hL2tqc193aW5kb3cuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL2VjbWEva2pzX3dpbmRvdy5jcHAs
dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTgzCmRpZmYgLXAgLXUgLXIxLjE4MyBlY21hL2tqc193
aW5kb3cuY3BwCi0tLSBlY21hL2tqc193aW5kb3cuY3BwCTExIE9jdCAyMDA1IDA2OjU1OjI5IC0w
MDAwCTEuMTgzCisrKyBlY21hL2tqc193aW5kb3cuY3BwCTIwIE9jdCAyMDA1IDIwOjM2OjQxIC0w
MDAwCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAia2pzX2V2ZW50cy5oIgogI2luY2x1ZGUg
InhtbGh0dHByZXF1ZXN0LmgiCiAjaW5jbHVkZSAieG1sc2VyaWFsaXplci5oIgorI2luY2x1ZGUg
IlhTTFRQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJkb21wYXJzZXIuaCIKIAogI2luY2x1ZGUgImto
dG1sdmlldy5oIgpAQCAtMjEyLDcgKzIxMyw3IEBAIFZhbHVlSW1wICpTY3JlZW46OmdldFZhbHVl
UHJvcGVydHkoRXhlY1MKIGNvbnN0IENsYXNzSW5mbyBXaW5kb3c6OmluZm8gPSB7ICJXaW5kb3ci
LCAwLCAmV2luZG93VGFibGUsIDAgfTsKIAogLyoKLUBiZWdpbiBXaW5kb3dUYWJsZSA5MQorQGJl
Z2luIFdpbmRvd1RhYmxlIDEwMwogICBjbG9zZWQJV2luZG93OjpDbG9zZWQJCURvbnREZWxldGV8
UmVhZE9ubHkKICAgY3J5cHRvCVdpbmRvdzo6Q3J5cHRvCQlEb250RGVsZXRlfFJlYWRPbmx5CiAg
IGRlZmF1bHRTdGF0dXMJV2luZG93OjpEZWZhdWx0U3RhdHVzCURvbnREZWxldGUKQEAgLTI3MCw2
ICsyNzEsNyBAQCBjb25zdCBDbGFzc0luZm8gV2luZG93OjppbmZvID0geyAiV2luZG93CiAgIFhN
TEh0dHBSZXF1ZXN0CVdpbmRvdzo6WE1MSHR0cFJlcXVlc3QJRG9udERlbGV0ZXxSZWFkT25seQog
ICBYTUxTZXJpYWxpemVyCVdpbmRvdzo6WE1MU2VyaWFsaXplcglEb250RGVsZXRlfFJlYWRPbmx5
CiAgIERPTVBhcnNlcglXaW5kb3c6OkRPTVBhcnNlcglEb250RGVsZXRlfFJlYWRPbmx5CisgIFhT
TFRQcm9jZXNzb3IJV2luZG93OjpYU0xUUHJvY2Vzc29yCURvbnREZWxldGV8UmVhZE9ubHkKICAg
YWxlcnQJCVdpbmRvdzo6QWxlcnQJCURvbnREZWxldGV8RnVuY3Rpb24gMQogICBjb25maXJtCVdp
bmRvdzo6Q29uZmlybQkJRG9udERlbGV0ZXxGdW5jdGlvbiAxCiAgIHByb21wdAlXaW5kb3c6OlBy
b21wdAkJRG9udERlbGV0ZXxGdW5jdGlvbiAyCkBAIC04NjYsNiArODY4LDggQEAgVmFsdWVJbXAg
KldpbmRvdzo6Z2V0VmFsdWVQcm9wZXJ0eShFeGVjUwogICAgICAgcmV0dXJuIG5ldyBYTUxTZXJp
YWxpemVyQ29uc3RydWN0b3JJbXAoZXhlYyk7CiAgICAgY2FzZSBET01QYXJzZXI6CiAgICAgICBy
ZXR1cm4gbmV3IERPTVBhcnNlckNvbnN0cnVjdG9ySW1wKGV4ZWMsIG1fcGFydC0+eG1sRG9jSW1w
bCgpKTsKKyAgICBjYXNlIFhTTFRQcm9jZXNzb3I6CisgICAgICByZXR1cm4gbmV3IFhTTFRQcm9j
ZXNzb3JDb25zdHJ1Y3RvckltcChleGVjKTsKICAgICBjYXNlIEZyYW1lRWxlbWVudDoKICAgICAg
IGlmIChEb2N1bWVudEltcGwgKmRvYyA9IG1fcGFydC0+eG1sRG9jSW1wbCgpKQogICAgICAgICBp
ZiAoRWxlbWVudEltcGwgKmZlID0gZG9jLT5vd25lckVsZW1lbnQoKSkKSW5kZXg6IGVjbWEva2pz
X3dpbmRvdy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL2Vj
bWEva2pzX3dpbmRvdy5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjUzCmRpZmYgLXAgLXUgLXIx
LjUzIGVjbWEva2pzX3dpbmRvdy5oCi0tLSBlY21hL2tqc193aW5kb3cuaAkxOSBTZXAgMjAwNSAx
ODo1MjoxMSAtMDAwMAkxLjUzCisrKyBlY21hL2tqc193aW5kb3cuaAkyMCBPY3QgMjAwNSAyMDoz
Njo0MSAtMDAwMApAQCAtMTQ2LDcgKzE0Niw4IEBAIG5hbWVzcGFjZSBLSlMgewogICAgICAgICAg
ICBTY3JvbGxUbywgU2Nyb2xsWCwgU2Nyb2xsWSwgTW92ZUJ5LCBNb3ZlVG8sIFJlc2l6ZUJ5LCBS
ZXNpemVUbywgU2VsZiwgX1dpbmRvdywgVG9wLCBfU2NyZWVuLAogICAgICAgICAgICBJbWFnZSwg
T3B0aW9uLCBBbGVydCwgQ29uZmlybSwgUHJvbXB0LCBPcGVuLCBQcmludCwgU2V0VGltZW91dCwg
Q2xlYXJUaW1lb3V0LAogICAgICAgICAgICBGb2N1cywgR2V0U2VsZWN0aW9uLCBCbHVyLCBDbG9z
ZSwgU2V0SW50ZXJ2YWwsIENsZWFySW50ZXJ2YWwsIENhcHR1cmVFdmVudHMsIAotICAgICAgICAg
ICBSZWxlYXNlRXZlbnRzLCBBZGRFdmVudExpc3RlbmVyLCBSZW1vdmVFdmVudExpc3RlbmVyLCBY
TUxIdHRwUmVxdWVzdCwgWE1MU2VyaWFsaXplciwgRE9NUGFyc2VyLAorICAgICAgICAgICBSZWxl
YXNlRXZlbnRzLCBBZGRFdmVudExpc3RlbmVyLCBSZW1vdmVFdmVudExpc3RlbmVyLAorICAgICAg
ICAgICBYTUxIdHRwUmVxdWVzdCwgWE1MU2VyaWFsaXplciwgRE9NUGFyc2VyLCBYU0xUUHJvY2Vz
c29yLAogCSAgIE9uYWJvcnQsIE9uYmx1ciwgT25jaGFuZ2UsIE9uY2xpY2ssIE9uZGJsY2xpY2ss
IE9uZHJhZ2Ryb3AsIE9uZXJyb3IsIAogCSAgIE9uZm9jdXMsIE9ua2V5ZG93biwgT25rZXlwcmVz
cywgT25rZXl1cCwgT25sb2FkLCBPbm1vdXNlZG93biwgT25tb3VzZW1vdmUsCiAgICAgICAgICAg
IE9ubW91c2VvdXQsIE9ubW91c2VvdmVyLCBPbm1vdXNldXAsIE9uV2luZG93TW91c2VXaGVlbCwg
T25tb3ZlLCBPbnJlc2V0LCBPbnJlc2l6ZSwgT25zY3JvbGwsIE9uc2VhcmNoLApJbmRleDogeG1s
L2RvbV9kb2NpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9r
aHRtbC94bWwvZG9tX2RvY2ltcGwuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjI2MApkaWZm
IC1wIC11IC1yMS4yNjAgeG1sL2RvbV9kb2NpbXBsLmNwcAotLS0geG1sL2RvbV9kb2NpbXBsLmNw
cAkxMCBPY3QgMjAwNSAyMzo0ODo1MyAtMDAwMAkxLjI2MAorKysgeG1sL2RvbV9kb2NpbXBsLmNw
cAkyMCBPY3QgMjAwNSAyMDozNjo0MSAtMDAwMApAQCAtMzA0LDcgKzMwNCw3IEBAIERvY3VtZW50
SW1wbDo6RG9jdW1lbnRJbXBsKERPTUltcGxlbWVudGEKICAgICAgICwgbV9iaW5kaW5nTWFuYWdl
cihuZXcgWEJMQmluZGluZ01hbmFnZXIodGhpcykpCiAjZW5kaWYKICNpZmRlZiBLSFRNTF9YU0xU
Ci0gICAgLCBtX3RyYW5zZm9ybVNvdXJjZShOVUxMKQorICAgICwgbV90cmFuc2Zvcm1Tb3VyY2Uo
MCkKICAgICAsIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoMCkKICNlbmRpZgogI2lmIEFQUExF
X0NIQU5HRVMKQEAgLTQ2MCw4ICs0NjAsNiBAQCBEb2N1bWVudEltcGw6On5Eb2N1bWVudEltcGwo
KQogCiAjaWZkZWYgS0hUTUxfWFNMVAogICAgIHhtbEZyZWVEb2MoKHhtbERvY1B0ciltX3RyYW5z
Zm9ybVNvdXJjZSk7Ci0gICAgaWYgKG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQpCi0gICAgICAg
IG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQtPmRlcmVmKCk7CiAjZW5kaWYKIAogI2lmbmRlZiBL
SFRNTF9OT19YQkwKQEAgLTI3MjUsNiArMjcyMyw4IEBAIGJvb2wgRG9jdW1lbnRJbXBsOjpzaG91
bGRDcmVhdGVSZW5kZXJlcnMKIERPTVN0cmluZyBEb2N1bWVudEltcGw6OnRvU3RyaW5nKCkgY29u
c3QKIHsKICAgICBET01TdHJpbmcgcmVzdWx0OworICAgIAorICAgIHJlc3VsdCArPSBtX2RvY3R5
cGUtPnRvU3RyaW5nKCk7CiAKICAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQo
KTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogCXJlc3Vs
dCArPSBjaGlsZC0+dG9TdHJpbmcoKTsKQEAgLTMwMjMsMjAgKzMwMjMsMTUgQEAgdm9pZCBEb2N1
bWVudEltcGw6OnNoaWZ0TWFya2VycyhOb2RlSW1wbAogCiB2b2lkIERvY3VtZW50SW1wbDo6YXBw
bHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCogcGkpCiB7Ci0gICAgLy8g
RklYTUU6IEJlIHN1cmUgdG8gY2hhbmdlIHRoaXMgbmV4dCBsaW5lIHRvIHVzZSBhIFNoYXJlZFB0
ciBpbnN0ZWFkIG9mIGEgc3RhY2stYWxsb2NhdGVkCi0gICAgLy8gb2JqZWN0IG9uY2UgWFNMVFBy
b2Nlc3NvckltcGwgZ2V0cyBhIHJlZiBjb3VudC4KLSAgICBYU0xUUHJvY2Vzc29ySW1wbCBwcm9j
ZXNzb3Ioc3RhdGljX2Nhc3Q8WFNMU3R5bGVTaGVldEltcGwqPihwaS0+c2hlZXQoKSksIHRoaXMp
OwotICAgIHByb2Nlc3Nvci50cmFuc2Zvcm1Eb2N1bWVudCh0aGlzKTsKKyAgICBTaGFyZWRQdHI8
WFNMVFByb2Nlc3NvckltcGw+IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29ySW1wbCgpOwor
ICAgIHByb2Nlc3Nvci0+c2V0WFNMU3R5bGVzaGVldChzdGF0aWNfY2FzdDxYU0xTdHlsZVNoZWV0
SW1wbCo+KHBpLT5zaGVldCgpKSk7CisgICAgCisgICAgUVN0cmluZyByZXN1bHRNSU1FVHlwZTsK
KyAgICBRU3RyaW5nIG5ld1NvdXJjZTsKKyAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9T
dHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1NvdXJjZSkpCisgICAgICAgIHJldHVybjsK
ICAgICAvLyBGSVhNRTogSWYgdGhlIHRyYW5zZm9ybSBmYWlsZWQgd2Ugc2hvdWxkIHByb2JhYmx5
IHJlcG9ydCBhbiBlcnJvciAobGlrZSBNb3ppbGxhIGRvZXMpLgotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6c2V0VHJhbnNmb3JtU291cmNlRG9jdW1lbnQoRG9jdW1lbnRJbXBsKiBkb2MpCi17IAot
ICAgIGlmIChkb2MpCi0gICAgICAgIGRvYy0+cmVmKCk7Ci0gICAgaWYgKG1fdHJhbnNmb3JtU291
cmNlRG9jdW1lbnQpCi0gICAgICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQtPmRlcmVmKCk7
IAotICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBkb2M7CisgICAgcHJvY2Vzc29yLT5j
cmVhdGVEb2N1bWVudEZyb21Tb3VyY2UobmV3U291cmNlLCByZXN1bHRNSU1FVHlwZSwgdGhpcywg
dmlldygpKTsKIH0KIAogI2VuZGlmCkluZGV4OiB4bWwvZG9tX2RvY2ltcGwuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94bWwvZG9tX2RvY2ltcGwuaCx2CnJl
dHJpZXZpbmcgcmV2aXNpb24gMS4xMzAKZGlmZiAtcCAtdSAtcjEuMTMwIHhtbC9kb21fZG9jaW1w
bC5oCi0tLSB4bWwvZG9tX2RvY2ltcGwuaAk1IE9jdCAyMDA1IDEwOjMxOjEyIC0wMDAwCTEuMTMw
CisrKyB4bWwvZG9tX2RvY2ltcGwuaAkyMCBPY3QgMjAwNSAyMDozNjo0MiAtMDAwMApAQCAtNTY3
LDggKzU2Nyw4IEBAIHB1YmxpYzoKICAgICB2b2lkIGFwcGx5WFNMVHJhbnNmb3JtKFByb2Nlc3Np
bmdJbnN0cnVjdGlvbkltcGwqIHBpKTsKICAgICB2b2lkIHNldFRyYW5zZm9ybVNvdXJjZSh2b2lk
KiBkb2MpIHsgbV90cmFuc2Zvcm1Tb3VyY2UgPSBkb2M7IH0KICAgICBjb25zdCB2b2lkKiB0cmFu
c2Zvcm1Tb3VyY2UoKSB7IHJldHVybiBtX3RyYW5zZm9ybVNvdXJjZTsgfQotICAgIERvY3VtZW50
SW1wbCogdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoKSB7IHJldHVybiBtX3RyYW5zZm9ybVNvdXJj
ZURvY3VtZW50OyB9Ci0gICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1bWVudChEb2N1bWVu
dEltcGwqIGRvYyk7CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gdHJhbnNmb3JtU291cmNl
RG9jdW1lbnQoKSB7IHJldHVybiBtX3RyYW5zZm9ybVNvdXJjZURvY3VtZW50OyB9CisgICAgdm9p
ZCBzZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1bWVudChEb2N1bWVudEltcGwgKmRvYykgeyBtX3RyYW5z
Zm9ybVNvdXJjZURvY3VtZW50ID0gZG9jOyB9CiAjZW5kaWYKIAogI2lmbmRlZiBLSFRNTF9OT19Y
QkwKQEAgLTY4OSw4ICs2ODksOCBAQCBwcm90ZWN0ZWQ6CiAgICAgYm9vbCBtX292ZXJNaW5pbXVt
TGF5b3V0VGhyZXNob2xkOwogICAgIAogI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB2b2lkKiBtX3Ry
YW5zZm9ybVNvdXJjZTsKLSAgICBEb2N1bWVudEltcGwqIG1fdHJhbnNmb3JtU291cmNlRG9jdW1l
bnQ7CisgICAgdm9pZCAqbV90cmFuc2Zvcm1Tb3VyY2U7CisgICAgU2hhcmVkUHRyPERvY3VtZW50
SW1wbD4gbV90cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudDsKICNlbmRpZgogCiAjaWZuZGVmIEtIVE1M
X05PX1hCTApJbmRleDogeG1sL3htbF90b2tlbml6ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6
IC9jdnMvcm9vdC9XZWJDb3JlL2todG1sL3htbC94bWxfdG9rZW5pemVyLmNwcCx2CnJldHJpZXZp
bmcgcmV2aXNpb24gMS40NQpkaWZmIC1wIC11IC1yMS40NSB4bWwveG1sX3Rva2VuaXplci5jcHAK
LS0tIHhtbC94bWxfdG9rZW5pemVyLmNwcAkxMCBPY3QgMjAwNSAyMzo0ODo1NCAtMDAwMAkxLjQ1
CisrKyB4bWwveG1sX3Rva2VuaXplci5jcHAJMjAgT2N0IDIwMDUgMjA6MzY6NDIgLTAwMDAKQEAg
LTc4MiwyMCArNzgyLDI1IEBAIGJvb2wgWE1MVG9rZW5pemVyOjppc1dhaXRpbmdGb3JTY3JpcHRz
KCkKIH0KIAogI2lmZGVmIEtIVE1MX1hTTFQKLXZvaWQgWE1MVG9rZW5pemVyOjpzZXRUcmFuc2Zv
cm1Tb3VyY2UoRG9jdW1lbnRJbXBsKiBkb2MpCit2b2lkICp4bWxEb2NQdHJGb3JTdHJpbmcoY29u
c3QgUVN0cmluZyAmc291cmNlLCBRU3RyaW5nIHVybCkKIHsKLSAgICAvLyBUaW1lIHRvIHNwaW4g
dXAgYSBuZXcgcGFyc2UgYW5kIHNhdmUgdGhlIHhtbERvY1B0ci4KICAgICAvLyBQYXJzZSBpbiBh
IHNpbmdsZSBjaHVuayBpbnRvIGFuIHhtbERvY1B0cgogICAgIC8vIEZJWE1FOiBIb29rIHVwIGVy
cm9yIGhhbmRsZXJzIHNvIHRoYXQgYSBmYWlsdXJlIHRvIHBhcnNlIHRoZSBtYWluIGRvY3VtZW50
IHJlc3VsdHMgaW4KICAgICAvLyBnb29kIGVycm9yIG1lc3NhZ2VzLgogICAgIGNvbnN0IFFDaGFy
IEJPTSgweEZFRkYpOwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgQk9NSGlnaEJ5dGUgPSAqcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KCZCT00pOwotICAgIHhtbERvY1B0
ciBzb3VyY2VEb2MgPSB4bWxSZWFkTWVtb3J5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAq
PihtX3htbENvZGUudW5pY29kZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtX3htbENvZGUubGVuZ3RoKCkgKiBzaXplb2YoUUNoYXIpLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYy0+VVJMKCkuYXNjaWkoKSwKKyAgICB4bWxE
b2NQdHIgc291cmNlRG9jID0geG1sUmVhZE1lbW9yeShyZWludGVycHJldF9jYXN0PGNvbnN0IGNo
YXIgKj4oc291cmNlLnVuaWNvZGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgc291cmNlLmxlbmd0aCgpICogc2l6ZW9mKFFDaGFyKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwuYXNjaWkoKSwKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBCT01IaWdoQnl0ZSA9PSAweEZGID8gIlVURi0xNkxFIiA6
ICJVVEYtMTZCRSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhN
TF9QQVJTRV9OT0NEQVRBfFhNTF9QQVJTRV9EVERBVFRSfFhNTF9QQVJTRV9OT0VOVCk7Ci0gICAg
ZG9jLT5zZXRUcmFuc2Zvcm1Tb3VyY2Uoc291cmNlRG9jKTsKKyAgICByZXR1cm4gc291cmNlRG9j
OworfQorCit2b2lkIFhNTFRva2VuaXplcjo6c2V0VHJhbnNmb3JtU291cmNlKERvY3VtZW50SW1w
bCAqZG9jKQoreworICAgIC8vIFRpbWUgdG8gc3BpbiB1cCBhIG5ldyBwYXJzZSBhbmQgc2F2ZSB0
aGUgeG1sRG9jUHRyLgorICAgIGRvYy0+c2V0VHJhbnNmb3JtU291cmNlKHhtbERvY1B0ckZvclN0
cmluZyhtX3htbENvZGUsIGRvYy0+VVJMKCkpKTsKIH0KICNlbmRpZgogCkluZGV4OiB4bWwveG1s
X3Rva2VuaXplci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJDb3JlL2todG1s
L3htbC94bWxfdG9rZW5pemVyLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMTgKZGlmZiAtcCAt
dSAtcjEuMTggeG1sL3htbF90b2tlbml6ZXIuaAotLS0geG1sL3htbF90b2tlbml6ZXIuaAkxOSBB
dWcgMjAwNSAxNjoyNzowMSAtMDAwMAkxLjE4CisrKyB4bWwveG1sX3Rva2VuaXplci5oCTIwIE9j
dCAyMDA1IDIwOjM2OjQyIC0wMDAwCkBAIC04NSw2ICs4NSw5IEBAIHByaXZhdGU6CiB9OwogCiBU
b2tlbml6ZXIgKm5ld1hNTFRva2VuaXplcihET006OkRvY3VtZW50UHRyICosIEtIVE1MVmlldyAq
ID0gMCk7CisjaWZkZWYgS0hUTUxfWFNMVAordm9pZCAqeG1sRG9jUHRyRm9yU3RyaW5nKGNvbnN0
IFFTdHJpbmcgJnNvdXJjZSwgUVN0cmluZyB1cmwgPSBRU3RyaW5nKCkpOworI2VuZGlmCiBRTWFw
PFFTdHJpbmcsIFFTdHJpbmc+IHBhcnNlQXR0cmlidXRlcyhjb25zdCBET006OkRPTVN0cmluZyAm
LCBib29sICZhdHRyc09LKTsKIGJvb2wgcGFyc2VYTUxEb2N1bWVudEZyYWdtZW50KGNvbnN0IERP
TTo6RE9NU3RyaW5nICYsIERPTTo6RG9jdW1lbnRGcmFnbWVudEltcGwgKiwgRE9NOjpFbGVtZW50
SW1wbCAqcGFyZW50ID0gMCk7CiB9CkluZGV4OiB4c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94c2wveHNsdF9wcm9j
ZXNzb3JpbXBsLmNwcCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC1wIC11IC1yMS4x
MyB4c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcAotLS0geHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5j
cHAJMTAgT2N0IDIwMDUgMjM6NDg6NTUgLTAwMDAJMS4xMworKysgeHNsL3hzbHRfcHJvY2Vzc29y
aW1wbC5jcHAJMjAgT2N0IDIwMDUgMjA6MzY6NDIgLTAwMDAKQEAgLTI0LDggKzI0LDExIEBACiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAieHNsdF9wcm9jZXNzb3JpbXBsLmgiCiAjaW5j
bHVkZSAieHNsX3N0eWxlc2hlZXRpbXBsLmgiCisjaW5jbHVkZSAieG1sX3Rva2VuaXplci5oIgor
I2luY2x1ZGUgImh0bWx0b2tlbml6ZXIuaCIKICNpbmNsdWRlICJodG1sX2RvY3VtZW50aW1wbC5o
IgogI2luY2x1ZGUgImxvYWRlci5oIgorI2luY2x1ZGUgIm1hcmt1cC5oIgogI2luY2x1ZGUgImto
dG1sdmlldy5oIgogI2luY2x1ZGUgImtodG1sX3BhcnQuaCIKICNpbmNsdWRlICJLV1FMb2FkZXIu
aCIKQEAgLTM2LDI3ICszOSwyOCBAQAogI2luY2x1ZGUgPGxpYnhzbHQvZG9jdW1lbnRzLmg+CiAj
aW5jbHVkZSA8bGlieHNsdC9pbXBvcnRzLmg+CiAKKyNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRp
b25zLmg+CisKIHVzaW5nIG5hbWVzcGFjZSBraHRtbDsKIHVzaW5nIG5hbWVzcGFjZSBET007CiAK
IG5hbWVzcGFjZSBET00gewotICAgIAotWFNMVFByb2Nlc3NvckltcGw6OlhTTFRQcm9jZXNzb3JJ
bXBsKFhTTFN0eWxlU2hlZXRJbXBsKiBzaGVldCwgRG9jdW1lbnRJbXBsKiBzb3VyY2UpCi0gICAg
OiBtX3N0eWxlc2hlZXQoc2hlZXQpLCBtX3NvdXJjZURvY3VtZW50KHNvdXJjZSkKLXsKLX0KLQot
WFNMVFByb2Nlc3NvckltcGw6On5YU0xUUHJvY2Vzc29ySW1wbCgpCi17Ci19CiAKIHN0YXRpYyB2
b2lkIHBhcnNlRXJyb3JGdW5jKHZvaWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewog
ICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBuaWNlIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMg
c29tZXdoZXJlLgorICAgIGNoYXIgKmVycm9yTWVzc2FnZSA9IDA7CisgICAgdmFfbGlzdCBhcmdz
OworICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisgICAgdmFzcHJpbnRmKCZlcnJvck1lc3NhZ2Us
IG1zZywgYXJncyk7CisgICAgRVJST1IoZXJyb3JNZXNzYWdlKTsKKyAgICB2YV9lbmQoYXJncyk7
CiB9CiAKKy8vIEZJWE1FOiBUaGVyZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gY29udHJvbCB0aGUg
Y3R4dCBwb2ludGVyIGZvciBsb2FkaW5nIGhlcmUsIHRodXMgd2UgaGF2ZSBnbG9iYWxzLgogc3Rh
dGljIFhTTFRQcm9jZXNzb3JJbXBsICpnbG9iYWxQcm9jZXNzb3IgPSAwOwotc3RhdGljIHhtbERv
Y1B0ciBzdHlsZXNoZWV0TG9hZEZ1bmMoY29uc3QgeG1sQ2hhciogdXJpLAorc3RhdGljIGtodG1s
OjpEb2NMb2FkZXIgKmdsb2JhbERvY0xvYWRlciA9IDA7CitzdGF0aWMgeG1sRG9jUHRyIHN0eWxl
c2hlZXRMb2FkRnVuYyhjb25zdCB4bWxDaGFyICp1cmksCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB4bWxEaWN0UHRyIGRpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBpbnQgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZvaWQqIGN0eHQsCkBAIC03Nyw3ICs4MSw3IEBAIHN0YXRpYyB4bWxEb2NQdHIgc3R5bGVz
aGVldExvYWRGdW5jKGNvbnMKICAgICAgICAgICAgIHZvaWQgKm9sZEVycm9yQ29udGV4dCA9IHht
bEdlbmVyaWNFcnJvckNvbnRleHQ7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGRhdGEgPSBL
V1FTZXJ2ZVN5bmNocm9ub3VzUmVxdWVzdChraHRtbDo6Q2FjaGU6OmxvYWRlcigpLCAKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9jZXNzb3It
PnNvdXJjZURvY3VtZW50KCktPmRvY0xvYWRlcigpLCBqb2IsIGZpbmFsVVJMLCBoZWFkZXJzKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxEb2NM
b2FkZXIsIGpvYiwgZmluYWxVUkwsIGhlYWRlcnMpOwogICAgICAgICAKICAgICAgICAgICAgIHht
bFNldEdlbmVyaWNFcnJvckZ1bmMoMCwgcGFyc2VFcnJvckZ1bmMpOwogICAgICAgICAgICAgLy8g
V2UgZG9uJ3Qgc3BlY2lmeSBhbiBlbmNvZGluZyBoZXJlLiBOZWl0aGVyIEdlY2tvIG5vciBXaW5J
RSByZXNwZWN0cwpAQCAtODcsNyArOTEsNyBAQCBzdGF0aWMgeG1sRG9jUHRyIHN0eWxlc2hlZXRM
b2FkRnVuYyhjb25zCiAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICB9CiAgICAgICAg
IGNhc2UgWFNMVF9MT0FEX1NUWUxFU0hFRVQ6Ci0gICAgICAgICAgICByZXR1cm4gZ2xvYmFsUHJv
Y2Vzc29yLT5zdHlsZXNoZWV0KCktPmxvY2F0ZVN0eWxlc2hlZXRTdWJSZXNvdXJjZSgoKHhzbHRT
dHlsZXNoZWV0UHRyKWN0eHQpLT5kb2MsIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gZ2xvYmFs
UHJvY2Vzc29yLT54c2xTdHlsZXNoZWV0KCktPmxvY2F0ZVN0eWxlc2hlZXRTdWJSZXNvdXJjZSgo
KHhzbHRTdHlsZXNoZWV0UHRyKWN0eHQpLT5kb2MsIHVyaSk7CiAgICAgICAgIGRlZmF1bHQ6CiAg
ICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC05NSwxMjAgKzk5LDI1NSBAQCBzdGF0aWMgeG1s
RG9jUHRyIHN0eWxlc2hlZXRMb2FkRnVuYyhjb25zCiAgICAgcmV0dXJuIDA7CiB9CiAKLVNoYXJl
ZFB0cjxEb2N1bWVudEltcGw+IFhTTFRQcm9jZXNzb3JJbXBsOjp0cmFuc2Zvcm1Eb2N1bWVudChE
b2N1bWVudEltcGwqIGRvYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRYU0xUTG9hZENhbGxCYWNr
KHhzbHREb2NMb2FkZXJGdW5jIGZ1bmMsIFhTTFRQcm9jZXNzb3JJbXBsICpwcm9jZXNzb3IsIGto
dG1sOjpEb2NMb2FkZXIgKmxvYWRlcikKIHsKLSAgICAvLyBGSVhNRTogUmlnaHQgbm93IHdlIGFz
c3VtZSB8ZG9jfCBpcyB1bnBhcnNlZCwgYnV0IGlmIGl0IGhhcyBiZWVuIHBhcnNlZCB3ZSB3aWxs
IG5lZWQgdG8gc2VyaWFsaXplIGl0Ci0gICAgLy8gYW5kIHRoZW4gZmVlZCB0aGF0IHJlc3VsdGlu
ZyBzb3VyY2UgdG8gbGlieHNsdC4KLSAgICBtX3Jlc3VsdE91dHB1dCA9ICIiOworICAgIHhzbHRT
ZXRMb2FkZXJGdW5jKGZ1bmMpOworICAgIGdsb2JhbFByb2Nlc3NvciA9IHByb2Nlc3NvcjsKKyAg
ICBnbG9iYWxEb2NMb2FkZXIgPSBsb2FkZXI7Cit9CiAKLSAgICBpZiAoIW1fc3R5bGVzaGVldCB8
fCAhbV9zdHlsZXNoZWV0LT5kb2N1bWVudCgpKSByZXR1cm4gMDsKLSAgICAgICAgCi0gICAgZ2xv
YmFsUHJvY2Vzc29yID0gdGhpczsKLSAgICB4c2x0U2V0TG9hZGVyRnVuYyhzdHlsZXNoZWV0TG9h
ZEZ1bmMpOworc3RhdGljIGludCB3cml0ZVRvUVN0cmluZyh2b2lkICpjb250ZXh0LCBjb25zdCBj
aGFyICpidWZmZXIsIGludCBsZW4pCit7CisgICAgUVN0cmluZyAmcmVzdWx0T3V0cHV0ID0gKnN0
YXRpY19jYXN0PFFTdHJpbmcgKj4oY29udGV4dCk7CisgICAgcmVzdWx0T3V0cHV0ICs9IFFTdHJp
bmc6OmZyb21VdGY4KGJ1ZmZlciwgbGVuKTsKKyAgICByZXR1cm4gbGVuOworfQogCi0gICAgeHNs
dFN0eWxlc2hlZXRQdHIgc2hlZXQgPSBtX3N0eWxlc2hlZXQtPmNvbXBpbGVTdHlsZVNoZWV0KCk7
CitzdGF0aWMgYm9vbCBzYXZlUmVzdWx0VG9TdHJpbmcoeG1sRG9jUHRyIHJlc3VsdERvYywgeHNs
dFN0eWxlc2hlZXRQdHIgc2hlZXQsIFFTdHJpbmcgJnJlc3VsdFN0cmluZykKK3sKKyAgICB4bWxP
dXRwdXRCdWZmZXJQdHIgb3V0cHV0QnVmID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoMCk7CisgICAg
aWYgKCFvdXRwdXRCdWYpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBvdXRwdXRCdWYtPmNv
bnRleHQgPSAmcmVzdWx0U3RyaW5nOworICAgIG91dHB1dEJ1Zi0+d3JpdGVjYWxsYmFjayA9IHdy
aXRlVG9RU3RyaW5nOworICAgIAorICAgIGludCByZXR2YWwgPSB4c2x0U2F2ZVJlc3VsdFRvKG91
dHB1dEJ1ZiwgcmVzdWx0RG9jLCBzaGVldCk7CisgICAgeG1sT3V0cHV0QnVmZmVyQ2xvc2Uob3V0
cHV0QnVmKTsKKyAgICAKKyAgICBpZiAocmV0dmFsIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIHJldHVybiB0cnVlOworfQogCi0gICAgaWYgKCFzaGVldCkgewotICAgICAgICBnbG9i
YWxQcm9jZXNzb3IgPSAwOwotICAgICAgICB4c2x0U2V0TG9hZGVyRnVuYygwKTsKK3N0YXRpYyBp
bmxpbmUgdm9pZCB0cmFuc2Zvcm1UZXh0U3RyaW5nVG9YSFRNTERvY3VtZW50U3RyaW5nKFFTdHJp
bmcgJnRleHQpCit7ICAgIAorICAgIC8vIE1vZGlmeSB0aGUgb3V0cHV0IHNvIHRoYXQgaXQgaXMg
YSB3ZWxsLWZvcm1lZCBYSFRNTCBkb2N1bWVudCB3aXRoIGEgPHByZT4gdGFnIGVuY2xvc2luZyB0
aGUgdGV4dC4KKyAgICB0ZXh0LnJlcGxhY2UoJyYnLCAiJmFtcDsiKTsKKyAgICB0ZXh0LnJlcGxh
Y2UoJzwnLCAiJmx0OyIpOworICAgIHRleHQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29k
aW5nPVwiVVRGLThcIj8+XG4iCisgICAgICAgICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9X
M0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0
bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPlxuIgorICAgICAgICAiPGh0bWwgeG1sbnM9XCJo
dHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCI+XG4iCisgICAgICAgICI8aGVhZD48dGl0bGUv
PjwvaGVhZD5cbiIKKyAgICAgICAgIjxib2R5PlxuIgorICAgICAgICAiPHByZT4iICsgdGV4dCAr
ICI8L3ByZT5cbiIKKyAgICAgICAgIjwvYm9keT5cbiIKKyAgICAgICAgIjwvaHRtbD5cbiI7Cit9
CisKK3N0YXRpYyBjb25zdCBjaGFyICoqeHNsdFBhcmFtQXJyYXlGcm9tUURpY3QoUURpY3Q8RE9N
U3RyaW5nPiBwYXJhbWV0ZXJzKQoreworICAgIGlmKHBhcmFtZXRlcnMuY291bnQoKSkKICAgICAg
ICAgcmV0dXJuIDA7CisgICAgY29uc3QgY2hhciAqKnBhcmFtZXRlckFycmF5ID0gKGNvbnN0IGNo
YXIgKiopbWFsbG9jKCgocGFyYW1ldGVycy5jb3VudCgpICogMikgKyAxKSAqIHNpemVvZihjaGFy
ICopKTsKKworICAgIFFEaWN0SXRlcmF0b3I8RE9NU3RyaW5nPiBpdChwYXJhbWV0ZXJzKTsKKyAg
ICB1bnNpZ25lZCBpbmRleCA9IDA7CisgICAgZm9yKGl0LnRvRmlyc3QoKTsgaXQuY3VycmVudCgp
OyArK2l0KSB7CisgICAgICAgIHBhcmFtZXRlckFycmF5WysraW5kZXhdID0gc3RyZHVwKGl0LmN1
cnJlbnRLZXkoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgcGFyYW1ldGVyQXJyYXlbKytpbmRl
eF0gPSBzdHJkdXAoaXQuY3VycmVudCgpLT5xc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CiAgICAg
fQorICAgIHBhcmFtZXRlckFycmF5W2luZGV4XSA9IE5VTEw7CisKKyAgICByZXR1cm4gcGFyYW1l
dGVyQXJyYXk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVYc2x0UGFyYW1BcnJheShjb25zdCBjaGFy
ICoqcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKip0ZW1wID0gcGFyYW1zOworICAgIGlmKCFw
YXJhbXMpCisgICAgICAgIHJldHVybjsKICAgICAKLSAgICBtX3N0eWxlc2hlZXQtPmNsZWFyRG9j
dW1lbnRzKCk7Ci0gIAotICAgIC8vIEdldCB0aGUgcGFyc2VkIHNvdXJjZSBkb2N1bWVudC4KLSAg
ICB4bWxEb2NQdHIgc291cmNlRG9jID0gKHhtbERvY1B0cilkb2MtPnRyYW5zZm9ybVNvdXJjZSgp
OwotICAgIHhtbERvY1B0ciByZXN1bHREb2MgPSB4c2x0QXBwbHlTdHlsZXNoZWV0KHNoZWV0LCBz
b3VyY2VEb2MsIDApOwotICAgIAotICAgIGdsb2JhbFByb2Nlc3NvciA9IDA7Ci0gICAgeHNsdFNl
dExvYWRlckZ1bmMoMCk7CisgICAgd2hpbGUoKnRlbXApIHsKKyAgICAgICAgZnJlZSgodm9pZCAq
KSoodGVtcCsrKSk7CisgICAgICAgIGZyZWUoKHZvaWQgKikqKHRlbXArKykpOworICAgIH0KKyAg
ICBmcmVlKHBhcmFtcyk7Cit9CiAKLSAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiByZXN1bHQg
PSBkb2N1bWVudEZyb21YTUxEb2NQdHIocmVzdWx0RG9jLCBzaGVldCk7Ci0gICAgeHNsdEZyZWVT
dHlsZXNoZWV0KHNoZWV0KTsKLSAgICB4bWxGcmVlRG9jKHJlc3VsdERvYyk7CiAKK1NoYXJlZFB0
cjxEb2N1bWVudEltcGw+IFhTTFRQcm9jZXNzb3JJbXBsOjpjcmVhdGVEb2N1bWVudEZyb21Tb3Vy
Y2UoUVN0cmluZyBkb2N1bWVudFNvdXJjZSwgUVN0cmluZyBzb3VyY2VNSU1FVHlwZSwgTm9kZUlt
cGwgKnNvdXJjZU5vZGUsIEtIVE1MVmlldyAqdmlldykKK3sKKyAgICBTaGFyZWRQdHI8RG9jdW1l
bnRJbXBsPiBvd25lckRvY3VtZW50ID0gc291cmNlTm9kZS0+Z2V0RG9jdW1lbnQoKTsKKyAgICBi
b29sIHNvdXJjZUlzRG9jdW1lbnQgPSAoc291cmNlTm9kZSA9PSBvd25lckRvY3VtZW50LmdldCgp
KTsKKworICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IHJlc3VsdDsKKyAgICBpZiAoc291cmNl
TUlNRVR5cGUgPT0gUVN0cmluZzo6ZnJvbUxhdGluMSgidGV4dC9odG1sIikpCisgICAgICAgIHJl
c3VsdCA9IG93bmVyRG9jdW1lbnQtPmltcGwoKS0+Y3JlYXRlSFRNTERvY3VtZW50KHZpZXcpOwor
ICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gb3duZXJEb2N1bWVudC0+aW1wbCgpLT5jcmVhdGVE
b2N1bWVudCh2aWV3KTsKKyAgICBpZiAoc291cmNlTUlNRVR5cGUgPT0gUVN0cmluZzo6ZnJvbUxh
dGluMSgidGV4dC9wbGFpbiIpKQorICAgICAgICB0cmFuc2Zvcm1UZXh0U3RyaW5nVG9YSFRNTERv
Y3VtZW50U3RyaW5nKGRvY3VtZW50U291cmNlKTsKKyAgICAKKyAgICByZXN1bHQtPmRvY0xvYWRl
cigpLT5zZXRTaG93QW5pbWF0aW9ucyhvd25lckRvY3VtZW50LT5kb2NMb2FkZXIoKS0+c2hvd0Fu
aW1hdGlvbnMoKSk7CisgICAgCisgICAgLy8gQmVmb3JlIHBhcnNpbmcsIHdlIG5lZWQgdG8gc2F2
ZSAmIGRldGFjaCB0aGUgb2xkIGRvY3VtZW50IGFuZCBnZXQgdGhlIG5ldyBkb2N1bWVudAorICAg
IC8vIGluIHBsYWNlLiBXZSBoYXZlIHRvIGRvIHRoaXMgb25seSBpZiB3ZSdyZSByZW5kZXJpbmcg
dGhlIHJlc3VsdCBkb2N1bWVudC4KKyAgICBpZiAodmlldykgeworICAgICAgICB2aWV3LT5jbGVh
cigpOworICAgICAgICByZXN1bHQtPnNldFRyYW5zZm9ybVNvdXJjZURvY3VtZW50KHZpZXctPnBh
cnQoKS0+eG1sRG9jSW1wbCgpKTsKKyAgICAgICAgdmlldy0+cGFydCgpLT5yZXBsYWNlRG9jSW1w
bChyZXN1bHQuZ2V0KCkpOworICAgIH0KKyAgICAKKyAgICByZXN1bHQtPm9wZW4oKTsKKyAgICBp
ZiAoc291cmNlSXNEb2N1bWVudCkgeworICAgICAgICByZXN1bHQtPnNldFVSTChvd25lckRvY3Vt
ZW50LT5VUkwoKSk7CisgICAgICAgIHJlc3VsdC0+c2V0QmFzZVVSTChvd25lckRvY3VtZW50LT5i
YXNlVVJMKCkpOworICAgIH0KKyAgICByZXN1bHQtPmRldGVybWluZVBhcnNlTW9kZShkb2N1bWVu
dFNvdXJjZSk7IC8vIE1ha2Ugc3VyZSB3ZSBwYXJzZSBpbiB0aGUgY29ycmVjdCBtb2RlLgorICAg
IHJlc3VsdC0+d3JpdGUoZG9jdW1lbnRTb3VyY2UpOworICAgIHJlc3VsdC0+ZmluaXNoUGFyc2lu
ZygpOworICAgIHJlc3VsdC0+c2V0UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKHZpZXcpCisgICAg
ICAgIHZpZXctPnBhcnQoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKKyAgICBlbHNlCisgICAgICAgIHJl
c3VsdC0+Y2xvc2UoKTsgLy8gRklYTUU6IEV2ZW4gdmlld2xlc3MgZG9jcyBjYW4gbG9hZCBzdWJy
ZXNvdXJjZXMuIG9ubG9hZCB3aWxsIGZpcmUgdG9vIGVhcmx5LgorICAgICAgICAgICAgICAgICAg
ICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gWE1MSHR0cFJlcXVlc3RPYmplY3Rz
IGFzIHdlbGwuCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBidWZmZXJXcml0
ZSh2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW4pCitzdGF0aWMgaW5s
aW5lIFNoYXJlZFB0cjxEb2N1bWVudEZyYWdtZW50SW1wbD4gY3JlYXRlRnJhZ21lbnRGcm9tU291
cmNlKFFTdHJpbmcgc291cmNlU3RyaW5nLCBRU3RyaW5nIHNvdXJjZU1JTUVUeXBlLCBOb2RlSW1w
bCAqc291cmNlTm9kZSwgRG9jdW1lbnRJbXBsICpvdXB1dERvYykKIHsKLSAgICBzdGF0aWNfY2Fz
dDxYU0xUUHJvY2Vzc29ySW1wbCo+KGNvbnRleHQpLT5hZGRUb1Jlc3VsdChidWZmZXIsIGxlbik7
Ci0gICAgcmV0dXJuIGxlbjsKKyAgICBpZiAoc291cmNlTUlNRVR5cGUgPT0gUVN0cmluZzo6ZnJv
bUxhdGluMSgidGV4dC9wbGFpbiIpKQorICAgICAgICB0cmFuc2Zvcm1UZXh0U3RyaW5nVG9YSFRN
TERvY3VtZW50U3RyaW5nKHNvdXJjZVN0cmluZyk7CisgICAgCisgICAgU2hhcmVkUHRyPERvY3Vt
ZW50RnJhZ21lbnRJbXBsPiBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbChvdXB1
dERvYy0+ZG9jUHRyKCkpOworICAgIAorICAgIGJvb2wgc3VjY2Vzc2Z1bFBhcnNlID0gZmFsc2U7
CisgICAgaWYgKHNvdXJjZU1JTUVUeXBlID09IFFTdHJpbmc6OmZyb21MYXRpbjEoInRleHQvaHRt
bCIpKQorICAgICAgICBzdWNjZXNzZnVsUGFyc2UgPSBwYXJzZUhUTUxEb2N1bWVudEZyYWdtZW50
KHNvdXJjZVN0cmluZywgZnJhZ21lbnQuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgICAgc3VjY2Vz
c2Z1bFBhcnNlID0gcGFyc2VYTUxEb2N1bWVudEZyYWdtZW50KHNvdXJjZVN0cmluZywgZnJhZ21l
bnQuZ2V0KCksIG91cHV0RG9jLT5kb2N1bWVudEVsZW1lbnQoKSk7CisgICAgCisgICAgaWYgKCFz
dWNjZXNzZnVsUGFyc2UpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIAorICAgIC8vIEZJWE1F
OiBEbyB3ZSBuZWVkIHRvIG1lc3Mgd2l0aCBVUkxzIGhlcmU/CisgICAgICAgIAorICAgIHJldHVy
biBmcmFnbWVudDsKIH0KIAotdm9pZCBYU0xUUHJvY2Vzc29ySW1wbDo6YWRkVG9SZXN1bHQoY29u
c3QgY2hhciogYnVmZmVyLCBpbnQgbGVuKQorc3RhdGljIHhzbHRTdHlsZXNoZWV0UHRyIHhzbHRT
dHlsZXNoZWV0UG9pbnRlcihTaGFyZWRQdHI8WFNMU3R5bGVTaGVldEltcGw+ICZjYWNoZWRTdHls
ZXNoZWV0LCBOb2RlSW1wbCAqc3R5bGVzaGVldFJvb3ROb2RlKQogewotICAgIG1fcmVzdWx0T3V0
cHV0ICs9IFFTdHJpbmc6OmZyb21VdGY4KGJ1ZmZlciwgbGVuKTsKKyAgICBpZiAoIWNhY2hlZFN0
eWxlc2hlZXQgJiYgc3R5bGVzaGVldFJvb3ROb2RlKSB7CisgICAgICAgIGNhY2hlZFN0eWxlc2hl
ZXQgPSBuZXcgWFNMU3R5bGVTaGVldEltcGwoc3R5bGVzaGVldFJvb3ROb2RlLT5wYXJlbnQoKSA/
IHN0eWxlc2hlZXRSb290Tm9kZS0+cGFyZW50KCkgOiBzdHlsZXNoZWV0Um9vdE5vZGUpOworICAg
ICAgICBjYWNoZWRTdHlsZXNoZWV0LT5wYXJzZVN0cmluZyhjcmVhdGVNYXJrdXAoc3R5bGVzaGVl
dFJvb3ROb2RlKSk7CisgICAgfQorICAgIAorICAgIGlmICghY2FjaGVkU3R5bGVzaGVldCB8fCAh
Y2FjaGVkU3R5bGVzaGVldC0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisg
ICAgcmV0dXJuIGNhY2hlZFN0eWxlc2hlZXQtPmNvbXBpbGVTdHlsZVNoZWV0KCk7CiB9CiAKLVNo
YXJlZFB0cjxEb2N1bWVudEltcGw+IFhTTFRQcm9jZXNzb3JJbXBsOjpkb2N1bWVudEZyb21YTUxE
b2NQdHIoeG1sRG9jUHRyIHJlc3VsdERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQpCitzdGF0
aWMgaW5saW5lIHhtbERvY1B0ciB4bWxEb2NQdHJGcm9tTm9kZShOb2RlSW1wbCAqc291cmNlTm9k
ZSkKIHsKLSAgICBpZiAoIXJlc3VsdERvYyB8fCAhc2hlZXQpCi0gICAgICAgIHJldHVybiAwOwor
ICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG93bmVyRG9jdW1lbnQgPSBzb3VyY2VOb2RlLT5n
ZXREb2N1bWVudCgpOworICAgIGJvb2wgc291cmNlSXNEb2N1bWVudCA9IChzb3VyY2VOb2RlID09
IG93bmVyRG9jdW1lbnQuZ2V0KCkpOworICAgIAorICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSAw
OworICAgIGlmIChzb3VyY2VJc0RvY3VtZW50KQorICAgICAgICBzb3VyY2VEb2MgPSAoeG1sRG9j
UHRyKW93bmVyRG9jdW1lbnQtPnRyYW5zZm9ybVNvdXJjZSgpOworICAgIGlmICghc291cmNlRG9j
KQorICAgICAgICBzb3VyY2VEb2MgPSAoeG1sRG9jUHRyKXhtbERvY1B0ckZvclN0cmluZyhjcmVh
dGVNYXJrdXAoc291cmNlTm9kZSksIHNvdXJjZUlzRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LT5V
UkwoKSA6IFFTdHJpbmcoKSk7CisgICAgcmV0dXJuIHNvdXJjZURvYzsKK30KIAotICAgIFNoYXJl
ZFB0cjxEb2N1bWVudEltcGw+IHJlc3VsdDsKLSAgICB4bWxPdXRwdXRCdWZmZXJQdHIgb3V0cHV0
QnVmID0geG1sQWxsb2NPdXRwdXRCdWZmZXIoMCk7Ci0gICAgaWYgKG91dHB1dEJ1ZikgewotICAg
ICAgICBvdXRwdXRCdWYtPmNvbnRleHQgPSB0aGlzOwotICAgICAgICBvdXRwdXRCdWYtPndyaXRl
Y2FsbGJhY2sgPSBidWZmZXJXcml0ZTsKLSAgICAgICAgCi0gICAgICAgIGludCByZXR2YWwgPSB4
c2x0U2F2ZVJlc3VsdFRvKG91dHB1dEJ1ZiwgcmVzdWx0RG9jLCBzaGVldCk7Ci0gICAgICAgIHht
bE91dHB1dEJ1ZmZlckNsb3NlKG91dHB1dEJ1Zik7Ci0gICAgICAgIAotICAgICAgICBpZiAocmV0
dmFsIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAKLSAgICAgICAgLy8gVGhl
cmUgYXJlIHRocmVlIHR5cGVzIG9mIG91dHB1dCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGVhbCB3
aXRoOgotICAgICAgICAvLyBIVE1MIChjcmVhdGUgYW4gSFRNTCBkb2N1bWVudCksIFhNTCAoY3Jl
YXRlIGFuIFhNTCBkb2N1bWVudCksCi0gICAgICAgIC8vIGFuZCB0ZXh0ICh3cmFwIGluIGEgPHBy
ZT4gYW5kIGNyZWF0ZSBhbiBYTUwgZG9jdW1lbnQpLgotICAgICAgICBLSFRNTFZpZXcgKnZpZXcg
PSBtX3NvdXJjZURvY3VtZW50LT52aWV3KCk7Ci0gICAgICAgIGNvbnN0IHhtbENoYXIgKm1ldGhv
ZDsKLSAgICAgICAgWFNMVF9HRVRfSU1QT1JUX1BUUihtZXRob2QsIHNoZWV0LCBtZXRob2QpOwot
ICAgICAgICBpZiAobWV0aG9kID09IDAgJiYgcmVzdWx0RG9jLT50eXBlID09IFhNTF9IVE1MX0RP
Q1VNRU5UX05PREUpCi0gICAgICAgICAgICBtZXRob2QgPSAoY29uc3QgeG1sQ2hhciAqKSJodG1s
IjsKLSAgICAgICAgaWYgKHhtbFN0ckVxdWFsKG1ldGhvZCwgKGNvbnN0IHhtbENoYXIgKikiaHRt
bCIpKQotICAgICAgICAgICAgcmVzdWx0ID0gbV9zb3VyY2VEb2N1bWVudC0+aW1wbCgpLT5jcmVh
dGVIVE1MRG9jdW1lbnQodmlldyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9
IG1fc291cmNlRG9jdW1lbnQtPmltcGwoKS0+Y3JlYXRlRG9jdW1lbnQodmlldyk7Ci0gICAgICAg
IHJlc3VsdC0+YXR0YWNoKCk7Ci0gICAgICAgIHJlc3VsdC0+ZG9jTG9hZGVyKCktPnNldFNob3dB
bmltYXRpb25zKG1fc291cmNlRG9jdW1lbnQtPmRvY0xvYWRlcigpLT5zaG93QW5pbWF0aW9ucygp
KTsKLSAgICAgICAgcmVzdWx0LT5zZXRUcmFuc2Zvcm1Tb3VyY2VEb2N1bWVudChtX3NvdXJjZURv
Y3VtZW50LmdldCgpKTsKLQotICAgICAgICBpZiAoeG1sU3RyRXF1YWwobWV0aG9kLCAoY29uc3Qg
eG1sQ2hhciAqKSJ0ZXh0IikpIHsKLSAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgb3V0cHV0IHNv
IHRoYXQgaXQgaXMgYSB3ZWxsLWZvcm1lZCBYSFRNTCBkb2N1bWVudCB3aXRoIGEgPHByZT4gdGFn
IGVuY2xvc2luZyB0aGUgdGV4dC4KLSAgICAgICAgICAgIG1fcmVzdWx0T3V0cHV0LnJlcGxhY2Uo
JyYnLCAiJmFtcDsiKTsKLSAgICAgICAgICAgIG1fcmVzdWx0T3V0cHV0LnJlcGxhY2UoJzwnLCAi
Jmx0OyIpOwotICAgICAgICAgICAgbV9yZXN1bHRPdXRwdXQgPSAiPD94bWwgdmVyc2lvbj1cIjEu
MFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iCi0gICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBo
dG1sIFBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCIgXCJodHRwOi8v
d3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkXCI+XG4iCi0gICAgICAg
ICAgICAgICAgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiPlxu
IgotICAgICAgICAgICAgICAgICI8aGVhZD48dGl0bGUvPjwvaGVhZD5cbiIKLSAgICAgICAgICAg
ICAgICAiPGJvZHk+XG4iCi0gICAgICAgICAgICAgICAgIjxwcmU+IiArIG1fcmVzdWx0T3V0cHV0
ICsgIjwvcHJlPlxuIgotICAgICAgICAgICAgICAgICI8L2JvZHk+XG4iCi0gICAgICAgICAgICAg
ICAgIjwvaHRtbD5cbiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIEJlZm9yZSBw
YXJzaW5nLCB3ZSBuZWVkIHRvIGRldGFjaCB0aGUgb2xkIGRvY3VtZW50IGNvbXBsZXRlbHkgYW5k
IGdldCB0aGUgbmV3IGRvY3VtZW50Ci0gICAgICAgIC8vIGluIHBsYWNlLiBXZSBoYXZlIHRvIGRv
IHRoaXMgb25seSBpZiB3ZSdyZSByZW5kZXJpbmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KLSAgICAg
ICAgaWYgKHZpZXcpIHsKLSAgICAgICAgICAgIHZpZXctPmNsZWFyKCk7Ci0gICAgICAgICAgICB2
aWV3LT5wYXJ0KCktPnJlcGxhY2VEb2NJbXBsKHJlc3VsdC5nZXQoKSk7Ci0gICAgICAgIH0KK3N0
YXRpYyBpbmxpbmUgUVN0cmluZyByZXN1bHRNSU1FVHlwZSh4bWxEb2NQdHIgcmVzdWx0RG9jLCB4
c2x0U3R5bGVzaGVldFB0ciBzaGVldCkKK3sKKyAgICAvLyBUaGVyZSBhcmUgdGhyZWUgdHlwZXMg
b2Ygb3V0cHV0IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGg6CisgICAgLy8gSFRNTCAo
Y3JlYXRlIGFuIEhUTUwgZG9jdW1lbnQpLCBYTUwgKGNyZWF0ZSBhbiBYTUwgZG9jdW1lbnQpLAor
ICAgIC8vIGFuZCB0ZXh0ICh3cmFwIGluIGEgPHByZT4gYW5kIGNyZWF0ZSBhbiBYTUwgZG9jdW1l
bnQpLgorCisgICAgY29uc3QgeG1sQ2hhciAqcmVzdWx0VHlwZSA9IDA7CisgICAgWFNMVF9HRVRf
SU1QT1JUX1BUUihyZXN1bHRUeXBlLCBzaGVldCwgbWV0aG9kKTsKKyAgICBpZiAocmVzdWx0VHlw
ZSA9PSAwICYmIHJlc3VsdERvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKQorICAg
ICAgICByZXN1bHRUeXBlID0gKGNvbnN0IHhtbENoYXIgKikiaHRtbCI7CisgICAgCisgICAgaWYg
KHhtbFN0ckVxdWFsKHJlc3VsdFR5cGUsIChjb25zdCB4bWxDaGFyICopImh0bWwiKSkKKyAgICAg
ICAgcmV0dXJuIFFTdHJpbmc6OmZyb21MYXRpbjEoInRleHQvaHRtbCIpOworICAgIGVsc2UgaWYg
KHhtbFN0ckVxdWFsKHJlc3VsdFR5cGUsIChjb25zdCB4bWxDaGFyICopInRleHQiKSkKKyAgICAg
ICAgcmV0dXJuIFFTdHJpbmc6OmZyb21MYXRpbjEoInRleHQvcGxhaW4iKTsKICAgICAgICAgCi0g
ICAgICAgIHJlc3VsdC0+b3BlbigpOwotICAgICAgICByZXN1bHQtPnNldFVSTChtX3NvdXJjZURv
Y3VtZW50LT5VUkwoKSk7Ci0gICAgICAgIHJlc3VsdC0+c2V0QmFzZVVSTChtX3NvdXJjZURvY3Vt
ZW50LT5iYXNlVVJMKCkpOwotICAgICAgICByZXN1bHQtPmRldGVybWluZVBhcnNlTW9kZShtX3Jl
c3VsdE91dHB1dCk7IC8vIE1ha2Ugc3VyZSB3ZSBwYXJzZSBpbiB0aGUgY29ycmVjdCBtb2RlLgot
ICAgICAgICByZXN1bHQtPndyaXRlKG1fcmVzdWx0T3V0cHV0KTsKLSAgICAgICAgcmVzdWx0LT5m
aW5pc2hQYXJzaW5nKCk7Ci0gICAgICAgIHJlc3VsdC0+c2V0UGFyc2luZyhmYWxzZSk7Ci0gICAg
ICAgIGlmICh2aWV3KQotICAgICAgICAgICAgdmlldy0+cGFydCgpLT5jaGVja0NvbXBsZXRlZCgp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQtPmNsb3NlKCk7IC8vIEZJWE1FOiBF
dmVuIHZpZXdsZXNzIGRvY3MgY2FuIGxvYWQgc3VicmVzb3VyY2VzLiBvbmxvYWQgd2lsbCBmaXJl
IHRvbyBlYXJseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBwcm9i
YWJseSBhIGJ1ZyBpbiBYTUxIdHRwUmVxdWVzdE9iamVjdHMgYXMgd2VsbC4KKyAgICByZXR1cm4g
UVN0cmluZzo6ZnJvbUxhdGluMSgiYXBwbGljYXRpb24veG1sIik7Cit9CisKK2Jvb2wgWFNMVFBy
b2Nlc3NvckltcGw6OnRyYW5zZm9ybVRvU3RyaW5nKE5vZGVJbXBsICpzb3VyY2VOb2RlLCBRU3Ry
aW5nICZtaW1lVHlwZSwgUVN0cmluZyAmcmVzdWx0U3RyaW5nKQoreworICAgIFNoYXJlZFB0cjxE
b2N1bWVudEltcGw+IG93bmVyRG9jdW1lbnQgPSBzb3VyY2VOb2RlLT5nZXREb2N1bWVudCgpOwor
ICAgIFNoYXJlZFB0cjxYU0xTdHlsZVNoZWV0SW1wbD4gY2FjaGVkU3R5bGVzaGVldCA9IG1fc3R5
bGVzaGVldDsKKyAgICAKKyAgICBzZXRYU0xUTG9hZENhbGxCYWNrKHN0eWxlc2hlZXRMb2FkRnVu
YywgdGhpcywgb3duZXJEb2N1bWVudC0+ZG9jTG9hZGVyKCkpOworICAgIHhzbHRTdHlsZXNoZWV0
UHRyIHNoZWV0ID0geHNsdFN0eWxlc2hlZXRQb2ludGVyKGNhY2hlZFN0eWxlc2hlZXQsIG1fc3R5
bGVzaGVldFJvb3ROb2RlLmdldCgpKTsKKyAgICBpZiAoIXNoZWV0KSB7CisgICAgICAgIHNldFhT
TFRMb2FkQ2FsbEJhY2soMCwgMCwgMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0g
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICBjYWNoZWRTdHlsZXNoZWV0LT5jbGVhckRvY3VtZW50cygp
OworICAgIAorICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSB4bWxEb2NQdHJGcm9tTm9kZShzb3Vy
Y2VOb2RlKTsKKyAgICBjb25zdCBjaGFyICoqcGFyYW1zID0geHNsdFBhcmFtQXJyYXlGcm9tUURp
Y3QobV9wYXJhbWV0ZXJzKTsKKyAgICB4bWxEb2NQdHIgcmVzdWx0RG9jID0geHNsdEFwcGx5U3R5
bGVzaGVldChzaGVldCwgc291cmNlRG9jLCBwYXJhbXMpOworICAgIGZyZWVYc2x0UGFyYW1BcnJh
eShwYXJhbXMpOworICAgIAorICAgIHNldFhTTFRMb2FkQ2FsbEJhY2soMCwgMCwgMCk7CisgICAg
CisgICAgaWYgKCFzYXZlUmVzdWx0VG9TdHJpbmcocmVzdWx0RG9jLCBzaGVldCwgcmVzdWx0U3Ry
aW5nKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIG1pbWVUeXBlID0gcmVzdWx0
TUlNRVR5cGUocmVzdWx0RG9jLCBzaGVldCk7CisgICAgCisgICAgeHNsdEZyZWVTdHlsZXNoZWV0
KHNoZWV0KTsKKyAgICB4bWxGcmVlRG9jKHJlc3VsdERvYyk7CisgICAgCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK1NoYXJlZFB0cjxEb2N1bWVudEltcGw+IFhTTFRQcm9jZXNzb3JJbXBsOjp0cmFu
c2Zvcm1Ub0RvY3VtZW50KE5vZGVJbXBsICpzb3VyY2VOb2RlKQoreworICAgIFFTdHJpbmcgcmVz
dWx0TUlNRVR5cGU7CisgICAgUVN0cmluZyByZXN1bHRTdHJpbmc7CisgICAgaWYgKCF0cmFuc2Zv
cm1Ub1N0cmluZyhzb3VyY2VOb2RlLCByZXN1bHRNSU1FVHlwZSwgcmVzdWx0U3RyaW5nKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShyZXN1
bHRTdHJpbmcsIHJlc3VsdE1JTUVUeXBlLCBzb3VyY2VOb2RlKTsKK30KKworU2hhcmVkUHRyPERv
Y3VtZW50RnJhZ21lbnRJbXBsPiBYU0xUUHJvY2Vzc29ySW1wbDo6dHJhbnNmb3JtVG9GcmFnbWVu
dChOb2RlSW1wbCAqc291cmNlTm9kZSwgRG9jdW1lbnRJbXBsICpvdXRwdXREb2MpCit7CisgICAg
UVN0cmluZyByZXN1bHRNSU1FVHlwZTsKKyAgICBRU3RyaW5nIHJlc3VsdFN0cmluZzsKKyAgICBp
ZiAoIXRyYW5zZm9ybVRvU3RyaW5nKHNvdXJjZU5vZGUsIHJlc3VsdE1JTUVUeXBlLCByZXN1bHRT
dHJpbmcpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9t
U291cmNlKHJlc3VsdFN0cmluZywgcmVzdWx0TUlNRVR5cGUsIHNvdXJjZU5vZGUsIG91dHB1dERv
Yyk7Cit9CisKK3ZvaWQgWFNMVFByb2Nlc3NvckltcGw6OnNldFBhcmFtZXRlcihET01TdHJpbmdJ
bXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmluZ0ltcGwgKmxvY2FsTmFtZSwgRE9NU3RyaW5nSW1w
bCAqdmFsdWUpCit7CisgICAgLy8gRklYTUU6IG5hbWVzcGFjZSBzdXBwb3J0PworICAgIG1fcGFy
YW1ldGVycy5yZXBsYWNlKERPTVN0cmluZyhsb2NhbE5hbWUpLnFzdHJpbmcoKSwgbmV3IERPTVN0
cmluZyh2YWx1ZSkpOworfQorCitTaGFyZWRQdHI8RE9NU3RyaW5nSW1wbD4gWFNMVFByb2Nlc3Nv
ckltcGw6OmdldFBhcmFtZXRlcihET01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmlu
Z0ltcGwgKmxvY2FsTmFtZSkgY29uc3QKK3sKKyAgICAvLyBGSVhNRTogbmFtZXNwYWNlIHN1cHBv
cnQ/CisgICAgaWYgKERPTVN0cmluZyAqdmFsdWUgPSBtX3BhcmFtZXRlcnMuZmluZChET01TdHJp
bmcobG9jYWxOYW1lKS5xc3RyaW5nKCkpKQorICAgICAgICByZXR1cm4gdmFsdWUtPmltcGwoKTsK
KyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBYU0xUUHJvY2Vzc29ySW1wbDo6cmVtb3ZlUGFy
YW1ldGVyKERPTVN0cmluZ0ltcGwgKm5hbWVzcGFjZVVSSSwgRE9NU3RyaW5nSW1wbCAqbG9jYWxO
YW1lKQoreworICAgIC8vIEZJWE1FOiBuYW1lc3BhY2Ugc3VwcG9ydD8KKyAgICBtX3BhcmFtZXRl
cnMucmVtb3ZlKERPTVN0cmluZyhsb2NhbE5hbWUpLnFzdHJpbmcoKSk7CiB9CiAKIH0KSW5kZXg6
IHhzbC94c2x0X3Byb2Nlc3NvcmltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3Qv
V2ViQ29yZS9raHRtbC94c2wveHNsdF9wcm9jZXNzb3JpbXBsLmgsdgpyZXRyaWV2aW5nIHJldmlz
aW9uIDEuNApkaWZmIC1wIC11IC1yMS40IHhzbC94c2x0X3Byb2Nlc3NvcmltcGwuaAotLS0geHNs
L3hzbHRfcHJvY2Vzc29yaW1wbC5oCTEwIE9jdCAyMDA1IDIzOjQ4OjU1IC0wMDAwCTEuNAorKysg
eHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5oCTIwIE9jdCAyMDA1IDIwOjM2OjQyIC0wMDAwCkBAIC0y
OSwzOCArMjksNTEgQEAKICNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VySW50ZXJuYWxzLmg+CiAKICNp
bmNsdWRlIDxsaWJ4c2x0L3RyYW5zZm9ybS5oPgorI2luY2x1ZGUgPGxpYnhzbHQvZG9jdW1lbnRz
Lmg+CiAKICNpbmNsdWRlIDxtaXNjL3NoYXJlZC5oPgorI2luY2x1ZGUgImRvbV9zdHJpbmdpbXBs
LmgiCisjaW5jbHVkZSAieHNsX3N0eWxlc2hlZXRpbXBsLmgiCiAjaW5jbHVkZSA8cXN0cmluZy5o
PgogCiBuYW1lc3BhY2UgRE9NIHsKIAotY2xhc3MgWFNMU3R5bGVTaGVldEltcGw7CitjbGFzcyBO
b2RlSW1wbDsKIGNsYXNzIERvY3VtZW50SW1wbDsKLSAgICAKLWNsYXNzIFhTTFRQcm9jZXNzb3JJ
bXBsCitjbGFzcyBEb2N1bWVudEZyYWdtZW50SW1wbDsKKworY2xhc3MgWFNMVFByb2Nlc3Nvcklt
cGwgOiBwdWJsaWMga2h0bWw6OlNoYXJlZDxYU0xUUHJvY2Vzc29ySW1wbD4KIHsKIHB1YmxpYzoK
LSAgICAvLyBDb25zdHJ1Y3RvcnMKLSAgICBYU0xUUHJvY2Vzc29ySW1wbChYU0xTdHlsZVNoZWV0
SW1wbCogc3R5bGVzaGVldCwgRG9jdW1lbnRJbXBsKiBzb3VyY2UpOwotICAgIH5YU0xUUHJvY2Vz
c29ySW1wbCgpOwotICAgIAotICAgIC8vIE1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIGEgc291cmNl
IGRvY3VtZW50IGludG8gYSByZXN1bHQgZG9jdW1lbnQuCi0gICAgU2hhcmVkUHRyPERvY3VtZW50
SW1wbD4gdHJhbnNmb3JtRG9jdW1lbnQoRG9jdW1lbnRJbXBsKiBzb3VyY2VEb2MpOworICAgIFhT
TFRQcm9jZXNzb3JJbXBsKCkgeyBtX3BhcmFtZXRlcnMuc2V0QXV0b0RlbGV0ZSh0cnVlKTsgfTsK
IAotICAgIC8vIENvbnZlcnQgYSBsaWJ4bWwgZG9jIHB0ciB0byBhIEtIVE1MIERPTSBEb2N1bWVu
dAotICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IGRvY3VtZW50RnJvbVhNTERvY1B0cih4bWxE
b2NQdHIgcmVzdWx0RG9jLCB4c2x0U3R5bGVzaGVldFB0ciBzaGVldCk7CisgICAgdm9pZCBzZXRY
U0xTdHlsZXNoZWV0KFhTTFN0eWxlU2hlZXRJbXBsICpzdHlsZVNoZWV0KSB7IG1fc3R5bGVzaGVl
dCA9IHN0eWxlU2hlZXQ7IH0KKyAgICBib29sIHRyYW5zZm9ybVRvU3RyaW5nKE5vZGVJbXBsICpz
b3VyY2UsIFFTdHJpbmcgJnJlc3VsdE1JTUVUeXBlLCBRU3RyaW5nICZyZXN1bHRTdHJpbmcpOwor
ICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IGNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShRU3Ry
aW5nIHNvdXJjZSwgUVN0cmluZyBzb3VyY2VNSU1FVHlwZSwgTm9kZUltcGwgKnNvdXJjZU5vZGUs
IEtIVE1MVmlldyAqdmlldyA9IDApOwogICAgIAotICAgIC8vIEhlbHBlcnMKLSAgICB2b2lkIGFk
ZFRvUmVzdWx0KGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbik7CisgICAgLy8gRE9NIG1ldGhv
ZHMKKyAgICB2b2lkIGltcG9ydFN0eWxlc2hlZXQoTm9kZUltcGwgKnN0eWxlKSB7IG1fc3R5bGVz
aGVldFJvb3ROb2RlID0gc3R5bGU7IH0KKyAgICBTaGFyZWRQdHI8RG9jdW1lbnRGcmFnbWVudElt
cGw+IHRyYW5zZm9ybVRvRnJhZ21lbnQoTm9kZUltcGwgKnNvdXJjZSwgRG9jdW1lbnRJbXBsICpv
dXB1dERvYyk7CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gdHJhbnNmb3JtVG9Eb2N1bWVu
dChOb2RlSW1wbCAqc291cmNlKTsKICAgICAKLSAgICBYU0xTdHlsZVNoZWV0SW1wbCAqc3R5bGVz
aGVldCgpIHsgcmV0dXJuIG1fc3R5bGVzaGVldC5nZXQoKTsgfQotICAgIERvY3VtZW50SW1wbCAq
c291cmNlRG9jdW1lbnQoKSB7IHJldHVybiBtX3NvdXJjZURvY3VtZW50LmdldCgpOyB9CisgICAg
dm9pZCBzZXRQYXJhbWV0ZXIoRE9NU3RyaW5nSW1wbCAqbmFtZXNwYWNlVVJJLCBET01TdHJpbmdJ
bXBsICpsb2NhbE5hbWUsIERPTVN0cmluZ0ltcGwgKnZhbHVlKTsKKyAgICBTaGFyZWRQdHI8RE9N
U3RyaW5nSW1wbD4gZ2V0UGFyYW1ldGVyKERPTVN0cmluZ0ltcGwgKm5hbWVzcGFjZVVSSSwgRE9N
U3RyaW5nSW1wbCAqbG9jYWxOYW1lKSBjb25zdDsKKyAgICB2b2lkIHJlbW92ZVBhcmFtZXRlcihE
T01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmluZ0ltcGwgKmxvY2FsTmFtZSk7Cisg
ICAgdm9pZCBjbGVhclBhcmFtZXRlcnMoKSB7IG1fcGFyYW1ldGVycy5jbGVhcigpOyB9CisKKyAg
ICB2b2lkIHJlc2V0KCkgeyBtX3N0eWxlc2hlZXQgPSBOVUxMOyBtX3N0eWxlc2hlZXRSb290Tm9k
ZSA9IE5VTEw7ICBtX3BhcmFtZXRlcnMuY2xlYXIoKTsgfQorICAgIAorcHVibGljOgorICAgIC8v
IE9ubHkgZm9yIGxpYlhTTFQgY2FsbGJhY2tzCisgICAgWFNMU3R5bGVTaGVldEltcGwgKnhzbFN0
eWxlc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlc2hlZXQuZ2V0KCk7IH0KICAgICAKIHBy
aXZhdGU6CisgICAgLy8gQ29udmVydCBhIGxpYnhtbCBkb2MgcHRyIHRvIGEgS0hUTUwgRE9NIERv
Y3VtZW50CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gZG9jdW1lbnRGcm9tWE1MRG9jUHRy
KHhtbERvY1B0ciByZXN1bHREb2MsIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0LCBEb2N1bWVudElt
cGwgKm93bmVyRG9jdW1lbnQsIGJvb2wgc291cmNlSXNEb2N1bWVudCk7CisKICAgICBTaGFyZWRQ
dHI8WFNMU3R5bGVTaGVldEltcGw+IG1fc3R5bGVzaGVldDsKLSAgICBRU3RyaW5nIG1fcmVzdWx0
T3V0cHV0OwotICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG1fc291cmNlRG9jdW1lbnQ7Cisg
ICAgU2hhcmVkUHRyPE5vZGVJbXBsPiBtX3N0eWxlc2hlZXRSb290Tm9kZTsKKyAgICBRRGljdDxE
T01TdHJpbmc+IG1fcGFyYW1ldGVyczsKIH07CiAKIH0K
</data>
<flag name="review"
          id="761"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>4428</attachid>
            <date>2005-10-20 13:40:59 -0700</date>
            <delta_ts>2005-10-22 08:46:15 -0700</delta_ts>
            <desc>XLSTProcessor test cases</desc>
            <filename>xslt_test.patch</filename>
            <type>text/plain</type>
            <size>15479</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IHhzbHQtcHJvY2Vzc2VyLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiB4
c2x0LXByb2Nlc3Nlci1leHBlY3RlZC50eHQKZGlmZiAtTiB4c2x0LXByb2Nlc3Nlci1leHBlY3Rl
ZC50eHQKLS0tIHhzbHQtcHJvY2Vzc2VyLWV4cGVjdGVkLnR4dAkxIEphbiAxOTcwIDAwOjAwOjAw
IC0wMDAwCisrKyB4c2x0LXByb2Nlc3Nlci1leHBlY3RlZC50eHQJMjAgT2N0IDIwMDUgMjA6NDA6
MzUgLTAwMDAKQEAgLTAsMCArMSwxMzQgQEAKKzAuMSBvcmlnaW5hbCB4bWw6Cis8P3htbC1zdHls
ZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSJ4c2x0LXRleHQueHNsIj8+PFRFU1Q+U09VUkNF
IFhNTDogPDw8JtGC0LXRgdGCJj4+PjwvVEVTVD4KKzAuMiB4c2wxOgorPHhzbDpzdHlsZXNoZWV0
IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiB2ZXJzaW9u
PSIxLjAiPgorCis8eHNsOm91dHB1dCBtZXRob2Q9InRleHQiIGVuY29kaW5nPSJLT0k4LVIiIC8+
Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJURVNUIj5DSEFSQUNURVJTIElOIFhTTFQ6IDw8PCbRgtC1
0YHRgiY+Pj4KKzx4c2w6YXBwbHktdGVtcGxhdGVzIC8+PHhzbDp0ZXh0PgorPC94c2w6dGV4dD48
L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZT4KKwkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9
Ii4iIC8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KKzAuMyB4c2wyOgor
PHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJh
bnNmb3JtIiB2ZXJzaW9uPSIxLjAiPgorICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgZW5j
b2Rpbmc9IlVURi04IiAvPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IlRFU1QiPgorICAgICAg
ICA8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+CisgICAgICAgICAg
ICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUi
IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIgLz4KKyAgICAgICAgICAgIDwvaGVh
ZD4gIAorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgIENIQVJBQ1RFUlMgSU4gWFNM
VDogw6nDqcOpw6nDqcOpw6nDqcOpw6nDqSA8YnIgLz4gPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4K
KyAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgPC9odG1sPgorICA8L3hzbDp0ZW1wbGF0ZT4K
KworPHhzbDp0ZW1wbGF0ZT4KKwkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+Cis8L3hzbDp0
ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KKworMS4wIHZvaWQgaW1wb3J0U3R5bGVzaGVl
dChpbiBET01Ob2RlIHN0eWxlKToKKworMS4xIEltcG9ydCB0d28gZGlmZmVyZW50IHN0eWxlc2hl
ZXRzOgorPEhUTUwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxIRUFEPjxN
RVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0
PVVURi04Ij48L0hFQUQ+PEJPRFk+CisgICAgICAgICAgICAgIENIQVJBQ1RFUlMgSU4gWFNMVDog
w6nDqcOpw6nDqcOpw6nDqcOpw6nDqSA8QlI+PEJSPlNPVVJDRSBYTUw6IDw8PCbRgtC10YHRgiY+
Pj4KKzwvQk9EWT48L0hUTUw+CisxLjIgSW1wb3J0IHNhbWUgc3R5bGVzaGVldCB0d2ljZToKKzxo
dG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPjx0aXRsZSAv
PjwvaGVhZD4KKzxib2R5PgorPHByZT5DSEFSQUNURVJTIElOIFhTTFQ6IDw8PCbRgtC10YHRgiY+
Pj4KK1NPVVJDRSBYTUw6IDw8PCbRgtC10YHRgiY+Pj4KKzwvcHJlPgorPC9ib2R5PgorPC9odG1s
PgorMS4zIEltcG9ydCB1bmRlZmluZWQgc3R5bGVzaGVldDoKKyoqKipGYWlsdXJlKioqKiAoZXhw
ZWN0ZWQgZXhjZXB0aW9uLCBpbnN0ZWFkIGdvdCByZXN1bHQ6ICJ1bmRlZmluZWQiKQorMS40IElt
cG9ydCB1bmRlZmluZWQgc3R5bGVzaGVldDoKKyoqKipGYWlsdXJlKioqKiAoZXhwZWN0ZWQgZXhj
ZXB0aW9uLCBpbnN0ZWFkIGdvdCByZXN1bHQ6ICJ1bmRlZmluZWQiKQorMS41IERvbid0IGltcG9y
dCBzdHlsZXNoZWV0OgordW5kZWZpbmVkCisKKzIuMCBET01Eb2N1bWVudEZyYWdtZW50IHRyYW5z
Zm9ybVRvRnJhZ21lbnQoaW4gRE9NTm9kZSBzb3VyY2UsIGluIERPTURvY3VtZW50IG91dHB1dCk6
CisKKzIuMSBmcmFnbWVudCB3aXRoIHVuZGVmaW5lZCBzb3VyY2U6CisqKioqRmFpbHVyZSoqKiog
KGV4cGVjdGVkIGV4Y2VwdGlvbiwgaW5zdGVhZCBnb3QgcmVzdWx0OiAidW5kZWZpbmVkIikKKzIu
MiBmcmFnbWVudCB3aXRoIHVuZGVmaW5lZCBvdXRwdXQgZG9jdW1lbnQ6Cit1bmRlZmluZWQKKzIu
MyB1c2Ugbm9uLURPTURvY3VtZW50IG91dHB1dCBwYXJhbWV0ZXI6CisqKioqRmFpbHVyZSoqKiog
KGV4cGVjdGVkIGV4Y2VwdGlvbiwgaW5zdGVhZCBnb3QgcmVzdWx0OiAidW5kZWZpbmVkIikKKzIu
NCB0cmFuc2Zvcm0gdG8gc2FtZSBmcmFnbWVudCB0d2ljZToKKzxodG1sIHhtbG5zPSJodHRwOi8v
d3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPjx0aXRsZSAvPjwvaGVhZD4KKzxib2R5Pgor
PHByZT5DSEFSQUNURVJTIElOIFhTTFQ6IDw8PCbRgtC10YHRgiY+Pj4KK1NPVVJDRSBYTUw6IDw8
PCbRgtC10YHRgiY+Pj4KKzwvcHJlPgorPC9ib2R5PgorPC9odG1sPgorCiszLjAgRE9NRG9jdW1l
bnQgdHJhbnNmb3JtVG9Eb2N1bWVudChpbiBET01Ob2RlIHNvdXJjZSk6CisKKzMuMSB1c2Ugbm9u
LURPTURvY3VtZW50IG91dHB1dCBwYXJhbWV0ZXI6CisqKioqRmFpbHVyZSoqKiogKGV4cGVjdGVk
IGV4Y2VwdGlvbiwgaW5zdGVhZCBnb3QgcmVzdWx0OiAidW5kZWZpbmVkIikKKzMuMiBkb2N1bWVu
dCBmcm9tIHVuZGVmaW5lZCBzb3VyY2U6Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
MTk5OS94aHRtbCI+Cis8aGVhZD48dGl0bGUgLz48L2hlYWQ+Cis8Ym9keT4KKzxwcmU+Q0hBUkFD
VEVSUyBJTiBYU0xUOiA8PDwm0YLQtdGB0YImPj4+CitTT1VSQ0UgWE1MOiA8PDwm0YLQtdGB0YIm
Pj4+Cis8L3ByZT4KKzwvYm9keT4KKzwvaHRtbD4KKworNC4wIHZvaWQgc2V0UGFyYW1ldGVyKGlu
IERPTVN0cmluZyBuYW1lc3BhY2VVUkksIGluIERPTVN0cmluZyBsb2NhbE5hbWUsIGluIFZhbHVl
IHZhbHVlKToKKworNC4xIHBhc3Mgc2V0UGFyYW1ldGVyIHNhbWUgbG9jYWxuYW1lLCBkaWZmZXJl
bnQgbmFtZXNwYWNlczoKKyoqKipGYWlsdXJlKioqKiAoZXhwZWN0ZWQ6ICJTdWNjZXNzIiBhY3R1
YWw6ICJGYWlsdXJlIikKKzQuMiBwYXNzIHVuZGVmaW5lZCBuYW1lc3BhY2U6CitTdWNjZXNzCis0
LjMgcGFzcyBzZXRQYXJhbWV0ZXIgYW4gdW5kZWZpbmVkIG5hbWU6CisqKioqRmFpbHVyZSoqKiog
KGV4cGVjdGVkIGV4Y2VwdGlvbiwgaW5zdGVhZCBnb3QgcmVzdWx0OiAidW5kZWZpbmVkIikKKzQu
NCBwYXNzIHVuc3VwcG9ydGVkIHZhbHVlIHRvIHNldFBhcmFtZXRlcjoKKyoqKipGYWlsdXJlKioq
KiAoZXhwZWN0ZWQgZXhjZXB0aW9uLCBpbnN0ZWFkIGdvdCByZXN1bHQ6ICJ1bmRlZmluZWQiKQor
Cis1LjAgVmFsdWUgZ2V0UGFyYW1ldGVyKGluIERPTVN0cmluZyBuYW1lc3BhY2VVUkksIGluIERP
TVN0cmluZyBsb2NhbE5hbWUpOgorCis1LjEgcGFzcyBnZXRQYXJhbWV0ZXIgYW4gdW5kZWZpbmVk
IG5hbWU6CisqKioqRmFpbHVyZSoqKiogKGV4cGVjdGVkIGV4Y2VwdGlvbiwgaW5zdGVhZCBnb3Qg
cmVzdWx0OiAidW5kZWZpbmVkIikKKzUuMiBwYXNzIGdldFBhcmFtZXRlciBhIG5hbWUgd2hpY2gg
aGFzIG5vdCBiZWVuIHNldDoKK1N1Y2Nlc3MKKzUuMyB2ZXJpZnkgZ2V0UGFyYW1ldGVyIGFjdHVh
bGx5IGdldHMgKGFuZCBzZXQgc2V0cyk6CitTdWNjZXNzCisKKzYuMCB2b2lkIHJlbW92ZVBhcmFt
ZXRlcihpbiBET01TdHJpbmcgbmFtZXNwYWNlVVJJLCBpbiBET01TdHJpbmcgbG9jYWxOYW1lKToK
KworNi4xIHBhc3MgcmVtb3ZlUGFyYW1ldGVyIHNhbWUgbG9jYWxuYW1lLCBkaWZmZXJlbnQgbmFt
ZXNwYWNlczoKKyoqKipGYWlsdXJlKioqKiAoZXhwZWN0ZWQ6ICJTdWNjZXNzIiBhY3R1YWw6ICJG
YWlsdXJlIikKKzYuMiB2ZXJpZnkgcmVtb3ZlUGFyYW1ldGVyIGFjdHVhbGx5IHJlbW92ZXMgdXNp
bmcgdW5kZWZpbmVkIG5hbWVzcGFjZToKK1N1Y2Nlc3MKKzYuMyBwYXNzIHJlbW92ZVBhcmFtZXRl
ciB1bmRlZmluZWQgbmFtZToKK1N1Y2Nlc3MKKzYuNCBwYXNzIHJlbW92ZVBhcmFtZXRlciBhIG5h
bWUgd2hpY2ggaGFzIG5vdCBiZWVuIHNldDoKK1N1Y2Nlc3MKKzYuNSB2ZXJpZnkgcmVtb3ZlUGFy
YW1ldGVyIGFjdHVhbGx5IHJlbW92ZXM6CitTdWNjZXNzCisKKzcuMCB2b2lkIGNsZWFyUGFyYW1l
dGVycygpOgorCis3LjEgdmVyaWZ5IHRoYXQgY2xlYXJQYXJhbWV0ZXJzIGRvZXM6CitTdWNjZXNz
CisKKzguMCB2b2lkIHJlc2V0KCk6CisKKzguMSB2ZXJpZnkgdGhhdCBwYXJhbWV0ZXJzIGhhdmUg
YmVlbiBjbGVhcmVkOgorU3VjY2VzcworOC4yIHZlcmlmeSB0aGF0IHN0eWxlc2hlZXQgaGFzIGJl
ZW4gY2xlYXJlZDoKK1N1Y2Nlc3MKKwpJbmRleDogeHNsdC1wcm9jZXNzZXIuaHRtbAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09ClJDUyBmaWxlOiB4c2x0LXByb2Nlc3Nlci5odG1sCmRpZmYgLU4geHNsdC1wcm9jZXNzZXIu
aHRtbAotLS0geHNsdC1wcm9jZXNzZXIuaHRtbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisr
KyB4c2x0LXByb2Nlc3Nlci5odG1sCTIwIE9jdCAyMDA1IDIwOjQwOjM2IC0wMDAwCkBAIC0wLDAg
KzEsMjk4IEBACis8aHRtbD4KKzxoZWFkPgorPFNUWUxFPgorICAgIHByZSB7IGJvcmRlcjoxcHgg
c29saWQgYmx1ZSB9CisgICAgc3BhbiB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KKzwvU1RZTEU+Cis8
L2hlYWQ+Cis8Ym9keSBpZD0iYm9keSI+CisKKzxzY3JpcHQ+CitpZiAod2luZG93LmxheW91dFRl
c3RDb250cm9sbGVyKQorCWxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKwordmFy
IHJlcXVlc3RlciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwordmFyIHByb2Nlc3NvciA9IG5ldyBY
U0xUUHJvY2Vzc29yKCk7Cit2YXIgc2VyaWFsaXplciA9IG5ldyBYTUxTZXJpYWxpemVyKCk7CisK
K3ZhciBzZWN0aW9uSWQgPSAwOwordmFyIHRlc3RJZCA9IDA7CisKK2Z1bmN0aW9uIGFkZFNlY3Rp
b25IZWFkZXIobmFtZSkgeworCXNlY3Rpb25JZCsrOworCWRvY3VtZW50LndyaXRlbG4oIjxicj48
c3Bhbj4iICsgc2VjdGlvbklkICsgIi4wICIgKyBuYW1lICsgIjo8L3NwYW4+PGJyPjxicj4iKTsK
Kwl0ZXN0SWQgPSAwOworfQorCitmdW5jdGlvbiBhZGRSZXN1bHRFeHBlY3RFeGNlcHRpb24obmFt
ZSwgZnVuYykgeworCXRyeSB7CisJCXZhciByZXN1bHQgPSBmdW5jKCk7CisJCWFkZFN0cmluZ1Jl
c3VsdCh0ZXN0bmFtZSwgIioqKipGYWlsdXJlKioqKiAoZXhwZWN0ZWQgZXhjZXB0aW9uLCBpbnN0
ZWFkIGdvdCByZXN1bHQ6IFwiIiArIHJlc3VsdCArICJcIikiKTsKKwl9IGNhdGNoIChlKSB7CisJ
CS8vIEZJWE1FOiBwcm9iYWJseSBzaG91bGQgY2hlY2sgZXhjZXB0aW9uIHR5cGUKKwkJYWRkU3Ry
aW5nUmVzdWx0KHRlc3RuYW1lLCAiU3VjY2VzcyIpOworCX0KK30KKworZnVuY3Rpb24gYWRkUmVz
dWx0RXhwZWN0VmFsdWVXaGVuU2VyaWFsaXplZChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWRWYWx1ZSkg
eworCXZhciBzZXJpYWxpemVkVmFsdWU7CisJaWYgKHZhbHVlICE9IHVuZGVmaW5lZCkKKwkJc2Vy
aWFsaXplZFZhbHVlID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh2YWx1ZSk7CisJaWYg
KHZhbHVlID09IGV4cGVjdGVkVmFsdWUpCisJCWFkZFN0cmluZ1Jlc3VsdChuYW1lLCAiU3VjY2Vz
cyIpOworCWVsc2UKKwkJYWRkU3RyaW5nUmVzdWx0KG5hbWUsICIqKioqRmFpbHVyZSoqKiogKGV4
cGVjdGVkOiBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiIGFjdHVhbDogXCIiICsgc2VyaWFsaXpl
ZFZhbHVlICsgIlwiKSIpOworfQorCisKK2Z1bmN0aW9uIGFkZFJlc3VsdEV4cGVjdFZhbHVlKG5h
bWUsIHZhbHVlLCBleHBlY3RlZFZhbHVlKSB7CisJaWYgKHZhbHVlID09IGV4cGVjdGVkVmFsdWUp
CisJCWFkZFN0cmluZ1Jlc3VsdChuYW1lLCAiU3VjY2VzcyIpOworCWVsc2UKKwkJYWRkU3RyaW5n
UmVzdWx0KG5hbWUsICIqKioqRmFpbHVyZSoqKiogKGV4cGVjdGVkOiBcIiIgKyBleHBlY3RlZFZh
bHVlICsgIlwiIGFjdHVhbDogXCIiICsgdmFsdWUgKyAiXCIpIik7Cit9CisKK2Z1bmN0aW9uIGdl
dFhNTERvY3VtZW50KG5hbWUpCit7CisJcmVxdWVzdGVyLm9wZW4oIkdFVCIsIG5hbWUsIGZhbHNl
KTsKKwlyZXF1ZXN0ZXIuc2VuZChudWxsKTsKKwlyZXR1cm4gcmVxdWVzdGVyLnJlc3BvbnNlWE1M
OworfQorCitmdW5jdGlvbiBhZGRTdHJpbmdSZXN1bHQobmFtZSwgcmVzdWx0KQoreworCXRlc3RJ
ZCsrOworCXZhciB0ZXN0TnVtYmVyU3RyaW5nID0gIiIgKyBzZWN0aW9uSWQgKyAiLiIgKyB0ZXN0
SWQKKwl2YXIgdGVzdElkU3RyaW5nID0gImlkIiArIHRlc3ROdW1iZXJTdHJpbmc7CisJZG9jdW1l
bnQud3JpdGVsbigiPHNwYW4+IiArIHRlc3ROdW1iZXJTdHJpbmcgKyAiICIgKyBuYW1lICsgIjo8
L3NwYW4+Iik7CisJZG9jdW1lbnQud3JpdGVsbigiPHByZSBpZD1cIiIgKyB0ZXN0SWRTdHJpbmcg
KyAiXCI+QEBOTyBWQUxVRUBAPC9wcmU+Iik7CisJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGVz
dElkU3RyaW5nKS5maXJzdENoaWxkLm5vZGVWYWx1ZSA9IHJlc3VsdDsKK30KKworZnVuY3Rpb24g
YWRkWE1MUmVzdWx0KG5hbWUsIHJlc3VsdCkKK3sKKwl2YXIgc3RyOworCWlmIChyZXN1bHQgIT0g
dW5kZWZpbmVkKQorCQlzdHIgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHJlc3VsdCk7
CisJYWRkU3RyaW5nUmVzdWx0KG5hbWUsIHN0cik7Cit9CisKK3ZhciB4bWwgPSBnZXRYTUxEb2N1
bWVudCgieHNsdC10ZXh0LnhtbCIpOworYWRkWE1MUmVzdWx0KCJvcmlnaW5hbCB4bWwiLCB4bWwp
OwordmFyIHhzbDEgPSBnZXRYTUxEb2N1bWVudCgieHNsdC10ZXh0LnhzbCIpOworYWRkWE1MUmVz
dWx0KCJ4c2wxIiwgeHNsMSk7Cit2YXIgeHNsMiA9IGdldFhNTERvY3VtZW50KCJyZXNvdXJjZXMv
eHNsdC1lbmMueHNsIik7CithZGRYTUxSZXN1bHQoInhzbDIiLCB4c2wyKTsKKworCisKKy8vIDEu
MCB2b2lkIGltcG9ydFN0eWxlc2hlZXQoaW4gRE9NTm9kZSBzdHlsZSk7CithZGRTZWN0aW9uSGVh
ZGVyKCJ2b2lkIGltcG9ydFN0eWxlc2hlZXQoaW4gRE9NTm9kZSBzdHlsZSkiKTsKKy8vIDEuMSBJ
bXBvcnQgdHdvIGRpZmZlcmVudCBzdHlsZXNoZWV0cyAobGFzdCBvbmUgd2lucykKKworcHJvY2Vz
c29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Citwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4
c2wyKTsKK3ZhciBuZXdYTUwgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOwor
YWRkWE1MUmVzdWx0KCJJbXBvcnQgdHdvIGRpZmZlcmVudCBzdHlsZXNoZWV0cyIsIG5ld1hNTCk7
CisKKy8vIDEuMiBJbXBvcnQgc2FtZSBzdHlsZXNoZWV0IHR3aWNlCisKK3Byb2Nlc3Nvci5yZXNl
dCgpOworcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Citwcm9jZXNzb3IuaW1wb3J0
U3R5bGVzaGVldCh4c2wxKTsKKwordmFyIG5ld1hNTCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0Rv
Y3VtZW50KHhtbCk7CithZGRYTUxSZXN1bHQoIkltcG9ydCBzYW1lIHN0eWxlc2hlZXQgdHdpY2Ui
LCBuZXdYTUwpOworCisvLyAxLjMgSW1wb3J0IHVuZGVmaW5lZCBzdHlsZXNoZWV0CisKK3Byb2Nl
c3Nvci5yZXNldCgpOwordmFyIHRlc3RuYW1lID0gIkltcG9ydCB1bmRlZmluZWQgc3R5bGVzaGVl
dCI7CithZGRSZXN1bHRFeHBlY3RFeGNlcHRpb24odGVzdG5hbWUsIGZ1bmN0aW9uICgpIHsgcmV0
dXJuIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KHVuZGVmaW5lZCk7IH0gKTsKKworLy8gMS40
IEltcG9ydCBpbnZhbGlkIHN0eWxlc2hlZXQgKG5vdCB3ZWxsZm9ybWVkIHhsc3QpCisKK3Byb2Nl
c3Nvci5yZXNldCgpOwordmFyIHRlc3ROYW1lID0gIkltcG9ydCBpbnZhbGlkIHN0eWxlc2hlZXQi
OworYWRkUmVzdWx0RXhwZWN0RXhjZXB0aW9uKHRlc3RuYW1lLCBmdW5jdGlvbiAoKSB7IHJldHVy
biBwcm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4bWwpOyB9ICk7CisKKy8vIDEuNSBEb24ndCBp
bXBvcnQgc3R5bGVzaGVldAorCitwcm9jZXNzb3IucmVzZXQoKTsKK3ZhciBuZXdYTUwgPSBwcm9j
ZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOworYWRkWE1MUmVzdWx0KCJEb24ndCBpbXBv
cnQgc3R5bGVzaGVldCIsIG5ld1hNTCk7CisKKworCisvLyAyLjAgRE9NRG9jdW1lbnRGcmFnbWVu
dCB0cmFuc2Zvcm1Ub0ZyYWdtZW50KGluIERPTU5vZGUgc291cmNlLCBpbiBET01Eb2N1bWVudCBv
dXRwdXQpOworYWRkU2VjdGlvbkhlYWRlcigiRE9NRG9jdW1lbnRGcmFnbWVudCB0cmFuc2Zvcm1U
b0ZyYWdtZW50KGluIERPTU5vZGUgc291cmNlLCBpbiBET01Eb2N1bWVudCBvdXRwdXQpIik7Cisv
LyAyLjEgZnJhZ21lbnQgd2l0aCB1bmRlZmluZWQgc291cmNlCisKK3Byb2Nlc3Nvci5yZXNldCgp
OworcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Cit2YXIgb3duZXJEb2N1bWVudCA9
IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KCIiLCAidGVzdCIsIG51bGwp
OwordmFyIHRlc3RuYW1lID0gImZyYWdtZW50IHdpdGggdW5kZWZpbmVkIHNvdXJjZSI7CithZGRS
ZXN1bHRFeHBlY3RFeGNlcHRpb24odGVzdG5hbWUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb2Nl
c3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHVuZGVmaW5lZCwgb3duZXJEb2N1bWVudCk7IH0gKTsK
KworLy8gMi4yIGZyYWdtZW50IHdpdGggdW5kZWZpbmVkIG91dHB1dCBkb2N1bWVudAorCitvd25l
ckRvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoIiIsICJ0
ZXN0IiwgbnVsbCk7CituZXdGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50
KHhtbCwgdW5kZWZpbmVkKTsKK2FkZFhNTFJlc3VsdCgiZnJhZ21lbnQgd2l0aCB1bmRlZmluZWQg
b3V0cHV0IGRvY3VtZW50IiwgbmV3RnJhZ21lbnQpOworCisvLyAyLjMgdXNlIG5vbi1ET01Eb2N1
bWVudCBvdXRwdXQgcGFyYW1ldGVyCisKK3ZhciB0ZXN0bmFtZSA9ICJ1c2Ugbm9uLURPTURvY3Vt
ZW50IG91dHB1dCBwYXJhbWV0ZXIiOworYWRkUmVzdWx0RXhwZWN0RXhjZXB0aW9uKHRlc3RuYW1l
LCBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9jZXNzb3IudHJhbnNmb3JtVG9GcmFnbWVudCh4bWws
ICJlcnJvciIpOyB9ICk7CisKKy8vIDIuNCB0cmFuc2Zvcm0gdG8gc2FtZSBmcmFnbWVudCB0d2lj
ZQorCitvd25lckRvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1l
bnQoIiIsICJ0ZXN0IiwgbnVsbCk7Cit2YXIgc2Vjb25kRG9jdW1lbnQgPSBkb2N1bWVudC5pbXBs
ZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgiIiwgInRlc3QiLCBudWxsKTsKK25ld0ZyYWdtZW50
ID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRnJhZ21lbnQoeG1sLCBvd25lckRvY3VtZW50KTsKK3Zh
ciBzZWNvbmRGcmFnbWVudCA9IHByb2Nlc3Nvci50cmFuc2Zvcm1Ub0ZyYWdtZW50KHhtbCwgc2Vj
b25kRG9jdW1lbnQpOworYWRkWE1MUmVzdWx0KCJ0cmFuc2Zvcm0gdG8gc2FtZSBmcmFnbWVudCB0
d2ljZSIsIHNlY29uZEZyYWdtZW50KTsKKworCisKKy8vIDMuMCBET01Eb2N1bWVudCB0cmFuc2Zv
cm1Ub0RvY3VtZW50KGluIERPTU5vZGUgc291cmNlKTsKK2FkZFNlY3Rpb25IZWFkZXIoIkRPTURv
Y3VtZW50IHRyYW5zZm9ybVRvRG9jdW1lbnQoaW4gRE9NTm9kZSBzb3VyY2UpIik7CisKKy8vIDMu
MSBkb2N1bWVudCBmcm9tIHVuZGVmaW5lZCBzb3VyY2UKKworcHJvY2Vzc29yLnJlc2V0KCk7Citw
cm9jZXNzb3IuaW1wb3J0U3R5bGVzaGVldCh4c2wxKTsKK2FkZFJlc3VsdEV4cGVjdEV4Y2VwdGlv
bih0ZXN0bmFtZSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9j
dW1lbnQodW5kZWZpbmVkKTsgfSApOworCisvLyAzLjIgdHJhbnNmb3JtIHR3aWNlCisKK3Byb2Nl
c3Nvci5yZXNldCgpOworcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Cit2YXIgbmV3
WE1MID0gcHJvY2Vzc29yLnRyYW5zZm9ybVRvRG9jdW1lbnQoeG1sKTsKK3ZhciBuZXdYTUwgPSBw
cm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudCh4bWwpOworYWRkWE1MUmVzdWx0KCJkb2N1bWVu
dCBmcm9tIHVuZGVmaW5lZCBzb3VyY2UiLCBuZXdYTUwpOworCisKKworCisvLyA0LjAgdm9pZCBz
ZXRQYXJhbWV0ZXIoaW4gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwgaW4gRE9NU3RyaW5nIGxvY2Fs
TmFtZSwgaW4gVmFsdWUgdmFsdWUpOworYWRkU2VjdGlvbkhlYWRlcigidm9pZCBzZXRQYXJhbWV0
ZXIoaW4gRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwgaW4gRE9NU3RyaW5nIGxvY2FsTmFtZSwgaW4g
VmFsdWUgdmFsdWUpIik7Citwcm9jZXNzb3IucmVzZXQoKTsKKworLy8gNC4xIHBhc3Mgc2V0UGFy
YW1ldGVyIHNhbWUgbG9jYWxuYW1lLCBkaWZmZXJlbnQgbmFtZXNwYWNlcworcHJvY2Vzc29yLnNl
dFBhcmFtZXRlcigiZm9vIiwgImZvbyIsICJTdWNjZXNzIik7Citwcm9jZXNzb3Iuc2V0UGFyYW1l
dGVyKCJiYXIiLCAiZm9vIiwgIkZhaWx1cmUiKTsKK3ZhciB0ZXN0bmFtZSA9ICJwYXNzIHNldFBh
cmFtZXRlciBzYW1lIGxvY2FsbmFtZSwgZGlmZmVyZW50IG5hbWVzcGFjZXMiOworYWRkUmVzdWx0
RXhwZWN0VmFsdWUodGVzdG5hbWUsIHByb2Nlc3Nvci5nZXRQYXJhbWV0ZXIoImZvbyIsICJmb28i
KSwgIlN1Y2Nlc3MiKTsKKworLy8gNC4yIHBhc3MgdW5kZWZpbmVkIG5hbWVzcGFjZQorCitwcm9j
ZXNzb3Iuc2V0UGFyYW1ldGVyKHVuZGVmaW5lZCwgImZvbyIsICJTdWNjZXNzIik7CithZGRTdHJp
bmdSZXN1bHQoInBhc3MgdW5kZWZpbmVkIG5hbWVzcGFjZSIsIHByb2Nlc3Nvci5nZXRQYXJhbWV0
ZXIodW5kZWZpbmVkLCAiZm9vIikpOworCisvLyA0LjMgcGFzcyBzZXRQYXJhbWV0ZXIgYW4gdW5k
ZWZpbmVkIG5hbWUKKwordmFyIHRlc3RuYW1lID0gInBhc3Mgc2V0UGFyYW1ldGVyIGFuIHVuZGVm
aW5lZCBuYW1lIjsKK2FkZFJlc3VsdEV4cGVjdEV4Y2VwdGlvbih0ZXN0bmFtZSwgZnVuY3Rpb24g
KCkgeyByZXR1cm4gcHJvY2Vzc29yLnNldFBhcmFtZXRlcih1bmRlZmluZWQsIHVuZGVmaW5lZCAs
ICJTdWNjZXNzIik7IH0gKTsKKworLy8gNC40IHBhc3MgdW5kZWZpbmVkIHZhbHVlCisKK3Byb2Nl
c3Nvci5zZXRQYXJhbWV0ZXIodW5kZWZpbmVkLCAiZm9vIiwgdW5kZWZpbmVkKTsKK3ZhciB0ZXN0
bmFtZSA9ICJwYXNzIHVuZGVmaW5lZCB2YWx1ZSI7CisKKworLy8gNC41IHBhc3MgdW5zdXBwb3J0
ZWQgdmFsdWUgdG8gc2V0UGFyYW1ldGVyIChvYmplY3QsIGZvciBpbnN0YW5jZT8pCisKK3ZhciB0
ZXN0bmFtZSA9ICJwYXNzIHVuc3VwcG9ydGVkIHZhbHVlIHRvIHNldFBhcmFtZXRlciI7CithZGRS
ZXN1bHRFeHBlY3RFeGNlcHRpb24odGVzdG5hbWUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb2Nl
c3Nvci5zZXRQYXJhbWV0ZXIodW5kZWZpbmVkLCAiaW52YWxpZCIgLCBuZXcgQXJyYXkoKSk7IH0g
KTsKKworCisvLyA1LjAgVmFsdWUgZ2V0UGFyYW1ldGVyKGluIERPTVN0cmluZyBuYW1lc3BhY2VV
UkksIGluIERPTVN0cmluZyBsb2NhbE5hbWUpOworYWRkU2VjdGlvbkhlYWRlcigiVmFsdWUgZ2V0
UGFyYW1ldGVyKGluIERPTVN0cmluZyBuYW1lc3BhY2VVUkksIGluIERPTVN0cmluZyBsb2NhbE5h
bWUpIik7CisKKy8vIDUuMSBwYXNzIHVuZGVmaW5lZCBuYW1lCisKK3ZhciB0ZXN0bmFtZSA9ICJw
YXNzIGdldFBhcmFtZXRlciBhbiB1bmRlZmluZWQgbmFtZSI7CithZGRSZXN1bHRFeHBlY3RFeGNl
cHRpb24odGVzdG5hbWUsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb2Nlc3Nvci5nZXRQYXJhbWV0
ZXIodW5kZWZpbmVkLCB1bmRlZmluZWQpOyB9ICk7CisKKy8vIDUuMiBwYXNzIGdldFBhcmFtZXRl
ciBhIG5hbWUgd2hpY2ggaGFzIG5vdCBiZWVuIHNldAorCit2YXIgdGVzdG5hbWUgPSAicGFzcyBn
ZXRQYXJhbWV0ZXIgYSBuYW1lIHdoaWNoIGhhcyBub3QgYmVlbiBzZXQiOworYWRkUmVzdWx0RXhw
ZWN0VmFsdWUodGVzdG5hbWUsIHByb2Nlc3Nvci5nZXRQYXJhbWV0ZXIodW5kZWZpbmVkLCAiaGFz
bm90YmVlbnNldCIpLCB1bmRlZmluZWQpOworCisvLyA1LjMgdmVyaWZ5IGdldFBhcmFtZXRlciBh
Y3R1YWxseSBnZXRzIChhbmQgc2V0IHNldHMpCitwcm9jZXNzb3Iuc2V0UGFyYW1ldGVyKG51bGws
ICJ0ZXN0IiwgInRlc3RWYWx1ZSIpOwordmFyIHRlc3RuYW1lID0gInZlcmlmeSBnZXRQYXJhbWV0
ZXIgYWN0dWFsbHkgZ2V0cyAoYW5kIHNldCBzZXRzKSI7CithZGRSZXN1bHRFeHBlY3RWYWx1ZSh0
ZXN0bmFtZSwgcHJvY2Vzc29yLmdldFBhcmFtZXRlcihudWxsLCAidGVzdCIpLCAidGVzdFZhbHVl
Iik7CisKKworCisvLyA2LjAgdm9pZCByZW1vdmVQYXJhbWV0ZXIoaW4gRE9NU3RyaW5nIG5hbWVz
cGFjZVVSSSwgaW4gRE9NU3RyaW5nIGxvY2FsTmFtZSk7CithZGRTZWN0aW9uSGVhZGVyKCJ2b2lk
IHJlbW92ZVBhcmFtZXRlcihpbiBET01TdHJpbmcgbmFtZXNwYWNlVVJJLCBpbiBET01TdHJpbmcg
bG9jYWxOYW1lKSIpOworLy8gNi4xIHBhc3MgcmVtb3ZlUGFyYW1ldGVyIHNhbWUgbG9jYWxuYW1l
LCBkaWZmZXJlbnQgbmFtZXNwYWNlcworCitwcm9jZXNzb3Iuc2V0UGFyYW1ldGVyKCJmb28iLCAi
Zm9vIiwgIlN1Y2Nlc3MiKTsKK3Byb2Nlc3Nvci5zZXRQYXJhbWV0ZXIoImJhciIsICJmb28iLCAi
RmFpbHVyZSIpOwordmFyIHRlc3RuYW1lID0gInBhc3MgcmVtb3ZlUGFyYW1ldGVyIHNhbWUgbG9j
YWxuYW1lLCBkaWZmZXJlbnQgbmFtZXNwYWNlcyI7CithZGRSZXN1bHRFeHBlY3RWYWx1ZSh0ZXN0
bmFtZSwgcHJvY2Vzc29yLmdldFBhcmFtZXRlcigiZm9vIiwgImZvbyIpLCAiU3VjY2VzcyIpOwor
CisvLyA2LjIgcGFzcyB1bmRlZmluZWQgbmFtZXNwYWNlCisKK3Byb2Nlc3Nvci5zZXRQYXJhbWV0
ZXIodW5kZWZpbmVkLCAidGVzdCIsICJ0ZXN0VmFsdWUiKTsKK3Byb2Nlc3Nvci5yZW1vdmVQYXJh
bWV0ZXIodW5kZWZpbmVkLCAidGVzdCIpOwordmFyIHRlc3RuYW1lID0gInZlcmlmeSByZW1vdmVQ
YXJhbWV0ZXIgYWN0dWFsbHkgcmVtb3ZlcyB1c2luZyB1bmRlZmluZWQgbmFtZXNwYWNlIjsJCith
ZGRSZXN1bHRFeHBlY3RWYWx1ZSh0ZXN0bmFtZSwgcHJvY2Vzc29yLmdldFBhcmFtZXRlcihudWxs
LCAidGVzdCIpLCB1bmRlZmluZWQpOworCisvLyA2LjMgcGFzcyByZW1vdmVQYXJhbWV0ZXIgdW5k
ZWZpbmVkIG5hbWUKKworcHJvY2Vzc29yLnNldFBhcmFtZXRlcih1bmRlZmluZWQsICJ1bmRlZmlu
ZWQiLCAiU3VjY2VzcyIpOworcHJvY2Vzc29yLnJlbW92ZVBhcmFtZXRlcih1bmRlZmluZWQsIHVu
ZGVmaW5lZCk7Cit2YXIgdGVzdG5hbWUgPSAicGFzcyByZW1vdmVQYXJhbWV0ZXIgdW5kZWZpbmVk
IG5hbWUiOworYWRkUmVzdWx0RXhwZWN0VmFsdWUodGVzdG5hbWUsIHByb2Nlc3Nvci5nZXRQYXJh
bWV0ZXIodW5kZWZpbmVkLCAidW5kZWZpbmVkIiksICJTdWNjZXNzIik7CisKKy8vIDYuNCBwYXNz
IHJlbW92ZVBhcmFtZXRlciBhIG5hbWUgd2hpY2ggaGFzIG5vdCBiZWVuIHNldAorCitwcm9jZXNz
b3IucmVtb3ZlUGFyYW1ldGVyKHVuZGVmaW5lZCwgIm5ldmVyYmVlbnNldGZvcnJlbW92ZSIpOwor
YWRkU3RyaW5nUmVzdWx0KCJwYXNzIHJlbW92ZVBhcmFtZXRlciBhIG5hbWUgd2hpY2ggaGFzIG5v
dCBiZWVuIHNldCIsICJTdWNjZXNzIik7CisKKy8vIDYuNSB2ZXJpZnkgcmVtb3ZlUGFyYW1ldGVy
IGFjdHVhbGx5IHJlbW92ZXMKK3Byb2Nlc3Nvci5zZXRQYXJhbWV0ZXIobnVsbCwgInRlc3QiLCAi
dGVzdFZhbHVlIik7Citwcm9jZXNzb3IucmVtb3ZlUGFyYW1ldGVyKG51bGwsICJ0ZXN0Iik7Cit2
YXIgdGVzdG5hbWUgPSAidmVyaWZ5IHJlbW92ZVBhcmFtZXRlciBhY3R1YWxseSByZW1vdmVzIjsK
K2FkZFJlc3VsdEV4cGVjdFZhbHVlKHRlc3RuYW1lLCBwcm9jZXNzb3IuZ2V0UGFyYW1ldGVyKG51
bGwsICJ0ZXN0IiksIHVuZGVmaW5lZCk7CisKKworCisvLyA3LjAgdm9pZCBjbGVhclBhcmFtZXRl
cnMoKTsKK2FkZFNlY3Rpb25IZWFkZXIoInZvaWQgY2xlYXJQYXJhbWV0ZXJzKCkiKTsKKworLy8g
Ny4xIGNhbGwsIHZlcmlmeSB0aGF0IHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNsZWFyZWQKK3Byb2Nl
c3Nvci5zZXRQYXJhbWV0ZXIobnVsbCwgInRlc3QiLCAidGVzdFZhbHVlIik7Citwcm9jZXNzb3Iu
Y2xlYXJQYXJhbWV0ZXJzKCk7Cit2YXIgdGVzdG5hbWUgPSAidmVyaWZ5IHRoYXQgY2xlYXJQYXJh
bWV0ZXJzIGRvZXMiOworYWRkUmVzdWx0RXhwZWN0VmFsdWUodGVzdG5hbWUsIHByb2Nlc3Nvci5n
ZXRQYXJhbWV0ZXIobnVsbCwgInRlc3QiKSwgdW5kZWZpbmVkKTsKKworCisvLyA4LjAgdm9pZCBy
ZXNldCgpOworYWRkU2VjdGlvbkhlYWRlcigidm9pZCByZXNldCgpIik7Citwcm9jZXNzb3IgPSBu
ZXcgWFNMVFByb2Nlc3NvcigpOworcHJvY2Vzc29yLmltcG9ydFN0eWxlc2hlZXQoeHNsMSk7Citw
cm9jZXNzb3Iuc2V0UGFyYW1ldGVyKG51bGwsICJ0ZXN0IiwgInRlc3RWYWx1ZSIpOworcHJvY2Vz
c29yLnJlc2V0KCk7CisKKy8vIDguMSBjYWxsLCB2ZXJpZnkgdGhhdCBwYXJhbWV0ZXJzIGFyZSBj
bGVhcmVkIGFmdGVyIHJlc2V0KCkKK3ZhciB0ZXN0bmFtZSA9ICJ2ZXJpZnkgdGhhdCBwYXJhbWV0
ZXJzIGhhdmUgYmVlbiBjbGVhcmVkIjsKK2FkZFJlc3VsdEV4cGVjdFZhbHVlKHRlc3RuYW1lLCBw
cm9jZXNzb3IuZ2V0UGFyYW1ldGVyKG51bGwsICJ0ZXN0IiksIHVuZGVmaW5lZCk7CisKKy8vIDgu
MiBjYWxsLCB2ZXJpZnkgdGhhdCBzdHlsZXNoZWV0IGhhcyBiZWVuIGNsZWFyZWQgYWZ0ZXIgcmVz
ZXQoKQordmFyIHRlc3RuYW1lID0gInZlcmlmeSB0aGF0IHN0eWxlc2hlZXQgaGFzIGJlZW4gY2xl
YXJlZCI7Cit2YXIgcmVzdWx0RG9jdW1lbnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVu
dCh4bWwpOworaWYgKHJlc3VsdERvY3VtZW50ICE9IHVuZGVmaW5lZCkKKwlhZGRTdHJpbmdSZXN1
bHQodGVzdG5hbWUsICIqKioqRmFpbHVyZSoqKiogKGFjdHVhbDogIiArIHNlcmlhbGl6ZXIuc2Vy
aWFsaXplVG9TdHJpbmcocmVzdWx0RG9jdW1lbnQpICsgIikiKTsKK2Vsc2UKKwlhZGRTdHJpbmdS
ZXN1bHQodGVzdG5hbWUsICJTdWNjZXNzIik7CisKKzwvc2NyaXB0PgorCis8L2JvZHk+Cis8L2h0
bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=
</data>
<flag name="review"
          id="762"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>4486</attachid>
            <date>2005-10-26 23:47:32 -0700</date>
            <delta_ts>2005-10-27 14:48:16 -0700</delta_ts>
            <desc>Patch fixing darin&apos;s complaints.</desc>
            <filename>final.patch</filename>
            <type>text/plain</type>
            <size>38919</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGVjbWEvWFNMVFByb2Nlc3Nvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogWFNMVFBy
b2Nlc3Nvci5jcHAKZGlmZiAtTiBlY21hL1hTTFRQcm9jZXNzb3IuY3BwCi0tLSBlY21hL1hTTFRQ
cm9jZXNzb3IuY3BwCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIGVjbWEvWFNMVFByb2Nl
c3Nvci5jcHAJMjcgT2N0IDIwMDUgMDY6NDc6MDMgLTAwMDAKQEAgLTAsMCArMSwxNTMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlhTTFRQ
cm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ4c2x0X3Byb2Nlc3NvcmltcGwuaCIKKyNpbmNsdWRlICJY
U0xUUHJvY2Vzc29yLmx1dC5oIgorI2luY2x1ZGUgImtqc19kb20uaCIKKyNpbmNsdWRlICJkb21f
ZG9jaW1wbC5oIgorCisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvbG9va3VwLmg+CisKK3VzaW5n
IG5hbWVzcGFjZSBET007CisKK25hbWVzcGFjZSBLSlMgeworCitjb25zdCBDbGFzc0luZm8gWFNM
VFByb2Nlc3Nvcjo6aW5mbyA9IHsgIlhTTFRQcm9jZXNzb3IiLCAwLCAwLCAwIH07CisKKy8qCitA
YmVnaW4gWFNMVFByb2Nlc3NvclByb3RvVGFibGUgNworICBpbXBvcnRTdHlsZXNoZWV0ICAgICAg
WFNMVFByb2Nlc3Nvcjo6SW1wb3J0U3R5bGVzaGVldCAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAx
CisgIHRyYW5zZm9ybVRvRnJhZ21lbnQgICBYU0xUUHJvY2Vzc29yOjpUcmFuc2Zvcm1Ub0ZyYWdt
ZW50ICBEb250RGVsZXRlfEZ1bmN0aW9uIDIKKyAgdHJhbnNmb3JtVG9Eb2N1bWVudCAgIFhTTFRQ
cm9jZXNzb3I6OlRyYW5zZm9ybVRvRG9jdW1lbnQgIERvbnREZWxldGV8RnVuY3Rpb24gMgorICBz
ZXRQYXJhbWV0ZXIgICAgICAgICAgWFNMVFByb2Nlc3Nvcjo6U2V0UGFyYW1ldGVyICAgICAgICAg
RG9udERlbGV0ZXxGdW5jdGlvbiAzCisgIGdldFBhcmFtZXRlciAgICAgICAgICBYU0xUUHJvY2Vz
c29yOjpHZXRQYXJhbWV0ZXIgICAgICAgICBEb250RGVsZXRlfEZ1bmN0aW9uIDIKKyAgcmVtb3Zl
UGFyYW1ldGVyICAgICAgIFhTTFRQcm9jZXNzb3I6OlJlbW92ZVBhcmFtZXRlciAgICAgIERvbnRE
ZWxldGV8RnVuY3Rpb24gMgorICBjbGVhclBhcmFtZXRlcnMgICAgICAgWFNMVFByb2Nlc3Nvcjo6
Q2xlYXJQYXJhbWV0ZXJzICAgICAgRG9udERlbGV0ZXxGdW5jdGlvbiAwCisgIHJlc2V0ICAgICAg
ICAgICAgICAgICBYU0xUUHJvY2Vzc29yOjpSZXNldCAgICAgICAgICAgICAgICBEb250RGVsZXRl
fEZ1bmN0aW9uIDAKK0BlbmQKKyovCisKK0RFRklORV9QUk9UT1RZUEUoIlhTTFRQcm9jZXNzb3Ii
LCBYU0xUUHJvY2Vzc29yUHJvdG8pCitJTVBMRU1FTlRfUFJPVE9GVU5DKFhTTFRQcm9jZXNzb3JQ
cm90b0Z1bmMpCitJTVBMRU1FTlRfUFJPVE9UWVBFKFhTTFRQcm9jZXNzb3JQcm90bywgWFNMVFBy
b2Nlc3NvclByb3RvRnVuYykKKworWFNMVFByb2Nlc3Nvcjo6WFNMVFByb2Nlc3NvcihFeGVjU3Rh
dGUgKmV4ZWMpIDogbV9pbXBsKG5ldyBYU0xUUHJvY2Vzc29ySW1wbCgpKQoreworICAgIHNldFBy
b3RvdHlwZShYU0xUUHJvY2Vzc29yUHJvdG86OnNlbGYoZXhlYykpOworfQorCitYU0xUUHJvY2Vz
c29yOjp+WFNMVFByb2Nlc3NvcigpCit7CisgICAgU2NyaXB0SW50ZXJwcmV0ZXI6OmZvcmdldERP
TU9iamVjdChtX2ltcGwuZ2V0KCkpOworfQorCitWYWx1ZUltcCAqWFNMVFByb2Nlc3NvclByb3Rv
RnVuYzo6Y2FsbEFzRnVuY3Rpb24oRXhlY1N0YXRlICpleGVjLCBPYmplY3RJbXAgKnRoaXNPYmos
IGNvbnN0IExpc3QgJmFyZ3MpCit7CisgICAgaWYgKCF0aGlzT2JqLT5pbmhlcml0cygmS0pTOjpY
U0xUUHJvY2Vzc29yOjppbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXhlYywgVHlw
ZUVycm9yKTsKKyAgICBYU0xUUHJvY2Vzc29ySW1wbCAmcHJvY2Vzc29yID0gKnN0YXRpY19jYXN0
PFhTTFRQcm9jZXNzb3IgKj4odGhpc09iaiktPmltcGwoKTsKKyAgICBzd2l0Y2ggKGlkKSB7Cisg
ICAgICAgIGNhc2UgWFNMVFByb2Nlc3Nvcjo6SW1wb3J0U3R5bGVzaGVldDoKKyAgICAgICAgewor
ICAgICAgICAgICAgVmFsdWVJbXAgKm5vZGVWYWwgPSBhcmdzWzBdOworICAgICAgICAgICAgaWYg
KG5vZGVWYWwtPmlzT2JqZWN0KCZET01Ob2RlOjppbmZvKSkgeworICAgICAgICAgICAgICAgIERP
TU5vZGUgKm5vZGUgPSBzdGF0aWNfY2FzdDxET01Ob2RlICo+KG5vZGVWYWwpOworICAgICAgICAg
ICAgICAgIHByb2Nlc3Nvci5pbXBvcnRTdHlsZXNoZWV0KG5vZGUtPmltcGwoKSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyBUaHJvdyBleGNlcHRpb24/CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6OlRyYW5zZm9ybVRvRnJhZ21lbnQ6CisgICAgICAgIHsK
KyAgICAgICAgICAgIFZhbHVlSW1wICpub2RlVmFsID0gYXJnc1swXTsKKyAgICAgICAgICAgIFZh
bHVlSW1wICpkb2NWYWwgPSBhcmdzWzFdOworICAgICAgICAgICAgaWYgKG5vZGVWYWwtPmlzT2Jq
ZWN0KCZET01Ob2RlOjppbmZvKSAmJiBkb2NWYWwtPmlzT2JqZWN0KCZET01Eb2N1bWVudDo6aW5m
bykpIHsKKyAgICAgICAgICAgICAgICBET01Ob2RlICpub2RlID0gc3RhdGljX2Nhc3Q8RE9NTm9k
ZSAqPihub2RlVmFsKTsKKyAgICAgICAgICAgICAgICBET01Eb2N1bWVudCAqZG9jID0gc3RhdGlj
X2Nhc3Q8RE9NRG9jdW1lbnQgKj4oZG9jVmFsKTsKKyAgICAgICAgICAgICAgICBEb2N1bWVudElt
cGwgKmRvY0ltcGwgPSBzdGF0aWNfY2FzdDxEb2N1bWVudEltcGwgKj4oZG9jLT5pbXBsKCkpOwor
ICAgICAgICAgICAgICAgIHJldHVybiBnZXRET01Ob2RlKGV4ZWMsIHByb2Nlc3Nvci50cmFuc2Zv
cm1Ub0ZyYWdtZW50KG5vZGUtPmltcGwoKSwgZG9jSW1wbCkuZ2V0KCkpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgLy8gVGhyb3cgZXhjZXB0aW9uPworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBYU0xUUHJvY2Vzc29yOjpUcmFuc2Zvcm1Ub0RvY3VtZW50
OgorICAgICAgICB7CisgICAgICAgICAgICBWYWx1ZUltcCAqbm9kZVZhbCA9IGFyZ3NbMF07Cisg
ICAgICAgICAgICBpZiAobm9kZVZhbC0+aXNPYmplY3QoJkRPTU5vZGU6OmluZm8pKSB7CisgICAg
ICAgICAgICAgICAgRE9NTm9kZSAqbm9kZSA9IHN0YXRpY19jYXN0PERPTU5vZGUgKj4obm9kZVZh
bCk7CisgICAgICAgICAgICAgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gcmVzdWx0RG9jdW1l
bnQgPSBwcm9jZXNzb3IudHJhbnNmb3JtVG9Eb2N1bWVudChub2RlLT5pbXBsKCkpOworICAgICAg
ICAgICAgICAgIGlmIChyZXN1bHREb2N1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGdldERPTURvY3VtZW50Tm9kZShleGVjLCByZXN1bHREb2N1bWVudC5nZXQoKSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyBUaHJvdyBleGNlcHRpb24/CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6OlNldFBhcmFtZXRlcjoKKyAgICAgICAgeworICAgICAg
ICAgICAgaWYgKGFyZ3NbMV0tPmlzVW5kZWZpbmVkT3JOdWxsKCkgfHwgYXJnc1syXS0+aXNVbmRl
ZmluZWRPck51bGwoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsgLy8g
VGhyb3cgZXhjZXB0aW9uPworICAgICAgICAgICAgRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGFy
Z3NbMF0tPnRvU3RyaW5nKGV4ZWMpLmRvbVN0cmluZygpOworICAgICAgICAgICAgRE9NU3RyaW5n
IGxvY2FsTmFtZSA9IGFyZ3NbMV0tPnRvU3RyaW5nKGV4ZWMpLmRvbVN0cmluZygpOworICAgICAg
ICAgICAgRE9NU3RyaW5nIHZhbHVlID0gYXJnc1syXS0+dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5n
KCk7CisgICAgICAgICAgICBwcm9jZXNzb3Iuc2V0UGFyYW1ldGVyKG5hbWVzcGFjZVVSSS5pbXBs
KCksIGxvY2FsTmFtZS5pbXBsKCksIHZhbHVlLmltcGwoKSk7CisgICAgICAgICAgICByZXR1cm4g
anNVbmRlZmluZWQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFhTTFRQcm9jZXNzb3I6Okdl
dFBhcmFtZXRlcjoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFyZ3NbMV0tPmlzVW5kZWZp
bmVkT3JOdWxsKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGpzVW5kZWZpbmVkKCk7CisgICAg
ICAgICAgICBET01TdHJpbmcgbmFtZXNwYWNlVVJJID0gYXJnc1swXS0+dG9TdHJpbmcoZXhlYyku
ZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBET01TdHJpbmcgbG9jYWxOYW1lID0gYXJnc1sxXS0+
dG9TdHJpbmcoZXhlYykuZG9tU3RyaW5nKCk7CisgICAgICAgICAgICBET01TdHJpbmdJbXBsICp2
YWx1ZSA9IHByb2Nlc3Nvci5nZXRQYXJhbWV0ZXIobmFtZXNwYWNlVVJJLmltcGwoKSwgbG9jYWxO
YW1lLmltcGwoKSkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmFsdWUpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGpzU3RyaW5nKFVTdHJpbmcodmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiBq
c1VuZGVmaW5lZCgpOworICAgICAgICB9CisgICAgICAgIGNhc2UgWFNMVFByb2Nlc3Nvcjo6UmVt
b3ZlUGFyYW1ldGVyOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYXJnc1sxXS0+aXNVbmRl
ZmluZWRPck51bGwoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAg
ICAgICAgICAgIERPTVN0cmluZyBuYW1lc3BhY2VVUkkgPSBhcmdzWzBdLT50b1N0cmluZyhleGVj
KS5kb21TdHJpbmcoKTsKKyAgICAgICAgICAgIERPTVN0cmluZyBsb2NhbE5hbWUgPSBhcmdzWzFd
LT50b1N0cmluZyhleGVjKS5kb21TdHJpbmcoKTsKKyAgICAgICAgICAgIHByb2Nlc3Nvci5yZW1v
dmVQYXJhbWV0ZXIobmFtZXNwYWNlVVJJLmltcGwoKSwgbG9jYWxOYW1lLmltcGwoKSk7CisgICAg
ICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFhT
TFRQcm9jZXNzb3I6OkNsZWFyUGFyYW1ldGVyczoKKyAgICAgICAgICAgIHByb2Nlc3Nvci5jbGVh
clBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOworICAgICAg
ICBjYXNlIFhTTFRQcm9jZXNzb3I6OlJlc2V0OgorICAgICAgICAgICAgcHJvY2Vzc29yLnJlc2V0
KCk7CisgICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICB9CisgICAgcmV0dXJu
IGpzVW5kZWZpbmVkKCk7Cit9CisKK307CisKSW5kZXg6IGVjbWEvWFNMVFByb2Nlc3Nvci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KUkNTIGZpbGU6IFhTTFRQcm9jZXNzb3IuaApkaWZmIC1OIGVjbWEvWFNMVFByb2Nl
c3Nvci5oCi0tLSBlY21hL1hTTFRQcm9jZXNzb3IuaAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAw
CisrKyBlY21hL1hTTFRQcm9jZXNzb3IuaAkyNyBPY3QgMjAwNSAwNjo0NzowNiAtMDAwMApAQCAt
MCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFhTTFRQcm9jZXNzb3Jf
SAorI2RlZmluZSBYU0xUUHJvY2Vzc29yX0gKKworI2luY2x1ZGUgPGt4bWxjb3JlL1NoYXJlZFB0
ci5oPgorI2luY2x1ZGUgImtqc19iaW5kaW5nLmgiCisKK25hbWVzcGFjZSBET00geworICAgIGNs
YXNzIFhTTFRQcm9jZXNzb3JJbXBsOworfTsKKworLy8gRXZlbnR1YWxseSB3ZSBzaG91bGQgaW1w
bGVtZW50IFhTTFRFeGNlcHRpb246CisvLyBodHRwOi8vbHhyLm1vemlsbGEub3JnL3NlYW1vbmtl
eS9zb3VyY2UvY29udGVudC94c2wvcHVibGljL25zSVhTTFRFeGNlcHRpb24uaWRsCisvLyBodHRw
Oi8vYnVnemlsbGEub3BlbmRhcndpbi5vcmcvc2hvd19idWcuY2dpP2lkPTU0NDYKKworbmFtZXNw
YWNlIEtKUyB7CisKK2NsYXNzIFhTTFRQcm9jZXNzb3IgOiBwdWJsaWMgRE9NT2JqZWN0IHsKK3B1
YmxpYzoKKyAgICBYU0xUUHJvY2Vzc29yKEV4ZWNTdGF0ZSAqZXhlYyk7CisgICAgflhTTFRQcm9j
ZXNzb3IoKTsKKyAgICAKKyAgICB2aXJ0dWFsIGNvbnN0IENsYXNzSW5mbyAqY2xhc3NJbmZvKCkg
Y29uc3QgeyByZXR1cm4gJmluZm87IH0KKyAgICBzdGF0aWMgY29uc3QgQ2xhc3NJbmZvIGluZm87
CisgICAgCisgICAgZW51bSB7IEltcG9ydFN0eWxlc2hlZXQsIFRyYW5zZm9ybVRvRnJhZ21lbnQs
IFRyYW5zZm9ybVRvRG9jdW1lbnQsIFNldFBhcmFtZXRlciwKKyAgICAgICAgICAgIEdldFBhcmFt
ZXRlciwgUmVtb3ZlUGFyYW1ldGVyLCBDbGVhclBhcmFtZXRlcnMsIFJlc2V0IH07CisgICAgCisg
ICAgRE9NOjpYU0xUUHJvY2Vzc29ySW1wbCAqaW1wbCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wbC5n
ZXQoKTsgfQorcHJpdmF0ZToKKyAgICBTaGFyZWRQdHI8RE9NOjpYU0xUUHJvY2Vzc29ySW1wbD4g
bV9pbXBsOworfTsKKworY2xhc3MgWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9ySW1wIDogcHVibGlj
IE9iamVjdEltcCB7CitwdWJsaWM6CisgICAgWFNMVFByb2Nlc3NvckNvbnN0cnVjdG9ySW1wKEV4
ZWNTdGF0ZSAqKSB7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaW1wbGVtZW50c0NvbnN0cnVjdCgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIE9iamVjdEltcCAqY29uc3RydWN0KEV4
ZWNTdGF0ZSAqZXhlYywgY29uc3QgTGlzdCAmYXJncykgeyByZXR1cm4gbmV3IFhTTFRQcm9jZXNz
b3IoZXhlYyk7IH0KK307CisKK307CisKKyNlbmRpZgpJbmRleDogZWNtYS9ranNfd2luZG93LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC9lY21hL2tqc193
aW5kb3cuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE4MwpkaWZmIC1wIC11IC1yMS4xODMg
ZWNtYS9ranNfd2luZG93LmNwcAotLS0gZWNtYS9ranNfd2luZG93LmNwcAkxMSBPY3QgMjAwNSAw
Njo1NToyOSAtMDAwMAkxLjE4MworKysgZWNtYS9ranNfd2luZG93LmNwcAkyNyBPY3QgMjAwNSAw
Njo0NzoxMCAtMDAwMApAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgImtqc19ldmVudHMuaCIK
ICNpbmNsdWRlICJ4bWxodHRwcmVxdWVzdC5oIgogI2luY2x1ZGUgInhtbHNlcmlhbGl6ZXIuaCIK
KyNpbmNsdWRlICJYU0xUUHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAiZG9tcGFyc2VyLmgiCiAKICNp
bmNsdWRlICJraHRtbHZpZXcuaCIKQEAgLTIxMiw3ICsyMTMsNyBAQCBWYWx1ZUltcCAqU2NyZWVu
OjpnZXRWYWx1ZVByb3BlcnR5KEV4ZWNTCiBjb25zdCBDbGFzc0luZm8gV2luZG93OjppbmZvID0g
eyAiV2luZG93IiwgMCwgJldpbmRvd1RhYmxlLCAwIH07CiAKIC8qCi1AYmVnaW4gV2luZG93VGFi
bGUgOTEKK0BiZWdpbiBXaW5kb3dUYWJsZSAxMDMKICAgY2xvc2VkCVdpbmRvdzo6Q2xvc2VkCQlE
b250RGVsZXRlfFJlYWRPbmx5CiAgIGNyeXB0bwlXaW5kb3c6OkNyeXB0bwkJRG9udERlbGV0ZXxS
ZWFkT25seQogICBkZWZhdWx0U3RhdHVzCVdpbmRvdzo6RGVmYXVsdFN0YXR1cwlEb250RGVsZXRl
CkBAIC0yNzAsNiArMjcxLDcgQEAgY29uc3QgQ2xhc3NJbmZvIFdpbmRvdzo6aW5mbyA9IHsgIldp
bmRvdwogICBYTUxIdHRwUmVxdWVzdAlXaW5kb3c6OlhNTEh0dHBSZXF1ZXN0CURvbnREZWxldGV8
UmVhZE9ubHkKICAgWE1MU2VyaWFsaXplcglXaW5kb3c6OlhNTFNlcmlhbGl6ZXIJRG9udERlbGV0
ZXxSZWFkT25seQogICBET01QYXJzZXIJV2luZG93OjpET01QYXJzZXIJRG9udERlbGV0ZXxSZWFk
T25seQorICBYU0xUUHJvY2Vzc29yCVdpbmRvdzo6WFNMVFByb2Nlc3NvcglEb250RGVsZXRlfFJl
YWRPbmx5CiAgIGFsZXJ0CQlXaW5kb3c6OkFsZXJ0CQlEb250RGVsZXRlfEZ1bmN0aW9uIDEKICAg
Y29uZmlybQlXaW5kb3c6OkNvbmZpcm0JCURvbnREZWxldGV8RnVuY3Rpb24gMQogICBwcm9tcHQJ
V2luZG93OjpQcm9tcHQJCURvbnREZWxldGV8RnVuY3Rpb24gMgpAQCAtODY2LDYgKzg2OCw4IEBA
IFZhbHVlSW1wICpXaW5kb3c6OmdldFZhbHVlUHJvcGVydHkoRXhlY1MKICAgICAgIHJldHVybiBu
ZXcgWE1MU2VyaWFsaXplckNvbnN0cnVjdG9ySW1wKGV4ZWMpOwogICAgIGNhc2UgRE9NUGFyc2Vy
OgogICAgICAgcmV0dXJuIG5ldyBET01QYXJzZXJDb25zdHJ1Y3RvckltcChleGVjLCBtX3BhcnQt
PnhtbERvY0ltcGwoKSk7CisgICAgY2FzZSBYU0xUUHJvY2Vzc29yOgorICAgICAgcmV0dXJuIG5l
dyBYU0xUUHJvY2Vzc29yQ29uc3RydWN0b3JJbXAoZXhlYyk7CiAgICAgY2FzZSBGcmFtZUVsZW1l
bnQ6CiAgICAgICBpZiAoRG9jdW1lbnRJbXBsICpkb2MgPSBtX3BhcnQtPnhtbERvY0ltcGwoKSkK
ICAgICAgICAgaWYgKEVsZW1lbnRJbXBsICpmZSA9IGRvYy0+b3duZXJFbGVtZW50KCkpCkluZGV4
OiBlY21hL2tqc193aW5kb3cuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29y
ZS9raHRtbC9lY21hL2tqc193aW5kb3cuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41MwpkaWZm
IC1wIC11IC1yMS41MyBlY21hL2tqc193aW5kb3cuaAotLS0gZWNtYS9ranNfd2luZG93LmgJMTkg
U2VwIDIwMDUgMTg6NTI6MTEgLTAwMDAJMS41MworKysgZWNtYS9ranNfd2luZG93LmgJMjcgT2N0
IDIwMDUgMDY6NDc6MTMgLTAwMDAKQEAgLTE0Niw3ICsxNDYsOCBAQCBuYW1lc3BhY2UgS0pTIHsK
ICAgICAgICAgICAgU2Nyb2xsVG8sIFNjcm9sbFgsIFNjcm9sbFksIE1vdmVCeSwgTW92ZVRvLCBS
ZXNpemVCeSwgUmVzaXplVG8sIFNlbGYsIF9XaW5kb3csIFRvcCwgX1NjcmVlbiwKICAgICAgICAg
ICAgSW1hZ2UsIE9wdGlvbiwgQWxlcnQsIENvbmZpcm0sIFByb21wdCwgT3BlbiwgUHJpbnQsIFNl
dFRpbWVvdXQsIENsZWFyVGltZW91dCwKICAgICAgICAgICAgRm9jdXMsIEdldFNlbGVjdGlvbiwg
Qmx1ciwgQ2xvc2UsIFNldEludGVydmFsLCBDbGVhckludGVydmFsLCBDYXB0dXJlRXZlbnRzLCAK
LSAgICAgICAgICAgUmVsZWFzZUV2ZW50cywgQWRkRXZlbnRMaXN0ZW5lciwgUmVtb3ZlRXZlbnRM
aXN0ZW5lciwgWE1MSHR0cFJlcXVlc3QsIFhNTFNlcmlhbGl6ZXIsIERPTVBhcnNlciwKKyAgICAg
ICAgICAgUmVsZWFzZUV2ZW50cywgQWRkRXZlbnRMaXN0ZW5lciwgUmVtb3ZlRXZlbnRMaXN0ZW5l
ciwKKyAgICAgICAgICAgWE1MSHR0cFJlcXVlc3QsIFhNTFNlcmlhbGl6ZXIsIERPTVBhcnNlciwg
WFNMVFByb2Nlc3NvciwKIAkgICBPbmFib3J0LCBPbmJsdXIsIE9uY2hhbmdlLCBPbmNsaWNrLCBP
bmRibGNsaWNrLCBPbmRyYWdkcm9wLCBPbmVycm9yLCAKIAkgICBPbmZvY3VzLCBPbmtleWRvd24s
IE9ua2V5cHJlc3MsIE9ua2V5dXAsIE9ubG9hZCwgT25tb3VzZWRvd24sIE9ubW91c2Vtb3ZlLAog
ICAgICAgICAgICBPbm1vdXNlb3V0LCBPbm1vdXNlb3ZlciwgT25tb3VzZXVwLCBPbldpbmRvd01v
dXNlV2hlZWwsIE9ubW92ZSwgT25yZXNldCwgT25yZXNpemUsIE9uc2Nyb2xsLCBPbnNlYXJjaCwK
SW5kZXg6IGtodG1sX3BhcnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9jdnMvcm9vdC9XZWJD
b3JlL2todG1sL2todG1sX3BhcnQuY3BwLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjM1MgpkaWZm
IC1wIC11IC1yMS4zNTIga2h0bWxfcGFydC5jcHAKLS0tIGtodG1sX3BhcnQuY3BwCTI2IE9jdCAy
MDA1IDIxOjQ3OjM1IC0wMDAwCTEuMzUyCisrKyBraHRtbF9wYXJ0LmNwcAkyNyBPY3QgMjAwNSAw
Njo0NzoyMCAtMDAwMApAQCAtNjkzLDIzICs2OTMsNiBAQCBib29sIEtIVE1MUGFydDo6Y2xvc2VV
UkwoKQogICByZXR1cm4gdHJ1ZTsKIH0KIAotI2lmICFLSFRNTF9OT19DUExVU1BMVVNfRE9NCi0K
LURPTTo6SFRNTERvY3VtZW50IEtIVE1MUGFydDo6aHRtbERvY3VtZW50KCkgY29uc3QKLXsKLSAg
aWYgKGQtPm1fZG9jICYmIGQtPm1fZG9jLT5pc0hUTUxEb2N1bWVudCgpKQotICAgIHJldHVybiBz
dGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsKj4oZC0+bV9kb2MpOwotICBlbHNlCi0gICAgcmV0
dXJuIHN0YXRpY19jYXN0PEhUTUxEb2N1bWVudEltcGwqPigwKTsKLX0KLQotRE9NOjpEb2N1bWVu
dCBLSFRNTFBhcnQ6OmRvY3VtZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+bV9kb2M7Ci19
Ci0KLSNlbmRpZgotCiBLUGFydHM6OkJyb3dzZXJFeHRlbnNpb24gKktIVE1MUGFydDo6YnJvd3Nl
ckV4dGVuc2lvbigpIGNvbnN0CiB7CiAgIHJldHVybiBkLT5tX2V4dGVuc2lvbjsKQEAgLTExODcs
OCArMTE3MCwxMCBAQCB2b2lkIEtIVE1MUGFydDo6cmVwbGFjZURvY0ltcGwoRG9jdW1lbnRJCiAg
ICAgICAgICAgICBkLT5tX2RvYy0+ZGVyZWYoKTsKICAgICAgICAgfQogICAgICAgICBkLT5tX2Rv
YyA9IG5ld0RvYzsKLSAgICAgICAgaWYgKG5ld0RvYykKKyAgICAgICAgaWYgKG5ld0RvYykgewog
ICAgICAgICAgICAgbmV3RG9jLT5yZWYoKTsKKyAgICAgICAgICAgIG5ld0RvYy0+YXR0YWNoKCk7
CisgICAgICAgIH0KICAgICB9CiB9CiAKSW5kZXg6IHhtbC9kb21fZG9jaW1wbC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dlYkNvcmUva2h0bWwveG1sL2RvbV9kb2NpbXBsLmNw
cCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4yNjIKZGlmZiAtcCAtdSAtcjEuMjYyIHhtbC9kb21f
ZG9jaW1wbC5jcHAKLS0tIHhtbC9kb21fZG9jaW1wbC5jcHAJMjYgT2N0IDIwMDUgMDY6MTA6MDkg
LTAwMDAJMS4yNjIKKysrIHhtbC9kb21fZG9jaW1wbC5jcHAJMjcgT2N0IDIwMDUgMDY6NDc6MjUg
LTAwMDAKQEAgLTM3Miw4ICszNzIsNyBAQCBEb2N1bWVudEltcGw6OkRvY3VtZW50SW1wbChET01J
bXBsZW1lbnRhCiAgICAgICAsIG1fYmluZGluZ01hbmFnZXIobmV3IFhCTEJpbmRpbmdNYW5hZ2Vy
KHRoaXMpKQogI2VuZGlmCiAjaWZkZWYgS0hUTUxfWFNMVAotICAgICwgbV90cmFuc2Zvcm1Tb3Vy
Y2UoTlVMTCkKLSAgICAsIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQoMCkKKyAgICAsIG1fdHJh
bnNmb3JtU291cmNlKDApCiAjZW5kaWYKICNpZiBBUFBMRV9DSEFOR0VTCiAgICAgLCBtX2Zpbmlz
aGVkUGFyc2luZyh0aGlzLCBTSUdOQUwoZmluaXNoZWRQYXJzaW5nKCkpKQpAQCAtNTE4LDggKzUx
Nyw2IEBAIERvY3VtZW50SW1wbDo6fkRvY3VtZW50SW1wbCgpCiAKICNpZmRlZiBLSFRNTF9YU0xU
CiAgICAgeG1sRnJlZURvYygoeG1sRG9jUHRyKW1fdHJhbnNmb3JtU291cmNlKTsKLSAgICBpZiAo
bV90cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCkKLSAgICAgICAgbV90cmFuc2Zvcm1Tb3VyY2VEb2N1
bWVudC0+ZGVyZWYoKTsKICNlbmRpZgogCiAjaWZuZGVmIEtIVE1MX05PX1hCTApAQCAtMzEwMSwy
MCArMzA5OCwxNSBAQCB2b2lkIERvY3VtZW50SW1wbDo6c2hpZnRNYXJrZXJzKE5vZGVJbXBsCiAK
IHZvaWQgRG9jdW1lbnRJbXBsOjphcHBseVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rp
b25JbXBsKiBwaSkKIHsKLSAgICAvLyBGSVhNRTogQmUgc3VyZSB0byBjaGFuZ2UgdGhpcyBuZXh0
IGxpbmUgdG8gdXNlIGEgU2hhcmVkUHRyIGluc3RlYWQgb2YgYSBzdGFjay1hbGxvY2F0ZWQKLSAg
ICAvLyBvYmplY3Qgb25jZSBYU0xUUHJvY2Vzc29ySW1wbCBnZXRzIGEgcmVmIGNvdW50LgotICAg
IFhTTFRQcm9jZXNzb3JJbXBsIHByb2Nlc3NvcihzdGF0aWNfY2FzdDxYU0xTdHlsZVNoZWV0SW1w
bCo+KHBpLT5zaGVldCgpKSwgdGhpcyk7Ci0gICAgcHJvY2Vzc29yLnRyYW5zZm9ybURvY3VtZW50
KHRoaXMpOworICAgIFNoYXJlZFB0cjxYU0xUUHJvY2Vzc29ySW1wbD4gcHJvY2Vzc29yID0gbmV3
IFhTTFRQcm9jZXNzb3JJbXBsOworICAgIHByb2Nlc3Nvci0+c2V0WFNMU3R5bGVzaGVldChzdGF0
aWNfY2FzdDxYU0xTdHlsZVNoZWV0SW1wbCo+KHBpLT5zaGVldCgpKSk7CisgICAgCisgICAgUVN0
cmluZyByZXN1bHRNSU1FVHlwZTsKKyAgICBRU3RyaW5nIG5ld1NvdXJjZTsKKyAgICBpZiAoIXBy
b2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1NvdXJj
ZSkpCisgICAgICAgIHJldHVybjsKICAgICAvLyBGSVhNRTogSWYgdGhlIHRyYW5zZm9ybSBmYWls
ZWQgd2Ugc2hvdWxkIHByb2JhYmx5IHJlcG9ydCBhbiBlcnJvciAobGlrZSBNb3ppbGxhIGRvZXMp
LgotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0VHJhbnNmb3JtU291cmNlRG9jdW1lbnQoRG9j
dW1lbnRJbXBsKiBkb2MpCi17IAotICAgIGlmIChkb2MpCi0gICAgICAgIGRvYy0+cmVmKCk7Ci0g
ICAgaWYgKG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQpCi0gICAgICAgIG1fdHJhbnNmb3JtU291
cmNlRG9jdW1lbnQtPmRlcmVmKCk7IAotICAgIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBk
b2M7CisgICAgcHJvY2Vzc29yLT5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UobmV3U291cmNlLCBy
ZXN1bHRNSU1FVHlwZSwgdGhpcywgdmlldygpKTsKIH0KIAogI2VuZGlmCkluZGV4OiB4bWwvZG9t
X2RvY2ltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94
bWwvZG9tX2RvY2ltcGwuaCx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4xMzIKZGlmZiAtcCAtdSAt
cjEuMTMyIHhtbC9kb21fZG9jaW1wbC5oCi0tLSB4bWwvZG9tX2RvY2ltcGwuaAkyNiBPY3QgMjAw
NSAwNjoxMDowOSAtMDAwMAkxLjEzMgorKysgeG1sL2RvbV9kb2NpbXBsLmgJMjcgT2N0IDIwMDUg
MDY6NDc6MjkgLTAwMDAKQEAgLTU3Miw4ICs1NzIsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBhcHBs
eVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSk7CiAgICAgdm9pZCBz
ZXRUcmFuc2Zvcm1Tb3VyY2Uodm9pZCogZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlID0gZG9jOyB9
CiAgICAgY29uc3Qgdm9pZCogdHJhbnNmb3JtU291cmNlKCkgeyByZXR1cm4gbV90cmFuc2Zvcm1T
b3VyY2U7IH0KLSAgICBEb2N1bWVudEltcGwqIHRyYW5zZm9ybVNvdXJjZURvY3VtZW50KCkgeyBy
ZXR1cm4gbV90cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudDsgfQotICAgIHZvaWQgc2V0VHJhbnNmb3Jt
U291cmNlRG9jdW1lbnQoRG9jdW1lbnRJbXBsKiBkb2MpOworICAgIFNoYXJlZFB0cjxEb2N1bWVu
dEltcGw+IHRyYW5zZm9ybVNvdXJjZURvY3VtZW50KCkgeyByZXR1cm4gbV90cmFuc2Zvcm1Tb3Vy
Y2VEb2N1bWVudDsgfQorICAgIHZvaWQgc2V0VHJhbnNmb3JtU291cmNlRG9jdW1lbnQoRG9jdW1l
bnRJbXBsICpkb2MpIHsgbV90cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCA9IGRvYzsgfQogI2VuZGlm
CiAKICNpZm5kZWYgS0hUTUxfTk9fWEJMCkBAIC02OTYsOCArNjk2LDggQEAgcHJvdGVjdGVkOgog
ICAgIGJvb2wgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZDsKICAgICAKICNpZmRlZiBLSFRN
TF9YU0xUCi0gICAgdm9pZCogbV90cmFuc2Zvcm1Tb3VyY2U7Ci0gICAgRG9jdW1lbnRJbXBsKiBt
X3RyYW5zZm9ybVNvdXJjZURvY3VtZW50OworICAgIHZvaWQgKm1fdHJhbnNmb3JtU291cmNlOwor
ICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQ7CiAj
ZW5kaWYKIAogI2lmbmRlZiBLSFRNTF9OT19YQkwKSW5kZXg6IHhtbC94bWxfdG9rZW5pemVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09ClJDUyBmaWxlOiAvY3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94bWwveG1sX3Rv
a2VuaXplci5jcHAsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNDgKZGlmZiAtcCAtdSAtcjEuNDgg
eG1sL3htbF90b2tlbml6ZXIuY3BwCi0tLSB4bWwveG1sX3Rva2VuaXplci5jcHAJMjYgT2N0IDIw
MDUgMDY6MTA6MTAgLTAwMDAJMS40OAorKysgeG1sL3htbF90b2tlbml6ZXIuY3BwCTI3IE9jdCAy
MDA1IDA2OjQ3OjMyIC0wMDAwCkBAIC03OTEsMjAgKzc5MSwyNSBAQCBib29sIFhNTFRva2VuaXpl
cjo6aXNXYWl0aW5nRm9yU2NyaXB0cygpCiB9CiAKICNpZmRlZiBLSFRNTF9YU0xUCi12b2lkIFhN
TFRva2VuaXplcjo6c2V0VHJhbnNmb3JtU291cmNlKERvY3VtZW50SW1wbCogZG9jKQordm9pZCAq
eG1sRG9jUHRyRm9yU3RyaW5nKGNvbnN0IFFTdHJpbmcgJnNvdXJjZSwgY29uc3QgUVN0cmluZyAm
dXJsKQogewotICAgIC8vIFRpbWUgdG8gc3BpbiB1cCBhIG5ldyBwYXJzZSBhbmQgc2F2ZSB0aGUg
eG1sRG9jUHRyLgogICAgIC8vIFBhcnNlIGluIGEgc2luZ2xlIGNodW5rIGludG8gYW4geG1sRG9j
UHRyCiAgICAgLy8gRklYTUU6IEhvb2sgdXAgZXJyb3IgaGFuZGxlcnMgc28gdGhhdCBhIGZhaWx1
cmUgdG8gcGFyc2UgdGhlIG1haW4gZG9jdW1lbnQgcmVzdWx0cyBpbgogICAgIC8vIGdvb2QgZXJy
b3IgbWVzc2FnZXMuCiAgICAgY29uc3QgUUNoYXIgQk9NKDB4RkVGRik7CiAgICAgY29uc3QgdW5z
aWduZWQgY2hhciBCT01IaWdoQnl0ZSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVk
IGNoYXIgKj4oJkJPTSk7Ci0gICAgeG1sRG9jUHRyIHNvdXJjZURvYyA9IHhtbFJlYWRNZW1vcnko
cmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KG1feG1sQ29kZS51bmljb2RlKCkpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1feG1sQ29kZS5sZW5ndGgoKSAq
IHNpemVvZihRQ2hhciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZG9jLT5VUkwoKS5hc2NpaSgpLAorICAgIHhtbERvY1B0ciBzb3VyY2VEb2MgPSB4bWxSZWFkTWVt
b3J5KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihzb3VyY2UudW5pY29kZSgpKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UubGVuZ3RoKCkgKiBz
aXplb2YoUUNoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVy
bC5hc2NpaSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPTUhp
Z2hCeXRlID09IDB4RkYgPyAiVVRGLTE2TEUiIDogIlVURi0xNkJFIiwgCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MX1BBUlNFX05PQ0RBVEF8WE1MX1BBUlNFX0RU
REFUVFJ8WE1MX1BBUlNFX05PRU5UKTsKLSAgICBkb2MtPnNldFRyYW5zZm9ybVNvdXJjZShzb3Vy
Y2VEb2MpOworICAgIHJldHVybiBzb3VyY2VEb2M7Cit9CisKK3ZvaWQgWE1MVG9rZW5pemVyOjpz
ZXRUcmFuc2Zvcm1Tb3VyY2UoRG9jdW1lbnRJbXBsICpkb2MpCit7CisgICAgLy8gVGltZSB0byBz
cGluIHVwIGEgbmV3IHBhcnNlIGFuZCBzYXZlIHRoZSB4bWxEb2NQdHIuCisgICAgZG9jLT5zZXRU
cmFuc2Zvcm1Tb3VyY2UoeG1sRG9jUHRyRm9yU3RyaW5nKG1feG1sQ29kZSwgZG9jLT5VUkwoKSkp
OwogfQogI2VuZGlmCiAKSW5kZXg6IHhtbC94bWxfdG9rZW5pemVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1Mg
ZmlsZTogL2N2cy9yb290L1dlYkNvcmUva2h0bWwveG1sL3htbF90b2tlbml6ZXIuaCx2CnJldHJp
ZXZpbmcgcmV2aXNpb24gMS4yMApkaWZmIC1wIC11IC1yMS4yMCB4bWwveG1sX3Rva2VuaXplci5o
Ci0tLSB4bWwveG1sX3Rva2VuaXplci5oCTI1IE9jdCAyMDA1IDIyOjMyOjU1IC0wMDAwCTEuMjAK
KysrIHhtbC94bWxfdG9rZW5pemVyLmgJMjcgT2N0IDIwMDUgMDY6NDc6MzUgLTAwMDAKQEAgLTg0
LDYgKzg0LDkgQEAgcHJpdmF0ZToKIH07CiAKIFRva2VuaXplciAqbmV3WE1MVG9rZW5pemVyKERP
TTo6RG9jdW1lbnRQdHIgKiwgS0hUTUxWaWV3ICogPSAwKTsKKyNpZmRlZiBLSFRNTF9YU0xUCit2
b2lkICp4bWxEb2NQdHJGb3JTdHJpbmcoY29uc3QgUVN0cmluZyAmc291cmNlLCBjb25zdCBRU3Ry
aW5nICZ1cmwgPSBRU3RyaW5nKCkpOworI2VuZGlmCiBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+IHBh
cnNlQXR0cmlidXRlcyhjb25zdCBET006OkRPTVN0cmluZyAmLCBib29sICZhdHRyc09LKTsKIGJv
b2wgcGFyc2VYTUxEb2N1bWVudEZyYWdtZW50KGNvbnN0IERPTTo6RE9NU3RyaW5nICYsIERPTTo6
RG9jdW1lbnRGcmFnbWVudEltcGwgKiwgRE9NOjpFbGVtZW50SW1wbCAqcGFyZW50ID0gMCk7CiB9
CkluZGV4OiB4c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAv
Y3ZzL3Jvb3QvV2ViQ29yZS9raHRtbC94c2wveHNsdF9wcm9jZXNzb3JpbXBsLmNwcCx2CnJldHJp
ZXZpbmcgcmV2aXNpb24gMS4xMwpkaWZmIC1wIC11IC1yMS4xMyB4c2wveHNsdF9wcm9jZXNzb3Jp
bXBsLmNwcAotLS0geHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJMTAgT2N0IDIwMDUgMjM6NDg6
NTUgLTAwMDAJMS4xMworKysgeHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5jcHAJMjcgT2N0IDIwMDUg
MDY6NDc6MzggLTAwMDAKQEAgLTI0LDggKzI0LDExIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAj
aW5jbHVkZSAieHNsdF9wcm9jZXNzb3JpbXBsLmgiCiAjaW5jbHVkZSAieHNsX3N0eWxlc2hlZXRp
bXBsLmgiCisjaW5jbHVkZSAieG1sX3Rva2VuaXplci5oIgorI2luY2x1ZGUgImh0bWx0b2tlbml6
ZXIuaCIKICNpbmNsdWRlICJodG1sX2RvY3VtZW50aW1wbC5oIgogI2luY2x1ZGUgImxvYWRlci5o
IgorI2luY2x1ZGUgIm1hcmt1cC5oIgogI2luY2x1ZGUgImtodG1sdmlldy5oIgogI2luY2x1ZGUg
ImtodG1sX3BhcnQuaCIKICNpbmNsdWRlICJLV1FMb2FkZXIuaCIKQEAgLTM2LDI3ICszOSwzMiBA
QAogI2luY2x1ZGUgPGxpYnhzbHQvZG9jdW1lbnRzLmg+CiAjaW5jbHVkZSA8bGlieHNsdC9pbXBv
cnRzLmg+CiAKKyNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CisKIHVzaW5nIG5hbWVz
cGFjZSBraHRtbDsKIHVzaW5nIG5hbWVzcGFjZSBET007CiAKIG5hbWVzcGFjZSBET00gewotICAg
IAotWFNMVFByb2Nlc3NvckltcGw6OlhTTFRQcm9jZXNzb3JJbXBsKFhTTFN0eWxlU2hlZXRJbXBs
KiBzaGVldCwgRG9jdW1lbnRJbXBsKiBzb3VyY2UpCi0gICAgOiBtX3N0eWxlc2hlZXQoc2hlZXQp
LCBtX3NvdXJjZURvY3VtZW50KHNvdXJjZSkKLXsKLX0KLQotWFNMVFByb2Nlc3NvckltcGw6On5Y
U0xUUHJvY2Vzc29ySW1wbCgpCi17Ci19CiAKIHN0YXRpYyB2b2lkIHBhcnNlRXJyb3JGdW5jKHZv
aWQgKmN0eHQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQogewogICAgIC8vIEZJWE1FOiBJdCB3b3Vs
ZCBiZSBuaWNlIHRvIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMgc29tZXdoZXJlLgorI2lmICFFUlJP
Ul9ESVNBQkxFRAorICAgIGNoYXIgKmVycm9yTWVzc2FnZSA9IDA7CisgICAgdmFfbGlzdCBhcmdz
OworICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisgICAgdmFzcHJpbnRmKCZlcnJvck1lc3NhZ2Us
IG1zZywgYXJncyk7CisgICAgRVJST1IoIiVzIiwgZXJyb3JNZXNzYWdlKTsKKyAgICBpZiAoZXJy
b3JNZXNzYWdlKQorICAgICAgICBmcmVlKGVycm9yTWVzc2FnZSk7CisgICAgdmFfZW5kKGFyZ3Mp
OworI2VuZGlmCiB9CiAKKy8vIEZJWE1FOiBUaGVyZSBzZWVtcyB0byBiZSBubyB3YXkgdG8gY29u
dHJvbCB0aGUgY3R4dCBwb2ludGVyIGZvciBsb2FkaW5nIGhlcmUsIHRodXMgd2UgaGF2ZSBnbG9i
YWxzLgogc3RhdGljIFhTTFRQcm9jZXNzb3JJbXBsICpnbG9iYWxQcm9jZXNzb3IgPSAwOwotc3Rh
dGljIHhtbERvY1B0ciBzdHlsZXNoZWV0TG9hZEZ1bmMoY29uc3QgeG1sQ2hhciogdXJpLAorc3Rh
dGljIGtodG1sOjpEb2NMb2FkZXIgKmdsb2JhbERvY0xvYWRlciA9IDA7CitzdGF0aWMgeG1sRG9j
UHRyIHN0eWxlc2hlZXRMb2FkRnVuYyhjb25zdCB4bWxDaGFyICp1cmksCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB4bWxEaWN0UHRyIGRpY3QsCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBpbnQgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHZvaWQqIGN0eHQsCkBAIC03Nyw3ICs4NSw3IEBAIHN0YXRpYyB4bWxEb2NQ
dHIgc3R5bGVzaGVldExvYWRGdW5jKGNvbnMKICAgICAgICAgICAgIHZvaWQgKm9sZEVycm9yQ29u
dGV4dCA9IHhtbEdlbmVyaWNFcnJvckNvbnRleHQ7CiAgICAgICAgICAgICAKICAgICAgICAgICAg
IGRhdGEgPSBLV1FTZXJ2ZVN5bmNocm9ub3VzUmVxdWVzdChraHRtbDo6Q2FjaGU6OmxvYWRlcigp
LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxQ
cm9jZXNzb3ItPnNvdXJjZURvY3VtZW50KCktPmRvY0xvYWRlcigpLCBqb2IsIGZpbmFsVVJMLCBo
ZWFkZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBn
bG9iYWxEb2NMb2FkZXIsIGpvYiwgZmluYWxVUkwsIGhlYWRlcnMpOwogICAgICAgICAKICAgICAg
ICAgICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmMoMCwgcGFyc2VFcnJvckZ1bmMpOwogICAgICAg
ICAgICAgLy8gV2UgZG9uJ3Qgc3BlY2lmeSBhbiBlbmNvZGluZyBoZXJlLiBOZWl0aGVyIEdlY2tv
IG5vciBXaW5JRSByZXNwZWN0cwpAQCAtODcsNyArOTUsNyBAQCBzdGF0aWMgeG1sRG9jUHRyIHN0
eWxlc2hlZXRMb2FkRnVuYyhjb25zCiAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICB9
CiAgICAgICAgIGNhc2UgWFNMVF9MT0FEX1NUWUxFU0hFRVQ6Ci0gICAgICAgICAgICByZXR1cm4g
Z2xvYmFsUHJvY2Vzc29yLT5zdHlsZXNoZWV0KCktPmxvY2F0ZVN0eWxlc2hlZXRTdWJSZXNvdXJj
ZSgoKHhzbHRTdHlsZXNoZWV0UHRyKWN0eHQpLT5kb2MsIHVyaSk7CisgICAgICAgICAgICByZXR1
cm4gZ2xvYmFsUHJvY2Vzc29yLT54c2xTdHlsZXNoZWV0KCktPmxvY2F0ZVN0eWxlc2hlZXRTdWJS
ZXNvdXJjZSgoKHhzbHRTdHlsZXNoZWV0UHRyKWN0eHQpLT5kb2MsIHVyaSk7CiAgICAgICAgIGRl
ZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC05NSwxMjAgKzEwMywyNTMgQEAg
c3RhdGljIHhtbERvY1B0ciBzdHlsZXNoZWV0TG9hZEZ1bmMoY29ucwogICAgIHJldHVybiAwOwog
fQogCi1TaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBYU0xUUHJvY2Vzc29ySW1wbDo6dHJhbnNmb3Jt
RG9jdW1lbnQoRG9jdW1lbnRJbXBsKiBkb2MpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0WFNMVExv
YWRDYWxsQmFjayh4c2x0RG9jTG9hZGVyRnVuYyBmdW5jLCBYU0xUUHJvY2Vzc29ySW1wbCAqcHJv
Y2Vzc29yLCBraHRtbDo6RG9jTG9hZGVyICpsb2FkZXIpCiB7Ci0gICAgLy8gRklYTUU6IFJpZ2h0
IG5vdyB3ZSBhc3N1bWUgfGRvY3wgaXMgdW5wYXJzZWQsIGJ1dCBpZiBpdCBoYXMgYmVlbiBwYXJz
ZWQgd2Ugd2lsbCBuZWVkIHRvIHNlcmlhbGl6ZSBpdAotICAgIC8vIGFuZCB0aGVuIGZlZWQgdGhh
dCByZXN1bHRpbmcgc291cmNlIHRvIGxpYnhzbHQuCi0gICAgbV9yZXN1bHRPdXRwdXQgPSAiIjsK
KyAgICB4c2x0U2V0TG9hZGVyRnVuYyhmdW5jKTsKKyAgICBnbG9iYWxQcm9jZXNzb3IgPSBwcm9j
ZXNzb3I7CisgICAgZ2xvYmFsRG9jTG9hZGVyID0gbG9hZGVyOworfQogCi0gICAgaWYgKCFtX3N0
eWxlc2hlZXQgfHwgIW1fc3R5bGVzaGVldC0+ZG9jdW1lbnQoKSkgcmV0dXJuIDA7Ci0gICAgICAg
IAotICAgIGdsb2JhbFByb2Nlc3NvciA9IHRoaXM7Ci0gICAgeHNsdFNldExvYWRlckZ1bmMoc3R5
bGVzaGVldExvYWRGdW5jKTsKK3N0YXRpYyBpbnQgd3JpdGVUb1FTdHJpbmcodm9pZCAqY29udGV4
dCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgbGVuKQoreworICAgIFFTdHJpbmcgJnJlc3VsdE91
dHB1dCA9ICpzdGF0aWNfY2FzdDxRU3RyaW5nICo+KGNvbnRleHQpOworICAgIHJlc3VsdE91dHB1
dCArPSBRU3RyaW5nOjpmcm9tVXRmOChidWZmZXIsIGxlbik7CisgICAgcmV0dXJuIGxlbjsKK30K
IAotICAgIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0ID0gbV9zdHlsZXNoZWV0LT5jb21waWxlU3R5
bGVTaGVldCgpOworc3RhdGljIGJvb2wgc2F2ZVJlc3VsdFRvU3RyaW5nKHhtbERvY1B0ciByZXN1
bHREb2MsIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0LCBRU3RyaW5nICZyZXN1bHRTdHJpbmcpCit7
CisgICAgeG1sT3V0cHV0QnVmZmVyUHRyIG91dHB1dEJ1ZiA9IHhtbEFsbG9jT3V0cHV0QnVmZmVy
KDApOworICAgIGlmICghb3V0cHV0QnVmKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgb3V0
cHV0QnVmLT5jb250ZXh0ID0gJnJlc3VsdFN0cmluZzsKKyAgICBvdXRwdXRCdWYtPndyaXRlY2Fs
bGJhY2sgPSB3cml0ZVRvUVN0cmluZzsKKyAgICAKKyAgICBpbnQgcmV0dmFsID0geHNsdFNhdmVS
ZXN1bHRUbyhvdXRwdXRCdWYsIHJlc3VsdERvYywgc2hlZXQpOworICAgIHhtbE91dHB1dEJ1ZmZl
ckNsb3NlKG91dHB1dEJ1Zik7CisgICAgCisgICAgcmV0dXJuIChyZXR2YWwgPj0gMCk7Cit9CiAK
LSAgICBpZiAoIXNoZWV0KSB7Ci0gICAgICAgIGdsb2JhbFByb2Nlc3NvciA9IDA7Ci0gICAgICAg
IHhzbHRTZXRMb2FkZXJGdW5jKDApOworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zZm9ybVRleHRT
dHJpbmdUb1hIVE1MRG9jdW1lbnRTdHJpbmcoUVN0cmluZyAmdGV4dCkKK3sKKyAgICAvLyBNb2Rp
ZnkgdGhlIG91dHB1dCBzbyB0aGF0IGl0IGlzIGEgd2VsbC1mb3JtZWQgWEhUTUwgZG9jdW1lbnQg
d2l0aCBhIDxwcmU+IHRhZyBlbmNsb3NpbmcgdGhlIHRleHQuCisgICAgdGV4dC5yZXBsYWNlKCcm
JywgIiZhbXA7Iik7CisgICAgdGV4dC5yZXBsYWNlKCc8JywgIiZsdDsiKTsKKyAgICB0ZXh0ID0g
Ijw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIgorICAgICAgICAi
PCFET0NUWVBFIGh0bWwgUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5c
IiBcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj5c
biIKKyAgICAgICAgIjxodG1sIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwi
PlxuIgorICAgICAgICAiPGhlYWQ+PHRpdGxlLz48L2hlYWQ+XG4iCisgICAgICAgICI8Ym9keT5c
biIKKyAgICAgICAgIjxwcmU+IiArIHRleHQgKyAiPC9wcmU+XG4iCisgICAgICAgICI8L2JvZHk+
XG4iCisgICAgICAgICI8L2h0bWw+XG4iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqKnhzbHRQ
YXJhbUFycmF5RnJvbVFEaWN0KFFEaWN0PERPTVN0cmluZz4gcGFyYW1ldGVycykKK3sKKyAgICBp
ZiAocGFyYW1ldGVycy5jb3VudCgpKQogICAgICAgICByZXR1cm4gMDsKKyAgICBjb25zdCBjaGFy
ICoqcGFyYW1ldGVyQXJyYXkgPSAoY29uc3QgY2hhciAqKiltYWxsb2MoKChwYXJhbWV0ZXJzLmNv
dW50KCkgKiAyKSArIDEpICogc2l6ZW9mKGNoYXIgKikpOworCisgICAgUURpY3RJdGVyYXRvcjxE
T01TdHJpbmc+IGl0KHBhcmFtZXRlcnMpOworICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKKyAgICBm
b3IgKGl0LnRvRmlyc3QoKTsgaXQuY3VycmVudCgpOyArK2l0KSB7CisgICAgICAgIHBhcmFtZXRl
ckFycmF5WysraW5kZXhdID0gc3RyZHVwKGl0LmN1cnJlbnRLZXkoKS51dGY4KCkuZGF0YSgpKTsK
KyAgICAgICAgcGFyYW1ldGVyQXJyYXlbKytpbmRleF0gPSBzdHJkdXAoaXQuY3VycmVudCgpLT5x
c3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CiAgICAgfQorICAgIHBhcmFtZXRlckFycmF5W2luZGV4
XSA9IDA7CisKKyAgICByZXR1cm4gcGFyYW1ldGVyQXJyYXk7Cit9CisKK3N0YXRpYyB2b2lkIGZy
ZWVYc2x0UGFyYW1BcnJheShjb25zdCBjaGFyICoqcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIg
Kip0ZW1wID0gcGFyYW1zOworICAgIGlmICghcGFyYW1zKQorICAgICAgICByZXR1cm47CiAgICAg
Ci0gICAgbV9zdHlsZXNoZWV0LT5jbGVhckRvY3VtZW50cygpOwotICAKLSAgICAvLyBHZXQgdGhl
IHBhcnNlZCBzb3VyY2UgZG9jdW1lbnQuCi0gICAgeG1sRG9jUHRyIHNvdXJjZURvYyA9ICh4bWxE
b2NQdHIpZG9jLT50cmFuc2Zvcm1Tb3VyY2UoKTsKLSAgICB4bWxEb2NQdHIgcmVzdWx0RG9jID0g
eHNsdEFwcGx5U3R5bGVzaGVldChzaGVldCwgc291cmNlRG9jLCAwKTsKLSAgICAKLSAgICBnbG9i
YWxQcm9jZXNzb3IgPSAwOwotICAgIHhzbHRTZXRMb2FkZXJGdW5jKDApOworICAgIHdoaWxlICgq
dGVtcCkgeworICAgICAgICBmcmVlKCh2b2lkICopKih0ZW1wKyspKTsKKyAgICAgICAgZnJlZSgo
dm9pZCAqKSoodGVtcCsrKSk7CisgICAgfQorICAgIGZyZWUocGFyYW1zKTsKK30KIAotICAgIFNo
YXJlZFB0cjxEb2N1bWVudEltcGw+IHJlc3VsdCA9IGRvY3VtZW50RnJvbVhNTERvY1B0cihyZXN1
bHREb2MsIHNoZWV0KTsKLSAgICB4c2x0RnJlZVN0eWxlc2hlZXQoc2hlZXQpOwotICAgIHhtbEZy
ZWVEb2MocmVzdWx0RG9jKTsKIAorU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gWFNMVFByb2Nlc3Nv
ckltcGw6OmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShjb25zdCBRU3RyaW5nICZzb3VyY2VTdHJp
bmcsIGNvbnN0IFFTdHJpbmcgJnNvdXJjZU1JTUVUeXBlLCBOb2RlSW1wbCAqc291cmNlTm9kZSwg
S0hUTUxWaWV3ICp2aWV3KQoreworICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG93bmVyRG9j
dW1lbnQgPSBzb3VyY2VOb2RlLT5nZXREb2N1bWVudCgpOworICAgIGJvb2wgc291cmNlSXNEb2N1
bWVudCA9IChzb3VyY2VOb2RlID09IG93bmVyRG9jdW1lbnQuZ2V0KCkpOworICAgIFFTdHJpbmcg
ZG9jdW1lbnRTb3VyY2UgPSBzb3VyY2VTdHJpbmc7CisKKyAgICBTaGFyZWRQdHI8RG9jdW1lbnRJ
bXBsPiByZXN1bHQ7CisgICAgaWYgKHNvdXJjZU1JTUVUeXBlID09ICJ0ZXh0L2h0bWwiKQorICAg
ICAgICByZXN1bHQgPSBvd25lckRvY3VtZW50LT5pbXBsKCktPmNyZWF0ZUhUTUxEb2N1bWVudCh2
aWV3KTsKKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gb3duZXJEb2N1bWVudC0+aW1wbCgp
LT5jcmVhdGVEb2N1bWVudCh2aWV3KTsKKyAgICAgICAgaWYgKHNvdXJjZU1JTUVUeXBlID09ICJ0
ZXh0L3BsYWluIikKKyAgICAgICAgICAgIHRyYW5zZm9ybVRleHRTdHJpbmdUb1hIVE1MRG9jdW1l
bnRTdHJpbmcoZG9jdW1lbnRTb3VyY2UpOworICAgIH0KKyAgICAKKyAgICByZXN1bHQtPmRvY0xv
YWRlcigpLT5zZXRTaG93QW5pbWF0aW9ucyhvd25lckRvY3VtZW50LT5kb2NMb2FkZXIoKS0+c2hv
d0FuaW1hdGlvbnMoKSk7CisgICAgCisgICAgLy8gQmVmb3JlIHBhcnNpbmcsIHdlIG5lZWQgdG8g
c2F2ZSAmIGRldGFjaCB0aGUgb2xkIGRvY3VtZW50IGFuZCBnZXQgdGhlIG5ldyBkb2N1bWVudAor
ICAgIC8vIGluIHBsYWNlLiBXZSBoYXZlIHRvIGRvIHRoaXMgb25seSBpZiB3ZSdyZSByZW5kZXJp
bmcgdGhlIHJlc3VsdCBkb2N1bWVudC4KKyAgICBpZiAodmlldykgeworICAgICAgICB2aWV3LT5j
bGVhcigpOworICAgICAgICByZXN1bHQtPnNldFRyYW5zZm9ybVNvdXJjZURvY3VtZW50KHZpZXct
PnBhcnQoKS0+eG1sRG9jSW1wbCgpKTsKKyAgICAgICAgdmlldy0+cGFydCgpLT5yZXBsYWNlRG9j
SW1wbChyZXN1bHQuZ2V0KCkpOworICAgIH0KKyAgICAKKyAgICByZXN1bHQtPm9wZW4oKTsKKyAg
ICBpZiAoc291cmNlSXNEb2N1bWVudCkgeworICAgICAgICByZXN1bHQtPnNldFVSTChvd25lckRv
Y3VtZW50LT5VUkwoKSk7CisgICAgICAgIHJlc3VsdC0+c2V0QmFzZVVSTChvd25lckRvY3VtZW50
LT5iYXNlVVJMKCkpOworICAgIH0KKyAgICByZXN1bHQtPmRldGVybWluZVBhcnNlTW9kZShkb2N1
bWVudFNvdXJjZSk7IC8vIE1ha2Ugc3VyZSB3ZSBwYXJzZSBpbiB0aGUgY29ycmVjdCBtb2RlLgor
ICAgIHJlc3VsdC0+d3JpdGUoZG9jdW1lbnRTb3VyY2UpOworICAgIHJlc3VsdC0+ZmluaXNoUGFy
c2luZygpOworICAgIHJlc3VsdC0+c2V0UGFyc2luZyhmYWxzZSk7CisgICAgaWYgKHZpZXcpCisg
ICAgICAgIHZpZXctPnBhcnQoKS0+Y2hlY2tDb21wbGV0ZWQoKTsKKyAgICBlbHNlCisgICAgICAg
IHJlc3VsdC0+Y2xvc2UoKTsgLy8gRklYTUU6IEV2ZW4gdmlld2xlc3MgZG9jcyBjYW4gbG9hZCBz
dWJyZXNvdXJjZXMuIG9ubG9hZCB3aWxsIGZpcmUgdG9vIGVhcmx5LgorICAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gWE1MSHR0cFJlcXVlc3RPYmpl
Y3RzIGFzIHdlbGwuCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGludCBidWZmZXJX
cml0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIGludCBsZW4pCitzdGF0aWMg
aW5saW5lIFNoYXJlZFB0cjxEb2N1bWVudEZyYWdtZW50SW1wbD4gY3JlYXRlRnJhZ21lbnRGcm9t
U291cmNlKFFTdHJpbmcgc291cmNlU3RyaW5nLCBRU3RyaW5nIHNvdXJjZU1JTUVUeXBlLCBOb2Rl
SW1wbCAqc291cmNlTm9kZSwgRG9jdW1lbnRJbXBsICpvdXB1dERvYykKIHsKLSAgICBzdGF0aWNf
Y2FzdDxYU0xUUHJvY2Vzc29ySW1wbCo+KGNvbnRleHQpLT5hZGRUb1Jlc3VsdChidWZmZXIsIGxl
bik7Ci0gICAgcmV0dXJuIGxlbjsKKyAgICBTaGFyZWRQdHI8RG9jdW1lbnRGcmFnbWVudEltcGw+
IGZyYWdtZW50ID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKG91cHV0RG9jLT5kb2NQdHIoKSk7
CisgICAgCisgICAgaWYgKHNvdXJjZU1JTUVUeXBlID09ICJ0ZXh0L2h0bWwiKQorICAgICAgICBw
YXJzZUhUTUxEb2N1bWVudEZyYWdtZW50KHNvdXJjZVN0cmluZywgZnJhZ21lbnQuZ2V0KCkpOwor
ICAgIGVsc2UgeworICAgICAgICBpZiAoc291cmNlTUlNRVR5cGUgPT0gInRleHQvcGxhaW4iKQor
ICAgICAgICAgICAgdHJhbnNmb3JtVGV4dFN0cmluZ1RvWEhUTUxEb2N1bWVudFN0cmluZyhzb3Vy
Y2VTdHJpbmcpOworICAgICAgICBib29sIHN1Y2Nlc3NmdWxQYXJzZSA9IHBhcnNlWE1MRG9jdW1l
bnRGcmFnbWVudChzb3VyY2VTdHJpbmcsIGZyYWdtZW50LmdldCgpLCBvdXB1dERvYy0+ZG9jdW1l
bnRFbGVtZW50KCkpOworICAgICAgICBpZiAoIXN1Y2Nlc3NmdWxQYXJzZSkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCB0byBtZXNz
IHdpdGggVVJMcyBoZXJlPworICAgICAgICAKKyAgICByZXR1cm4gZnJhZ21lbnQ7CiB9CiAKLXZv
aWQgWFNMVFByb2Nlc3NvckltcGw6OmFkZFRvUmVzdWx0KGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50
IGxlbikKK3N0YXRpYyB4c2x0U3R5bGVzaGVldFB0ciB4c2x0U3R5bGVzaGVldFBvaW50ZXIoU2hh
cmVkUHRyPFhTTFN0eWxlU2hlZXRJbXBsPiAmY2FjaGVkU3R5bGVzaGVldCwgTm9kZUltcGwgKnN0
eWxlc2hlZXRSb290Tm9kZSkKIHsKLSAgICBtX3Jlc3VsdE91dHB1dCArPSBRU3RyaW5nOjpmcm9t
VXRmOChidWZmZXIsIGxlbik7CisgICAgaWYgKCFjYWNoZWRTdHlsZXNoZWV0ICYmIHN0eWxlc2hl
ZXRSb290Tm9kZSkgeworICAgICAgICBjYWNoZWRTdHlsZXNoZWV0ID0gbmV3IFhTTFN0eWxlU2hl
ZXRJbXBsKHN0eWxlc2hlZXRSb290Tm9kZS0+cGFyZW50KCkgPyBzdHlsZXNoZWV0Um9vdE5vZGUt
PnBhcmVudCgpIDogc3R5bGVzaGVldFJvb3ROb2RlKTsKKyAgICAgICAgY2FjaGVkU3R5bGVzaGVl
dC0+cGFyc2VTdHJpbmcoY3JlYXRlTWFya3VwKHN0eWxlc2hlZXRSb290Tm9kZSkpOworICAgIH0K
KyAgICAKKyAgICBpZiAoIWNhY2hlZFN0eWxlc2hlZXQgfHwgIWNhY2hlZFN0eWxlc2hlZXQtPmRv
Y3VtZW50KCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIHJldHVybiBjYWNoZWRTdHls
ZXNoZWV0LT5jb21waWxlU3R5bGVTaGVldCgpOwogfQogCi1TaGFyZWRQdHI8RG9jdW1lbnRJbXBs
PiBYU0xUUHJvY2Vzc29ySW1wbDo6ZG9jdW1lbnRGcm9tWE1MRG9jUHRyKHhtbERvY1B0ciByZXN1
bHREb2MsIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0KQorc3RhdGljIGlubGluZSB4bWxEb2NQdHIg
eG1sRG9jUHRyRnJvbU5vZGUoTm9kZUltcGwgKnNvdXJjZU5vZGUpCiB7Ci0gICAgaWYgKCFyZXN1
bHREb2MgfHwgIXNoZWV0KQotICAgICAgICByZXR1cm4gMDsKKyAgICBTaGFyZWRQdHI8RG9jdW1l
bnRJbXBsPiBvd25lckRvY3VtZW50ID0gc291cmNlTm9kZS0+Z2V0RG9jdW1lbnQoKTsKKyAgICBi
b29sIHNvdXJjZUlzRG9jdW1lbnQgPSAoc291cmNlTm9kZSA9PSBvd25lckRvY3VtZW50LmdldCgp
KTsKKyAgICAKKyAgICB4bWxEb2NQdHIgc291cmNlRG9jID0gMDsKKyAgICBpZiAoc291cmNlSXNE
b2N1bWVudCkKKyAgICAgICAgc291cmNlRG9jID0gKHhtbERvY1B0cilvd25lckRvY3VtZW50LT50
cmFuc2Zvcm1Tb3VyY2UoKTsKKyAgICBpZiAoIXNvdXJjZURvYykKKyAgICAgICAgc291cmNlRG9j
ID0gKHhtbERvY1B0cil4bWxEb2NQdHJGb3JTdHJpbmcoY3JlYXRlTWFya3VwKHNvdXJjZU5vZGUp
LCBzb3VyY2VJc0RvY3VtZW50ID8gb3duZXJEb2N1bWVudC0+VVJMKCkgOiBRU3RyaW5nKCkpOwor
ICAgIHJldHVybiBzb3VyY2VEb2M7Cit9CiAKLSAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBy
ZXN1bHQ7Ci0gICAgeG1sT3V0cHV0QnVmZmVyUHRyIG91dHB1dEJ1ZiA9IHhtbEFsbG9jT3V0cHV0
QnVmZmVyKDApOwotICAgIGlmIChvdXRwdXRCdWYpIHsKLSAgICAgICAgb3V0cHV0QnVmLT5jb250
ZXh0ID0gdGhpczsKLSAgICAgICAgb3V0cHV0QnVmLT53cml0ZWNhbGxiYWNrID0gYnVmZmVyV3Jp
dGU7Ci0gICAgICAgIAotICAgICAgICBpbnQgcmV0dmFsID0geHNsdFNhdmVSZXN1bHRUbyhvdXRw
dXRCdWYsIHJlc3VsdERvYywgc2hlZXQpOwotICAgICAgICB4bWxPdXRwdXRCdWZmZXJDbG9zZShv
dXRwdXRCdWYpOwotICAgICAgICAKLSAgICAgICAgaWYgKHJldHZhbCA8IDApCi0gICAgICAgICAg
ICByZXR1cm4gMDsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBv
ZiBvdXRwdXQgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRlYWwgd2l0aDoKLSAgICAgICAgLy8gSFRN
TCAoY3JlYXRlIGFuIEhUTUwgZG9jdW1lbnQpLCBYTUwgKGNyZWF0ZSBhbiBYTUwgZG9jdW1lbnQp
LAotICAgICAgICAvLyBhbmQgdGV4dCAod3JhcCBpbiBhIDxwcmU+IGFuZCBjcmVhdGUgYW4gWE1M
IGRvY3VtZW50KS4KLSAgICAgICAgS0hUTUxWaWV3ICp2aWV3ID0gbV9zb3VyY2VEb2N1bWVudC0+
dmlldygpOwotICAgICAgICBjb25zdCB4bWxDaGFyICptZXRob2Q7Ci0gICAgICAgIFhTTFRfR0VU
X0lNUE9SVF9QVFIobWV0aG9kLCBzaGVldCwgbWV0aG9kKTsKLSAgICAgICAgaWYgKG1ldGhvZCA9
PSAwICYmIHJlc3VsdERvYy0+dHlwZSA9PSBYTUxfSFRNTF9ET0NVTUVOVF9OT0RFKQotICAgICAg
ICAgICAgbWV0aG9kID0gKGNvbnN0IHhtbENoYXIgKikiaHRtbCI7Ci0gICAgICAgIGlmICh4bWxT
dHJFcXVhbChtZXRob2QsIChjb25zdCB4bWxDaGFyICopImh0bWwiKSkKLSAgICAgICAgICAgIHJl
c3VsdCA9IG1fc291cmNlRG9jdW1lbnQtPmltcGwoKS0+Y3JlYXRlSFRNTERvY3VtZW50KHZpZXcp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBtX3NvdXJjZURvY3VtZW50LT5p
bXBsKCktPmNyZWF0ZURvY3VtZW50KHZpZXcpOwotICAgICAgICByZXN1bHQtPmF0dGFjaCgpOwot
ICAgICAgICByZXN1bHQtPmRvY0xvYWRlcigpLT5zZXRTaG93QW5pbWF0aW9ucyhtX3NvdXJjZURv
Y3VtZW50LT5kb2NMb2FkZXIoKS0+c2hvd0FuaW1hdGlvbnMoKSk7Ci0gICAgICAgIHJlc3VsdC0+
c2V0VHJhbnNmb3JtU291cmNlRG9jdW1lbnQobV9zb3VyY2VEb2N1bWVudC5nZXQoKSk7Ci0KLSAg
ICAgICAgaWYgKHhtbFN0ckVxdWFsKG1ldGhvZCwgKGNvbnN0IHhtbENoYXIgKikidGV4dCIpKSB7
Ci0gICAgICAgICAgICAvLyBNb2RpZnkgdGhlIG91dHB1dCBzbyB0aGF0IGl0IGlzIGEgd2VsbC1m
b3JtZWQgWEhUTUwgZG9jdW1lbnQgd2l0aCBhIDxwcmU+IHRhZyBlbmNsb3NpbmcgdGhlIHRleHQu
Ci0gICAgICAgICAgICBtX3Jlc3VsdE91dHB1dC5yZXBsYWNlKCcmJywgIiZhbXA7Iik7Ci0gICAg
ICAgICAgICBtX3Jlc3VsdE91dHB1dC5yZXBsYWNlKCc8JywgIiZsdDsiKTsKLSAgICAgICAgICAg
IG1fcmVzdWx0T3V0cHV0ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04
XCI/PlxuIgotICAgICAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbCBQVUJMSUMgXCItLy9XM0Mv
L0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTlwiIFwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwx
L0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPlxuIgotICAgICAgICAgICAgICAgICI8aHRtbCB4bWxu
cz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIj5cbiIKLSAgICAgICAgICAgICAgICAi
PGhlYWQ+PHRpdGxlLz48L2hlYWQ+XG4iCi0gICAgICAgICAgICAgICAgIjxib2R5PlxuIgotICAg
ICAgICAgICAgICAgICI8cHJlPiIgKyBtX3Jlc3VsdE91dHB1dCArICI8L3ByZT5cbiIKLSAgICAg
ICAgICAgICAgICAiPC9ib2R5PlxuIgotICAgICAgICAgICAgICAgICI8L2h0bWw+XG4iOwotICAg
ICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBCZWZvcmUgcGFyc2luZywgd2UgbmVlZCB0byBk
ZXRhY2ggdGhlIG9sZCBkb2N1bWVudCBjb21wbGV0ZWx5IGFuZCBnZXQgdGhlIG5ldyBkb2N1bWVu
dAotICAgICAgICAvLyBpbiBwbGFjZS4gV2UgaGF2ZSB0byBkbyB0aGlzIG9ubHkgaWYgd2UncmUg
cmVuZGVyaW5nIHRoZSByZXN1bHQgZG9jdW1lbnQuCi0gICAgICAgIGlmICh2aWV3KSB7Ci0gICAg
ICAgICAgICB2aWV3LT5jbGVhcigpOwotICAgICAgICAgICAgdmlldy0+cGFydCgpLT5yZXBsYWNl
RG9jSW1wbChyZXN1bHQuZ2V0KCkpOwotICAgICAgICB9CitzdGF0aWMgaW5saW5lIFFTdHJpbmcg
cmVzdWx0TUlNRVR5cGUoeG1sRG9jUHRyIHJlc3VsdERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hl
ZXQpCit7CisgICAgLy8gVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG91dHB1dCB3ZSBuZWVkIHRv
IGJlIGFibGUgdG8gZGVhbCB3aXRoOgorICAgIC8vIEhUTUwgKGNyZWF0ZSBhbiBIVE1MIGRvY3Vt
ZW50KSwgWE1MIChjcmVhdGUgYW4gWE1MIGRvY3VtZW50KSwKKyAgICAvLyBhbmQgdGV4dCAod3Jh
cCBpbiBhIDxwcmU+IGFuZCBjcmVhdGUgYW4gWE1MIGRvY3VtZW50KS4KKworICAgIGNvbnN0IHht
bENoYXIgKnJlc3VsdFR5cGUgPSAwOworICAgIFhTTFRfR0VUX0lNUE9SVF9QVFIocmVzdWx0VHlw
ZSwgc2hlZXQsIG1ldGhvZCk7CisgICAgaWYgKHJlc3VsdFR5cGUgPT0gMCAmJiByZXN1bHREb2Mt
PnR5cGUgPT0gWE1MX0hUTUxfRE9DVU1FTlRfTk9ERSkKKyAgICAgICAgcmVzdWx0VHlwZSA9IChj
b25zdCB4bWxDaGFyICopImh0bWwiOworICAgIAorICAgIGlmICh4bWxTdHJFcXVhbChyZXN1bHRU
eXBlLCAoY29uc3QgeG1sQ2hhciAqKSJodG1sIikpCisgICAgICAgIHJldHVybiBRU3RyaW5nKCJ0
ZXh0L2h0bWwiKTsKKyAgICBlbHNlIGlmICh4bWxTdHJFcXVhbChyZXN1bHRUeXBlLCAoY29uc3Qg
eG1sQ2hhciAqKSJ0ZXh0IikpCisgICAgICAgIHJldHVybiBRU3RyaW5nKCJ0ZXh0L3BsYWluIik7
CiAgICAgICAgIAotICAgICAgICByZXN1bHQtPm9wZW4oKTsKLSAgICAgICAgcmVzdWx0LT5zZXRV
UkwobV9zb3VyY2VEb2N1bWVudC0+VVJMKCkpOwotICAgICAgICByZXN1bHQtPnNldEJhc2VVUkwo
bV9zb3VyY2VEb2N1bWVudC0+YmFzZVVSTCgpKTsKLSAgICAgICAgcmVzdWx0LT5kZXRlcm1pbmVQ
YXJzZU1vZGUobV9yZXN1bHRPdXRwdXQpOyAvLyBNYWtlIHN1cmUgd2UgcGFyc2UgaW4gdGhlIGNv
cnJlY3QgbW9kZS4KLSAgICAgICAgcmVzdWx0LT53cml0ZShtX3Jlc3VsdE91dHB1dCk7Ci0gICAg
ICAgIHJlc3VsdC0+ZmluaXNoUGFyc2luZygpOwotICAgICAgICByZXN1bHQtPnNldFBhcnNpbmco
ZmFsc2UpOwotICAgICAgICBpZiAodmlldykKLSAgICAgICAgICAgIHZpZXctPnBhcnQoKS0+Y2hl
Y2tDb21wbGV0ZWQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0LT5jbG9zZSgp
OyAvLyBGSVhNRTogRXZlbiB2aWV3bGVzcyBkb2NzIGNhbiBsb2FkIHN1YnJlc291cmNlcy4gb25s
b2FkIHdpbGwgZmlyZSB0b28gZWFybHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v
IFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gWE1MSHR0cFJlcXVlc3RPYmplY3RzIGFzIHdlbGwu
CisgICAgcmV0dXJuIFFTdHJpbmcoImFwcGxpY2F0aW9uL3htbCIpOworfQorCitib29sIFhTTFRQ
cm9jZXNzb3JJbXBsOjp0cmFuc2Zvcm1Ub1N0cmluZyhOb2RlSW1wbCAqc291cmNlTm9kZSwgUVN0
cmluZyAmbWltZVR5cGUsIFFTdHJpbmcgJnJlc3VsdFN0cmluZykKK3sKKyAgICBTaGFyZWRQdHI8
RG9jdW1lbnRJbXBsPiBvd25lckRvY3VtZW50ID0gc291cmNlTm9kZS0+Z2V0RG9jdW1lbnQoKTsK
KyAgICBTaGFyZWRQdHI8WFNMU3R5bGVTaGVldEltcGw+IGNhY2hlZFN0eWxlc2hlZXQgPSBtX3N0
eWxlc2hlZXQ7CisgICAgCisgICAgc2V0WFNMVExvYWRDYWxsQmFjayhzdHlsZXNoZWV0TG9hZEZ1
bmMsIHRoaXMsIG93bmVyRG9jdW1lbnQtPmRvY0xvYWRlcigpKTsKKyAgICB4c2x0U3R5bGVzaGVl
dFB0ciBzaGVldCA9IHhzbHRTdHlsZXNoZWV0UG9pbnRlcihjYWNoZWRTdHlsZXNoZWV0LCBtX3N0
eWxlc2hlZXRSb290Tm9kZS5nZXQoKSk7CisgICAgaWYgKCFzaGVldCkgeworICAgICAgICBzZXRY
U0xUTG9hZENhbGxCYWNrKDAsIDAsIDApOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQot
ICAgIHJldHVybiByZXN1bHQ7CisgICAgY2FjaGVkU3R5bGVzaGVldC0+Y2xlYXJEb2N1bWVudHMo
KTsKKyAgICAKKyAgICB4bWxEb2NQdHIgc291cmNlRG9jID0geG1sRG9jUHRyRnJvbU5vZGUoc291
cmNlTm9kZSk7CisgICAgY29uc3QgY2hhciAqKnBhcmFtcyA9IHhzbHRQYXJhbUFycmF5RnJvbVFE
aWN0KG1fcGFyYW1ldGVycyk7CisgICAgeG1sRG9jUHRyIHJlc3VsdERvYyA9IHhzbHRBcHBseVN0
eWxlc2hlZXQoc2hlZXQsIHNvdXJjZURvYywgcGFyYW1zKTsKKyAgICBmcmVlWHNsdFBhcmFtQXJy
YXkocGFyYW1zKTsKKyAgICAKKyAgICBzZXRYU0xUTG9hZENhbGxCYWNrKDAsIDAsIDApOworICAg
IAorICAgIGlmICghc2F2ZVJlc3VsdFRvU3RyaW5nKHJlc3VsdERvYywgc2hlZXQsIHJlc3VsdFN0
cmluZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBtaW1lVHlwZSA9IHJlc3Vs
dE1JTUVUeXBlKHJlc3VsdERvYywgc2hlZXQpOworICAgIAorICAgIHhzbHRGcmVlU3R5bGVzaGVl
dChzaGVldCk7CisgICAgeG1sRnJlZURvYyhyZXN1bHREb2MpOworICAgIAorICAgIHJldHVybiB0
cnVlOworfQorCitTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBYU0xUUHJvY2Vzc29ySW1wbDo6dHJh
bnNmb3JtVG9Eb2N1bWVudChOb2RlSW1wbCAqc291cmNlTm9kZSkKK3sKKyAgICBRU3RyaW5nIHJl
c3VsdE1JTUVUeXBlOworICAgIFFTdHJpbmcgcmVzdWx0U3RyaW5nOworICAgIGlmICghdHJhbnNm
b3JtVG9TdHJpbmcoc291cmNlTm9kZSwgcmVzdWx0TUlNRVR5cGUsIHJlc3VsdFN0cmluZykpCisg
ICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UocmVz
dWx0U3RyaW5nLCByZXN1bHRNSU1FVHlwZSwgc291cmNlTm9kZSk7Cit9CisKK1NoYXJlZFB0cjxE
b2N1bWVudEZyYWdtZW50SW1wbD4gWFNMVFByb2Nlc3NvckltcGw6OnRyYW5zZm9ybVRvRnJhZ21l
bnQoTm9kZUltcGwgKnNvdXJjZU5vZGUsIERvY3VtZW50SW1wbCAqb3V0cHV0RG9jKQoreworICAg
IFFTdHJpbmcgcmVzdWx0TUlNRVR5cGU7CisgICAgUVN0cmluZyByZXN1bHRTdHJpbmc7CisgICAg
aWYgKCF0cmFuc2Zvcm1Ub1N0cmluZyhzb3VyY2VOb2RlLCByZXN1bHRNSU1FVHlwZSwgcmVzdWx0
U3RyaW5nKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJv
bVNvdXJjZShyZXN1bHRTdHJpbmcsIHJlc3VsdE1JTUVUeXBlLCBzb3VyY2VOb2RlLCBvdXRwdXRE
b2MpOworfQorCit2b2lkIFhTTFRQcm9jZXNzb3JJbXBsOjpzZXRQYXJhbWV0ZXIoRE9NU3RyaW5n
SW1wbCAqbmFtZXNwYWNlVVJJLCBET01TdHJpbmdJbXBsICpsb2NhbE5hbWUsIERPTVN0cmluZ0lt
cGwgKnZhbHVlKQoreworICAgIC8vIEZJWE1FOiBuYW1lc3BhY2Ugc3VwcG9ydD8KKyAgICBtX3Bh
cmFtZXRlcnMucmVwbGFjZShET01TdHJpbmcobG9jYWxOYW1lKS5xc3RyaW5nKCksIG5ldyBET01T
dHJpbmcodmFsdWUpKTsKK30KKworU2hhcmVkUHRyPERPTVN0cmluZ0ltcGw+IFhTTFRQcm9jZXNz
b3JJbXBsOjpnZXRQYXJhbWV0ZXIoRE9NU3RyaW5nSW1wbCAqbmFtZXNwYWNlVVJJLCBET01TdHJp
bmdJbXBsICpsb2NhbE5hbWUpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IG5hbWVzcGFjZSBzdXBw
b3J0PworICAgIGlmIChET01TdHJpbmcgKnZhbHVlID0gbV9wYXJhbWV0ZXJzLmZpbmQoRE9NU3Ry
aW5nKGxvY2FsTmFtZSkucXN0cmluZygpKSkKKyAgICAgICAgcmV0dXJuIHZhbHVlLT5pbXBsKCk7
CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgWFNMVFByb2Nlc3NvckltcGw6OnJlbW92ZVBhcmFt
ZXRlcihET01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmluZ0ltcGwgKmxvY2FsTmFt
ZSkKK3sKKyAgICAvLyBGSVhNRTogbmFtZXNwYWNlIHN1cHBvcnQ/CisgICAgbV9wYXJhbWV0ZXJz
LnJlbW92ZShET01TdHJpbmcobG9jYWxOYW1lKS5xc3RyaW5nKCkpOwogfQogCiB9CkluZGV4OiB4
c2wveHNsdF9wcm9jZXNzb3JpbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL2N2cy9yb290L1dl
YkNvcmUva2h0bWwveHNsL3hzbHRfcHJvY2Vzc29yaW1wbC5oLHYKcmV0cmlldmluZyByZXZpc2lv
biAxLjQKZGlmZiAtcCAtdSAtcjEuNCB4c2wveHNsdF9wcm9jZXNzb3JpbXBsLmgKLS0tIHhzbC94
c2x0X3Byb2Nlc3NvcmltcGwuaAkxMCBPY3QgMjAwNSAyMzo0ODo1NSAtMDAwMAkxLjQKKysrIHhz
bC94c2x0X3Byb2Nlc3NvcmltcGwuaAkyNyBPY3QgMjAwNSAwNjo0Nzo0MSAtMDAwMApAQCAtMjks
MzggKzI5LDUxIEBACiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlckludGVybmFscy5oPgogCiAjaW5j
bHVkZSA8bGlieHNsdC90cmFuc2Zvcm0uaD4KKyNpbmNsdWRlIDxsaWJ4c2x0L2RvY3VtZW50cy5o
PgogCiAjaW5jbHVkZSA8bWlzYy9zaGFyZWQuaD4KKyNpbmNsdWRlICJkb21fc3RyaW5naW1wbC5o
IgorI2luY2x1ZGUgInhzbF9zdHlsZXNoZWV0aW1wbC5oIgogI2luY2x1ZGUgPHFzdHJpbmcuaD4K
IAogbmFtZXNwYWNlIERPTSB7CiAKLWNsYXNzIFhTTFN0eWxlU2hlZXRJbXBsOworY2xhc3MgTm9k
ZUltcGw7CiBjbGFzcyBEb2N1bWVudEltcGw7Ci0gICAgCi1jbGFzcyBYU0xUUHJvY2Vzc29ySW1w
bAorY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGw7CisKK2NsYXNzIFhTTFRQcm9jZXNzb3JJbXBs
IDogcHVibGljIGtodG1sOjpTaGFyZWQ8WFNMVFByb2Nlc3NvckltcGw+CiB7CiBwdWJsaWM6Ci0g
ICAgLy8gQ29uc3RydWN0b3JzCi0gICAgWFNMVFByb2Nlc3NvckltcGwoWFNMU3R5bGVTaGVldElt
cGwqIHN0eWxlc2hlZXQsIERvY3VtZW50SW1wbCogc291cmNlKTsKLSAgICB+WFNMVFByb2Nlc3Nv
ckltcGwoKTsKLSAgICAKLSAgICAvLyBNZXRob2QgZm9yIHRyYW5zZm9ybWluZyBhIHNvdXJjZSBk
b2N1bWVudCBpbnRvIGEgcmVzdWx0IGRvY3VtZW50LgotICAgIFNoYXJlZFB0cjxEb2N1bWVudElt
cGw+IHRyYW5zZm9ybURvY3VtZW50KERvY3VtZW50SW1wbCogc291cmNlRG9jKTsKKyAgICBYU0xU
UHJvY2Vzc29ySW1wbCgpIHsgbV9wYXJhbWV0ZXJzLnNldEF1dG9EZWxldGUodHJ1ZSk7IH07CiAK
LSAgICAvLyBDb252ZXJ0IGEgbGlieG1sIGRvYyBwdHIgdG8gYSBLSFRNTCBET00gRG9jdW1lbnQK
LSAgICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBkb2N1bWVudEZyb21YTUxEb2NQdHIoeG1sRG9j
UHRyIHJlc3VsdERvYywgeHNsdFN0eWxlc2hlZXRQdHIgc2hlZXQpOworICAgIHZvaWQgc2V0WFNM
U3R5bGVzaGVldChYU0xTdHlsZVNoZWV0SW1wbCAqc3R5bGVTaGVldCkgeyBtX3N0eWxlc2hlZXQg
PSBzdHlsZVNoZWV0OyB9CisgICAgYm9vbCB0cmFuc2Zvcm1Ub1N0cmluZyhOb2RlSW1wbCAqc291
cmNlLCBRU3RyaW5nICZyZXN1bHRNSU1FVHlwZSwgUVN0cmluZyAmcmVzdWx0U3RyaW5nKTsKKyAg
ICBTaGFyZWRQdHI8RG9jdW1lbnRJbXBsPiBjcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UoY29uc3Qg
UVN0cmluZyAmc291cmNlLCBjb25zdCBRU3RyaW5nICZzb3VyY2VNSU1FVHlwZSwgTm9kZUltcGwg
KnNvdXJjZU5vZGUsIEtIVE1MVmlldyAqdmlldyA9IDApOwogICAgIAotICAgIC8vIEhlbHBlcnMK
LSAgICB2b2lkIGFkZFRvUmVzdWx0KGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbik7CisgICAg
Ly8gRE9NIG1ldGhvZHMKKyAgICB2b2lkIGltcG9ydFN0eWxlc2hlZXQoTm9kZUltcGwgKnN0eWxl
KSB7IG1fc3R5bGVzaGVldFJvb3ROb2RlID0gc3R5bGU7IH0KKyAgICBTaGFyZWRQdHI8RG9jdW1l
bnRGcmFnbWVudEltcGw+IHRyYW5zZm9ybVRvRnJhZ21lbnQoTm9kZUltcGwgKnNvdXJjZSwgRG9j
dW1lbnRJbXBsICpvdXB1dERvYyk7CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gdHJhbnNm
b3JtVG9Eb2N1bWVudChOb2RlSW1wbCAqc291cmNlKTsKICAgICAKLSAgICBYU0xTdHlsZVNoZWV0
SW1wbCAqc3R5bGVzaGVldCgpIHsgcmV0dXJuIG1fc3R5bGVzaGVldC5nZXQoKTsgfQotICAgIERv
Y3VtZW50SW1wbCAqc291cmNlRG9jdW1lbnQoKSB7IHJldHVybiBtX3NvdXJjZURvY3VtZW50Lmdl
dCgpOyB9CisgICAgdm9pZCBzZXRQYXJhbWV0ZXIoRE9NU3RyaW5nSW1wbCAqbmFtZXNwYWNlVVJJ
LCBET01TdHJpbmdJbXBsICpsb2NhbE5hbWUsIERPTVN0cmluZ0ltcGwgKnZhbHVlKTsKKyAgICBT
aGFyZWRQdHI8RE9NU3RyaW5nSW1wbD4gZ2V0UGFyYW1ldGVyKERPTVN0cmluZ0ltcGwgKm5hbWVz
cGFjZVVSSSwgRE9NU3RyaW5nSW1wbCAqbG9jYWxOYW1lKSBjb25zdDsKKyAgICB2b2lkIHJlbW92
ZVBhcmFtZXRlcihET01TdHJpbmdJbXBsICpuYW1lc3BhY2VVUkksIERPTVN0cmluZ0ltcGwgKmxv
Y2FsTmFtZSk7CisgICAgdm9pZCBjbGVhclBhcmFtZXRlcnMoKSB7IG1fcGFyYW1ldGVycy5jbGVh
cigpOyB9CisKKyAgICB2b2lkIHJlc2V0KCkgeyBtX3N0eWxlc2hlZXQgPSBOVUxMOyBtX3N0eWxl
c2hlZXRSb290Tm9kZSA9IE5VTEw7ICBtX3BhcmFtZXRlcnMuY2xlYXIoKTsgfQorICAgIAorcHVi
bGljOgorICAgIC8vIE9ubHkgZm9yIGxpYlhTTFQgY2FsbGJhY2tzCisgICAgWFNMU3R5bGVTaGVl
dEltcGwgKnhzbFN0eWxlc2hlZXQoKSBjb25zdCB7IHJldHVybiBtX3N0eWxlc2hlZXQuZ2V0KCk7
IH0KICAgICAKIHByaXZhdGU6CisgICAgLy8gQ29udmVydCBhIGxpYnhtbCBkb2MgcHRyIHRvIGEg
S0hUTUwgRE9NIERvY3VtZW50CisgICAgU2hhcmVkUHRyPERvY3VtZW50SW1wbD4gZG9jdW1lbnRG
cm9tWE1MRG9jUHRyKHhtbERvY1B0ciByZXN1bHREb2MsIHhzbHRTdHlsZXNoZWV0UHRyIHNoZWV0
LCBEb2N1bWVudEltcGwgKm93bmVyRG9jdW1lbnQsIGJvb2wgc291cmNlSXNEb2N1bWVudCk7CisK
ICAgICBTaGFyZWRQdHI8WFNMU3R5bGVTaGVldEltcGw+IG1fc3R5bGVzaGVldDsKLSAgICBRU3Ry
aW5nIG1fcmVzdWx0T3V0cHV0OwotICAgIFNoYXJlZFB0cjxEb2N1bWVudEltcGw+IG1fc291cmNl
RG9jdW1lbnQ7CisgICAgU2hhcmVkUHRyPE5vZGVJbXBsPiBtX3N0eWxlc2hlZXRSb290Tm9kZTsK
KyAgICBRRGljdDxET01TdHJpbmc+IG1fcGFyYW1ldGVyczsKIH07CiAKIH0K
</data>
<flag name="review"
          id="784"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>