<?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>14730</bug_id>
          
          <creation_ts>2007-07-23 11:58:23 -0700</creation_ts>
          <short_desc>[curl] Cookie handling</short_desc>
          <delta_ts>2018-11-14 11:00:36 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>523.x (Safari 3)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>174942</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Curl</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>14725</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Holger Freyther">zecke</reporter>
          <assigned_to name="Julien Chaffraix">jchaffraix</assigned_to>
          <cc>ahya365</cc>
    
    <cc>alp</cc>
    
    <cc>basuke</cc>
    
    <cc>christian</cc>
    
    <cc>davidsz</cc>
    
    <cc>galpeter</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>kevino</cc>
    
    <cc>markybob</cc>
    
    <cc>mrowe</cc>
    
    <cc>snehalkedar</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>uws+webkit</cc>
    
    <cc>xfdbse</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>3959</commentid>
    <comment_count>0</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2007-07-23 11:58:23 -0700</bug_when>
    <thetext>How do we want to handle cookies with Curl? Should we use the cookie jar functionality of curl. In this case we have no control over individual cookies and can not save the jar.
We could do the cookie parsing inside WebCore allowing us to have tight control on which cookies to accept and which to reject (e.g. having signals in our  equivalent to WebFrameLoadDelegate).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3911</commentid>
    <comment_count>1</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2007-07-23 13:14:37 -0700</bug_when>
    <thetext>Add the Gtk keyword, even to the curl bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>3916</commentid>
    <comment_count>2</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2007-07-23 13:18:37 -0700</bug_when>
    <thetext>Add Curl as keyword.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>113</commentid>
    <comment_count>3</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2007-09-23 07:53:40 -0700</bug_when>
    <thetext>The OWB/Sandlabs WebKit fork is still using CURL but have made some improvements. In the fork Cookies are handled within WebCore. This makes sense as it gives full control of storing, loading and deleting cookies which would not be easily doable using the CURL APIs.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62506</commentid>
    <comment_count>4</comment_count>
      <attachid>17560</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2007-11-27 12:48:36 -0800</bug_when>
    <thetext>Created attachment 17560
First draft (cookie handling)

This patch imports the OWB cookie management both for handling, refusing and storing cookies.

The points that remain are :
- writing cookies to a file should occur only when the CookieManager is destroyed. My idea was to do that in the destructor of the ResourceHandleManager but it is never called (my workaround is to write it each time a cookie is added)
- I have left all the original comments and logging for discussion

Any comments appreciated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62553</commentid>
    <comment_count>5</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2007-11-28 01:13:08 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; This patch imports the OWB cookie management both for handling, refusing and
&gt; storing cookies.
This looks nice. I&apos;ll test it a bit today.

&gt; - writing cookies to a file should occur only when the CookieManager is
&gt; destroyed. My idea was to do that in the destructor of the
&gt; ResourceHandleManager but it is never called (my workaround is to write it each
&gt; time a cookie is added)
I think saving changes instantly is a very good idea. However I would favor an sqlite database over a textfile. This would be more flexible and allow multiple webkit clients to access cookies at the same time.

&gt; This fonction tries to analyse the string to obtain the proper format.
Let me guess... you are French, aren&apos;t you? ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62579</commentid>
    <comment_count>6</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2007-11-28 08:31:34 -0800</bug_when>
    <thetext>&gt; This looks nice. I&apos;ll test it a bit today.

Sure. I have tested it and it seems to work well.

&gt; I think saving changes instantly is a very good idea. However I would favor an
&gt; sqlite database over a textfile. This would be more flexible and allow multiple
&gt; webkit clients to access cookies at the same time.

It seems like a good idea, I will dig it. The textfile method is the one used by OWB that&apos;s why I imported it as a starting point.

&gt;&gt; This fonction tries to analyse the string to obtain the proper format.
&gt; Let me guess... you are French, aren&apos;t you? ;)

The OWB team is French ;) (and I happen to be too)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62733</commentid>
    <comment_count>7</comment_count>
    <who name="Alp Toker">alp</who>
    <bug_when>2007-11-29 16:44:38 -0800</bug_when>
    <thetext>Hey, sorry I haven&apos;t had time to look at this properly yet.

I think this is a great addition since there is no http stack or build in cookie support in GTK+ or GNOME.

There are some minor coding style issues to do with whitespace mostly I think.

It&apos;s good to use plain text files for interoperability here. It&apos;s quite common for applications to go and inspect the cookies a browser stores nowadays by just opening those files since there isn&apos;t a better solution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>62743</commentid>
    <comment_count>8</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2007-11-29 18:20:20 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; It&apos;s good to use plain text files for interoperability here. It&apos;s quite common
&gt; for applications to go and inspect the cookies a browser stores nowadays by
&gt; just opening those files since there isn&apos;t a better solution.

I can&apos;t quite agree here. SQL is very well known and interoperable, it is already used in WebKit. Other browsers are also using or switching to sqlite. Working around all the drawbacks of text files is painful and I don&apos;t see any benefit of that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63056</commentid>
    <comment_count>9</comment_count>
      <attachid>17660</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2007-12-02 19:02:40 -0800</bug_when>
    <thetext>Created attachment 17660
Updated patch (corrected most coding style issues)

&gt; There are some minor coding style issues to do with whitespace mostly I think.

I did not paid enough attention to coding style issues. It is now corrected for most of them I hope.

For the SQL versus files issue, the current implementation works with files so we can start with that and see what others think about this issue. FWIW I would tend to agree with Alp on that point as other applications could use our cookie implementation to use the cookie file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>63131</commentid>
    <comment_count>10</comment_count>
      <attachid>17660</attachid>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2007-12-03 03:56:48 -0800</bug_when>
    <thetext>Comment on attachment 17660
Updated patch (corrected most coding style issues)

I don&apos;t see any value in using a custom plain text file format.  It adds nothing from an interoperability point of view as any applications wishing to parse it would need to write new code to do so.  Rather than doing this I think using SQLite would be preferable.  Firefox 3, currently in beta, uses SQLite for its cookie store so it could be desirable to match its schema.  I can&apos;t think of any good reason to use a plain text file over SQLite when the major browser with which interoperability is desirable has itself switched from plain text files.

There are several other issues with this implementation.  The largest is that ResourceHandleManager is a singleton that is never destroyed.  This means that cookies will never be saved to disk.  Tying the persisting of cookies to disk to the lifetime of ResourceHandleManager seems fundamentally flawed.  What if I load a bunch of cookie-using pages and then the application crashes?  Another issue worth considering is multiple instances of the application.  If I have two instances of the application running, the second to quit will overwrite any cookies stored by the first.  This seems bad.

There are many places within the patch that lack adequate error-handling.  This is especially bad when dealing with data from untrusted sources, eg. the network or file system.

Finally, there are many coding style issues.  String arguments should be passed as &quot;const String&amp;&quot; rather than just &quot;String&quot; to prevent their contents from being copied.  Variables should be declared at their point of first use unless needed, rather than in blocks at the start of a function.

There also appears to be a logic error in getDaysTillFirstOfMonth.  Quoting Wikipedia:
&quot;&quot;The Gregorian calendar, the current standard calendar in most of the world, adds a 29th day to February in all years evenly divisible by 4, except for centennial years (those ending in -00) which are not evenly divisible by 400. Thus 1600, 2000 and 2400 are leap years but 1700, 1800, 1900, 2100, 2200 and 2300 are not.&quot;&quot;

It&apos;s really easy to get these sort of date calculations wrong, so it would definitely be better to reuse existing libraries rather than writing it anew.  We possibly have code that handles this in JavaScriptCore for our date support there, otherwise I&apos;m sure ICU and other platform libraries have this knowledge.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72403</commentid>
    <comment_count>11</comment_count>
      <attachid>19465</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-02-29 16:43:13 -0800</bug_when>
    <thetext>Created attachment 19465
Rewritten patch addressing Marc&apos;s comments

It took me some time but I have rewritten most of the first patch. It had too many issues to be really usable : Marc pointed some but there were others.

The new one should address all the comments : 
- for the date issue, I have used curl_getdate as ICU data parsing was way too simple for processing cookies&apos; date.
- the cookies are saved in a sqlite table
- they are saved as soon as they are processed (instead on waiting for the destructor)
- the methods take &quot;const String&amp;&quot; to prevent content&apos;s copy

I have added some features :
- we have a real parser that is RFC2109 compliant (with some Mozilla hacks)
- LRU replacement policy for cookies (as required per RFC2109)

The patch is quite huge and if necessary, I should be able to cut it to several pieces to ease review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72772</commentid>
    <comment_count>12</comment_count>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-03-04 19:59:50 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; Created an attachment (id=19465) [edit]
Some random thoughts after a quick look:

- CookieManager::getCookieManager() looks like it is never returning 0 (unless you get into a OOM situation). So all behavior which is checking the return value is probably wrong, cookiesEnabled is coming to my mind.
- The c&apos;tor of CookieManager is looking wrong, if you set such a thing in the c&apos;tor, undo it in the d&apos;tor? But then again you force it to be a singleton why care?
- getCookie(String,KURL), do you only return one cookie? =&gt; getCookies
- You have looked at firefox&apos;s SQL schema? Why do you decide to be incompatible with it? If we don&apos;t use isHttpOnly, why break their schema, there is nothing wrong with an &apos;empty&apos; column for the sake of compability
- setCookieJarFile(const char*), do not use char* in WebCore, make the higher levels parse and give you a WebCore::String, you use the latin1() c&apos;tor of WebCore::String which will break for utf-8 filenames..
- the indention of Cookie.h is wrong. the whole class needs to be indented inside the namespace.
- What is preventing you to pass the Cookie by reference/value?
- Same goes for the CookieMap in the CookieManager
- Do you have two different upper limits for Cookies?
- If you say you are RFC compliant, how did you test it?


</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72797</commentid>
    <comment_count>13</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-03-05 06:46:35 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; Created an attachment (id=19465) [edit]
&gt; Some random thoughts after a quick look:
&gt; 

Thanks for taking the time to look at it !

&gt; - CookieManager::getCookieManager() looks like it is never returning 0 (unless
&gt; you get into a OOM situation). So all behavior which is checking the return
&gt; value is probably wrong, cookiesEnabled is coming to my mind.

Granted even thought WebCore::cookieEnabled is only a check for the CookieManager value (null or not).

&gt; - The c&apos;tor of CookieManager is looking wrong, if you set such a thing in the
&gt; c&apos;tor, undo it in the d&apos;tor? But then again you force it to be a singleton why
&gt; care?

What I do in the constructor is :
- setting the default file in which save the CookieJar
- creating the Cookie representation of the cookies saved in the database (as it is only called once, it should be ok)
- saving the shared instance of CookieManager in case it is called later

Only the third point could be arguable IMHO as it duplicates what is done in CookieManager::getCookieManager()

Concerning the destructor, I think you are right : if we are to provide a destructor, I should at least nullify the shared instance. I will take care of that.

&gt; - getCookie(String,KURL), do you only return one cookie? =&gt; getCookies

Good catch.

&gt; - You have looked at firefox&apos;s SQL schema? Why do you decide to be incompatible
&gt; with it? If we don&apos;t use isHttpOnly, why break their schema, there is nothing
&gt; wrong with an &apos;empty&apos; column for the sake of compability

Yes, apart from the table name (which is mozilla_cookies in FF), the column names are the same.
I did not think about breaking their schema when I removed isHttpOnly so it seems fair to add it again.

&gt; - setCookieJarFile(const char*), do not use char* in WebCore, make the higher
&gt; levels parse and give you a WebCore::String, you use the latin1() c&apos;tor of
&gt; WebCore::String which will break for utf-8 filenames..

I will correct that in the next patch.

&gt; - the indention of Cookie.h is wrong. the whole class needs to be indented
&gt; inside the namespace.

Ditto.

&gt; - What is preventing you to pass the Cookie by reference/value?
&gt; - Same goes for the CookieMap in the CookieManager

Nothing as far as I know. I have started working with pointers when I rewrote the implementation and kept with that convention. I had a look at WebCore and we use both so I thought it would be ok. Should I use reference/value in the next iteration ?

&gt; - Do you have two different upper limits for Cookies?

Yes, a limit per site (enforced in CookieMap) and a global limit (in CookieManager).

&gt; - If you say you are RFC compliant, how did you test it?

I am loosely compliant as I have added some firefox extension which are not standard and merely done for compatibility with some sites.
I have not found any cookie test suite so I did some tests on real websites. It is a bit weak to prove compliance so it should be a good addition to include test cases (I have done some but I could produce a complete test suite).

I intend to break the next patch to ease review so I could add some test cases on this bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>72798</commentid>
    <comment_count>14</comment_count>
      <attachid>19465</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-03-05 06:50:34 -0800</bug_when>
    <thetext>Comment on attachment 19465
Rewritten patch addressing Marc&apos;s comments

Clearing review flag (issues to address + patch to split)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74005</commentid>
    <comment_count>15</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-03-16 18:01:30 -0700</bug_when>
    <thetext>&gt; &gt; - What is preventing you to pass the Cookie by reference/value?
&gt; &gt; - Same goes for the CookieMap in the CookieManager
&gt; 
&gt; Nothing as far as I know. I have started working with pointers when I rewrote
&gt; the implementation and kept with that convention. I had a look at WebCore and
&gt; we use both so I thought it would be ok. Should I use reference/value in the
&gt; next iteration ?
&gt; 

It seems that I was a bit too enthusiastic when I said there was nothing to prevent me from switching: I am using some methods that can return 0 (HashMap::take for example). I also have to use a pointer at several places (to know whether the value has been initialized or not). I could find a way around those issues but I think it would hurt readability in the end.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>74006</commentid>
    <comment_count>16</comment_count>
      <attachid>19814</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-03-16 18:06:52 -0700</bug_when>
    <thetext>Created attachment 19814
First part : implement CookieManager stubs &amp; network bindings</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>79074</commentid>
    <comment_count>17</comment_count>
    <who name="Mark Rowe (bdash)">mrowe</who>
    <bug_when>2008-04-27 20:29:31 -0700</bug_when>
    <thetext>*** Bug 18777 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>87592</commentid>
    <comment_count>18</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2008-08-01 12:13:09 -0700</bug_when>
    <thetext>Would mark or Holger be willing to review the rest of this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89521</commentid>
    <comment_count>19</comment_count>
      <attachid>19814</attachid>
    <who name="Holger Freyther">zecke</who>
    <bug_when>2008-08-27 13:12:20 -0700</bug_when>
    <thetext>Comment on attachment 19814
First part : implement CookieManager stubs &amp; network bindings

Sorry I think we need another iteration.


-    return cookieJar.get(url.string());
+    if (cookiesEnabled(document))
+        return CookieManager::getCookieManager()-&gt;getCookies(url);
+    else
+        return String();

Could we have an early return here?

-    return true;
+    CookieManager* manager = CookieManager::getCookieManager();
+    if (manager)
+        return true;
+    else
+        return false;

return manager; :)



+    // Cookie size should not be above 81920 (per construction and also because we
+    // do not want to  cookie).
+    ASSERT(cookiePairs.length() &lt;= 81920);

make that a runtime option? Why should big cookies make webkit assert?


+    strncpy(cookieChar, cookiePairs.ascii().data(),

what ascii is that? Is that available when build in release mode? I think it is not.


+        ~CookieManager();

can we make that private. With the current d&apos;tor implementation I would feel more happy with that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89611</commentid>
    <comment_count>20</comment_count>
    <who name="marcos pinto">markybob</who>
    <bug_when>2008-08-28 01:44:46 -0700</bug_when>
    <thetext>I know this isnt a particularly helpful comment, but i really cant wait for this to be implemented.  It&apos;s the only thing keeping me from using WebKit instead of gecko.  Cheers to those working on it and I hope it&apos;s taken care of in not too long!  Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>90839</commentid>
    <comment_count>21</comment_count>
    <who name="snehalkedar">snehalkedar</who>
    <bug_when>2008-09-11 02:24:45 -0700</bug_when>
    <thetext>if (cookie-&gt;domain()[0] != &apos;.&apos; || cookie-&gt;domain().find(&quot;.&quot;, 1) == -1 || cookie-&gt;domain().find(&quot;.&quot;, 1) == cookie-&gt;domain().length())
+        return true;
+
+    // The request host should domain match the Domain attribute.
+    int diffPos = url.host().find(cookie-&gt;domain());
+    if (diffPos == -1)
+        return true;

can you explain</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91406</commentid>
    <comment_count>22</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-09-16 11:22:36 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; if (cookie-&gt;domain()[0] != &apos;.&apos; || cookie-&gt;domain().find(&quot;.&quot;, 1) == -1 ||
&gt; cookie-&gt;domain().find(&quot;.&quot;, 1) == cookie-&gt;domain().length())
&gt; +        return true;
&gt; +
&gt; +    // The request host should domain match the Domain attribute.
&gt; +    int diffPos = url.host().find(cookie-&gt;domain());
&gt; +    if (diffPos == -1)
&gt; +        return true;
&gt; 
&gt; can you explain
&gt; 
Yes. A cookie is set for the Domain&apos;s subnetwork (see RFC2109 - 4.3.4: Domain selection). The check is in fact wrong: it should be endsWith(). Is it what you were pointing out?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91485</commentid>
    <comment_count>23</comment_count>
      <attachid>23500</attachid>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-09-17 09:22:02 -0700</bug_when>
    <thetext>Created attachment 23500
First patch rewritten: should address Zecke&apos;s comments

I have finally taken the time to update this patch. Sorry for the really long delay.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>91685</commentid>
    <comment_count>24</comment_count>
    <who name="marcos pinto">markybob</who>
    <bug_when>2008-09-18 15:32:07 -0700</bug_when>
    <thetext>i just finished building webkit with the new (09/17) patch...doesn&apos;t seem to be working here, though.  it didnt save my google account login and i had to repeatedly reenter the information when the browser is restarted.  is there anything that i need to be specifying in configure?  </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>92138</commentid>
    <comment_count>25</comment_count>
    <who name="Julien Chaffraix">jchaffraix</who>
    <bug_when>2008-09-22 09:30:55 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; i just finished building webkit with the new (09/17) patch...doesn&apos;t seem to be
&gt; working here, though.  it didnt save my google account login and i had to
&gt; repeatedly reenter the information when the browser is restarted.  is there
&gt; anything that i need to be specifying in configure?  

This is the first part of the whole rewrite and it does not contain the ability to save cookies. As it is a long way from being finished, I would advise you to use curl&apos;s cookie jar support. It is currently not enabled but setting m_cookieJarFileName in ResourceHandleManager to an existing file should enable it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103341</commentid>
    <comment_count>26</comment_count>
    <who name="monil">monil.parmar</who>
    <bug_when>2008-12-23 21:48:00 -0800</bug_when>
    <thetext>(In reply to comment #25)
&gt; (In reply to comment #24)
&gt; &gt; i just finished building webkit with the new (09/17) patch...doesn&apos;t seem to be
&gt; &gt; working here, though.  it didnt save my google account login and i had to
&gt; &gt; repeatedly reenter the information when the browser is restarted.  is there
&gt; &gt; anything that i need to be specifying in configure?  
&gt; 
&gt; This is the first part of the whole rewrite and it does not contain the ability
&gt; to save cookies. As it is a long way from being finished, I would advise you to
&gt; use curl&apos;s cookie jar support. It is currently not enabled but setting
&gt; m_cookieJarFileName in ResourceHandleManager to an existing file should enable
&gt; it.
&gt; 

Hi, 
 Iam working on a browser using gtk/webkit. i want to implement cookies functionality in that.
is new patch for cookie implementation in webkit available?
or do we need to use curl&apos;s cookie jar support.
Any suggestions?
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111600</commentid>
    <comment_count>27</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-02-27 20:04:15 -0800</bug_when>
    <thetext>Removing the Gtk keyword, since GTK+ doesn&apos;t use curl anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122770</commentid>
    <comment_count>28</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-22 19:54:13 -0700</bug_when>
    <thetext>If gtk no longer uses curl do we still need this patch? I guess the cairo win port uses curl?  (If no one does, seems we should pull the curl code from the repo.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122771</commentid>
    <comment_count>29</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-22 19:58:00 -0700</bug_when>
    <thetext>Zecke no longer seems like the right reviewer since this patch no longer affects gtk.  Kevin Oliver is the only reviewer for a port which still uses curl (the wx port).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>122860</commentid>
    <comment_count>30</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2009-05-23 09:01:11 -0700</bug_when>
    <thetext>Overall it looks good, but r- because we are leaking the CookieManager. If you&apos;re going to have a global object which is not owned by another WebCore or WebKit object, I&apos;d suggest making the CookieManager a RefCounted class so that when the static gets destroyed it will also cause the CookieManager to be destroyed. 

It&apos;d be nice, also, if some basic persistent storage mechanism were present in this patch for testing purposes, though I know you split things up to improve your changes of getting the patch landed. Either way, though, I&apos;d suggest removing the COOKIEFILE option from the next patch, because it&apos;s just a stopgap and will be removed in the final implementation. It&apos;s confusing to see two different approaches to managing cookies in the same patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>905727</commentid>
    <comment_count>31</comment_count>
      <attachid>205975</attachid>
    <who name="Szabolcs David">davidsz</who>
    <bug_when>2013-07-03 01:07:25 -0700</bug_when>
    <thetext>Created attachment 205975
My &quot;working progress&quot; implementation

This is my experimental implementation, a little different approach for testing purposes. It works fine, but it still has some deficiencies, for example: top level domain checking, RFC incompatibility around the domain attribute.
I am working on these weaknesses and I would like to optimize the whole cookie storage method.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1478529</commentid>
    <comment_count>32</comment_count>
    <who name="Basuke Suzuki">basuke</who>
    <bug_when>2018-11-14 11:00:36 -0800</bug_when>
    <thetext>Curl cookie-backend database implementation was already landed.

*** This bug has been marked as a duplicate of bug 174942 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17560</attachid>
            <date>2007-11-27 12:48:36 -0800</date>
            <delta_ts>2007-12-02 19:02:40 -0800</delta_ts>
            <desc>First draft (cookie handling)</desc>
            <filename>bug14730.patch</filename>
            <type>text/plain</type>
            <size>43679</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDI4MDcz
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjggQEAKKzIwMDctMTEt
MjcgIEp1bGllbiBDaGFmZnJhaXggIDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBCdWcgMTQ3MzA6IFtj
dXJsXSBDb29raWUgaGFuZGxpbmcKKworICAgICAgICBJbXBvcnQgT1dCIGNvb2tpZSBoYW5kbGlu
ZyBsYXlvdXQgZm9yIENVUkwKKworICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAqIHBs
YXRmb3JtL2d0ay9Db29raWVKYXJHdGsuY3BwOgorICAgICAgICAoV2ViQ29yZTo6c2V0Q29va2ll
cyk6CisgICAgICAgIChXZWJDb3JlOjpjb29raWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvb2tp
ZXNFbmFibGVkKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmg6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llOjppbml0RnJvbVN0cmluZyk6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWU6OmNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21Db29raWUpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29va2llOjppbml0Q29va2llRnJvbUJhY2t1cFN0cmluZyk6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWU6OmV4dHJhY3RWYWx1ZUluKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6
YWRkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Y3JlYXRlQmFja3VwU3RyaW5nRnJv
bUNvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjpnZXROYW1lVmFsdWVQYWly
cyk6CisgICAgICAgIChXZWJDb3JlOjpnZXREYXlzVGlsbEZpcnN0T2ZNb250aCk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWU6OnRpbWVGcm9tU3RyaW5nKToKKyAgICAgICAgKiBwbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29va2llOjpD
b29raWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llOjp+Q29va2llKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvb2tpZTo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OnZhbHVlKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6cGF0aCk6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWU6OmRvbWFpbik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OmV4cGlyZURhdGUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llOjppc0RvbWFpbik6CisgICAgICAgIChXZWJDb3JlOjpDb29r
aWU6OmlzU2VjdXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Q29va2llTWFwKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6fkNvb2tpZU1hcCk6CisgICAgICAgIChXZWJD
b3JlOjpDb29raWVNYXA6OmdldE1hcCk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJs
L0Nvb2tpZU1hbmFnZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFn
ZXI6OmdldENvb2tpZU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6
Q29va2llTWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp+Q29va2ll
TWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpzZXRDb29raWVzKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnJlc3BlY3RzU2VjdXJpdHlTdGFuZGFy
ZHMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Y29va2llcyk6CisgICAgICAg
IChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp0aGlzTWFwRXhpc3RzKToKKyAgICAgICAgKFdlYkNv
cmU6OkNvb2tpZU1hbmFnZXI6OmFkZCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2Vy
Ojpjb29raWVzQ291bnQpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Z2V0TWFw
TGlzdEZvckhvc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2F2ZUNvb2tp
ZXNUb0ZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Z2V0Q29va2llc0Zy
b21GaWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnNldENvb2tpZUphcik6
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuaDogQWRkZWQu
CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpzZXRIYW5kbGUpOgorICAgICAgICAo
V2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2V0VVJMKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291
cmNlSGFuZGxlOjpzZXRDb29raWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxl
OjpjaGVja0FuZFNlbmRDb29raWVzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
UmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFu
ZGxlTWFuYWdlcjo6UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
c291cmNlSGFuZGxlTWFuYWdlcjo6flJlc291cmNlSGFuZGxlTWFuYWdlcik6CisgICAgICAgIChX
ZWJDb3JlOjpSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNldENvb2tpZUphckZpbGVOYW1lKToKKyAg
ICAgICAgKFdlYkNvcmU6OmhlYWRlckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291
cmNlSGFuZGxlTWFuYWdlcjo6c3RhcnRKb2IpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaDoKKwogMjAwNy0xMS0yNyAgQWxwIFRva2VyICA8
YWxwQGF0b2tlci5jb20+CiAKICAgICAgICAgRml4IHBvdGVudGlhbCBicm9rZW4gYnVpbGQgZHVl
IHRvIGEgbWlzc2luZyBERVBFTkRQQVRILgpJbmRleDogV2ViQ29yZS5wcm8KPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS5wcm8JKHJldmlzaW9uIDI4MDczKQorKysgV2ViQ29yZS5wcm8JKHdvcmtpbmcg
Y29weSkKQEAgLTk5OSw2ICs5OTksOCBAQCBndGstcG9ydCB7CiAgICAgICAgIHBsYXRmb3JtL2dy
YXBoaWNzL2d0ay9JbWFnZUd0ay5jcHAgXAogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9ndGsv
SW50UG9pbnRHdGsuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ludFJlY3RH
dGsuY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5jcHAgXAorICAg
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHAgXAogICAgICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcCBcCiAgICAgICAgIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwIFwKICAgICAgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vQWZmaW5lVHJhbnNmb3JtQ2Fpcm8uY3BwIFwKSW5kZXg6
IHBsYXRmb3JtL2d0ay9Db29raWVKYXJHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2d0
ay9Db29raWVKYXJHdGsuY3BwCShyZXZpc2lvbiAyODA3MykKKysrIHBsYXRmb3JtL2d0ay9Db29r
aWVKYXJHdGsuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwyOSArMjgsMzMgQEAKICNpbmNsdWRl
ICJjb25maWcuaCIKICNpbmNsdWRlICJDb29raWVKYXIuaCIKIAotI2luY2x1ZGUgIkRlcHJlY2F0
ZWRTdHJpbmcuaCIKLSNpbmNsdWRlICJLVVJMLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcu
aCIKLSNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCi0jaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNp
bmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGlj
IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGNvb2tpZUphcjsKLQotdm9pZCBzZXRDb29raWVzKGNv
bnN0IEtVUkwmIHVybCwgY29uc3QgS1VSTCYgLypwb2xpY3lVUkwqLywgY29uc3QgU3RyaW5nJiB2
YWx1ZSkKK3ZvaWQgc2V0Q29va2llcyhjb25zdCBLVVJMJiB1cmwsIGNvbnN0IEtVUkwmIHBvbGlj
eVVSTCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKIHsKLSAgICBjb29raWVKYXIuc2V0KHVybC51cmwo
KSwgdmFsdWUpOworICAgIENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpn
ZXRDb29raWVNYW5hZ2VyKCk7CisgICAgaWYgKG1hbmFnZXIpCisgICAgICAgIG1hbmFnZXItPnNl
dENvb2tpZXModXJsLCBwb2xpY3lVUkwsIHZhbHVlKTsKIH0KIAogU3RyaW5nIGNvb2tpZXMoY29u
c3QgS1VSTCYgdXJsKQogewotICAgIHJldHVybiBjb29raWVKYXIuZ2V0KHVybC51cmwoKSk7Cisg
ICAgQ29va2llTWFuYWdlciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFn
ZXIoKTsKKyAgICBpZiAobWFuYWdlcikKKyAgICAgICAgcmV0dXJuIG1hbmFnZXItPmNvb2tpZXMo
dXJsLnVybCgpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAogYm9v
bCBjb29raWVzRW5hYmxlZCgpCiB7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgQ29va2llTWFuYWdl
ciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIoKTsKKyAgICBpZiAo
bWFuYWdlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4g
ZmFsc2U7CiB9CiAKIH0KSW5kZXg6IHBsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VIYW5kbGUuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgJKHJldmlzaW9u
IDI4MDczKQorKysgcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xMzcsNiArMTM3LDExIEBAIHB1YmxpYzoKICAgICBSZXNvdXJjZUhhbmRsZUludGVy
bmFsKiBnZXRJbnRlcm5hbCgpIHsgcmV0dXJuIGQuZ2V0KCk7IH0KICNlbmRpZgogCisjaWYgVVNF
KENVUkwpCisgICAgdm9pZCBjaGVja0FuZFNlbmRDb29raWVzKEtVUkwgdXJsID0gIiIpOworICAg
IHZvaWQgc2V0Q29va2llcyhjb25zdCBLVVJMJiB1cmwsIGNvbnN0IEtVUkwmIHBvbGljeVVSTCwg
Y29uc3QgU3RyaW5nJiB2YWx1ZSk7CisjZW5kaWYKKwogICAgIC8vIFVzZWQgdG8gd29yayBhcm91
bmQgdGhlIGZhY3QgdGhhdCB5b3UgZG9uJ3QgZ2V0IGFueSBtb3JlIE5TVVJMQ29ubmVjdGlvbiBj
YWxsYmFja3MgdW50aWwgeW91IHJldHVybiBmcm9tIHRoZSBvbmUgeW91J3JlIGluLgogICAgIHN0
YXRpYyBib29sIGxvYWRzQmxvY2tlZCgpOyAgICAKICAgICAKSW5kZXg6IHBsYXRmb3JtL25ldHdv
cmsvY3VybC9Db29raWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWUuY3BwCShyZXZpc2lvbiAwKQorKysgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA3IFBsZXlvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMu
ICBOZWl0aGVyIHRoZSBuYW1lIG9mIFBsZXlvIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
UExFWU8gQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJ
TVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBQTEVZTyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
CisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorCisjaW5j
bHVkZSAiQ29va2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJT
eXN0ZW1UaW1lLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBDb29raWU6OmluaXRG
cm9tU3RyaW5nKGNvbnN0IFN0cmluZyYgY29va2llKQoreworICAgIGlmIChjb29raWUubGVuZ3Ro
KCkgPiA0MDk2KSB7CisgICAgICAgIExPRyhOZXR3b3JrLCAiY29va2llcyBhcmUgbGltaXRlZCB0
byA0S0IgaW4gc2l6ZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBmaXJzdCwg
c2Vjb25kOworICAgIC8vIGZpbmQgbmFtZQorICAgIGZpcnN0ID0gY29va2llLmZpbmQoIj0iKTsK
KyAgICBtX25hbWUgPSBjb29raWUubGVmdChmaXJzdCk7CisgICAgLy8gZmluZCB2YWx1ZQorICAg
IHNlY29uZCA9IGNvb2tpZS5maW5kKCI7Iik7CisgICAgbV92YWx1ZSA9IGNvb2tpZS5zdWJzdHJp
bmcoZmlyc3QgKyAxLCBzZWNvbmQgLSBmaXJzdCAtIDEpOworICAgIC8vIG5hbWUgaXMgdGhlIGZp
cnN0IGFyZyBiZWZvcmUgPQorICAgIAorICAgIC8vIHRoZSBleHBpcmF0aW9uIGRhdGUgaXMgcmVh
ZCBpbiBhIHRlbXBvcmFyeSBzdHJpbmcKKyAgICBTdHJpbmcgdG1wRXhwaXJlczsKKyAgICB0bXBF
eHBpcmVzID0gZXh0cmFjdFZhbHVlSW4oImV4cGlyZXM9IiwgY29va2llKTsKKyAgICAKKyAgICBp
ZiAoIXRtcEV4cGlyZXMgfHwgdG1wRXhwaXJlcy5sZW5ndGgoKSA8IDIwKSAvLyB0aGVuIGl0IGlz
IGEgc2Vzc2lvbiBjb29raWUKKyAgICAgICAgbV9leHBpcmVzID0gLTE7ICAKKyAgICBlbHNlCisg
ICAgICAgIC8vIHRoZW4gd2UgY29udmVydCBpdCBpbiBzZWNvbmRzIHNpbmNlIDEvMS8xOTcwCisg
ICAgICAgIG1fZXhwaXJlcyA9IHRpbWVGcm9tU3RyaW5nKHRtcEV4cGlyZXMpOworICAgIAorICAg
IG1fcGF0aCA9IGV4dHJhY3RWYWx1ZUluKCJwYXRoPSIsIGNvb2tpZSk7CisgICAgaWYgKCFtX3Bh
dGgpIAorICAgICAgICBtX3BhdGggPSAiLyI7CisgICAgCisgICAgbV9kb21haW4gPSBleHRyYWN0
VmFsdWVJbigiZG9tYWluPSIsIGNvb2tpZSk7CisgICAgaWYgKCFtX2RvbWFpbi5pc0VtcHR5KCkg
JiYgIW1fZG9tYWluLnN0YXJ0c1dpdGgoIi4iLGZhbHNlKSkKKyAgICAgICAgbV9kb21haW4gPSAi
LiIgKyBtX2RvbWFpbjsKKyAgICAKKyAgICBpZiAoY29va2llLmNvbnRhaW5zKCJzZWN1cmUiLGZh
bHNlKSkKKyAgICAgICAgbV9zZWN1cmUgPSB0cnVlOworCisgICAgTE9HKE5ldHdvcmssICJUaGUg
Zm9sbG93aW5nIGNvb2tpZSB3YXMgaW5pdGlhbGl6ZWQgOiAoJXMpPSglcylcbiVzPSVsZlxuJXM9
JXNcbiVzPSVzXG4lcz0lZCBcbiIsIG1fbmFtZS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwg
bV92YWx1ZS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwKKyAgICAgICAgImV4cGlyZXMiLCBt
X2V4cGlyZXMgLCAicGF0aCIsIG1fcGF0aC5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgImRv
bWFpbiIsIG1fZG9tYWluLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCAic2VjdXJlIiwgbV9z
ZWN1cmUpOworCit9ICAgCisKK1N0cmluZyBDb29raWU6OmNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21D
b29raWUoKQoreworICAgIFN0cmluZyByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gbV9uYW1l
ICsgIj0iICsgbV92YWx1ZSArICI7IjsKKyAgICByZXN1bHQgKz0gInBhdGg9IiArIG1fcGF0aCAr
ICI7IiA7CisgICAgU3RyaW5nIHRtcCA9IFN0cmluZzo6bnVtYmVyKG1fZXhwaXJlcyk7CisgICAg
cmVzdWx0ICs9ICJleHBpcmVzPSIgK3RtcCArICI7c2VjdXJlPSIgOworICAgIGlmIChtX3NlY3Vy
ZSkKKyAgICAgICAgcmVzdWx0ICs9ICJ0cnVlOyIgOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0
ICs9ICJmYWxzZTsiIDsKKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIENvb2tp
ZTo6aW5pdENvb2tpZUZyb21CYWNrdXBTdHJpbmcoU3RyaW5nIGNvb2tpZSwgU3RyaW5nIGRvbWFp
bikKK3sKKyAgICBpbnQgZmlyc3QsIHNlY29uZDsKKyAgICBTdHJpbmcgdG1wOworCisgICAgLy8g
ZmluZCBuYW1lCisgICAgZmlyc3QgPSBjb29raWUuZmluZCgiPSIpOworICAgIG1fbmFtZSA9IGNv
b2tpZS5sZWZ0KGZpcnN0KTsKKworICAgIC8vIGZpbmQgdmFsdWUKKyAgICBzZWNvbmQgPSBjb29r
aWUuZmluZCgiOyIpOworICAgIG1fdmFsdWUgPSBjb29raWUuc3Vic3RyaW5nKGZpcnN0ICsgMSwg
c2Vjb25kIC0gZmlyc3QgLSAxKTsKKworICAgIC8vIGZpbmQgcGF0aAorICAgIG1fcGF0aCA9IGV4
dHJhY3RWYWx1ZUluKCJwYXRoPSIsIGNvb2tpZSk7CisgICAgCisgICAgLy8gZmluZCBleHBpcmF0
aW9uIGRhdGUKKyAgICB0bXAgPSBleHRyYWN0VmFsdWVJbigiZXhwaXJlcz0iLCBjb29raWUpOwor
ICAgIG1fZXhwaXJlcyA9IHRtcC50b0RvdWJsZSgpOworICAgIAorICAgIC8vIHRoZSBkb21haW4g
aXMgdGhlIGNvb2tpZU1hcCBuYW1lCisgICAgbV9kb21haW4gPSBkb21haW47CisgICAgCisgICAg
Ly8gc2V0IHNlY3VyZSBzdGF0ZQorICAgIHRtcCA9IGV4dHJhY3RWYWx1ZUluKCJzZWN1cmU9Iiwg
Y29va2llKTsKKyAgICBpZiAodG1wLmNvbnRhaW5zKCJmYWxzZSIsdHJ1ZSkpCisgICAgICAgIG1f
c2VjdXJlID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgICBtX3NlY3VyZSA9IHRydWU7CisgICAg
CisgICAgTE9HKE5ldHdvcmssICJUaGUgZm9sbG93aW5nIGNvb2tpZSB3YXMgcmVhZCBmcm9tIGZp
bGUgOiAoJXMpPSglcylcbiVzPSVsZlxuJXM9JXNcbiVzPSVzXG4lcz0lZCBcbiIsIG1fbmFtZS5k
ZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgbV92YWx1ZS5kZXByZWNhdGVkU3RyaW5nKCkuYXNj
aWkoKSwKKyAgICAgICAgImV4cGlyZXMiLCBtX2V4cGlyZXMsICJwYXRoIiwgbV9wYXRoLmRlcHJl
Y2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCAiZG9tYWluIiwgbV9kb21haW4uZGVwcmVjYXRlZFN0cmlu
ZygpLmFzY2lpKCksICJzZWN1cmUiLCBtX3NlY3VyZSk7Cit9CisKK1N0cmluZyBDb29raWU6OmV4
dHJhY3RWYWx1ZUluKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFN0cmluZyYgY29va2llKQorewor
ICAgIGludCBmaXJzdCwgc2Vjb25kOworICAgIC8vIGZpbmQgbmFtZQorICAgIGZpcnN0ID0gY29v
a2llLmZpbmQobmFtZSwwLGZhbHNlKTsKKyAgICBpZiAoZmlyc3QgPT0gLTEpCisgICAgICAgIHJl
dHVybiBTdHJpbmcoKTsgLy8gbnVsbCBzdHJpbmcKKyAgICAvLyBmaW5kIHZhbHVlCisgICAgc2Vj
b25kID0gY29va2llLmZpbmQoIjsiLCBmaXJzdCk7CisgICAgaWYgKHNlY29uZCA9PSAtMSAmJiBj
b29raWUuZmluZCgiICIsIGZpcnN0KSAhPSAtMSkKKyAgICAgICAgLy8gbm8gIjsiIGFuZCBubyAi
ICIsIHNvIHdlJ3JlIGFuZCB0aGUgZW5kIG9mIGxpbmUKKyAgICAgICAgc2Vjb25kID0gY29va2ll
Lmxlbmd0aCgpOworCisgICAgcmV0dXJuIGNvb2tpZS5zdWJzdHJpbmcoZmlyc3QgKyBzdHJsZW4o
bmFtZSksIHNlY29uZCAtIGZpcnN0IC0gc3RybGVuKG5hbWUpKTsKK30KKworCisvKgorICogQ29v
a2llTWFwIGltcGxlbWVudGF0aW9uCisgKi8KK2ludCBDb29raWVNYXA6OmFkZChjb25zdCBDb29r
aWUmIGNvb2tpZSkKK3sKKyAgICBpbnQgbnVtYmVyQWRkZWQgPSAwOworICAgIAorICAgIC8vIGNo
ZWNrIGlmIHRoZSBjb29raWUgYWxyZWFkeSBleGlzdHMgdG8gcmVwbGFjZSBpdCBieSBhIG5ldyBv
bmUKKyAgICBpZiAobV9jb29raWVNYXAuY29udGFpbnMoY29va2llLm5hbWUoKSkpIHsKKyAgICAg
ICAgTE9HKE5ldHdvcmssICJDb29raWUgbmFtZWQgJXMgaXMgcmVwbGFjZWQgYnkgYSBuZXcgb25l
XG4iLCBjb29raWUubmFtZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICAgICAg
bV9jb29raWVNYXAucmVtb3ZlKGNvb2tpZS5uYW1lKCkpOworICAgICAgICBudW1iZXJBZGRlZC0t
OworICAgIH0gICAgICAKKyAgICAKKyAgICAvLyBjaGVjayBpZiB0aGUgY29va2llIGhhc24ndCBl
eHBpcmVkCisgICAgaWYgKGNvb2tpZS5leHBpcmVEYXRlKCkgIT0gLTEgJiYgY29va2llLmV4cGly
ZURhdGUoKSA8IFdlYkNvcmU6OmN1cnJlbnRUaW1lKCkpIHsKKyAgICAgICAgTE9HKE5ldHdvcmss
ICJDT09LSUUgUmVtb3ZlZCA6ICVzIDogaGlzIGV4cGlyZXMgZGF0ZSAoJWxmKSBpcyBsb3dlciB0
aGFuIHN5c3RlbWUgZGF0ZSAoJWxmKSBcbiIsIGNvb2tpZS5uYW1lKCkuZGVwcmVjYXRlZFN0cmlu
ZygpLmFzY2lpKCksIGNvb2tpZS5leHBpcmVEYXRlKCksIFdlYkNvcmU6OmN1cnJlbnRUaW1lKCkp
OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bWJlckFkZGVkOworICAgIH0KKworICAgIC8v
IGNoZWNrIGlmIHRoZXJlJ3Mgcm9vbSBmb3IgdGhlIG5ldyBjb29raWUgaW4gdGhpcyBtYXAsIGlm
IHRoZXJlIGlzIG5vdCB3ZSBtYWtlIHNvbWUgZm9yIGl0CisgICAgaWYgKG1fY291bnQgPj0gMjAp
IHsKKyAgICAgICAgTE9HKE5ldHdvcmssICJDb29raWVzIGFyZSBsaW1pdGVkIHRvIDIwIHBlciBk
b21haW4uLi5hIGNvb2tpZSBmcm9tIHRoaXMgZG9tYWluIHdpbGwgYmUgUkVNT1ZFRCBUTyBNQUtF
IFJPT00gZm9yICVzLiIsIGNvb2tpZS5uYW1lKCkuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkp
OworICAgICAgICBkb3VibGUgbWluID0gV2ViQ29yZTo6Y3VycmVudFRpbWUoKTsKKyAgICAgICAg
SGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJhdG9yIGl0QmFrID0gbV9jb29raWVNYXAuYmVn
aW4oKTsKKyAgICAgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llPjo6aXRlcmF0b3IgaXQg
PSBtX2Nvb2tpZU1hcC5iZWdpbigpO2l0ICE9IG1fY29va2llTWFwLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5leHBpcmVEYXRlKCkgPCBtaW4pIHsKKyAgICAgICAg
ICAgICAgICBtaW4gPSBpdC0+c2Vjb25kLmV4cGlyZURhdGUoKTsKKyAgICAgICAgICAgICAgICBp
dEJhayA9IGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fY29va2llTWFw
LnJlbW92ZShpdEJhayk7CisgICAgICAgIG1fY291bnQtLTsKKyAgICAgICAgbnVtYmVyQWRkZWQt
LTsKKyAgICB9CisgICAgCisgICAgaWYgKChDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2Vy
KCktPmNvb2tpZXNDb3VudCgpKSA+PSAzMDApIHsKKyAgICAgICAgTE9HKE5ldHdvcmssICJDb29r
aWVzJyBjb3VudCBpcyBsaW1pdGVkIHRvIDMwMCIpOworICAgICAgICByZXR1cm4gbnVtYmVyQWRk
ZWQ7CisgICAgfQorICAgIAorICAgIC8vIFdlIGFkZCB0aGUgY29va2llIGluIHRoZSBtYXAKKyAg
ICBtX2Nvb2tpZU1hcC5zZXQoY29va2llLm5hbWUoKSwgY29va2llKTsKKyAgICAKKyAgICAvLyBO
T1RFIGNhbid0IHRlc3QgY29ycmVjdGx5IHJldHVybiBzdGF0ZSBpbiAuc2Vjb25kCisgICAgTE9H
KE5ldHdvcmssICIqXG4qIENPT0tJRSBBRERFRCA6ICVzXG4qKioqKioqKioqKlxuIixjb29raWUu
bmFtZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICBtX2NvdW50Kys7CisgICAg
bnVtYmVyQWRkZWQrKzsKKyAgICAKKyAgICByZXR1cm4gbnVtYmVyQWRkZWQ7Cit9CisKK1N0cmlu
ZyBDb29raWVNYXA6OmNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21Db29raWVzKCkKK3sKKyAgICBTdHJp
bmcgcmVzdWx0OworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJhdG9yIGl0
ID0gbV9jb29raWVNYXAuYmVnaW4oKTsgaXQgIT0gbV9jb29raWVNYXAuZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgaWYgKGl0LT5zZWNvbmQuZXhwaXJlRGF0ZSgpICE9IC0xICYmIGl0LT5zZWNvbmQu
ZXhwaXJlRGF0ZSgpID4gV2ViQ29yZTo6Y3VycmVudFRpbWUoKSkgeworICAgICAgICAgICAgcmVz
dWx0ICs9IGl0LT5zZWNvbmQuY3JlYXRlQmFja3VwU3RyaW5nRnJvbUNvb2tpZSgpOworICAgICAg
ICAgICAgcmVzdWx0ICs9ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgTE9HKE5ldHdvcmssICJDb29raWUgJXMgLS0+IHJlbW92ZWRcbiIsIGl0LT5maXJzdC5kZXBy
ZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7
Cit9CisKKworLy8gY2FuJ3QgYmUgY29uc3QgYmVjYXVzZSBvZiBtX2Nvb2tpZU1hcC5iZWdpbigp
IGFuZCAuZW5kKCkKK1N0cmluZyBDb29raWVNYXA6OmdldE5hbWVWYWx1ZVBhaXJzKCkKK3sKKyAg
ICBTdHJpbmcgcmVzdWx0OworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJh
dG9yIGl0ID0gbV9jb29raWVNYXAuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbV9jb29raWVNYXAu
ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgcmVzdWx0ICs9IGl0LT5maXJzdCArICI9IiArIGl0LT5z
ZWNvbmQudmFsdWUoKSArICI7ICI7CisgICAgICAgICAgICBMT0coTmV0d29yaywgImZpcnN0PSVz
IHNlY29uZD0lcyBcbiIsIGl0LT5maXJzdC5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgaXQt
PnNlY29uZC52YWx1ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICB9CisgICAg
cmV0dXJuIHJlc3VsdDsKK30KKworLy8gY2FuJ3QgYmUgY29uc3QgYmVjYXVzZSBvZiBtX2Nvb2tp
ZU1hcC5iZWdpbigpIGFuZCAuZW5kKCkKK1N0cmluZyBDb29raWVNYXA6OmdldE5hbWVWYWx1ZVBh
aXJzKFN0cmluZyBwYXRoLCBib29sIHNpdGVJc1NlY3VyZSkKK3sKKyAgICBTdHJpbmcgcmVzdWx0
ID0gIiI7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llPjo6aXRlcmF0b3IgaXQgPSBt
X2Nvb2tpZU1hcC5iZWdpbigpOyBpdCAhPSBtX2Nvb2tpZU1hcC5lbmQoKTsgKytpdCkKKyAgICAg
ICAgaWYgKHBhdGguc3RhcnRzV2l0aChpdC0+c2Vjb25kLnBhdGgoKSxmYWxzZSkgJiYgKCFpdC0+
c2Vjb25kLmlzU2VjdXJlKCkgfHwgc2l0ZUlzU2VjdXJlKSkKKyAgICAgICAgICAgIHJlc3VsdCAr
PSBpdC0+Zmlyc3QgKyAiPSIgKyBpdC0+c2Vjb25kLnZhbHVlKCkgKyAiOyAiOworCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBnZXREYXlzVGlsbEZpcnN0T2ZNb250aChTdHJp
bmcgbW9udGgsIGZsb2F0IHllYXIpCit7CisgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGRh
eXMgZWxhcHNlZCBmcm9tIHRoZSBiZWdpbmluZyBvZiB0aGUgeWVhciB0byBmaXJzdCBvZiB0aGUg
ZGF0ZVN0cmluZyBtb250aAorICAgIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgaW50ID4gZGF5c1Rp
bGxGaXJzdE9mTW9udGg7CisgICAgaWYgKGRheXNUaWxsRmlyc3RPZk1vbnRoLmlzRW1wdHkoKSkg
eworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIkphbiIsIDApOworICAgICAgICBk
YXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIkZlYiIsIDMxKTsKKyAgICAgICAgZGF5c1RpbGxGaXJz
dE9mTW9udGguYWRkKCJNYXIiLCA1OSk7CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1vbnRoLmFk
ZCgiQXByIiwgOTApOworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIk1heSIsIDEy
MCk7CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1vbnRoLmFkZCgiSnVuIiwgMTUxKTsKKyAgICAg
ICAgZGF5c1RpbGxGaXJzdE9mTW9udGguYWRkKCJKdWwiLCAxODEpOworICAgICAgICBkYXlzVGls
bEZpcnN0T2ZNb250aC5hZGQoIkF1ZyIsIDIxMik7CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1v
bnRoLmFkZCgiU2VwIiwgMjQyKTsKKyAgICAgICAgZGF5c1RpbGxGaXJzdE9mTW9udGguYWRkKCJP
Y3QiLCAyNzMpOworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIk5vdiIsIDMwMyk7
CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1vbnRoLmFkZCgiRGVjIiwgMzM0KTsKKyAgICB9CisK
KyAgICBpbnQgZGF5cyA9IGRheXNUaWxsRmlyc3RPZk1vbnRoLmdldChtb250aCk7CisKKyAgICAv
LyBIYW5kbGUgdGhlIGJpc3NleHRpbCB5ZWFycworICAgIGlmICh5ZWFyLzQ9PWludCh5ZWFyLzQp
ICYmIGRheXMgPiAzMSkgCisgICAgICAgIGRheXMrKzsKKworICAgIHJldHVybiBkYXlzOworfQor
Citkb3VibGUgQ29va2llOjp0aW1lRnJvbVN0cmluZyhTdHJpbmcgZGF0ZVN0cmluZykKK3sKKyAg
ICBkb3VibGUgZGF5LCBkYXlzVGlsRmlyc3RPZk1vbnRoID0gMCwgaG91cnMsIHllYXIsIG1pbnV0
ZXMsIHNlY29uZHM7CisgICAgU3RyaW5nIG1vbnRoLCBjdXREYXRlLCB0bXBMZWZ0LCB0bXBSaWdo
dDsKKyAgICBkb3VibGUgY29va2llVGltZSA9IDA7CisKKyAgICAvKgorICAgICAqIFRoZXJlIGFy
ZSBzZXZlcmFsIHdheXMgdG8gZm9ybWF0IHRoZSBkYXRlIGFuZCBlYWNoIHdlYiBzaXRlIHVzZXMg
YSBkaWZmZXJlbnQgb25lIDotLworICAgICAqIFRoaXMgZm9uY3Rpb24gdHJpZXMgdG8gYW5hbHlz
ZSB0aGUgc3RyaW5nIHRvIG9idGFpbiB0aGUgcHJvcGVyIGZvcm1hdC4KKyAgICAgKiBXaGVuIHRo
aXMgaXMgZG9uZSwgd2UgZXh0cmFjdCB0aGUgdmFsdWVzIGFuZCBjb252ZXJ0IHRoZW0gaW50byBh
IG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDEvMS8xOTcwIDBoMDBtMDBzCisgICAgICovCisKKyAg
ICB0bXBSaWdodCA9IGRhdGVTdHJpbmcucmlnaHQoMyk7CisgICAgaWYgKHRtcFJpZ2h0LmNvbnRh
aW5zKCJHTVQiLCBmYWxzZSkpCisgICAgICAgIGN1dERhdGUgPSBkYXRlU3RyaW5nLnJpZ2h0KDI0
KTsKKyAgICBlbHNlCisgICAgICAgIGN1dERhdGUgPSBkYXRlU3RyaW5nLnJpZ2h0KDIwKTsKKwor
ICAgIC8vIHdlIGdldCB0aGUgbnVtZXJpYyB2YWx1ZXMgZGlyZWN0bHkKKyAgICB0bXBMZWZ0ID0g
Y3V0RGF0ZS5sZWZ0KDIpOworICAgIGlmICh0bXBMZWZ0LmNvbnRhaW5zKCIsIixmYWxzZSkpIHsK
KyAgICAgICAgZGF5ID0gY3V0RGF0ZS5zdWJzdHJpbmcoMiwyKS50b0RvdWJsZSgpOworICAgICAg
ICBtb250aCA9IG1vbnRoID0gY3V0RGF0ZS5zdWJzdHJpbmcoNSwzKTsKKyAgICAgICAgeWVhciA9
IGN1dERhdGUuc3Vic3RyaW5nKDksMikudG9Eb3VibGUoKTsKKyAgICAgICAgeWVhciA9IHllYXIg
KyAyMDAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZGF5ID0gY3V0RGF0ZS5zdWJzdHJp
bmcoMCwyKS50b0RvdWJsZSgpOworICAgICAgICBtb250aCA9IGN1dERhdGUuc3Vic3RyaW5nKDMs
Myk7CisgICAgICAgIHllYXIgPSBjdXREYXRlLnN1YnN0cmluZyg3LDQpLnRvRG91YmxlKCk7Cisg
ICAgfQorICAgIAorICAgIC8vIEdNVCB0aW1lCisgICAgaG91cnMgPSBjdXREYXRlLnN1YnN0cmlu
ZygxMiwyKS50b0RvdWJsZSgpOworICAgIGlmIChkYXRlU3RyaW5nLmVuZHNXaXRoKCJHTVQiLGZh
bHNlKSk7CisgICAgICAgIGhvdXJzID0gaG91cnMgKyAyLjA7IC8vRklYTUUgOiB0aGlzIHdvdWxk
IG9ubHkgd29yayBpbiBmcmFuY2UKKyAgICAgICAgCisgICAgbWludXRlcyA9IGN1dERhdGUuc3Vi
c3RyaW5nKDE1LDQpLnRvRG91YmxlKCk7CisgICAgc2Vjb25kcyA9IGN1dERhdGUuc3Vic3RyaW5n
KDE4LDQpLnRvRG91YmxlKCk7CisgICAgCisgICAgZGF5c1RpbEZpcnN0T2ZNb250aCA9IGdldERh
eXNUaWxsRmlyc3RPZk1vbnRoKG1vbnRoLCB5ZWFyKTsKKyAgICAKKyAgICBMT0coTmV0d29yaywg
Ik9yaWdpbmFsIDogJXNcbkRBVEUgRlJPTSBTVFJJTkdcbkRheSA9ICVsZlxuTW9udGggPSAlbGZc
blllYXIgPSAlbGZcbkhvdXJzID0gJWxmXG5NaW4gPSAlbGZcblNlYyA9ICVsZlxuICIsZGF0ZVN0
cmluZy5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgZGF5LCBkYXlzVGlsRmlyc3RPZk1vbnRo
LCB5ZWFyLCBob3VycywgbWludXRlcywgc2Vjb25kcyk7CisKKyAgICAvLyBub3cgd2UgY2FuIGNh
bGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIEphbnVhcnkgMTk3MCB0aGUg
MXN0IGF0IDAwOjAwOjAwCisgICAgY29va2llVGltZSA9ICh5ZWFyIC0gMTk3MCkqKDYwKjYwKjI0
KjM2NSk7CisgICAgY29va2llVGltZSArPSBkYXlzVGlsRmlyc3RPZk1vbnRoICogKDYwKjYwKjI0
KTsKKyAgICBjb29raWVUaW1lICs9ICgoZGF5IC0gMSkrIGludCgoeWVhci0xOTcwKS80KSkgKiAo
NjAqNjAqMjQpOworICAgIGNvb2tpZVRpbWUgKz0gaG91cnMgKiAoNjAqNjApOworICAgIGNvb2tp
ZVRpbWUgKz0gbWludXRlcyAqIDYwOworICAgIGNvb2tpZVRpbWUgKz0gc2Vjb25kczsKKyAgICAK
KyAgICByZXR1cm4gY29va2llVGltZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRl
eDogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWUuaAkocmV2aXNpb24gMCkKKysrIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcgUGxleW8uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgUGxleW8gbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBQTEVZTyBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFBMRVlPIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
KyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBjb29raWVfaAorI2RlZmluZSBjb29raWVfaAorCisj
aW5jbHVkZSAiRGVwcmVjYXRlZFN0cmluZy5oIgorI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIKKyNp
bmNsdWRlICJ3dGYvSGFzaE1hcC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ29va2llIHsKK3B1YmxpYzoKKyAgICBDb29raWUo
KQorICAgICAgICA6IG1fZXhwaXJlcygwKQorICAgICAgICAsIG1fc2VjdXJlKGZhbHNlKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgQ29va2llKFN0cmluZyYgbmFtZSwgU3RyaW5nJiB2YWx1ZSwg
U3RyaW5nJiBleHBpcmVzLCBTdHJpbmcmIHNlY3VyZSkKKyAgICAgICAgOiBtX25hbWUobmFtZSkK
KyAgICAgICAgLCBtX3ZhbHVlKHZhbHVlKQorICAgICAgICAsIG1fZXhwaXJlcygwKQorICAgICAg
ICAsIG1fc2VjdXJlKGZhbHNlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgfkNvb2tpZSgpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvb2tpZSBuYW1lLgor
ICAgICAqLworICAgIGNvbnN0IFN0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQorICAgIAorICAgIC8qKgorICAgICogR2V0IHRoZSBjb29raWUgdmFsdWUuCisgICAgICovCisg
ICAgY29uc3QgU3RyaW5nJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICAK
KyAgICAvKioKKyAgICAqIEdldCB0aGUgY29va2llIHBhdGguCisgICAgICovCisgICAgY29uc3Qg
U3RyaW5nJiBwYXRoKCkgY29uc3QgeyByZXR1cm4gbV9wYXRoOyB9CisgICAgCisgICAgLyoqCisg
ICAgICogR2V0IHRoZSBjb29raWUgZG9tYWluLgorICAgICAqLworICAgIGNvbnN0IFN0cmluZyYg
ZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICAKKyAgICAvKioKKyAgICAg
KiBHZXQgdGhlIGNvb2tpZSBleHBpcmUgZGF0ZS4KKyAgICAgKi8KKyAgICBjb25zdCBkb3VibGUg
ZXhwaXJlRGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZXhwaXJlczsgfQorICAgIAorICAgIC8qKgor
ICAgICogUmV0dXJucyB0cnVlIGlmIGNvb2tpZSBpcyBzZXQgZm9yIGFsbCBkb21haW4uCisgICAg
ICovCisgICAgYm9vbCBpc0RvbWFpbigpIGNvbnN0IHsgcmV0dXJuICFtX2RvbWFpbi5pc0VtcHR5
KCk7IH0KKyAgICAKKyAgICAvKioKKyAgICAqIFRoZSBjb29raWUgaXMgc2VjdXJlZCBvbmx5IGlm
IHRoZSB0cmFuc2ZlciB3YXMgc2VjdXJlZCAoaHR0cHMpLgorICAgICAqLworICAgIGJvb2wgaXNT
ZWN1cmUoKSBjb25zdCB7IHJldHVybiBtX3NlY3VyZTsgfQorICAgIAorICAgIC8qKgorICAgICAq
IENvbnN0cnVjdCB0aGUgY29va2llIGZyb20gdGhlIHZhbHVlcyBzdG9yZWQgaW4gcGFyYW1ldGVy
LgorICAgICAqIEBwYXJhbShpbikgc3RyaW5nIGNvbnRhaW5pbmcgYXQgbGVhc3QgbmFtZT12YWx1
ZQorICAgICAqLworICAgIHZvaWQgaW5pdEZyb21TdHJpbmcoY29uc3QgU3RyaW5nJiBjb29raWUp
OworICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBiYWNrdXAgc3RyaW5nIGZyb20gdGhl
IGNvb2tpZQorICAgICAqIGZvciBpdCB0byBiZSBzYXZlZCBvbiBhIGZpbGUKKyAgICAgKi8KKyAg
ICBTdHJpbmcgY3JlYXRlQmFja3VwU3RyaW5nRnJvbUNvb2tpZSgpOworICAgIAorICAgIC8qKgor
ICAgICAqIEluaXRpYXRlIHRoZSBjb29raWUgZnJvbSBhIGJhY2t1cCBzdHJpbmcKKyAgICAgKi8K
KyAgICB2b2lkIGluaXRDb29raWVGcm9tQmFja3VwU3RyaW5nKFN0cmluZyBjb29raWUsIFN0cmlu
ZyBkb21haW4pOworICAgIAorcHJpdmF0ZToKKyAgICAvLyBGSVhNRSA6IHdlIHNob3VsZCBmaW5k
IGEgYmV0dGVyIHBsYWNlIGZvciB0aGlzCisgICAgZG91YmxlIHRpbWVGcm9tU3RyaW5nKFN0cmlu
ZyBkYXRlU3RyaW5nKTsKKworICAgIFN0cmluZyBleHRyYWN0VmFsdWVJbihjb25zdCBjaGFyKiBu
YW1lLCBjb25zdCBTdHJpbmcmIGNvb2tpZSk7CisgICAgU3RyaW5nIG1fbmFtZTsKKyAgICBTdHJp
bmcgbV92YWx1ZTsKKyAgICBTdHJpbmcgbV9kb21haW47CisgICAgU3RyaW5nIG1fcGF0aDsKKyAg
ICBkb3VibGUgbV9leHBpcmVzOyAvKmluIHNlY29uZHMgc2luY2UgamFudWFyeSAxOTcwIHRoZSAx
c3QgYXQgMDBoMDBtMDBzICovCisgICAgYm9vbCBtX3NlY3VyZTsKK307CisKKy8qKgorICogQSBD
b29raWVNYXAgaXMgZGVzaWduIHRvIGhvbGQgY29va2llcyBmb3Igb25lIGhvc3QuCisgKiBBbGwg
Y29va2llcyBmb3Igb25lIGhvc3QgYXJlIHN0b3JlZCBpbiBhIG1hcC4KKyAqLworY2xhc3MgQ29v
a2llTWFwIHsKK3B1YmxpYzoKKyAgICBDb29raWVNYXAoKSAKKyAgICAgICAgOiBtX2NvdW50KDAp
CisgICAgeworICAgIH0KKworICAgIH5Db29raWVNYXAoKQorICAgIHsKKyAgICB9CisKKyAgICAv
KioKKyAgICAgKiBTdG9yZSBhIGNvb2tpZSBpbiBtYXAuCisgICAgICogSWYgaXQgYWxyZWFkeSBl
eGlzdHMsIGl0IGlzIHVwZGF0ZWQuCisgICAgICogQHBhcmFtKGluKSB0aGUgY29va2llCisgICAg
ICovCisgICAgaW50IGFkZChjb25zdCBDb29raWUmIGNvb2tpZSk7CisgICAgCisgICAgU3RyaW5n
IGNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21Db29raWVzKCk7CisgICAgCisgICAgLyoqCisgICAgICog
UmV0dXJucyAibmFtZT12YWx1ZTsgLi4uIiBzZXF1ZW5jZXMgaW4gb25lIGxpbmUgZm9yIGFsbCBj
b29raWVzLgorICAgICAqLworICAgIFN0cmluZyBnZXROYW1lVmFsdWVQYWlycygpOworICAgIAor
ICAgIC8qKgorICAgICAqIFJldHVybnMgIm5hbWU9dmFsdWU7IC4uLiIgc2VxdWVuY2VzIGluIG9u
ZSBsaW5lIGZvciBhbGwgY29va2llcyByZWxhdGl2ZSB0byBvbmUgcGF0aC4KKyAgICAgKiBAcGFy
YW0oaW4pIHRoZSBwYXRoIG9mIHRoZSBhc2tpbmcgdXJsCisgICAgICogQHBhcmFtKGluKSBib29s
ZWFuIHRvIHRlbGwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc2VjdXJlZAorICAgICAqLworICAgIFN0
cmluZyBnZXROYW1lVmFsdWVQYWlycyhTdHJpbmcgcGF0aCwgYm9vbCBzaXRlSXNTZWN1cmUpOwor
ICAgIAorICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWU+IGdldE1hcCgpIHsgcmV0dXJuIG1fY29v
a2llTWFwOyB9CisgICAgCitwcml2YXRlOgorICAgIC8vIG1hcCBvZiBjb29raWUgbmFtZXMgYW5k
IHRoZSBDb29raWUKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llPiBtX2Nvb2tpZU1hcDsKKyAg
ICAKKyAgICAvLyBjb29raWVzIGFyZSBsaW1pdGVkIHRvIDIwIHBlciBkb21haW4KKyAgICB1bnNp
Z25lZCBzaG9ydCBtX2NvdW50OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorI2VuZGlm
CkluZGV4OiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwCShyZXZpc2lvbiAw
KQorKysgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQbGV5by4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBQbGV5byBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFBMRVlPIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgUExFWU8gT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJM
b2dnaW5nLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKworI2luY2x1ZGUgPGZjbnRs
Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitzdGF0aWMgY2hhciogZGVmYXVsdEZpbGVOYW1lID0gImNvb2tpZUNvbGxl
Y3Rpb24udHh0IjsKK3N0YXRpYyBDb29raWVNYW5hZ2VyKiBzaGFyZWRNYW5hZ2VyID0gMDsKKwor
Q29va2llTWFuYWdlciogQ29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcigpCit7CisgICAg
aWYgKCFzaGFyZWRNYW5hZ2VyKQorICAgICAgICBzaGFyZWRNYW5hZ2VyID0gbmV3IENvb2tpZU1h
bmFnZXIoKTsKKyAgICByZXR1cm4gc2hhcmVkTWFuYWdlcjsKK30KKworQ29va2llTWFuYWdlcjo6
Q29va2llTWFuYWdlcigpCisgICAgOiBtX2NvdW50KDApCit7CisgICAgaWYgKCFzaGFyZWRNYW5h
Z2VyKQorICAgICAgICBzaGFyZWRNYW5hZ2VyID0gdGhpczsKKyAgICBtX2Nvb2tpZUphckZpbGVO
YW1lID0gZGVmYXVsdEZpbGVOYW1lOworICAgIGdldENvb2tpZXNGcm9tRmlsZSgpOworfQorCitD
b29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgc2F2ZUNvb2tpZXNUb0ZpbGUo
KTsKKyAgICAKKyAgICAvLyBkZXN0cm95IGFsbCBhbGxvY2F0ZWQgYWxsIENvb2tpZU1hcAorICAg
IGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IG1fbWFuYWdl
ck1hcC5iZWdpbigpOworICAgICAgICBpdCAhPSBtX21hbmFnZXJNYXAuZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgICAgIHByaW50ZigibWFwIGZvciAnJXMnIHdhcyAnJXMnIVxuIiwgaXQtPmZpcnN0
LmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCBpdC0+c2Vjb25kLT5nZXROYW1lVmFsdWVQYWly
cygpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICAgICAgICAgIGRlbGV0ZSBpdC0+
c2Vjb25kOworICAgICAgICB9CisKKyAgICBpZiAobV9jb29raWVKYXJGaWxlTmFtZSAhPSBkZWZh
dWx0RmlsZU5hbWUpCisgICAgICAgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4obV9jb29raWVKYXJG
aWxlTmFtZSkpOworCit9CisKK3Vuc2lnbmVkIGludCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVz
KGNvbnN0IEtVUkwmIHVybCwgY29uc3QgS1VSTCYgcG9saWN5VVJMLCBjb25zdCBTdHJpbmcmIHZh
bHVlKQoreworICAgIHVuc2lnbmVkIGludCBjb29raWVzQWRkZWQgPSAwOworICAgIFN0cmluZyBo
b3N0ID0gdXJsLmhvc3QoKTsKKyAgICAgICAgCisgICAgQ29va2llIGNvb2tpZTsKKyAgICBjb29r
aWUuaW5pdEZyb21TdHJpbmcodmFsdWUpOworCisgICAgaWYgKHJlc3BlY3RzU2VjdXJpdHlTdGFu
ZGFyZHModXJsLCBjb29raWUpKQorICAgICAgICBjb29raWVzQWRkZWQgPSBhZGQoaG9zdCwgY29v
a2llKTsKKyAgICBlbHNlCisgICAgICAgIExPRyhOZXR3b3JrLCAiQ09PS0lFICVzIGlzIGNvbnNp
ZGVyZWQgYXMgZGFuZ2Vyb3VzIGFuZCB3aWxsIGJlIHJlamVjdGVkXG4iLCBjb29raWUubmFtZSgp
LmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKworICAgIHJldHVybiBjb29raWVzQWRkZWQ7
ICAgIAorfQorCitib29sIENvb2tpZU1hbmFnZXI6OnJlc3BlY3RzU2VjdXJpdHlTdGFuZGFyZHMo
Y29uc3QgS1VSTCYgdXJsLCBDb29raWUmIGNvb2tpZSkKK3sKKyAgICBpZiAoIWNvb2tpZS5kb21h
aW4oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IGNvb2tpZS5kb21haW4o
KTsKKyAgICAgICAgZG9tYWluID0gZG9tYWluLnJpZ2h0KGRvbWFpbi5sZW5ndGgoKS0xKTsKKyAg
ICAgICAgaWYgKCFkb21haW4uY29udGFpbnMoIi4iLGZhbHNlKSB8fCAhdXJsLmhvc3QoKS5lbmRz
V2l0aChkb21haW4uZGVwcmVjYXRlZFN0cmluZygpKSkgeworICAgICAgICAgICAgTE9HKE5ldHdv
cmssICJJbGxlZ2FsIENvb2tpZSA6IEJhZCBkb21haW4gbmFtZVxuIik7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAq
IEEgU2V0LUNvb2tpZSBmcm9tIHJlcXVlc3QtaG9zdCB5LnguZm9vLmNvbSBmb3IgRG9tYWluPS5m
b28uY29tCisgICAgICAgICAqIHdvdWxkIGJlIHJlamVjdGVkLCBiZWNhdXNlIHkueCBhbmQgY29u
dGFpbnMgYSBkb3QuCisgICAgICAgICAqLworICAgICAgICBpZiAodXJsLmhvc3QoKSE9ZG9tYWlu
ICYmIHVybC5ob3N0KCkubGVmdCh1cmwuaG9zdCgpLmxlbmd0aCgpLWRvbWFpbi5sZW5ndGgoKS0x
KS5jb250YWlucygiLiIsZmFsc2UpKSB7CisgICAgICAgICAgICBwcmludGYoIklsbGVnYWwgQ29v
a2llIDogeS54LmZvby5jb20gZm9yIERvbWFpbj0uZm9vLmNvbVxuIik7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCF1cmwucGF0aCgp
LnN0YXJ0c1dpdGgoY29va2llLnBhdGgoKS5kZXByZWNhdGVkU3RyaW5nKCkpKSB7CisgICAgICAg
IExPRyhOZXR3b3JrLCAiSWxsZWdhbCBDb29raWUgOiBjb29raWUncyBwYXRoIGRvZXNuJ3QgbWF0
Y2ggdGhlIHByZXNlbnQgVVJMXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworU3RyaW5nIENvb2tpZU1hbmFnZXI6OmNvb2tpZXMo
Y29uc3QgS1VSTCYgdXJsKQoreworICAgIExPRyhOZXR3b3JrLCAiTG9va2luZyBmb3IgY29va2ll
cyBmb3IgVVJMIDogJXNcbiIsdXJsLnVybCgpLmFzY2lpKCkpOworCisgICAgSGFzaE1hcDxXZWJD
b3JlOjpTdHJpbmcsIENvb2tpZU1hcCo+IG1hcExpc3QgPSBnZXRNYXBMaXN0Rm9ySG9zdChTdHJp
bmcodXJsLmhvc3QoKSkpOworICAgIGlmICghbWFwTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAg
U3RyaW5nIHJlc3VsdDsKKyAgICAgICAgaWYgKHVybC51cmwoKS5zdGFydHNXaXRoKCJodHRwOiIp
KQorICAgICAgICAgICAgZm9yIChIYXNoTWFwPFdlYkNvcmU6OlN0cmluZywgQ29va2llTWFwKj46
Oml0ZXJhdG9yIGl0ID0gbWFwTGlzdC5iZWdpbigpOyBpdCAhPSBtYXBMaXN0LmVuZCgpIDsgKytp
dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gaXQtPnNlY29uZC0+Z2V0TmFtZVZhbHVlUGFp
cnMoU3RyaW5nKHVybC51cmwoKS5yZW1vdmUoMCx1cmwuaG9zdCgpLmxlbmd0aCgpKzcpKSwgZmFs
c2UpOworICAgICAgICAKKyAgICAgICAgZWxzZSAvL2h0dHBzOgorICAgICAgICAgICAgZm9yIChI
YXNoTWFwPFdlYkNvcmU6OlN0cmluZywgQ29va2llTWFwKj46Oml0ZXJhdG9yIGl0ID0gbWFwTGlz
dC5iZWdpbigpOyBpdCAhPSBtYXBMaXN0LmVuZCgpIDsgKytpdCkKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgKz0gaXQtPnNlY29uZC0+Z2V0TmFtZVZhbHVlUGFpcnMoU3RyaW5nKHVybC51cmwoKS5y
ZW1vdmUoMCx1cmwuaG9zdCgpLmxlbmd0aCgpKzgpKSwgdHJ1ZSk7CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisK
K2Jvb2wgQ29va2llTWFuYWdlcjo6dGhpc01hcEV4aXN0cyhTdHJpbmcgbWFwTmFtZSkKK3sKKyAg
ICBmb3IgKEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQg
PSBtX21hbmFnZXJNYXAuYmVnaW4oKTsgaXQgIT0gbV9tYW5hZ2VyTWFwLmVuZCgpIDsgKytpdCkg
eworICAgICAgICBpZiAoaXQtPmZpcnN0ID09IG1hcE5hbWUpCisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQgQ29va2llTWFu
YWdlcjo6YWRkKGNvbnN0IFN0cmluZyYgaG9zdCwgY29uc3QgQ29va2llJiBjb29raWUpCit7Cisg
ICAgaW50IGFkZGVkQ29va2llcyA9IDA7CisgICAgCisgICAgLy8gSWYgdGhlIGNvb2tpZSBzcGVj
aWZpZXMgYSBkb21haW4gbmFtZSwgdGhlIG1hcCBzaG91bGQgaGF2ZSB0aGlzIG5hbWUgZWxzZSBp
dCdsbCBiZSB0aGUgaG9zdCBuYW1lLiAKKyAgICBTdHJpbmcgZG9tYWluID0gaG9zdDsKKyAgICBp
ZiAoIWNvb2tpZS5kb21haW4oKS5pc0VtcHR5KCkpCisgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5k
b21haW4oKTsKKyAgICAKKyAgICAvLyBOZWVkIHRvIGNoZWNrIGZpcnN0IGlmIHRoZSBjb29raWUg
bWFwIGFscmVhZHkgZXhpc3RzIHRvIGV2ZW50dWFsbHkgY3JlYXRlIG9uZQorICAgIGlmICghdGhp
c01hcEV4aXN0cyhkb21haW4pKSB7CisgICAgICAgIENvb2tpZU1hcCogbmV3TWFwID0gbmV3IENv
b2tpZU1hcCgpOworICAgICAgICAKKyAgICAgICAgbV9tYW5hZ2VyTWFwLnNldChkb21haW4sIG5l
d01hcCk7CisgICAgICAgIHByaW50ZigiTkVXIENvb2tpZU1hcCBjcmVhdGVkIDogJXMgXG4iLCBk
b21haW4uZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkpOworICAgICAgICAKKyAgICAgICAgYWRk
ZWRDb29raWVzID0gbmV3TWFwLT5hZGQoY29va2llKTsKKyAgICAgICAgbV9jb3VudCArPSBhZGRl
ZENvb2tpZXM7CisgICAgICAgIHJldHVybiBhZGRlZENvb2tpZXM7CisgICAgfQorICAgIAorICAg
IC8vIEdldHRpbmcgdGhlIG1hcCByZWxhdGVkIHRvIHRoaXMgaG9zdAorICAgIEhhc2hNYXA8V2Vi
Q29yZTo6U3RyaW5nLCBDb29raWVNYXAqPiBleGlzdGluZ01hcCA9IGdldE1hcExpc3RGb3JIb3N0
KGRvbWFpbiwgdHJ1ZSk7CisgICAgCisgICAgTE9HKE5ldHdvcmssICJUcnlpbmcgdG8gYWRkIGEg
Y29va2llIHRvIDogJXMgXG4iLCBkb21haW4uZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCkpOwor
ICAgIGFkZGVkQ29va2llcyA9IGV4aXN0aW5nTWFwLmJlZ2luKCktPnNlY29uZC0+YWRkKGNvb2tp
ZSk7CisgICAgbV9jb3VudCArPSBhZGRlZENvb2tpZXM7CisgICAgcmV0dXJuIGFkZGVkQ29va2ll
czsKK30KKwordW5zaWduZWQgc2hvcnQgQ29va2llTWFuYWdlcjo6Y29va2llc0NvdW50KCkKK3sK
KyAgICByZXR1cm4gbV9jb3VudDsKK30KKworLy8gY2FuJ3QgcmV0dXJuIENvb2tpZU1hcCYgYmVj
YXVzZSBvZiBtYXAuZ2V0KGhvc3QpIHdoaWNoIHJldHVybnMgdGVtcG9yYXJ5IHZhbAorSGFzaE1h
cDxXZWJDb3JlOjpTdHJpbmcsIENvb2tpZU1hcCo+IENvb2tpZU1hbmFnZXI6OmdldE1hcExpc3RG
b3JIb3N0KGNvbnN0IFN0cmluZyYgaG9zdCwgYm9vbCBvbmx5T25lTWFwKSBjb25zdAoreworICAg
IEhhc2hNYXA8V2ViQ29yZTo6U3RyaW5nLCBDb29raWVNYXAqPiB0bXA7CisgICAgZm9yIChIYXNo
TWFwPFdlYkNvcmU6OlN0cmluZywgQ29va2llTWFwKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9t
YW5hZ2VyTWFwLmJlZ2luKCk7IGl0ICE9IG1fbWFuYWdlck1hcC5lbmQoKTsgKytpdCkgeworICAg
ICAgICBpZiAob25seU9uZU1hcCAmJiBob3N0ID09IGl0LT5maXJzdCkgeworICAgICAgICAgICAg
dG1wLmFkZChpdC0+Zmlyc3QsaXQtPnNlY29uZCk7CisgICAgICAgICAgICByZXR1cm4gdG1wOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvKiBUbyBoYW5kbGUgdGhlIHN1YiBkb21haW5z
LCB3ZSBvbmx5IGNoZWNrIHRoZSBlbmQgb2YgdGhlIGhvc3QgdG8gcmV0dXJuIHRoZSBtYXAgKi8K
KyAgICAgICAgaWYgKCFvbmx5T25lTWFwICYmIGhvc3QuZW5kc1dpdGgoaXQtPmZpcnN0LGZhbHNl
KSB8fCAoaXQtPmZpcnN0LnN0YXJ0c1dpdGgoIi4iLGZhbHNlKSAmJiAoIi4iK2hvc3QpLmVuZHNX
aXRoKGl0LT5maXJzdCxmYWxzZSkpICkKKyAgICAgICAgICAgIHRtcC5hZGQoaXQtPmZpcnN0LGl0
LT5zZWNvbmQpOworICAgIH0KKyAgICAKKyAgICBpZiAodG1wLmlzRW1wdHkoKSkKKyAgICAgICAg
TE9HKE5ldHdvcmssICJHZXQgTUFQIGZvciBob3N0IDogJXMgXG4gTk8gTUFQIEZPVU5EIFxuIiwg
aG9zdC5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisgICAgcmV0dXJuIHRtcDsgLy8gZG8g
bm90IGNyZWF0ZSBtYXAgZm9yIGVhY2ggc2l0ZSB2aXNpdGVkCit9CisKK3ZvaWQgQ29va2llTWFu
YWdlcjo6c2F2ZUNvb2tpZXNUb0ZpbGUoKSAKK3sKKyAgICBpbnQgY29va2llRmlsZSA9IDo6b3Bl
bihtX2Nvb2tpZUphckZpbGVOYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkMsIDA2NjYpOwor
ICAgIAorICAgIGlmIChjb29raWVGaWxlID09IC0xKQorICAgICAgICBMT0coTmV0d29yaywgIkNv
b2tpZSBmaWxlIGNhbid0IGJlIGNyZWF0ZWRcbiIpOworICAgIAorICAgIFN0cmluZyB0bXAsIHRt
cENvb2tpZUxpc3Q7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46Oml0ZXJh
dG9yIGl0ID0gbV9tYW5hZ2VyTWFwLmJlZ2luKCk7IGl0ICE9IG1fbWFuYWdlck1hcC5lbmQoKTsg
KytpdCkgeworICAgICAgICBMT0coTmV0d29yaywgIlNhdmluZyBDb29raWVNYXAgOiAlcyBcbiIs
IGl0LT5maXJzdC5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisgICAgICAgIHRtcENvb2tp
ZUxpc3QgPSBpdC0+c2Vjb25kLT5jcmVhdGVCYWNrdXBTdHJpbmdGcm9tQ29va2llcygpOworICAg
ICAgICBpZiAoIXRtcENvb2tpZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0bXAgPSBp
dC0+Zmlyc3QuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCk7CisgICAgICAgICAgICB0bXAuYXBw
ZW5kKCdcbicpOworICAgICAgICAgICAgCisgICAgICAgICAgICB0bXAuYXBwZW5kKHRtcENvb2tp
ZUxpc3QpOworICAgICAgICAgICAgdG1wLmFwcGVuZCgiKlxuIik7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIDo6d3JpdGUoY29va2llRmlsZSwgdG1wLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2Np
aSgpLCB0bXAuZGVwcmVjYXRlZFN0cmluZygpLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICA6OmNsb3NlKGNvb2tpZUZpbGUpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6
OmdldENvb2tpZXNGcm9tRmlsZSgpCit7CisgICAgaW50IGNvb2tpZUZpbGUgPSA6Om9wZW4obV9j
b29raWVKYXJGaWxlTmFtZSwgT19SRE9OTFkpOworICAgIAorICAgIGlmIChjb29raWVGaWxlID09
IC0xKSB7CisgICAgICAgIExPRyhOZXR3b3JrLCAiQ29va2llIGZpbGUgY2FuJ3QgYmUgb3BlbmVk
XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBHZXQgdGhlIGZpbGUg
c2l6ZQorICAgIGludCBzaXplID0gbHNlZWsoY29va2llRmlsZSwwLFNFRUtfRU5EKTsKKyAgICBs
c2Vlayhjb29raWVGaWxlLCAwLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoc2l6ZSA+IDApIHsKKyAg
ICAgICAgY2hhciogYnVmZmVyID0gbmV3IGNoYXJbc2l6ZSArIDFdOworICAgIAorICAgICAgICBp
ZiAoIWJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICA6OnJlYWQoY29va2ll
RmlsZSwgYnVmZmVyLCBzaXplKTsKKworICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOworICAg
ICAgICAKKyAgICAgICAgU3RyaW5nIGNvb2tpZUNvbGxlY3Rpb24oYnVmZmVyLCBzaXplKSwgbWFw
LCBjb29raWU7CisgICAgICAgIGludCBzdGFydE9mTGluZSA9IDAsIGVuZE9mTGluZSA9IDAsIGFk
ZGVkQ29va2llcyA9IDA7CisgICAgICAgIGJvb2wgcmVhZENvb2tpZTsKKyAgICAgICAgQ29va2ll
TWFwKiBuZXdNYXA7CisgICAgICAgIENvb2tpZSogbmV3Q29va2llOworICAgICAgICAKKyAgICAg
ICAgLy8gUmVhZCB0aGUgZW50aXJlIGZpbGUgY29udGVudAorICAgICAgICB3aGlsZSAoZW5kT2ZM
aW5lIDwgKGludCljb29raWVDb2xsZWN0aW9uLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAvL3N0
YXJ0IGEgbmV3IENvb2tpZU1hcCBhZnRlciBlYWNoICcqJyBjaGFyYWN0ZXIKKyAgICAgICAgICAg
IG5ld01hcCA9IG5ldyBDb29raWVNYXAoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8g
R2V0dGluZyB0aGUgbmFtZSBvZiB0aGUgbWFwICh3aGljaCBpcyB0aGUgZG9tYWluKQorICAgICAg
ICAgICAgZW5kT2ZMaW5lID0gY29va2llQ29sbGVjdGlvbi5maW5kKCJcbiIsc3RhcnRPZkxpbmUp
OworICAgICAgICAgICAgbWFwID0gY29va2llQ29sbGVjdGlvbi5zdWJzdHJpbmcoc3RhcnRPZkxp
bmUsIGVuZE9mTGluZSAtIHN0YXJ0T2ZMaW5lKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
Ly8gQWRkaW5nIHRoZSBtYXAgdG8gdGhlIGNvb2tpZU1hbmFnZXIKKyAgICAgICAgICAgIG1fbWFu
YWdlck1hcC5zZXQobWFwLCBuZXdNYXApOworICAgICAgICAgICAgCisgICAgICAgICAgICByZWFk
Q29va2llID0gdHJ1ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gUmVhZGluZyBhbGwg
dGhlIGNvb2tpZXMgZnJvbSB0aGlzIG1hcAorICAgICAgICAgICAgd2hpbGUgKHJlYWRDb29raWUp
IHsKKyAgICAgICAgICAgICAgICBzdGFydE9mTGluZSA9IGVuZE9mTGluZSArIDE7CisgICAgICAg
ICAgICAgICAgZW5kT2ZMaW5lID0gY29va2llQ29sbGVjdGlvbi5maW5kKCJcbiIsc3RhcnRPZkxp
bmUpOworICAgICAgICAgICAgICAgIGNvb2tpZSA9IGNvb2tpZUNvbGxlY3Rpb24uc3Vic3RyaW5n
KHN0YXJ0T2ZMaW5lLCBlbmRPZkxpbmUgLSBzdGFydE9mTGluZSk7CisgICAgICAgICAgICAgICAg
aWYgKGNvb2tpZSA9PSAiKiIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZENvb2tpZSA9IGZh
bHNlOworICAgICAgICAgICAgICAgICAgICBzdGFydE9mTGluZSA9IGVuZE9mTGluZSArIDE7Cisg
ICAgICAgICAgICAgICAgICAgIGVuZE9mTGluZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29va2llID0gbmV3IENv
b2tpZTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29va2llLT5pbml0Q29va2llRnJvbUJhY2t1
cFN0cmluZyhjb29raWUsIG1hcCk7CisgICAgICAgICAgICAgICAgICAgIGFkZGVkQ29va2llcyA9
IG5ld01hcC0+YWRkKCpuZXdDb29raWUpOworICAgICAgICAgICAgICAgICAgICBtX2NvdW50ICs9
IGFkZGVkQ29va2llczsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5ld0Nvb2tpZTsKKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLy8gRW5kIHJlYWRpbmcgY29va2llcyBm
cm9tIHRoaXMgbWFwCisKKyAgICAgICAgfSAvLyBFbmQgcmVhZGluZyBtYXAgZnJvbSB0aGUgZmls
ZSBjb250ZW50CisKKyAgICBkZWxldGUgYnVmZmVyOworCisgICAgfSAvLyBFbmQgYW5hbHlzaW5n
IHRoZSBmaWxlCisgICAgICAgCisgICAgOjpjbG9zZShjb29raWVGaWxlKTsKKyAgICAKK30KKwor
dm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVKYXIoY29uc3QgY2hhciogZmlsZU5hbWUpCit7
CisgICAgbV9jb29raWVKYXJGaWxlTmFtZSA9IGZpbGVOYW1lOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmgJKHJldmlz
aW9uIDApCisrKyBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBQbGV5by4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBQbGV5byBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICog
ICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFBMRVlPIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgUExFWU8gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIktVUkwu
aCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKwor
I2luY2x1ZGUgPGN1cmwvY3VybC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENv
b2tpZU1hbmFnZXIgeworcHVibGljOgorICAgIHN0YXRpYyBDb29raWVNYW5hZ2VyKiBnZXRDb29r
aWVNYW5hZ2VyKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgc2V0Q29va2llcyhjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IEtVUkwmIHBvbGljeVVSTCwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgU3Ry
aW5nIGNvb2tpZXMoY29uc3QgS1VSTCYgdXJsKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNv
b2tpZSBmb3IgYSBob3N0IGluIG1hcC4KKyAgICAgKiBAcGFyYW0oaW4pIHRoZSBvd25lciBob3N0
CisgICAgICogQHBhcmFtKGluKSB0aGUgY29va2llIHRvIGFkZAorICAgICAqLworICAgIGludCBh
ZGQoY29uc3QgV2ViQ29yZTo6U3RyaW5nJiBob3N0LCBjb25zdCBDb29raWUmIGNvb2tpZSk7CisK
KyAgICBib29sIHJlc3BlY3RzU2VjdXJpdHlTdGFuZGFyZHMoY29uc3QgS1VSTCYgdXJsLCBDb29r
aWUmIGNvb2tpZSk7CisgICAgCisgICAgYm9vbCB0aGlzTWFwRXhpc3RzKFN0cmluZyBtYXBOYW1l
KTsKKyAgICAgICAgCisgICAgLyoqCisgICAgICogQXNrIGZvciB0aGUgY29va2llIG1hcCByZWxh
dGVkIHRvIGhvc3QuCisgICAgICogQHBhcmFtKGluKSB0aGUgaG9zdCBjb25jZXJuZWQKKyAgICAg
KiBAcmV0dXJuIGEgbGlzdCBvZiBjb29raWUgbWFwcyBjb250YWluaW5nIGNvb2tpZXMgZm9yIGhv
c3QKKyAgICAgKiBAcmV0dXJuIDAgaWYgdGhlcmUncyBubyBjb29raWUgZm9yIGhvc3QKKyAgICAg
Ki8KKyAgICBIYXNoTWFwPFdlYkNvcmU6OlN0cmluZywgQ29va2llTWFwKj4gZ2V0TWFwTGlzdEZv
ckhvc3QoY29uc3QgV2ViQ29yZTo6U3RyaW5nJiBob3N0LCBib29sIG9ubHlPbmVNYXAgPSBmYWxz
ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGFsbCB0aGUgY29va2llcyBpbiBhIGZp
bGUgZm9yIGJhY2t1cAorICAgICAqIFdlIHVzZSBhIHRleHQgZmlsZSBmb3IgdGhpcy4KKyAgICAg
Ki8KKyAgICB2b2lkIHNhdmVDb29raWVzVG9GaWxlKCk7CisgICAgCisgICAgLyoqCisgICAgICog
TG9hZCBhbGwgdGhlIGNvb2tpZXMgZnJvbSBhIGZpbGUKKyAgICAgKiBFeHBpcmVkIGNvb2tpZXMg
YW5kIHByZXZpb3VzIHNlc3Npb24gY29va2llcyBhcmUgbGVmdCBiZWhpbmQKKyAgICAgKi8KKyAg
ICB2b2lkIGdldENvb2tpZXNGcm9tRmlsZSgpOworCisgICAgdW5zaWduZWQgc2hvcnQgY29va2ll
c0NvdW50KCk7CisKKyAgICB2b2lkIHNldEhhbmRsZShDVVJMKiBoYW5kbGUpIHsgbV9oYW5kbGUg
PSBoYW5kbGU7IH0KKyAgICB2b2lkIHNldFVSTChjb25zdCBjaGFyKiB1cmwpIHttX3VybCA9IHVy
bDsgfQorCisgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3QgY2hhciopOworCisgICAgfkNvb2tp
ZU1hbmFnZXIoKTsKKworcHJpdmF0ZToKKyAgICBDb29raWVNYW5hZ2VyKCk7CisKKyAgICAvLyBj
YW4ndCBwdXQgcmVmZXJlbmNlIENvb2tpZU1hcCYgaW4gbWFwCisgICAgSGFzaE1hcDxXZWJDb3Jl
OjpTdHJpbmcsIENvb2tpZU1hcCo+IG1fbWFuYWdlck1hcDsKKworICAgIC8vIGNvdW50IGFsbCBj
b29raWVzLiBDb29raWVzIG51bWJlciBpcyBsaW1pdGVkIHRvIDMwMAorICAgIHVuc2lnbmVkIHNo
b3J0IG1fY291bnQ7CisKKyAgICBDVVJMKiBtX2hhbmRsZTsKKyAgICBjb25zdCBjaGFyKiBtX3Vy
bDsKKyAgICBjb25zdCBjaGFyKiBtX2Nvb2tpZUphckZpbGVOYW1lOworfTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxl
Q3VybC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFu
ZGxlQ3VybC5jcHAJKHJldmlzaW9uIDI4MDczKQorKysgcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jl
c291cmNlSGFuZGxlQ3VybC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4LDcgQEAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZS5oIgogCisjaW5jbHVk
ZSAiQ29va2llTWFuYWdlci5oIgogI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgpAQCAt
OTQsNCArOTUsNDEgQEAgdm9pZCBSZXNvdXJjZUhhbmRsZTo6bG9hZFJlc291cmNlU3luY2hybwog
ICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKK3ZvaWQgUmVzb3VyY2VIYW5kbGU6OnNldENvb2tp
ZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBwb2xpY3lVUkwsIGNvbnN0IFN0cmluZyYg
dmFsdWUpCit7CisgICAgQ29va2llTWFuYWdlciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6Omdl
dENvb2tpZU1hbmFnZXIoKTsKKyAgICAgICAgCisgICAgaWYgKG1hbmFnZXIgJiYgbWFuYWdlci0+
c2V0Q29va2llcyh1cmwsIHBvbGljeVVSTCwgdmFsdWUpKSB7CisgICAgICAgIC8vIGlmIGEgY29v
a2llIHdhcyBhZGRlZCwgdXBkYXRlIHRoZSBDVVJMIGNvb2tpZXMKKyAgICAgICAgY2hlY2tBbmRT
ZW5kQ29va2llcyh1cmwpOworICAgICAgICAKKyAgICAgICAgLy8gRklYTUUgOiBpdCBzaG91bGQg
YmUgZG9uZSB3aGVuIGZyZWVpbmcgdGhlIENvb2tpZU1hbmFnZXIKKyAgICAgICAgbWFuYWdlci0+
c2F2ZUNvb2tpZXNUb0ZpbGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VIYW5kbGU6OmNo
ZWNrQW5kU2VuZENvb2tpZXMoS1VSTCB1cmwpCit7CisgICAgLy9jb29raWVzIGFyZSBhIHBhcnQg
b2YgdGhlIGh0dHAgcHJvdG9jb2wgb25seQorICAgIGlmICghU3RyaW5nKGQtPm1fdXJsKS5zdGFy
dHNXaXRoKCJodHRwIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh1cmwgPT0gIiIpCisg
ICAgICAgIHVybCA9IGQtPm1fdXJsOworCisgICAgLy9wcmVwYXJlIGEgY29va2llIGhlYWRlciBp
ZiB0aGVyZSBhcmUgY29va2llcyByZWxhdGVkIHRvIHRoaXMgdXJsLgorICAgIFN0cmluZyBjb29r
aWVQYWlyczsKKyAgICBjb29raWVQYWlycyA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFn
ZXIoKS0+Y29va2llcyh1cmwpOworCisgICAgLyogV2UgY2hvb3NlIGEgbWF4IHNpemUgb2YgODE5
MjAgY2FyYWN0ZXJzIGJlY2F1c2UgYSBjb29raWUgbWF4IHNpemUgaXMgNDA5NiBhbmQgYSBkb21h
aW4gY2FuIGhhdmUgYXQgbWF4IDIwIGNvb2tpZXMgc28gMjAqNDA5Nj04MTkyMCAqLworICAgIC8v
RklYTUU6IGlmIGFuIHVybCBkZXBlbmRzIG9uIG1vcmUgdGhhbiBvbmUgbWFwLCBjb29raWUgc3Ry
aW5nIG1heSBiZSB0cnVuY2F0ZWQKKyAgICBzdGF0aWMgY2hhciBjb29raWVDaGFyWzgxOTIwXTsK
KyAgICBzdHJuY3B5KGNvb2tpZUNoYXIsY29va2llUGFpcnMuZGVwcmVjYXRlZFN0cmluZygpLmFz
Y2lpKCksODE5MjApOworCisgICAgaWYgKCFjb29raWVQYWlycy5pc0VtcHR5KCkgJiYgZC0+bV9o
YW5kbGUpIHsKKyAgICAgICAgcHJpbnRmKCJDVVJMIFBPU1QgQ29va2llIDogJXMgXG4iLCBjb29r
aWVDaGFyKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChkLT5tX2hhbmRsZSwgQ1VSTE9QVF9D
T09LSUUsIGNvb2tpZUNoYXIpOworICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5j
cHAJKHJldmlzaW9uIDI4MDczKQorKysgcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFu
ZGxlTWFuYWdlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRl
ICJSZXNvdXJjZUhhbmRsZUludGVybmFsLmgiCiAjaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKICNp
bmNsdWRlICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCiAKICNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CiAKQEAgLTQ3LDcgKzQ4LDYgQEAgY29uc3QgZG91YmxlIHBvbGxUaW1l
U2Vjb25kcyA9IDAuMDU7CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6UmVzb3VyY2VIYW5kbGVN
YW5hZ2VyKCkKICAgICA6IG1fZG93bmxvYWRUaW1lcih0aGlzLCAmUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyOjpkb3dubG9hZFRpbWVyQ2FsbGJhY2spCi0gICAgLCBtX2Nvb2tpZUphckZpbGVOYW1lKDAp
CiAgICAgLCBtX3Jlc291cmNlSGFuZGxlTGlzdEhlYWQoMCkKIHsKICAgICBjdXJsX2dsb2JhbF9p
bml0KENVUkxfR0xPQkFMX0FMTCk7CkBAIC02MSwxMyArNjEsMTQgQEAgUmVzb3VyY2VIYW5kbGVN
YW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYQogewogICAgIGN1cmxfbXVsdGlfY2xlYW51cChtX2N1
cmxNdWx0aUhhbmRsZSk7CiAgICAgY3VybF9zaGFyZV9jbGVhbnVwKG1fY3VybFNoYXJlSGFuZGxl
KTsKLSAgICBpZiAobV9jb29raWVKYXJGaWxlTmFtZSkKLSAgICAgICAgZnJlZShtX2Nvb2tpZUph
ckZpbGVOYW1lKTsKKworICAgIC8vIEZyZWUgdGhlIENvb2tpZU1hbmFnZXIgdG8gd3JpdGUgY29v
a2llcyB0byBmaWxlCisgICAgZGVsZXRlIENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIo
KTsKIH0KIAogdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNldENvb2tpZUphckZpbGVOYW1l
KGNvbnN0IGNoYXIqIGNvb2tpZUphckZpbGVOYW1lKQogeyAKLSAgICBtX2Nvb2tpZUphckZpbGVO
YW1lID0gc3RyZHVwKGNvb2tpZUphckZpbGVOYW1lKTsKKyAgICBDb29raWVNYW5hZ2VyOjpnZXRD
b29raWVNYW5hZ2VyKCktPnNldENvb2tpZUphcihzdHJkdXAoY29va2llSmFyRmlsZU5hbWUpKTsK
IH0KIAogUmVzb3VyY2VIYW5kbGVNYW5hZ2VyKiBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNoYXJl
ZEluc3RhbmNlKCkKQEAgLTE2Myw4ICsxNjQsMjggQEAgc3RhdGljIHNpemVfdCBoZWFkZXJDYWxs
YmFjayhjaGFyKiBwdHIsIAogICAgICAgICAgICAgY2xpZW50LT5kaWRSZWNlaXZlUmVzcG9uc2Uo
am9iLCBkLT5tX3Jlc3BvbnNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgc3BsaXRQb3Mg
PSBoZWFkZXIuZmluZCgiOiIpOwotICAgICAgICBpZiAoc3BsaXRQb3MgIT0gLTEpCisgICAgICAg
IGlmIChzcGxpdFBvcyAhPSAtMSkgewogICAgICAgICAgICAgZC0+bV9yZXNwb25zZS5zZXRIVFRQ
SGVhZGVyRmllbGQoaGVhZGVyLmxlZnQoc3BsaXRQb3MpLCBoZWFkZXIuc3Vic3RyaW5nKHNwbGl0
UG9zKzEpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKworICAgICAgICAgICAgLy8gSGFuZGxlIGNvb2tp
ZQorICAgICAgICAgICAgaWYgKGhlYWRlci5jb250YWlucygiU2V0LUNvb2tpZTogIiwgZmFsc2Up
KSB7CisgICAgICAgICAgICAgICAgaW50IHJldCA9IGhlYWRlci5maW5kKCdccicpOworICAgICAg
ICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyLnRydW5j
YXRlKHJldCk7CisKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIHNldCB0aGUgdXJsIGlmIG5v
dCBhbHJlYWR5IGRvbmUKKyAgICAgICAgICAgICAgICBpZiAoZC0+bV9yZXNwb25zZS51cmwoKS5p
c0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaGRyOworICAgICAg
ICAgICAgICAgICAgICBjdXJsX2Vhc3lfZ2V0aW5mbyhkLT5tX2hhbmRsZSwgQ1VSTElORk9fRUZG
RUNUSVZFX1VSTCwgJmhkcik7CisgICAgICAgICAgICAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0
VXJsKEtVUkwoaGRyKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgam9i
LT5zZXRDb29raWVzKGQtPm1fcmVzcG9uc2UudXJsKCksIEtVUkwoKSwgZC0+bV9yZXNwb25zZS5o
dHRwSGVhZGVyRmllbGQoIlNldC1Db29raWUiKSk7CisKKyAgICAgICAgICAgICAgICBwcmludGYo
IkNvb2tpZSB2YWt1ZSA6ICVzICEhXG4iLCBkLT5tX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgi
U2V0LUNvb2tpZSIpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICAgICAgICAgICAg
ICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAg
IHJldHVybiB0b3RhbFNpemU7CkBAIC00NDEsMTEgKzQ2Miw2IEBAIHZvaWQgUmVzb3VyY2VIYW5k
bGVNYW5hZ2VyOjpzdGFydEpvYihSZXMKICAgICBkLT5tX3VybCA9IHN0cmR1cCh1cmwuYXNjaWko
KSk7CiAgICAgY3VybF9lYXN5X3NldG9wdChkLT5tX2hhbmRsZSwgQ1VSTE9QVF9VUkwsIGQtPm1f
dXJsKTsKIAotICAgIGlmIChtX2Nvb2tpZUphckZpbGVOYW1lKSB7Ci0gICAgICAgIGN1cmxfZWFz
eV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfQ09PS0lFRklMRSwgbV9jb29raWVKYXJGaWxl
TmFtZSk7Ci0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfQ09P
S0lFSkFSLCBtX2Nvb2tpZUphckZpbGVOYW1lKTsKLSAgICB9Ci0KICAgICBpZiAoam9iLT5yZXF1
ZXN0KCkuaHR0cEhlYWRlckZpZWxkcygpLnNpemUoKSA+IDApIHsKICAgICAgICAgc3RydWN0IGN1
cmxfc2xpc3QqIGhlYWRlcnMgPSAwOwogICAgICAgICBIVFRQSGVhZGVyTWFwIGN1c3RvbUhlYWRl
cnMgPSBqb2ItPnJlcXVlc3QoKS5odHRwSGVhZGVyRmllbGRzKCk7CkBAIC00NzIsNiArNDg4LDkg
QEAgdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnN0YXJ0Sm9iKFJlcwogICAgIGVsc2UgaWYg
KCJIRUFEIiA9PSBqb2ItPnJlcXVlc3QoKS5odHRwTWV0aG9kKCkpCiAgICAgICAgIGN1cmxfZWFz
eV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfTk9CT0RZLCBUUlVFKTsKIAorICAgIC8vIEFk
ZCBjb29raWVzCisgICAgam9iLT5jaGVja0FuZFNlbmRDb29raWVzKCk7CisKICAgICBDVVJMTWNv
ZGUgcmV0ID0gY3VybF9tdWx0aV9hZGRfaGFuZGxlKG1fY3VybE11bHRpSGFuZGxlLCBkLT5tX2hh
bmRsZSk7CiAgICAgLy8gZG9uJ3QgY2FsbCBwZXJmb3JtLCBiZWNhdXNlIGV2ZW50cyBtdXN0IGJl
IGFzeW5jCiAgICAgLy8gdGltZW91dCB3aWxsIG9jY3VyIGFuZCBkbyBjdXJsX211bHRpX3BlcmZv
cm0KSW5kZXg6IHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
LmgJKHJldmlzaW9uIDI4MDczKQorKysgcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFu
ZGxlTWFuYWdlci5oCSh3b3JraW5nIGNvcHkpCkBAIC03NSw3ICs3NSw2IEBAIHByaXZhdGU6CiAg
ICAgVGltZXI8UmVzb3VyY2VIYW5kbGVNYW5hZ2VyPiBtX2Rvd25sb2FkVGltZXI7CiAgICAgQ1VS
TE0qIG1fY3VybE11bHRpSGFuZGxlOwogICAgIENVUkxTSCogbV9jdXJsU2hhcmVIYW5kbGU7Ci0g
ICAgY2hhciogbV9jb29raWVKYXJGaWxlTmFtZTsKICAgICBjaGFyIG1fY3VybEVycm9yQnVmZmVy
W0NVUkxfRVJST1JfU0laRV07CiAgICAgUmVzb3VyY2VIYW5kbGVMaXN0KiBtX3Jlc291cmNlSGFu
ZGxlTGlzdEhlYWQ7CiB9Owo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>17660</attachid>
            <date>2007-12-02 19:02:40 -0800</date>
            <delta_ts>2008-02-29 16:43:13 -0800</delta_ts>
            <desc>Updated patch (corrected most coding style issues)</desc>
            <filename>bug14730-updated.patch</filename>
            <type>text/plain</type>
            <size>43734</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyODMyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjYgQEAKKzIwMDctMTItMDIgIEp1bGllbiAgPGp1bGllbi5jaGFmZnJhaXhAZ21h
aWwuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAg
IEJ1ZyAxNDczMDogW2N1cmxdIENvb2tpZSBoYW5kbGluZworCisgICAgICAgIEltcG9ydCBPV0Ig
Y29va2llIGhhbmRsaW5nIGxheW91dCBmb3IgQ1VSTAorCisgICAgICAgICogV2ViQ29yZS5wcm86
CisgICAgICAgICogcGxhdGZvcm0vZ3RrL0Nvb2tpZUphckd0ay5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpzZXRDb29raWVzKToKKyAgICAgICAgKFdlYkNvcmU6OmNvb2tpZXMpOgorICAgICAgICAo
V2ViQ29yZTo6Y29va2llc0VuYWJsZWQpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvUmVz
b3VyY2VIYW5kbGUuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OmluaXRGcm9tU3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6Y3JlYXRlQmFja3VwU3RyaW5nRnJvbUNvb2tpZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb29raWU6OmluaXRDb29raWVGcm9tQmFja3VwU3RyaW5nKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6ZXh0cmFjdFZhbHVlSW4pOgorICAgICAgICAoV2ViQ29y
ZTo6Q29va2llTWFwOjphZGQpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjpjcmVhdGVC
YWNrdXBTdHJpbmdGcm9tQ29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6Omdl
dE5hbWVWYWx1ZVBhaXJzKToKKyAgICAgICAgKFdlYkNvcmU6OmdldERheXNUaWxsRmlyc3RPZk1v
bnRoKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6dGltZUZyb21TdHJpbmcpOgorICAgICAg
ICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWUuaDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlOjpDb29raWU6OkNvb2tpZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6On5Db29raWUp
OgorICAgICAgICAoV2ViQ29yZTo6Q29va2llOjpuYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkNv
b2tpZTo6dmFsdWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llOjpwYXRoKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZTo6ZG9tYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6ZXhw
aXJlRGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OmlzRG9tYWluKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZTo6aXNTZWN1cmUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFw
OjpDb29raWVNYXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjp+Q29va2llTWFwKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Z2V0TWFwKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6Q29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpD
b29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1h
bmFnZXI6On5Db29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6
OnNldENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6cmVzcGVjdHNT
ZWN1cml0eVN0YW5kYXJkcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpjb29r
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnRoaXNNYXBFeGlzdHMpOgor
ICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6YWRkKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvb2tpZU1hbmFnZXI6OmNvb2tpZXNDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVN
YW5hZ2VyOjpnZXRNYXBMaXN0Rm9ySG9zdCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5h
Z2VyOjpzYXZlQ29va2llc1RvRmlsZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2Vy
OjpnZXRDb29raWVzRnJvbUZpbGUpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6
c2V0Q29va2llSmFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFu
YWdlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VI
YW5kbGVDdXJsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOjpzZXRDb29r
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOjpjaGVja0FuZFNlbmRDb29r
aWVzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlTWFuYWdlcjo6UmVzb3Vy
Y2VIYW5kbGVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlTWFuYWdl
cjo6flJlc291cmNlSGFuZGxlTWFuYWdlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhh
bmRsZU1hbmFnZXI6OnNldENvb2tpZUphckZpbGVOYW1lKToKKyAgICAgICAgKFdlYkNvcmU6Omhl
YWRlckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlTWFuYWdlcjo6
c3RhcnRKb2IpOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRs
ZU1hbmFnZXIuaDoKKwogMjAwNy0xMi0wMiAgTmlrb2xhcyBaaW1tZXJtYW5uICA8emltbWVybWFu
bkBrZGUub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0uCkluZGV4OiBXZWJDb3JlL1dl
YkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHJldmlzaW9uIDI4
MzI1KQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtMTAwNCw2ICsx
MDA0LDggQEAgZ3RrLXBvcnQgewogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9ndGsvSW1hZ2VH
dGsuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ludFBvaW50R3RrLmNwcCBc
CiAgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNzL2d0ay9JbnRSZWN0R3RrLmNwcCBcCisgICAgICAg
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWUuY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vbmV0
d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vbmV0d29yay9j
dXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAgXAogICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcCBcCiAgICAgICAgIHBsYXRmb3JtL2dyYXBoaWNz
L2NhaXJvL0FmZmluZVRyYW5zZm9ybUNhaXJvLmNwcCBcCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2d0ay9Db29raWVKYXJHdGsuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3Rr
L0Nvb2tpZUphckd0ay5jcHAJKHJldmlzaW9uIDI4MzI1KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvQ29va2llSmFyR3RrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsMjkgKzI4LDMzIEBACiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQ29va2llSmFyLmgiCiAKLSNpbmNsdWRlICJE
ZXByZWNhdGVkU3RyaW5nLmgiCi0jaW5jbHVkZSAiS1VSTC5oIgotI2luY2x1ZGUgIlBsYXRmb3Jt
U3RyaW5nLmgiCi0jaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgotI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+CisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
LXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBjb29raWVKYXI7Ci0KLXZvaWQgc2V0Q29v
a2llcyhjb25zdCBLVVJMJiB1cmwsIGNvbnN0IEtVUkwmIC8qcG9saWN5VVJMKi8sIGNvbnN0IFN0
cmluZyYgdmFsdWUpCit2b2lkIHNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJM
JiBwb2xpY3lVUkwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7Ci0gICAgY29va2llSmFyLnNldCh1
cmwudXJsKCksIHZhbHVlKTsKKyAgICBDb29raWVNYW5hZ2VyKiBtYW5hZ2VyID0gQ29va2llTWFu
YWdlcjo6Z2V0Q29va2llTWFuYWdlcigpOworICAgIGlmIChtYW5hZ2VyKQorICAgICAgICBtYW5h
Z2VyLT5zZXRDb29raWVzKHVybCwgcG9saWN5VVJMLCB2YWx1ZSk7CiB9CiAKIFN0cmluZyBjb29r
aWVzKGNvbnN0IEtVUkwmIHVybCkKIHsKLSAgICByZXR1cm4gY29va2llSmFyLmdldCh1cmwudXJs
KCkpOworICAgIENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29r
aWVNYW5hZ2VyKCk7CisgICAgaWYgKG1hbmFnZXIpCisgICAgICAgIHJldHVybiBtYW5hZ2VyLT5j
b29raWVzKHVybC51cmwoKSk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CiB9
CiAKIGJvb2wgY29va2llc0VuYWJsZWQoKQogewotICAgIHJldHVybiB0cnVlOworICAgIENvb2tp
ZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2VyKCk7Cisg
ICAgaWYgKG1hbmFnZXIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UKKyAgICAgICAg
cmV0dXJuIGZhbHNlOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVz
b3VyY2VIYW5kbGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVz
b3VyY2VIYW5kbGUuaAkocmV2aXNpb24gMjgzMjUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvUmVzb3VyY2VIYW5kbGUuaAkod29ya2luZyBjb3B5KQpAQCAtMTM3LDYgKzEzNywxMSBAQCBw
dWJsaWM6CiAgICAgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogZ2V0SW50ZXJuYWwoKSB7IHJldHVy
biBkLmdldCgpOyB9CiAjZW5kaWYKIAorI2lmIFVTRShDVVJMKQorICAgIHZvaWQgY2hlY2tBbmRT
ZW5kQ29va2llcyhLVVJMIHVybCA9ICIiKTsKKyAgICB2b2lkIHNldENvb2tpZXMoKTsKKyNlbmRp
ZgorCiAgICAgLy8gVXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHlvdSBkb24ndCBn
ZXQgYW55IG1vcmUgTlNVUkxDb25uZWN0aW9uIGNhbGxiYWNrcyB1bnRpbCB5b3UgcmV0dXJuIGZy
b20gdGhlIG9uZSB5b3UncmUgaW4uCiAgICAgc3RhdGljIGJvb2wgbG9hZHNCbG9ja2VkKCk7ICAg
IAogICAgIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWUuY3BwCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
UGxleW8uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgUGxleW8gbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250
cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2
ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBQTEVZ
TyBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFBM
RVlPIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisKKyNpbmNsdWRl
ICJDb29raWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlN5c3Rl
bVRpbWUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIENvb2tpZTo6aW5pdEZyb21T
dHJpbmcoY29uc3QgU3RyaW5nJiBjb29raWUpCit7CisgICAgaWYgKGNvb2tpZS5sZW5ndGgoKSA+
IDQwOTYpIHsKKyAgICAgICAgTE9HKE5ldHdvcmssICJjb29raWVzIGFyZSBsaW1pdGVkIHRvIDRL
QiBpbiBzaXplIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgZmlyc3Q7Cisg
ICAgaW50IHNlY29uZDsKKworICAgIC8vIGZpbmQgbmFtZQorICAgIGZpcnN0ID0gY29va2llLmZp
bmQoIj0iKTsKKyAgICBtX25hbWUgPSBjb29raWUubGVmdChmaXJzdCk7CisgICAgLy8gZmluZCB2
YWx1ZQorICAgIHNlY29uZCA9IGNvb2tpZS5maW5kKCI7Iik7CisgICAgbV92YWx1ZSA9IGNvb2tp
ZS5zdWJzdHJpbmcoZmlyc3QgKyAxLCBzZWNvbmQgLSBmaXJzdCAtIDEpOworICAgIC8vIG5hbWUg
aXMgdGhlIGZpcnN0IGFyZyBiZWZvcmUgPQorICAgIAorICAgIC8vIHRoZSBleHBpcmF0aW9uIGRh
dGUgaXMgcmVhZCBpbiBhIHRlbXBvcmFyeSBzdHJpbmcKKyAgICBTdHJpbmcgdG1wRXhwaXJlczsK
KyAgICB0bXBFeHBpcmVzID0gZXh0cmFjdFZhbHVlSW4oImV4cGlyZXM9IiwgY29va2llKTsKKyAg
ICAKKyAgICBpZiAoIXRtcEV4cGlyZXMgfHwgdG1wRXhwaXJlcy5sZW5ndGgoKSA8IDIwKSAvLyB0
aGVuIGl0IGlzIGEgc2Vzc2lvbiBjb29raWUKKyAgICAgICAgbV9leHBpcmVzID0gLTE7ICAKKyAg
ICBlbHNlCisgICAgICAgIC8vIHRoZW4gd2UgY29udmVydCBpdCBpbiBzZWNvbmRzIHNpbmNlIDEv
MS8xOTcwCisgICAgICAgIG1fZXhwaXJlcyA9IHRpbWVGcm9tU3RyaW5nKHRtcEV4cGlyZXMpOwor
ICAgIAorICAgIG1fcGF0aCA9IGV4dHJhY3RWYWx1ZUluKCJwYXRoPSIsIGNvb2tpZSk7CisgICAg
aWYgKCFtX3BhdGgpIAorICAgICAgICBtX3BhdGggPSAiLyI7CisgICAgCisgICAgbV9kb21haW4g
PSBleHRyYWN0VmFsdWVJbigiZG9tYWluPSIsIGNvb2tpZSk7CisgICAgaWYgKCFtX2RvbWFpbi5p
c0VtcHR5KCkgJiYgIW1fZG9tYWluLnN0YXJ0c1dpdGgoIi4iLCBmYWxzZSkpCisgICAgICAgIG1f
ZG9tYWluID0gIi4iICsgbV9kb21haW47CisgICAgCisgICAgaWYgKGNvb2tpZS5jb250YWlucygi
c2VjdXJlIiwgZmFsc2UpKQorICAgICAgICBtX3NlY3VyZSA9IHRydWU7CisKKyAgICBMT0coTmV0
d29yaywgIlRoZSBmb2xsb3dpbmcgY29va2llIHdhcyBpbml0aWFsaXplZCA6ICglcyk9KCVzKVxu
JXM9JWxmXG4lcz0lc1xuJXM9JXNcbiVzPSVkIFxuIiwgbV9uYW1lLmRlcHJlY2F0ZWRTdHJpbmco
KS5hc2NpaSgpLCBtX3ZhbHVlLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLAorICAgICAgICAi
ZXhwaXJlcyIsIG1fZXhwaXJlcyAsICJwYXRoIiwgbV9wYXRoLmRlcHJlY2F0ZWRTdHJpbmcoKS5h
c2NpaSgpLCAiZG9tYWluIiwgbV9kb21haW4uZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCksICJz
ZWN1cmUiLCBtX3NlY3VyZSk7Cit9ICAgCisKK1N0cmluZyBDb29raWU6OmNyZWF0ZUJhY2t1cFN0
cmluZ0Zyb21Db29raWUoKQoreworICAgIFN0cmluZyByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0
ID0gbV9uYW1lICsgIj0iICsgbV92YWx1ZSArICI7IjsKKyAgICByZXN1bHQgKz0gInBhdGg9IiAr
IG1fcGF0aCArICI7IiA7CisKKyAgICBTdHJpbmcgdG1wID0gU3RyaW5nOjpudW1iZXIobV9leHBp
cmVzKTsKKyAgICByZXN1bHQgKz0gImV4cGlyZXM9IiArIHRtcCArICI7c2VjdXJlPSI7CisgICAg
aWYgKG1fc2VjdXJlKQorICAgICAgICByZXN1bHQgKz0gInRydWU7IjsKKyAgICBlbHNlCisgICAg
ICAgIHJlc3VsdCArPSAiZmFsc2U7IjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQg
Q29va2llOjppbml0Q29va2llRnJvbUJhY2t1cFN0cmluZyhTdHJpbmcgY29va2llLCBTdHJpbmcg
ZG9tYWluKQoreworICAgIGludCBmaXJzdDsKKyAgICBpbnQgc2Vjb25kOworICAgIFN0cmluZyB0
bXA7CisKKyAgICAvLyBmaW5kIG5hbWUKKyAgICBmaXJzdCA9IGNvb2tpZS5maW5kKCI9Iik7Cisg
ICAgbV9uYW1lID0gY29va2llLmxlZnQoZmlyc3QpOworCisgICAgLy8gZmluZCB2YWx1ZQorICAg
IHNlY29uZCA9IGNvb2tpZS5maW5kKCI7Iik7CisgICAgbV92YWx1ZSA9IGNvb2tpZS5zdWJzdHJp
bmcoZmlyc3QgKyAxLCBzZWNvbmQgLSBmaXJzdCAtIDEpOworCisgICAgLy8gZmluZCBwYXRoCisg
ICAgbV9wYXRoID0gZXh0cmFjdFZhbHVlSW4oInBhdGg9IiwgY29va2llKTsKKyAgICAKKyAgICAv
LyBmaW5kIGV4cGlyYXRpb24gZGF0ZQorICAgIHRtcCA9IGV4dHJhY3RWYWx1ZUluKCJleHBpcmVz
PSIsIGNvb2tpZSk7CisgICAgbV9leHBpcmVzID0gdG1wLnRvRG91YmxlKCk7CisgICAgCisgICAg
Ly8gdGhlIGRvbWFpbiBpcyB0aGUgY29va2llTWFwIG5hbWUKKyAgICBtX2RvbWFpbiA9IGRvbWFp
bjsKKyAgICAKKyAgICAvLyBzZXQgc2VjdXJlIHN0YXRlCisgICAgdG1wID0gZXh0cmFjdFZhbHVl
SW4oInNlY3VyZT0iLCBjb29raWUpOworICAgIGlmICh0bXAuY29udGFpbnMoImZhbHNlIiwgdHJ1
ZSkpCisgICAgICAgIG1fc2VjdXJlID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgICBtX3NlY3Vy
ZSA9IHRydWU7CisgICAgCisgICAgTE9HKE5ldHdvcmssICJUaGUgZm9sbG93aW5nIGNvb2tpZSB3
YXMgcmVhZCBmcm9tIGZpbGUgOiAoJXMpPSglcylcbiVzPSVsZlxuJXM9JXNcbiVzPSVzXG4lcz0l
ZCBcbiIsIG1fbmFtZS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgbV92YWx1ZS5kZXByZWNh
dGVkU3RyaW5nKCkuYXNjaWkoKSwKKyAgICAgICAgImV4cGlyZXMiLCBtX2V4cGlyZXMsICJwYXRo
IiwgbV9wYXRoLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCAiZG9tYWluIiwgbV9kb21haW4u
ZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCksICJzZWN1cmUiLCBtX3NlY3VyZSk7Cit9CisKK1N0
cmluZyBDb29raWU6OmV4dHJhY3RWYWx1ZUluKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IFN0cmlu
ZyYgY29va2llKQoreworICAgIGludCBmaXJzdDsKKyAgICBpbnQgc2Vjb25kOworCisgICAgLy8g
ZmluZCBuYW1lCisgICAgZmlyc3QgPSBjb29raWUuZmluZChuYW1lLCAwLCBmYWxzZSk7CisgICAg
aWYgKGZpcnN0ID09IC0xKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7IC8vIG51bGwgc3RyaW5n
CisgICAgLy8gZmluZCB2YWx1ZQorICAgIHNlY29uZCA9IGNvb2tpZS5maW5kKCI7IiwgZmlyc3Qp
OworICAgIGlmIChzZWNvbmQgPT0gLTEgJiYgY29va2llLmZpbmQoIiAiLCBmaXJzdCkgIT0gLTEp
CisgICAgICAgIC8vIG5vICI7IiBhbmQgbm8gIiAiLCBzbyB3ZSdyZSBhbmQgdGhlIGVuZCBvZiBs
aW5lCisgICAgICAgIHNlY29uZCA9IGNvb2tpZS5sZW5ndGgoKTsKKworICAgIHJldHVybiBjb29r
aWUuc3Vic3RyaW5nKGZpcnN0ICsgc3RybGVuKG5hbWUpLCBzZWNvbmQgLSBmaXJzdCAtIHN0cmxl
bihuYW1lKSk7Cit9CisKKworLyoKKyAqIENvb2tpZU1hcCBpbXBsZW1lbnRhdGlvbgorICovCitp
bnQgQ29va2llTWFwOjphZGQoY29uc3QgQ29va2llJiBjb29raWUpCit7CisgICAgaW50IG51bWJl
ckFkZGVkID0gMDsKKyAgICAKKyAgICAvLyBDaGVjayBpZiB0aGUgY29va2llIGFscmVhZHkgZXhp
c3RzIHRvIHJlcGxhY2UgaXQgYnkgYSBuZXcgb25lCisgICAgaWYgKG1fY29va2llTWFwLmNvbnRh
aW5zKGNvb2tpZS5uYW1lKCkpKSB7CisgICAgICAgIExPRyhOZXR3b3JrLCAiQ29va2llIG5hbWVk
ICVzIGlzIHJlcGxhY2VkIGJ5IGEgbmV3IG9uZVxuIiwgY29va2llLm5hbWUoKS5kZXByZWNhdGVk
U3RyaW5nKCkuYXNjaWkoKSk7CisgICAgICAgIG1fY29va2llTWFwLnJlbW92ZShjb29raWUubmFt
ZSgpKTsKKyAgICAgICAgbnVtYmVyQWRkZWQtLTsKKyAgICB9ICAgICAgCisgICAgCisgICAgLy8g
Q2hlY2sgaWYgdGhlIGNvb2tpZSBoYXNuJ3QgZXhwaXJlZAorICAgIGlmIChjb29raWUuZXhwaXJl
RGF0ZSgpICE9IC0xICYmIGNvb2tpZS5leHBpcmVEYXRlKCkgPCBjdXJyZW50VGltZSgpKSB7Cisg
ICAgICAgIExPRyhOZXR3b3JrLCAiQ09PS0lFIFJlbW92ZWQgOiAlcyA6IGhpcyBleHBpcmVzIGRh
dGUgKCVsZikgaXMgbG93ZXIgdGhhbiBzeXN0ZW1lIGRhdGUgKCVsZikgXG4iLCBjb29raWUubmFt
ZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCBjb29raWUuZXhwaXJlRGF0ZSgpLCBjdXJy
ZW50VGltZSgpKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBudW1iZXJBZGRlZDsKKyAgICB9
CisKKyAgICAvLyBDaGVjayBpZiB0aGVyZSdzIHJvb20gZm9yIHRoZSBuZXcgY29va2llIGluIHRo
aXMgbWFwLCBpZiB0aGVyZSBpcyBub3Qgd2UgbWFrZSBzb21lIGZvciBpdAorICAgIGlmIChtX2Nv
dW50ID49IDIwKSB7CisgICAgICAgIExPRyhOZXR3b3JrLCAiQ29va2llcyBhcmUgbGltaXRlZCB0
byAyMCBwZXIgZG9tYWluLi4uYSBjb29raWUgZnJvbSB0aGlzIGRvbWFpbiB3aWxsIGJlIFJFTU9W
RUQgVE8gTUFLRSBST09NIGZvciAlcy4iLCBjb29raWUubmFtZSgpLmRlcHJlY2F0ZWRTdHJpbmco
KS5hc2NpaSgpKTsKKyAgICAgICAgZG91YmxlIG1pbiA9IGN1cnJlbnRUaW1lKCk7CisgICAgICAg
IEhhc2hNYXA8U3RyaW5nLCBDb29raWU+OjppdGVyYXRvciBpdEJhayA9IG1fY29va2llTWFwLmJl
Z2luKCk7CisgICAgICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJhdG9yIGl0
ID0gbV9jb29raWVNYXAuYmVnaW4oKTsgaXQgIT0gbV9jb29raWVNYXAuZW5kKCk7ICsraXQpIHsK
KyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmV4cGlyZURhdGUoKSA8IG1pbikgeworICAgICAg
ICAgICAgICAgIG1pbiA9IGl0LT5zZWNvbmQuZXhwaXJlRGF0ZSgpOworICAgICAgICAgICAgICAg
IGl0QmFrID0gaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9jb29raWVN
YXAucmVtb3ZlKGl0QmFrKTsKKyAgICAgICAgbV9jb3VudC0tOworICAgICAgICBudW1iZXJBZGRl
ZC0tOworICAgIH0KKyAgICAKKyAgICBpZiAoKENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFn
ZXIoKS0+Y29va2llc0NvdW50KCkpID49IDMwMCkgeworICAgICAgICBMT0coTmV0d29yaywgIkNv
b2tpZXMnIGNvdW50IGlzIGxpbWl0ZWQgdG8gMzAwIik7CisgICAgICAgIHJldHVybiBudW1iZXJB
ZGRlZDsKKyAgICB9CisgICAgCisgICAgLy8gV2UgYWRkIHRoZSBjb29raWUgaW4gdGhlIG1hcAor
ICAgIG1fY29va2llTWFwLnNldChjb29raWUubmFtZSgpLCBjb29raWUpOworICAgIAorICAgIC8v
IE5PVEUgY2FuJ3QgdGVzdCBjb3JyZWN0bHkgcmV0dXJuIHN0YXRlIGluIC5zZWNvbmQKKyAgICBM
T0coTmV0d29yaywgIipcbiogQ09PS0lFIEFEREVEIDogJXNcbioqKioqKioqKioqXG4iLCBjb29r
aWUubmFtZSgpLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICBtX2NvdW50Kys7Cisg
ICAgbnVtYmVyQWRkZWQrKzsKKyAgICAKKyAgICByZXR1cm4gbnVtYmVyQWRkZWQ7Cit9CisKK1N0
cmluZyBDb29raWVNYXA6OmNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21Db29raWVzKCkKK3sKKyAgICBT
dHJpbmcgcmVzdWx0OworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJhdG9y
IGl0ID0gbV9jb29raWVNYXAuYmVnaW4oKTsgaXQgIT0gbV9jb29raWVNYXAuZW5kKCk7ICsraXQp
IHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQuZXhwaXJlRGF0ZSgpICE9IC0xICYmIGl0LT5zZWNv
bmQuZXhwaXJlRGF0ZSgpID4gY3VycmVudFRpbWUoKSkgeworICAgICAgICAgICAgcmVzdWx0ICs9
IGl0LT5zZWNvbmQuY3JlYXRlQmFja3VwU3RyaW5nRnJvbUNvb2tpZSgpOworICAgICAgICAgICAg
cmVzdWx0ICs9ICJcbiI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgTE9HKE5ldHdvcmss
ICJDb29raWUgJXMgLS0+IHJlbW92ZWRcbiIsIGl0LT5maXJzdC5kZXByZWNhdGVkU3RyaW5nKCku
YXNjaWkoKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLy8gQ2Fu
J3QgYmUgY29uc3QgYmVjYXVzZSBvZiBtX2Nvb2tpZU1hcC5iZWdpbigpIGFuZCAuZW5kKCkKK1N0
cmluZyBDb29raWVNYXA6OmdldE5hbWVWYWx1ZVBhaXJzKCkKK3sKKyAgICBTdHJpbmcgcmVzdWx0
OworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZT46Oml0ZXJhdG9yIGl0ID0gbV9jb29r
aWVNYXAuYmVnaW4oKTsgaXQgIT0gbV9jb29raWVNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAg
cmVzdWx0ICs9IGl0LT5maXJzdCArICI9IiArIGl0LT5zZWNvbmQudmFsdWUoKSArICI7ICI7Cisg
ICAgICAgIExPRyhOZXR3b3JrLCAiZmlyc3Q9JXMgc2Vjb25kPSVzIFxuIiwgaXQtPmZpcnN0LmRl
cHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpLCBpdC0+c2Vjb25kLnZhbHVlKCkuZGVwcmVjYXRlZFN0
cmluZygpLmFzY2lpKCkpOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIENh
bid0IGJlIGNvbnN0IGJlY2F1c2Ugb2YgbV9jb29raWVNYXAuYmVnaW4oKSBhbmQgLmVuZCgpCitT
dHJpbmcgQ29va2llTWFwOjpnZXROYW1lVmFsdWVQYWlycyhTdHJpbmcgcGF0aCwgYm9vbCBzaXRl
SXNTZWN1cmUpCit7CisgICAgU3RyaW5nIHJlc3VsdCA9ICIiOworICAgIGZvciAoSGFzaE1hcDxT
dHJpbmcsIENvb2tpZT46Oml0ZXJhdG9yIGl0ID0gbV9jb29raWVNYXAuYmVnaW4oKTsgaXQgIT0g
bV9jb29raWVNYXAuZW5kKCk7ICsraXQpCisgICAgICAgIGlmIChwYXRoLnN0YXJ0c1dpdGgoaXQt
PnNlY29uZC5wYXRoKCksIGZhbHNlKSAmJiAoIWl0LT5zZWNvbmQuaXNTZWN1cmUoKSB8fCBzaXRl
SXNTZWN1cmUpKQorICAgICAgICAgICAgcmVzdWx0ICs9IGl0LT5maXJzdCArICI9IiArIGl0LT5z
ZWNvbmQudmFsdWUoKSArICI7ICI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMg
aW50IGdldERheXNUaWxsRmlyc3RPZk1vbnRoKFN0cmluZyBtb250aCwgZmxvYXQgeWVhcikKK3sK
KyAgICAvLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgZGF5cyBlbGFwc2VkIGZyb20gdGhlIGJlZ2lu
aW5nIG9mIHRoZSB5ZWFyIHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoCisgICAgc3RhdGlj
IEhhc2hNYXA8U3RyaW5nLCBpbnQ+IGRheXNUaWxsRmlyc3RPZk1vbnRoOworICAgIGlmIChkYXlz
VGlsbEZpcnN0T2ZNb250aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGF5c1RpbGxGaXJzdE9mTW9u
dGguYWRkKCJKYW4iLCAwKTsKKyAgICAgICAgZGF5c1RpbGxGaXJzdE9mTW9udGguYWRkKCJGZWIi
LCAzMSk7CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1vbnRoLmFkZCgiTWFyIiwgNTkpOworICAg
ICAgICBkYXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIkFwciIsIDkwKTsKKyAgICAgICAgZGF5c1Rp
bGxGaXJzdE9mTW9udGguYWRkKCJNYXkiLCAxMjApOworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZN
b250aC5hZGQoIkp1biIsIDE1MSk7CisgICAgICAgIGRheXNUaWxsRmlyc3RPZk1vbnRoLmFkZCgi
SnVsIiwgMTgxKTsKKyAgICAgICAgZGF5c1RpbGxGaXJzdE9mTW9udGguYWRkKCJBdWciLCAyMTIp
OworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZNb250aC5hZGQoIlNlcCIsIDI0Mik7CisgICAgICAg
IGRheXNUaWxsRmlyc3RPZk1vbnRoLmFkZCgiT2N0IiwgMjczKTsKKyAgICAgICAgZGF5c1RpbGxG
aXJzdE9mTW9udGguYWRkKCJOb3YiLCAzMDMpOworICAgICAgICBkYXlzVGlsbEZpcnN0T2ZNb250
aC5hZGQoIkRlYyIsIDMzNCk7CisgICAgfQorCisgICAgaW50IGRheXMgPSBkYXlzVGlsbEZpcnN0
T2ZNb250aC5nZXQobW9udGgpOworCisgICAgLy8gSGFuZGxlIHRoZSBiaXNzZXh0aWwgeWVhcnMK
KyAgICBpZiAoeWVhciAvIDQgPT0gaW50KHllYXIgLyA0KSAmJiBkYXlzID4gMzEpIAorICAgICAg
ICBkYXlzKys7CisKKyAgICByZXR1cm4gZGF5czsKK30KKworZG91YmxlIENvb2tpZTo6dGltZUZy
b21TdHJpbmcoU3RyaW5nIGRhdGVTdHJpbmcpCit7CisgICAgZG91YmxlIGRheTsKKyAgICBkb3Vi
bGUgZGF5c1RpbGxGaXJzdE9mTW9udGggPSAwOworICAgIGRvdWJsZSBob3VyczsKKyAgICBkb3Vi
bGUgeWVhcjsKKyAgICBkb3VibGUgbWludXRlczsKKyAgICBkb3VibGUgc2Vjb25kczsKKyAgICBT
dHJpbmcgbW9udGg7CisgICAgU3RyaW5nIGN1dERhdGU7CisgICAgU3RyaW5nIHRtcExlZnQ7Cisg
ICAgU3RyaW5nIHRtcFJpZ2h0OworICAgIGRvdWJsZSBjb29raWVUaW1lID0gMDsKKworICAgIC8q
CisgICAgICogVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBmb3JtYXQgdGhlIGRhdGUgYW5kIGVh
Y2ggd2ViIHNpdGUgdXNlcyBhIGRpZmZlcmVudCBvbmUgOi0vCisgICAgICogVGhpcyBmb25jdGlv
biB0cmllcyB0byBhbmFseXplIHRoZSBzdHJpbmcgdG8gb2J0YWluIHRoZSBwcm9wZXIgZm9ybWF0
LgorICAgICAqIFdoZW4gdGhpcyBpcyBkb25lLCB3ZSBleHRyYWN0IHRoZSB2YWx1ZXMgYW5kIGNv
bnZlcnQgdGhlbSBpbnRvIGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgMS8xLzE5NzAgMGgwMG0w
MHMKKyAgICAgKi8KKworICAgIHRtcFJpZ2h0ID0gZGF0ZVN0cmluZy5yaWdodCgzKTsKKyAgICBp
ZiAodG1wUmlnaHQuY29udGFpbnMoIkdNVCIsIGZhbHNlKSkKKyAgICAgICAgY3V0RGF0ZSA9IGRh
dGVTdHJpbmcucmlnaHQoMjQpOworICAgIGVsc2UKKyAgICAgICAgY3V0RGF0ZSA9IGRhdGVTdHJp
bmcucmlnaHQoMjApOworCisgICAgLy8gV2UgZ2V0IHRoZSBudW1lcmljIHZhbHVlcyBkaXJlY3Rs
eQorICAgIHRtcExlZnQgPSBjdXREYXRlLmxlZnQoMik7CisgICAgaWYgKHRtcExlZnQuY29udGFp
bnMoIiwiLCBmYWxzZSkpIHsKKyAgICAgICAgZGF5ID0gY3V0RGF0ZS5zdWJzdHJpbmcoMiwgMiku
dG9Eb3VibGUoKTsKKyAgICAgICAgbW9udGggPSBtb250aCA9IGN1dERhdGUuc3Vic3RyaW5nKDUs
IDMpOworICAgICAgICB5ZWFyID0gY3V0RGF0ZS5zdWJzdHJpbmcoOSwgMikudG9Eb3VibGUoKTsK
KyAgICAgICAgeWVhciA9IHllYXIgKyAyMDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGRheSA9
IGN1dERhdGUuc3Vic3RyaW5nKDAsIDIpLnRvRG91YmxlKCk7CisgICAgICAgIG1vbnRoID0gY3V0
RGF0ZS5zdWJzdHJpbmcoMywgMyk7CisgICAgICAgIHllYXIgPSBjdXREYXRlLnN1YnN0cmluZyg3
LCA0KS50b0RvdWJsZSgpOworICAgIH0KKyAgICAKKyAgICAvLyBHTVQgdGltZQorICAgIGhvdXJz
ID0gY3V0RGF0ZS5zdWJzdHJpbmcoMTIsIDIpLnRvRG91YmxlKCk7CisgICAgaWYgKGRhdGVTdHJp
bmcuZW5kc1dpdGgoIkdNVCIsIGZhbHNlKSk7CisgICAgICAgIGhvdXJzID0gaG91cnMgKyAyLjA7
IC8vIEZJWE1FIDogdGhpcyB3b3VsZCBvbmx5IHdvcmsgaW4gZnJhbmNlCisKKyAgICBtaW51dGVz
ID0gY3V0RGF0ZS5zdWJzdHJpbmcoMTUsIDQpLnRvRG91YmxlKCk7CisgICAgc2Vjb25kcyA9IGN1
dERhdGUuc3Vic3RyaW5nKDE4LCA0KS50b0RvdWJsZSgpOworCisgICAgZGF5c1RpbGxGaXJzdE9m
TW9udGggPSBnZXREYXlzVGlsbEZpcnN0T2ZNb250aChtb250aCwgeWVhcik7CisKKyAgICBMT0co
TmV0d29yaywgIk9yaWdpbmFsIDogJXNcbkRBVEUgRlJPTSBTVFJJTkdcbkRheSA9ICVsZlxuTW9u
dGggPSAlbGZcblllYXIgPSAlbGZcbkhvdXJzID0gJWxmXG5NaW4gPSAlbGZcblNlYyA9ICVsZlxu
ICIsZGF0ZVN0cmluZy5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgZGF5LCBkYXlzVGlsbEZp
cnN0T2ZNb250aCwgeWVhciwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMpOworCisgICAgLy8gTm93
IHdlIGNhbiBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBKYW51YXJ5
IDE5NzAgdGhlIDFzdCBhdCAwMDowMDowMAorICAgIGNvb2tpZVRpbWUgPSAoeWVhciAtIDE5NzAp
ICogKDYwICogNjAgKiAyNCAqIDM2NSk7CisgICAgY29va2llVGltZSArPSBkYXlzVGlsbEZpcnN0
T2ZNb250aCAqICg2MCAqIDYwICogMjQpOworICAgIGNvb2tpZVRpbWUgKz0gKChkYXkgLSAxKSAr
IGludCgoeWVhciAtIDE5NzApIC8gNCkpICogKDYwICogNjAgKiAyNCk7CisgICAgY29va2llVGlt
ZSArPSBob3VycyAqICg2MCAqIDYwKTsKKyAgICBjb29raWVUaW1lICs9IG1pbnV0ZXMgKiA2MDsK
KyAgICBjb29raWVUaW1lICs9IHNlY29uZHM7CisgICAgCisgICAgcmV0dXJuIGNvb2tpZVRpbWU7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL0Nvb2tpZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvQ29va2llLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA3IFBsZXlvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIFBsZXlvIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgUExFWU8gQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBQTEVZTyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgY29va2llX2gKKyNkZWZpbmUgY29va2llX2gKKwor
I2luY2x1ZGUgIkRlcHJlY2F0ZWRTdHJpbmcuaCIKKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisj
aW5jbHVkZSAid3RmL0hhc2hNYXAuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvb2tpZSB7CitwdWJsaWM6CisgICAgQ29va2ll
KCkKKyAgICAgICAgOiBtX2V4cGlyZXMoMCkKKyAgICAgICAgLCBtX3NlY3VyZShmYWxzZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIENvb2tpZShTdHJpbmcmIG5hbWUsIFN0cmluZyYgdmFsdWUs
IFN0cmluZyYgZXhwaXJlcywgU3RyaW5nJiBzZWN1cmUpCisgICAgICAgIDogbV9uYW1lKG5hbWUp
CisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkKKyAgICAgICAgLCBtX2V4cGlyZXMoMCkKKyAgICAg
ICAgLCBtX3NlY3VyZShmYWxzZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIH5Db29raWUoKQor
ICAgIHsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb29raWUgbmFtZS4K
KyAgICAgKi8KKyAgICBjb25zdCBTdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7
IH0KKyAgICAKKyAgICAvKioKKyAgICAqIEdldCB0aGUgY29va2llIHZhbHVlLgorICAgICAqLwor
ICAgIGNvbnN0IFN0cmluZyYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9CisgICAg
CisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb29raWUgcGF0aC4KKyAgICAgKi8KKyAgICBjb25z
dCBTdHJpbmcmIHBhdGgoKSBjb25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICAKKyAgICAvKioK
KyAgICAgKiBHZXQgdGhlIGNvb2tpZSBkb21haW4uCisgICAgICovCisgICAgY29uc3QgU3RyaW5n
JiBkb21haW4oKSBjb25zdCB7IHJldHVybiBtX2RvbWFpbjsgfQorICAgIAorICAgIC8qKgorICAg
ICAqIEdldCB0aGUgY29va2llIGV4cGlyZSBkYXRlLgorICAgICAqLworICAgIGNvbnN0IGRvdWJs
ZSBleHBpcmVEYXRlKCkgY29uc3QgeyByZXR1cm4gbV9leHBpcmVzOyB9CisgICAgCisgICAgLyoq
CisgICAgKiBSZXR1cm5zIHRydWUgaWYgY29va2llIGlzIHNldCBmb3IgYWxsIGRvbWFpbi4KKyAg
ICAgKi8KKyAgICBib29sIGlzRG9tYWluKCkgY29uc3QgeyByZXR1cm4gIW1fZG9tYWluLmlzRW1w
dHkoKTsgfQorICAgIAorICAgIC8qKgorICAgICogVGhlIGNvb2tpZSBpcyBzZWN1cmVkIG9ubHkg
aWYgdGhlIHRyYW5zZmVyIHdhcyBzZWN1cmVkIChodHRwcykuCisgICAgICovCisgICAgYm9vbCBp
c1NlY3VyZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2VjdXJlOyB9CisgICAgCisgICAgLyoqCisgICAg
ICogQ29uc3RydWN0IHRoZSBjb29raWUgZnJvbSB0aGUgdmFsdWVzIHN0b3JlZCBpbiBwYXJhbWV0
ZXIuCisgICAgICogQHBhcmFtKGluKSBzdHJpbmcgY29udGFpbmluZyBhdCBsZWFzdCBuYW1lPXZh
bHVlCisgICAgICovCisgICAgdm9pZCBpbml0RnJvbVN0cmluZyhjb25zdCBTdHJpbmcmIGNvb2tp
ZSk7CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJhY2t1cCBzdHJpbmcgZnJvbSB0
aGUgY29va2llCisgICAgICogZm9yIGl0IHRvIGJlIHNhdmVkIG9uIGEgZmlsZQorICAgICAqLwor
ICAgIFN0cmluZyBjcmVhdGVCYWNrdXBTdHJpbmdGcm9tQ29va2llKCk7CisgICAgCisgICAgLyoq
CisgICAgICogSW5pdGlhdGUgdGhlIGNvb2tpZSBmcm9tIGEgYmFja3VwIHN0cmluZworICAgICAq
LworICAgIHZvaWQgaW5pdENvb2tpZUZyb21CYWNrdXBTdHJpbmcoU3RyaW5nIGNvb2tpZSwgU3Ry
aW5nIGRvbWFpbik7CisgICAgCitwcml2YXRlOgorICAgIC8vIEZJWE1FIDogd2Ugc2hvdWxkIGZp
bmQgYSBiZXR0ZXIgcGxhY2UgZm9yIHRoaXMKKyAgICBkb3VibGUgdGltZUZyb21TdHJpbmcoU3Ry
aW5nIGRhdGVTdHJpbmcpOworCisgICAgU3RyaW5nIGV4dHJhY3RWYWx1ZUluKGNvbnN0IGNoYXIq
IG5hbWUsIGNvbnN0IFN0cmluZyYgY29va2llKTsKKyAgICBTdHJpbmcgbV9uYW1lOworICAgIFN0
cmluZyBtX3ZhbHVlOworICAgIFN0cmluZyBtX2RvbWFpbjsKKyAgICBTdHJpbmcgbV9wYXRoOwor
ICAgIGRvdWJsZSBtX2V4cGlyZXM7IC8qaW4gc2Vjb25kcyBzaW5jZSBqYW51YXJ5IDE5NzAgdGhl
IDFzdCBhdCAwMGgwMG0wMHMgKi8KKyAgICBib29sIG1fc2VjdXJlOworfTsKKworLyoqCisgKiBB
IENvb2tpZU1hcCBpcyBkZXNpZ24gdG8gaG9sZCBjb29raWVzIGZvciBvbmUgaG9zdC4KKyAqIEFs
bCBjb29raWVzIGZvciBvbmUgaG9zdCBhcmUgc3RvcmVkIGluIGEgbWFwLgorICovCitjbGFzcyBD
b29raWVNYXAgeworcHVibGljOgorICAgIENvb2tpZU1hcCgpIAorICAgICAgICA6IG1fY291bnQo
MCkKKyAgICB7CisgICAgfQorCisgICAgfkNvb2tpZU1hcCgpCisgICAgeworICAgIH0KKworICAg
IC8qKgorICAgICAqIFN0b3JlIGEgY29va2llIGluIG1hcC4KKyAgICAgKiBJZiBpdCBhbHJlYWR5
IGV4aXN0cywgaXQgaXMgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0oaW4pIHRoZSBjb29raWUKKyAg
ICAgKi8KKyAgICBpbnQgYWRkKGNvbnN0IENvb2tpZSYgY29va2llKTsKKyAgICAKKyAgICBTdHJp
bmcgY3JlYXRlQmFja3VwU3RyaW5nRnJvbUNvb2tpZXMoKTsKKyAgICAKKyAgICAvKioKKyAgICAg
KiBSZXR1cm5zICJuYW1lPXZhbHVlOyAuLi4iIHNlcXVlbmNlcyBpbiBvbmUgbGluZSBmb3IgYWxs
IGNvb2tpZXMuCisgICAgICovCisgICAgU3RyaW5nIGdldE5hbWVWYWx1ZVBhaXJzKCk7CisgICAg
CisgICAgLyoqCisgICAgICogUmV0dXJucyAibmFtZT12YWx1ZTsgLi4uIiBzZXF1ZW5jZXMgaW4g
b25lIGxpbmUgZm9yIGFsbCBjb29raWVzIHJlbGF0aXZlIHRvIG9uZSBwYXRoLgorICAgICAqIEBw
YXJhbShpbikgdGhlIHBhdGggb2YgdGhlIGFza2luZyB1cmwKKyAgICAgKiBAcGFyYW0oaW4pIGJv
b2xlYW4gdG8gdGVsbCBpZiB0aGUgY29ubmVjdGlvbiBpcyBzZWN1cmVkCisgICAgICovCisgICAg
U3RyaW5nIGdldE5hbWVWYWx1ZVBhaXJzKFN0cmluZyBwYXRoLCBib29sIHNpdGVJc1NlY3VyZSk7
CisgICAgCisgICAgSGFzaE1hcDxTdHJpbmcsIENvb2tpZT4gZ2V0TWFwKCkgeyByZXR1cm4gbV9j
b29raWVNYXA7IH0KKyAgICAKK3ByaXZhdGU6CisgICAgLy8gTWFwIG9mIGNvb2tpZSBuYW1lcyBh
bmQgdGhlIENvb2tpZQorICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWU+IG1fY29va2llTWFwOwor
ICAgIAorICAgIC8vIENvb2tpZXMgYXJlIGxpbWl0ZWQgdG8gMjAgcGVyIGRvbWFpbgorICAgIHVu
c2lnbmVkIHNob3J0IG1fY291bnQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisjZW5k
aWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFn
ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llTWFuYWdlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA3IFBsZXlvLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIFBsZXlvIG5vciB0aGUgbmFtZXMgb2YK
KyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgUExFWU8gQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBQTEVZTyBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkNvb2tp
ZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0
cmluZy5oIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNs
dWRlIDxzdGRpby5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjaGFyKiBkZWZh
dWx0RmlsZU5hbWUgPSAiY29va2llQ29sbGVjdGlvbi50eHQiOworc3RhdGljIENvb2tpZU1hbmFn
ZXIqIHNoYXJlZE1hbmFnZXIgPSAwOworCitDb29raWVNYW5hZ2VyKiBDb29raWVNYW5hZ2VyOjpn
ZXRDb29raWVNYW5hZ2VyKCkKK3sKKyAgICBpZiAoIXNoYXJlZE1hbmFnZXIpCisgICAgICAgIHNo
YXJlZE1hbmFnZXIgPSBuZXcgQ29va2llTWFuYWdlcigpOworICAgIHJldHVybiBzaGFyZWRNYW5h
Z2VyOworfQorCitDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKCkKKyAgICA6IG1fY291bnQo
MCkKK3sKKyAgICBpZiAoIXNoYXJlZE1hbmFnZXIpCisgICAgICAgIHNoYXJlZE1hbmFnZXIgPSB0
aGlzOworICAgIG1fY29va2llSmFyRmlsZU5hbWUgPSBkZWZhdWx0RmlsZU5hbWU7CisgICAgZ2V0
Q29va2llc0Zyb21GaWxlKCk7Cit9CisKK0Nvb2tpZU1hbmFnZXI6On5Db29raWVNYW5hZ2VyKCkK
K3sKKyAgICBzYXZlQ29va2llc1RvRmlsZSgpOworICAgIAorICAgIC8vIGRlc3Ryb3kgYWxsIGFs
bG9jYXRlZCBhbGwgQ29va2llTWFwCisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFw
Kj46Oml0ZXJhdG9yIGl0ID0gbV9tYW5hZ2VyTWFwLmJlZ2luKCk7IGl0ICE9IG1fbWFuYWdlck1h
cC5lbmQoKTsgKytpdCkgeworICAgICAgICBMT0coTmV0d29yaywgIm1hcCBmb3IgJyVzJyB3YXMg
JyVzJyFcbiIsIGl0LT5maXJzdC5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSwgaXQtPnNlY29u
ZC0+Z2V0TmFtZVZhbHVlUGFpcnMoKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisgICAg
ICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKworICAgIGlmIChtX2Nvb2tpZUphckZpbGVO
YW1lICE9IGRlZmF1bHRGaWxlTmFtZSkKKyAgICAgICAgZnJlZShjb25zdF9jYXN0PGNoYXIqPiht
X2Nvb2tpZUphckZpbGVOYW1lKSk7CisKK30KKwordW5zaWduZWQgaW50IENvb2tpZU1hbmFnZXI6
OnNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBwb2xpY3lVUkwsIGNvbnN0
IFN0cmluZyYgdmFsdWUpCit7CisgICAgdW5zaWduZWQgaW50IGNvb2tpZXNBZGRlZCA9IDA7Cisg
ICAgICAgIAorICAgIENvb2tpZSBjb29raWU7CisgICAgY29va2llLmluaXRGcm9tU3RyaW5nKHZh
bHVlKTsKKworICAgIGlmIChyZXNwZWN0c1NlY3VyaXR5U3RhbmRhcmRzKHVybCwgY29va2llKSkK
KyAgICAgICAgY29va2llc0FkZGVkID0gYWRkKHVybC5ob3N0KCksIGNvb2tpZSk7CisgICAgZWxz
ZQorICAgICAgICBMT0coTmV0d29yaywgIkNPT0tJRSAlcyBpcyBjb25zaWRlcmVkIGFzIGRhbmdl
cm91cyBhbmQgd2lsbCBiZSByZWplY3RlZFxuIiwgY29va2llLm5hbWUoKS5kZXByZWNhdGVkU3Ry
aW5nKCkuYXNjaWkoKSk7CisKKyAgICByZXR1cm4gY29va2llc0FkZGVkOyAgICAKK30KKworYm9v
bCBDb29raWVNYW5hZ2VyOjpyZXNwZWN0c1NlY3VyaXR5U3RhbmRhcmRzKGNvbnN0IEtVUkwmIHVy
bCwgQ29va2llJiBjb29raWUpCit7CisgICAgaWYgKCFjb29raWUuZG9tYWluKCkuaXNFbXB0eSgp
KSB7CisgICAgICAgIFN0cmluZyBkb21haW4gPSBjb29raWUuZG9tYWluKCk7CisgICAgICAgIGRv
bWFpbiA9IGRvbWFpbi5yaWdodChkb21haW4ubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgaWYgKCFk
b21haW4uY29udGFpbnMoIi4iLCBmYWxzZSkgfHwgIXVybC5ob3N0KCkuZW5kc1dpdGgoZG9tYWlu
LmRlcHJlY2F0ZWRTdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIExPRyhOZXR3b3JrLCAiSWxsZWdh
bCBDb29raWUgOiBCYWQgZG9tYWluIG5hbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQSBTZXQtQ29va2llIGZyb20g
cmVxdWVzdC1ob3N0IHkueC5mb28uY29tIGZvciBEb21haW49LmZvby5jb20KKyAgICAgICAgICog
d291bGQgYmUgcmVqZWN0ZWQsIGJlY2F1c2UgeS54IGFuZCBjb250YWlucyBhIGRvdC4KKyAgICAg
ICAgICovCisgICAgICAgIGlmICh1cmwuaG9zdCgpICE9IGRvbWFpbiAmJiB1cmwuaG9zdCgpLmxl
ZnQodXJsLmhvc3QoKS5sZW5ndGgoKSAtIGRvbWFpbi5sZW5ndGgoKSAtIDEpLmNvbnRhaW5zKCIu
IiwgZmFsc2UpKSB7CisgICAgICAgICAgICBMT0coTmV0d29yaywgIklsbGVnYWwgQ29va2llIDog
eS54LmZvby5jb20gZm9yIERvbWFpbj0uZm9vLmNvbVxuIik7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCF1cmwucGF0aCgpLnN0YXJ0
c1dpdGgoY29va2llLnBhdGgoKS5kZXByZWNhdGVkU3RyaW5nKCkpKSB7CisgICAgICAgIExPRyhO
ZXR3b3JrLCAiSWxsZWdhbCBDb29raWUgOiBjb29raWUncyBwYXRoIGRvZXNuJ3QgbWF0Y2ggdGhl
IHByZXNlbnQgVVJMXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworU3RyaW5nIENvb2tpZU1hbmFnZXI6OmNvb2tpZXMoY29uc3Qg
S1VSTCYgdXJsKQoreworICAgIExPRyhOZXR3b3JrLCAiTG9va2luZyBmb3IgY29va2llcyBmb3Ig
VVJMIDogJXNcbiIsIHVybC51cmwoKS5hc2NpaSgpKTsKKworICAgIEhhc2hNYXA8U3RyaW5nLCBD
b29raWVNYXAqPiBtYXBMaXN0ID0gZ2V0TWFwTGlzdEZvckhvc3QoU3RyaW5nKHVybC5ob3N0KCkp
KTsKKyAgICBpZiAoIW1hcExpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQ7
CisgICAgICAgIGlmICh1cmwudXJsKCkuc3RhcnRzV2l0aCgiaHR0cDoiKSkKKyAgICAgICAgICAg
IGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IG1hcExpc3Qu
YmVnaW4oKTsgaXQgIT0gbWFwTGlzdC5lbmQoKTsgKytpdCkKKyAgICAgICAgICAgICAgICByZXN1
bHQgKz0gaXQtPnNlY29uZC0+Z2V0TmFtZVZhbHVlUGFpcnMoU3RyaW5nKHVybC51cmwoKS5yZW1v
dmUoMCwgdXJsLmhvc3QoKS5sZW5ndGgoKSArIDcpKSwgZmFsc2UpOworICAgICAgICAKKyAgICAg
ICAgZWxzZSAvLyBodHRwczoKKyAgICAgICAgICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tp
ZU1hcCo+OjppdGVyYXRvciBpdCA9IG1hcExpc3QuYmVnaW4oKTsgaXQgIT0gbWFwTGlzdC5lbmQo
KTsgKytpdCkKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gaXQtPnNlY29uZC0+Z2V0TmFtZVZh
bHVlUGFpcnMoU3RyaW5nKHVybC51cmwoKS5yZW1vdmUoMCwgdXJsLmhvc3QoKS5sZW5ndGgoKSAr
IDgpKSwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIFN0cmluZygpOworfQorCitib29sIENvb2tpZU1hbmFnZXI6OnRoaXNNYXBFeGlzdHMo
U3RyaW5nIG1hcE5hbWUpCit7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj46
Oml0ZXJhdG9yIGl0ID0gbV9tYW5hZ2VyTWFwLmJlZ2luKCk7IGl0ICE9IG1fbWFuYWdlck1hcC5l
bmQoKSA7ICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5maXJzdCA9PSBtYXBOYW1lKQorICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwor
aW50IENvb2tpZU1hbmFnZXI6OmFkZChjb25zdCBTdHJpbmcmIGhvc3QsIGNvbnN0IENvb2tpZSYg
Y29va2llKQoreworICAgIGludCBhZGRlZENvb2tpZXMgPSAwOworICAgIAorICAgIC8vIElmIHRo
ZSBjb29raWUgc3BlY2lmaWVzIGEgZG9tYWluIG5hbWUsIHRoZSBtYXAgc2hvdWxkIGhhdmUgdGhp
cyBuYW1lIGVsc2UgaXQnbGwgYmUgdGhlIGhvc3QgbmFtZS4gCisgICAgU3RyaW5nIGRvbWFpbiA9
IGhvc3Q7CisgICAgaWYgKCFjb29raWUuZG9tYWluKCkuaXNFbXB0eSgpKQorICAgICAgICBkb21h
aW4gPSBjb29raWUuZG9tYWluKCk7CisgICAgCisgICAgLy8gTmVlZCB0byBjaGVjayBmaXJzdCBp
ZiB0aGUgY29va2llIG1hcCBhbHJlYWR5IGV4aXN0cyB0byBldmVudHVhbGx5IGNyZWF0ZSBvbmUK
KyAgICBpZiAoIXRoaXNNYXBFeGlzdHMoZG9tYWluKSkgeworICAgICAgICBDb29raWVNYXAqIG5l
d01hcCA9IG5ldyBDb29raWVNYXAoKTsKKyAgICAgICAgCisgICAgICAgIG1fbWFuYWdlck1hcC5z
ZXQoZG9tYWluLCBuZXdNYXApOworICAgICAgICBwcmludGYoIk5FVyBDb29raWVNYXAgY3JlYXRl
ZCA6ICVzIFxuIiwgZG9tYWluLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgpKTsKKyAgICAgICAg
CisgICAgICAgIGFkZGVkQ29va2llcyA9IG5ld01hcC0+YWRkKGNvb2tpZSk7CisgICAgICAgIG1f
Y291bnQgKz0gYWRkZWRDb29raWVzOworICAgICAgICByZXR1cm4gYWRkZWRDb29raWVzOworICAg
IH0KKyAgICAKKyAgICAvLyBHZXR0aW5nIHRoZSBtYXAgcmVsYXRlZCB0byB0aGlzIGhvc3QKKyAg
ICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj4gZXhpc3RpbmdNYXAgPSBnZXRNYXBMaXN0Rm9y
SG9zdChkb21haW4sIHRydWUpOworICAgIAorICAgIExPRyhOZXR3b3JrLCAiVHJ5aW5nIHRvIGFk
ZCBhIGNvb2tpZSB0byA6ICVzIFxuIiwgZG9tYWluLmRlcHJlY2F0ZWRTdHJpbmcoKS5hc2NpaSgp
KTsKKyAgICBhZGRlZENvb2tpZXMgPSBleGlzdGluZ01hcC5iZWdpbigpLT5zZWNvbmQtPmFkZChj
b29raWUpOworICAgIG1fY291bnQgKz0gYWRkZWRDb29raWVzOworICAgIHJldHVybiBhZGRlZENv
b2tpZXM7Cit9CisKK3Vuc2lnbmVkIHNob3J0IENvb2tpZU1hbmFnZXI6OmNvb2tpZXNDb3VudCgp
Cit7CisgICAgcmV0dXJuIG1fY291bnQ7Cit9CisKKy8vIENhbid0IHJldHVybiBDb29raWVNYXAm
IGJlY2F1c2Ugb2YgbWFwLmdldChob3N0KSB3aGljaCByZXR1cm5zIHRlbXBvcmFyeSB2YWwKK0hh
c2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPiBDb29raWVNYW5hZ2VyOjpnZXRNYXBMaXN0Rm9ySG9z
dChjb25zdCBTdHJpbmcmIGhvc3QsIGJvb2wgb25seU9uZU1hcCkgY29uc3QKK3sKKyAgICBIYXNo
TWFwPFN0cmluZywgQ29va2llTWFwKj4gcmVzOworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENv
b2tpZU1hcCo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fbWFuYWdlck1hcC5iZWdpbigpOyBpdCAh
PSBtX21hbmFnZXJNYXAuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKG9ubHlPbmVNYXAgJiYg
aG9zdCA9PSBpdC0+Zmlyc3QpIHsKKyAgICAgICAgICAgIHJlcy5hZGQoaXQtPmZpcnN0LCBpdC0+
c2Vjb25kKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIC8vIFRvIGhhbmRsZSB0aGUgc3ViIGRvbWFpbnMsIHdlIG9ubHkgY2hlY2sgdGhlIGVu
ZCBvZiB0aGUgaG9zdCB0byByZXR1cm4gdGhlIG1hcAorICAgICAgICBpZiAoIW9ubHlPbmVNYXAg
JiYgaG9zdC5lbmRzV2l0aChpdC0+Zmlyc3QsIGZhbHNlKSB8fCAoaXQtPmZpcnN0LnN0YXJ0c1dp
dGgoIi4iLCBmYWxzZSkgJiYgKCIuIiArIGhvc3QpLmVuZHNXaXRoKGl0LT5maXJzdCwgZmFsc2Up
KSApCisgICAgICAgICAgICByZXMuYWRkKGl0LT5maXJzdCwgaXQtPnNlY29uZCk7CisgICAgfQor
ICAgIAorICAgIGlmIChyZXMuaXNFbXB0eSgpKQorICAgICAgICBMT0coTmV0d29yaywgIkdldCBN
QVAgZm9yIGhvc3QgOiAlcyBcbiBOTyBNQVAgRk9VTkQgXG4iLCBob3N0LmRlcHJlY2F0ZWRTdHJp
bmcoKS5hc2NpaSgpKTsKKworICAgIHJldHVybiByZXM7IC8vIGRvIG5vdCBjcmVhdGUgbWFwIGZv
ciBlYWNoIHNpdGUgdmlzaXRlZAorfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnNhdmVDb29raWVz
VG9GaWxlKCkgCit7CisgICAgaW50IGNvb2tpZUZpbGUgPSA6Om9wZW4obV9jb29raWVKYXJGaWxl
TmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKyAgICAKKyAgICBpZiAoY29v
a2llRmlsZSA9PSAtMSkKKyAgICAgICAgTE9HKE5ldHdvcmssICJDb29raWUgZmlsZSBjYW4ndCBi
ZSBjcmVhdGVkXG4iKTsKKyAgICAKKyAgICBTdHJpbmcgdG1wLCB0bXBDb29raWVMaXN0OworICAg
IGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZU1hcCo+OjppdGVyYXRvciBpdCA9IG1fbWFuYWdl
ck1hcC5iZWdpbigpOyBpdCAhPSBtX21hbmFnZXJNYXAuZW5kKCk7ICsraXQpIHsKKworICAgICAg
ICBMT0coTmV0d29yaywgIlNhdmluZyBDb29raWVNYXAgOiAlcyBcbiIsIGl0LT5maXJzdC5kZXBy
ZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisKKyAgICAgICAgdG1wQ29va2llTGlzdCA9IGl0LT5z
ZWNvbmQtPmNyZWF0ZUJhY2t1cFN0cmluZ0Zyb21Db29raWVzKCk7CisgICAgICAgIGlmICghdG1w
Q29va2llTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRtcCA9IGl0LT5maXJzdC5kZXBy
ZWNhdGVkU3RyaW5nKCkuYXNjaWkoKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoJ1xuJyk7Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIHRtcC5hcHBlbmQodG1wQ29va2llTGlzdCk7CisgICAg
ICAgICAgICB0bXAuYXBwZW5kKCIqXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgOjp3
cml0ZShjb29raWVGaWxlLCB0bXAuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCksIHRtcC5kZXBy
ZWNhdGVkU3RyaW5nKCkubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIDo6
Y2xvc2UoY29va2llRmlsZSk7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6Z2V0Q29va2llc0Zy
b21GaWxlKCkKK3sKKyAgICBpbnQgY29va2llRmlsZSA9IDo6b3BlbihtX2Nvb2tpZUphckZpbGVO
YW1lLCBPX1JET05MWSk7CisgICAgCisgICAgaWYgKGNvb2tpZUZpbGUgPT0gLTEpIHsKKyAgICAg
ICAgTE9HKE5ldHdvcmssICJDb29raWUgZmlsZSBjYW4ndCBiZSBvcGVuZWRcbiIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEdldCB0aGUgZmlsZSBzaXplCisgICAgaW50
IHNpemUgPSBsc2Vlayhjb29raWVGaWxlLCAwLCBTRUVLX0VORCk7CisgICAgbHNlZWsoY29va2ll
RmlsZSwgMCwgU0VFS19TRVQpOworCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIGNoYXIq
IGJ1ZmZlciA9IG5ldyBjaGFyW3NpemUgKyAxXTsKKyAgICAKKyAgICAgICAgaWYgKCFidWZmZXIp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgOjpyZWFkKGNvb2tpZUZpbGUsIGJ1ZmZl
ciwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKKyAgICAgICAgCisgICAg
ICAgIFN0cmluZyBjb29raWVDb2xsZWN0aW9uKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIFN0cmlu
ZyBtYXA7CisgICAgICAgIFN0cmluZyBjb29raWU7CisgICAgICAgIGludCBzdGFydE9mTGluZSA9
IDA7CisgICAgICAgIGludCBlbmRPZkxpbmUgPSAwOworICAgICAgICBpbnQgYWRkZWRDb29raWVz
ID0gMDsKKyAgICAgICAgYm9vbCByZWFkQ29va2llOworICAgICAgICBDb29raWVNYXAqIG5ld01h
cDsKKyAgICAgICAgQ29va2llKiBuZXdDb29raWU7CisgICAgICAgIAorICAgICAgICAvLyBSZWFk
IHRoZSBlbnRpcmUgZmlsZSBjb250ZW50CisgICAgICAgIHdoaWxlIChlbmRPZkxpbmUgPCAoaW50
KWNvb2tpZUNvbGxlY3Rpb24ubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3
IENvb2tpZU1hcCBhZnRlciBlYWNoICcqJyBjaGFyYWN0ZXIKKyAgICAgICAgICAgIG5ld01hcCA9
IG5ldyBDb29raWVNYXAoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gR2V0dGluZyB0
aGUgbmFtZSBvZiB0aGUgbWFwICh3aGljaCBpcyB0aGUgZG9tYWluKQorICAgICAgICAgICAgZW5k
T2ZMaW5lID0gY29va2llQ29sbGVjdGlvbi5maW5kKCJcbiIsIHN0YXJ0T2ZMaW5lKTsKKyAgICAg
ICAgICAgIG1hcCA9IGNvb2tpZUNvbGxlY3Rpb24uc3Vic3RyaW5nKHN0YXJ0T2ZMaW5lLCBlbmRP
ZkxpbmUgLSBzdGFydE9mTGluZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEFkZGlu
ZyB0aGUgbWFwIHRvIHRoZSBjb29raWVNYW5hZ2VyCisgICAgICAgICAgICBtX21hbmFnZXJNYXAu
c2V0KG1hcCwgbmV3TWFwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmVhZENvb2tpZSA9
IHRydWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJlYWRpbmcgYWxsIHRoZSBjb29r
aWVzIGZyb20gdGhpcyBtYXAKKyAgICAgICAgICAgIHdoaWxlIChyZWFkQ29va2llKSB7CisgICAg
ICAgICAgICAgICAgc3RhcnRPZkxpbmUgPSBlbmRPZkxpbmUgKyAxOworICAgICAgICAgICAgICAg
IGVuZE9mTGluZSA9IGNvb2tpZUNvbGxlY3Rpb24uZmluZCgiXG4iLCBzdGFydE9mTGluZSk7Cisg
ICAgICAgICAgICAgICAgY29va2llID0gY29va2llQ29sbGVjdGlvbi5zdWJzdHJpbmcoc3RhcnRP
ZkxpbmUsIGVuZE9mTGluZSAtIHN0YXJ0T2ZMaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoY29v
a2llID09ICIqIikgeworICAgICAgICAgICAgICAgICAgICByZWFkQ29va2llID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZMaW5lID0gZW5kT2ZMaW5lICsgMTsKKyAgICAgICAg
ICAgICAgICAgICAgZW5kT2ZMaW5lKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICAgICAgbmV3Q29va2llID0gbmV3IENvb2tpZTsKKyAgICAgICAgICAgICAgICAg
ICAgbmV3Q29va2llLT5pbml0Q29va2llRnJvbUJhY2t1cFN0cmluZyhjb29raWUsIG1hcCk7Cisg
ICAgICAgICAgICAgICAgICAgIGFkZGVkQ29va2llcyA9IG5ld01hcC0+YWRkKCpuZXdDb29raWUp
OworICAgICAgICAgICAgICAgICAgICBtX2NvdW50ICs9IGFkZGVkQ29va2llczsKKyAgICAgICAg
ICAgICAgICAgICAgZGVsZXRlIG5ld0Nvb2tpZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIH0gLy8gRW5kIHJlYWRpbmcgY29va2llcyBmcm9tIHRoaXMgbWFwCisKKyAgICAgICAg
fSAvLyBFbmQgcmVhZGluZyBtYXAgZnJvbSB0aGUgZmlsZSBjb250ZW50CisKKyAgICBkZWxldGUg
YnVmZmVyOworCisgICAgfSAvLyBFbmQgYW5hbHlzaW5nIHRoZSBmaWxlCisgICAgICAgCisgICAg
OjpjbG9zZShjb29raWVGaWxlKTsKKyAgICAKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRD
b29raWVKYXIoY29uc3QgY2hhciogZmlsZU5hbWUpCit7CisgICAgbV9jb29raWVKYXJGaWxlTmFt
ZSA9IGZpbGVOYW1lOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFBsZXlvLiAg
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIFBsZXlvIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg
ICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgUExFWU8gQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBQTEVZTyBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkNvb2tpZS5oIgorI2luY2x1ZGUgIktVUkwuaCIK
KyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKworI2lu
Y2x1ZGUgPGN1cmwvY3VybC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvb2tp
ZU1hbmFnZXIgeworcHVibGljOgorICAgIHN0YXRpYyBDb29raWVNYW5hZ2VyKiBnZXRDb29raWVN
YW5hZ2VyKCk7CisKKyAgICB1bnNpZ25lZCBpbnQgc2V0Q29va2llcyhjb25zdCBLVVJMJiB1cmws
IGNvbnN0IEtVUkwmIHBvbGljeVVSTCwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisgICAgU3RyaW5n
IGNvb2tpZXMoY29uc3QgS1VSTCYgdXJsKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGNvb2tp
ZSBmb3IgYSBob3N0IGluIG1hcC4KKyAgICAgKiBAcGFyYW0oaW4pIHRoZSBvd25lciBob3N0Cisg
ICAgICogQHBhcmFtKGluKSB0aGUgY29va2llIHRvIGFkZAorICAgICAqLworICAgIGludCBhZGQo
Y29uc3QgU3RyaW5nJiBob3N0LCBjb25zdCBDb29raWUmIGNvb2tpZSk7CisKKyAgICBib29sIHJl
c3BlY3RzU2VjdXJpdHlTdGFuZGFyZHMoY29uc3QgS1VSTCYgdXJsLCBDb29raWUmIGNvb2tpZSk7
CisgICAgCisgICAgYm9vbCB0aGlzTWFwRXhpc3RzKFN0cmluZyBtYXBOYW1lKTsKKyAgICAgICAg
CisgICAgLyoqCisgICAgICogQXNrIGZvciB0aGUgY29va2llIG1hcCByZWxhdGVkIHRvIGhvc3Qu
CisgICAgICogQHBhcmFtKGluKSB0aGUgaG9zdCBjb25jZXJuZWQKKyAgICAgKiBAcmV0dXJuIGEg
bGlzdCBvZiBjb29raWUgbWFwcyBjb250YWluaW5nIGNvb2tpZXMgZm9yIGhvc3QKKyAgICAgKiBA
cmV0dXJuIDAgaWYgdGhlcmUncyBubyBjb29raWUgZm9yIGhvc3QKKyAgICAgKi8KKyAgICBIYXNo
TWFwPFN0cmluZywgQ29va2llTWFwKj4gZ2V0TWFwTGlzdEZvckhvc3QoY29uc3QgU3RyaW5nJiBo
b3N0LCBib29sIG9ubHlPbmVNYXAgPSBmYWxzZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBT
YXZlIGFsbCB0aGUgY29va2llcyBpbiBhIGZpbGUgZm9yIGJhY2t1cAorICAgICAqIFdlIHVzZSBh
IHRleHQgZmlsZSBmb3IgdGhpcy4KKyAgICAgKi8KKyAgICB2b2lkIHNhdmVDb29raWVzVG9GaWxl
KCk7CisgICAgCisgICAgLyoqCisgICAgICogTG9hZCBhbGwgdGhlIGNvb2tpZXMgZnJvbSBhIGZp
bGUKKyAgICAgKiBFeHBpcmVkIGNvb2tpZXMgYW5kIHByZXZpb3VzIHNlc3Npb24gY29va2llcyBh
cmUgbGVmdCBiZWhpbmQKKyAgICAgKi8KKyAgICB2b2lkIGdldENvb2tpZXNGcm9tRmlsZSgpOwor
CisgICAgdW5zaWduZWQgc2hvcnQgY29va2llc0NvdW50KCk7CisKKyAgICB2b2lkIHNldENvb2tp
ZUphcihjb25zdCBjaGFyKik7CisKKyAgICB+Q29va2llTWFuYWdlcigpOworCitwcml2YXRlOgor
ICAgIENvb2tpZU1hbmFnZXIoKTsKKworICAgIC8vIENhbid0IHB1dCByZWZlcmVuY2UgQ29va2ll
TWFwJiBpbiBtYXAKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llTWFwKj4gbV9tYW5hZ2VyTWFw
OworCisgICAgLy8gQ291bnQgYWxsIGNvb2tpZXMuIENvb2tpZXMgbnVtYmVyIGlzIGxpbWl0ZWQg
dG8gMzAwCisgICAgdW5zaWduZWQgc2hvcnQgbV9jb3VudDsKKworICAgIGNvbnN0IGNoYXIqIG1f
Y29va2llSmFyRmlsZU5hbWU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBX
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3Vy
bC5jcHAJKHJldmlzaW9uIDI4MzI1KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwv
UmVzb3VyY2VIYW5kbGVDdXJsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAog
I2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCiAKKyNpbmNs
dWRlICJDb29raWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCiAjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUludGVybmFsLmgiCkBA
IC05NCw0ICs5NSw0MyBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpsb2FkUmVzb3VyY2VTeW5jaHJv
CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAordm9pZCBSZXNvdXJjZUhhbmRsZTo6c2V0Q29v
a2llcygpCit7CisgICAgQ29va2llTWFuYWdlciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6Omdl
dENvb2tpZU1hbmFnZXIoKTsKKyAgICBLVVJMIHVybCA9IGdldEludGVybmFsKCktPm1fcmVzcG9u
c2UudXJsKCk7CisKKyAgICBpZiAobWFuYWdlciAmJiBtYW5hZ2VyLT5zZXRDb29raWVzKHVybCwg
S1VSTCgpLCBnZXRJbnRlcm5hbCgpLT5tX3Jlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiU2V0LUNv
b2tpZSIpKSkgeworICAgICAgICAvLyBpZiBhIGNvb2tpZSB3YXMgYWRkZWQsIHVwZGF0ZSB0aGUg
Q1VSTCBjb29raWVzCisgICAgICAgIGNoZWNrQW5kU2VuZENvb2tpZXModXJsKTsKKyAgICAgICAg
CisgICAgICAgIC8vIEZJWE1FIDogaXQgc2hvdWxkIGJlIGRvbmUgd2hlbiBmcmVlaW5nIHRoZSBD
b29raWVNYW5hZ2VyCisgICAgICAgIG1hbmFnZXItPnNhdmVDb29raWVzVG9GaWxlKCk7CisgICAg
fQorfQorCit2b2lkIFJlc291cmNlSGFuZGxlOjpjaGVja0FuZFNlbmRDb29raWVzKEtVUkwgdXJs
KQoreworICAgIC8vY29va2llcyBhcmUgYSBwYXJ0IG9mIHRoZSBodHRwIHByb3RvY29sIG9ubHkK
KyAgICBpZiAoIVN0cmluZyhkLT5tX3VybCkuc3RhcnRzV2l0aCgiaHR0cCIpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAodXJsID09ICIiKQorICAgICAgICB1cmwgPSBkLT5tX3VybDsKKwor
ICAgIC8vcHJlcGFyZSBhIGNvb2tpZSBoZWFkZXIgaWYgdGhlcmUgYXJlIGNvb2tpZXMgcmVsYXRl
ZCB0byB0aGlzIHVybC4KKyAgICBTdHJpbmcgY29va2llUGFpcnM7CisgICAgY29va2llUGFpcnMg
PSBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2VyKCktPmNvb2tpZXModXJsKTsKKworICAg
IC8vIFdlIGNob29zZSBhIG1heCBzaXplIG9mIDgxOTIwIGNhcmFjdGVycyBiZWNhdXNlIGEgY29v
a2llIG1heCBzaXplIGlzIDQwOTYgYW5kIGEgZG9tYWluIGNhbiBoYXZlIGF0IG1heCAyMCBjb29r
aWVzIHNvIDIwICogNDA5NiA9IDgxOTIwCisKKyAgICAvLyBGSVhNRTogaWYgYW4gdXJsIGRlcGVu
ZHMgb24gbW9yZSB0aGFuIG9uZSBtYXAsIGNvb2tpZSBzdHJpbmcgbWF5IGJlIHRydW5jYXRlZAor
ICAgIHN0YXRpYyBjaGFyIGNvb2tpZUNoYXJbODE5MjBdOworICAgIHN0cm5jcHkoY29va2llQ2hh
ciwgY29va2llUGFpcnMuZGVwcmVjYXRlZFN0cmluZygpLmFzY2lpKCksIDgxOTIwKTsKKworICAg
IGlmICghY29va2llUGFpcnMuaXNFbXB0eSgpICYmIGQtPm1faGFuZGxlKSB7CisgICAgICAgIHBy
aW50ZigiQ1VSTCBQT1NUIENvb2tpZSA6ICVzIFxuIiwgY29va2llQ2hhcik7CisgICAgICAgIGN1
cmxfZWFzeV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfQ09PS0lFLCBjb29raWVDaGFyKTsK
KyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcAko
cmV2aXNpb24gMjgzMjUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJj
ZUhhbmRsZU1hbmFnZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw2ICszNyw3IEBACiAjaW5j
bHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgogI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgi
CiAjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgogCiAjaW5j
bHVkZSA8d3RmL1ZlY3Rvci5oPgogCkBAIC00Nyw3ICs0OCw2IEBAIGNvbnN0IGRvdWJsZSBwb2xs
VGltZVNlY29uZHMgPSAwLjA1OwogCiBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OlJlc291cmNlSGFu
ZGxlTWFuYWdlcigpCiAgICAgOiBtX2Rvd25sb2FkVGltZXIodGhpcywgJlJlc291cmNlSGFuZGxl
TWFuYWdlcjo6ZG93bmxvYWRUaW1lckNhbGxiYWNrKQotICAgICwgbV9jb29raWVKYXJGaWxlTmFt
ZSgwKQogICAgICwgbV9yZXNvdXJjZUhhbmRsZUxpc3RIZWFkKDApCiB7CiAgICAgY3VybF9nbG9i
YWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOwpAQCAtNjEsMTMgKzYxLDE3IEBAIFJlc291cmNlSGFu
ZGxlTWFuYWdlcjo6flJlc291cmNlSGFuZGxlTWEKIHsKICAgICBjdXJsX211bHRpX2NsZWFudXAo
bV9jdXJsTXVsdGlIYW5kbGUpOwogICAgIGN1cmxfc2hhcmVfY2xlYW51cChtX2N1cmxTaGFyZUhh
bmRsZSk7Ci0gICAgaWYgKG1fY29va2llSmFyRmlsZU5hbWUpCi0gICAgICAgIGZyZWUobV9jb29r
aWVKYXJGaWxlTmFtZSk7CisKKyAgICAvLyBGcmVlIHRoZSBDb29raWVNYW5hZ2VyIHRvIHdyaXRl
IGNvb2tpZXMgdG8gZmlsZQorICAgIGRlbGV0ZSBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5h
Z2VyKCk7CiB9CiAKIHZvaWQgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpzZXRDb29raWVKYXJGaWxl
TmFtZShjb25zdCBjaGFyKiBjb29raWVKYXJGaWxlTmFtZSkKIHsgCi0gICAgbV9jb29raWVKYXJG
aWxlTmFtZSA9IHN0cmR1cChjb29raWVKYXJGaWxlTmFtZSk7CisgICAgQ29va2llTWFuYWdlciog
bWFuYWdlciA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIoKTsKKworICAgIGlmICht
YW5hZ2VyKQorICAgICAgICBtYW5hZ2VyLT5zZXRDb29raWVKYXIoc3RyZHVwKGNvb2tpZUphckZp
bGVOYW1lKSk7CiB9CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlciogUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyOjpzaGFyZWRJbnN0YW5jZSgpCkBAIC0xNjMsOCArMTY3LDI3IEBAIHN0YXRpYyBzaXplX3Qg
aGVhZGVyQ2FsbGJhY2soY2hhciogcHRyLCAKICAgICAgICAgICAgIGNsaWVudC0+ZGlkUmVjZWl2
ZVJlc3BvbnNlKGpvYiwgZC0+bV9yZXNwb25zZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50
IHNwbGl0UG9zID0gaGVhZGVyLmZpbmQoIjoiKTsKLSAgICAgICAgaWYgKHNwbGl0UG9zICE9IC0x
KQotICAgICAgICAgICAgZC0+bV9yZXNwb25zZS5zZXRIVFRQSGVhZGVyRmllbGQoaGVhZGVyLmxl
ZnQoc3BsaXRQb3MpLCBoZWFkZXIuc3Vic3RyaW5nKHNwbGl0UG9zKzEpLnN0cmlwV2hpdGVTcGFj
ZSgpKTsKKyAgICAgICAgaWYgKHNwbGl0UG9zICE9IC0xKSB7CisgICAgICAgICAgICBkLT5tX3Jl
c3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChoZWFkZXIubGVmdChzcGxpdFBvcyksIGhlYWRlci5z
dWJzdHJpbmcoc3BsaXRQb3MgKyAxKS5zdHJpcFdoaXRlU3BhY2UoKSk7CisKKyAgICAgICAgICAg
IC8vIEhhbmRsZSBjb29raWUKKyAgICAgICAgICAgIGlmIChoZWFkZXIuY29udGFpbnMoIlNldC1D
b29raWU6ICIsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBoZWFkZXIuZmlu
ZCgnXHInKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAg
ICAgIGhlYWRlci50cnVuY2F0ZShyZXQpOworCisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBz
ZXQgdGhlIHVybCBpZiBub3QgYWxyZWFkeSBkb25lCisgICAgICAgICAgICAgICAgaWYgKGQtPm1f
cmVzcG9uc2UudXJsKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNo
YXIqIGhkcjsKKyAgICAgICAgICAgICAgICAgICAgY3VybF9lYXN5X2dldGluZm8oZC0+bV9oYW5k
bGUsIENVUkxJTkZPX0VGRkVDVElWRV9VUkwsICZoZHIpOworICAgICAgICAgICAgICAgICAgICBk
LT5tX3Jlc3BvbnNlLnNldFVybChLVVJMKGhkcikpOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGpvYi0+c2V0Q29va2llcygpOworCisgICAgICAgICAgICAgICAgTE9HKE5l
dHdvcmssICJDb29raWUgdmFrdWUgOiAlcyAhIVxuIiwgZC0+bV9yZXNwb25zZS5odHRwSGVhZGVy
RmllbGQoIlNldC1Db29raWUiKS5kZXByZWNhdGVkU3RyaW5nKCkuYXNjaWkoKSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdG90YWxTaXplOwpAQCAtNDQx
LDExICs0NjQsNiBAQCB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6c3RhcnRKb2IoUmVzCiAg
ICAgZC0+bV91cmwgPSBzdHJkdXAodXJsLmFzY2lpKCkpOwogICAgIGN1cmxfZWFzeV9zZXRvcHQo
ZC0+bV9oYW5kbGUsIENVUkxPUFRfVVJMLCBkLT5tX3VybCk7CiAKLSAgICBpZiAobV9jb29raWVK
YXJGaWxlTmFtZSkgewotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxlLCBDVVJM
T1BUX0NPT0tJRUZJTEUsIG1fY29va2llSmFyRmlsZU5hbWUpOwotICAgICAgICBjdXJsX2Vhc3lf
c2V0b3B0KGQtPm1faGFuZGxlLCBDVVJMT1BUX0NPT0tJRUpBUiwgbV9jb29raWVKYXJGaWxlTmFt
ZSk7Ci0gICAgfQotCiAgICAgaWYgKGpvYi0+cmVxdWVzdCgpLmh0dHBIZWFkZXJGaWVsZHMoKS5z
aXplKCkgPiAwKSB7CiAgICAgICAgIHN0cnVjdCBjdXJsX3NsaXN0KiBoZWFkZXJzID0gMDsKICAg
ICAgICAgSFRUUEhlYWRlck1hcCBjdXN0b21IZWFkZXJzID0gam9iLT5yZXF1ZXN0KCkuaHR0cEhl
YWRlckZpZWxkcygpOwpAQCAtNDcyLDYgKzQ5MCw5IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyOjpzdGFydEpvYihSZXMKICAgICBlbHNlIGlmICgiSEVBRCIgPT0gam9iLT5yZXF1ZXN0KCku
aHR0cE1ldGhvZCgpKQogICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxlLCBDVVJM
T1BUX05PQk9EWSwgVFJVRSk7CiAKKyAgICAvLyBBZGQgY29va2llcworICAgIGpvYi0+Y2hlY2tB
bmRTZW5kQ29va2llcygpOworCiAgICAgQ1VSTE1jb2RlIHJldCA9IGN1cmxfbXVsdGlfYWRkX2hh
bmRsZShtX2N1cmxNdWx0aUhhbmRsZSwgZC0+bV9oYW5kbGUpOwogICAgIC8vIGRvbid0IGNhbGwg
cGVyZm9ybSwgYmVjYXVzZSBldmVudHMgbXVzdCBiZSBhc3luYwogICAgIC8vIHRpbWVvdXQgd2ls
bCBvY2N1ciBhbmQgZG8gY3VybF9tdWx0aV9wZXJmb3JtCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaAkocmV2aXNp
b24gMjgzMjUpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRs
ZU1hbmFnZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNzUsNyArNzUsNiBAQCBwcml2YXRlOgogICAg
IFRpbWVyPFJlc291cmNlSGFuZGxlTWFuYWdlcj4gbV9kb3dubG9hZFRpbWVyOwogICAgIENVUkxN
KiBtX2N1cmxNdWx0aUhhbmRsZTsKICAgICBDVVJMU0gqIG1fY3VybFNoYXJlSGFuZGxlOwotICAg
IGNoYXIqIG1fY29va2llSmFyRmlsZU5hbWU7CiAgICAgY2hhciBtX2N1cmxFcnJvckJ1ZmZlcltD
VVJMX0VSUk9SX1NJWkVdOwogICAgIFJlc291cmNlSGFuZGxlTGlzdCogbV9yZXNvdXJjZUhhbmRs
ZUxpc3RIZWFkOwogfTsK
</data>
<flag name="review"
          id="7600"
          type_id="1"
          status="-"
          setter="mrowe"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19465</attachid>
            <date>2008-02-29 16:43:13 -0800</date>
            <delta_ts>2010-06-10 17:21:28 -0700</delta_ts>
            <desc>Rewritten patch addressing Marc&apos;s comments</desc>
            <filename>cookie-v2.patch</filename>
            <type>text/plain</type>
            <size>53984</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmM0ZjFkMS4uOWFjYTQyZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMTUgQEAKKzIwMDgtMDItMjkgIEp1bGllbiBDaGFm
ZnJhaXggIDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgY29va2llIHN1cHBvcnQgZm9yIGd0ay4g
VGhlIG9yaWdpbmFsIGlkZWEgaXMgYmFzZWQgb24gT1dCIGNvb2tpZSBwYXJzaW5nIGJ1dCBoYXMg
YmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbi4KKworICAgICAgICArIFdlIGFyZSB1c2luZyBvdXIg
b3duIHBhcnNlciBmb3IgY29va2llcy4gSXQgdXNlcyBvbiBNb3ppbGxhJ3MgZ3JhbW1hciAoY29t
cGxpYW50IHdpdGggUkZDMjEwOSB3aXRoIHNvbWUgZXh0ZW5zaW9uKS4KKworICAgICAgICArIFdl
IGludHJvZHVjZSAzIGNsYXNzIDoKKworICAgICAgICAgICAgLSBDb29raWUgOiBpdCBpcyBpbnRl
cm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIGNvb2tpZQorCisgICAgICAgICAgICAtIENvb2tpZU1h
cCA6IGl0IHJlcHJlc2VudHMgYWxsIHRoZSBjb29raWUgZm9yIGFuIGhvc3QuIFRoZSBudW1iZXIg
b2YgY29va2llcyBpcyBsaW1pdGVkIHRvIDIwIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAg
ICB0aGUgY29va2llcyByZXBsYWNlbWVudCBwb2xpY3kgaXMgTFJVIChhcyBzcGVjaWZpZWQgaW4g
dGhlIFJGQzIxMDkpLgorCisgICAgICAgICAgICAtIENvb2tpZU1hbmFnZXIgOiBpdCBpcyB0aGUg
Y2VudHJhbCBjbGFzcyBmb3IgbWFuYWdpbmcgY29va2llLiBJdCBoYW5kbGVzIGNvb2tpZSBhZGRp
dGlvbiBhbmQgcmVtb3ZhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgd2VsbCBh
cyB0aGUgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UuIFRoZSBnbG9iYWwgbnVtYmVyIG9mIGNv
b2tpZXMgaXMgbGltaXRlZCB0byAzMDAuCisKKworICAgICAgICArIFRoZSBjb29raWVzIGFyZSBz
YXZlZCBpbnRvIGEgc3FsaXRlIHRhYmxlICJjb29raWVzIiBhbmQgYXJlIHJlc3RvcmVkIHdoZW4g
dGhlIGJyb3dzZXIgaXMgb3BlbmVkLgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAg
ICAgICogV2ViQ29yZS5wcm86CisgICAgICAgICogcGxhdGZvcm0vZ3RrL0Nvb2tpZUphckd0ay5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpzZXRDb29raWVzKTogQ2hhbmdlZCB0byBjYWxsIENvb2tp
ZU1hbmFnZXIgbWV0aG9kcworICAgICAgICAoV2ViQ29yZTo6Y29va2llcyk6IERpdHRvCisgICAg
ICAgIChXZWJDb3JlOjpjb29raWVzRW5hYmxlZCk6IERpdHRvCisKKyAgICAgICAgKiBwbGF0Zm9y
bS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmg6IEFkZGVkIHR3byBtZXRob2QgZGVjbGFyYXRpb25z
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llOjppc19sd3MpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
OjpwYXJzZSk6IFBhcnNlcyB0aGUgQ29va2llIGFjY29yZGluZyB0byBNb3ppbGxhJ3MgZ3JhbW1h
cgorICAgICAgICBhbmQgcmV0dXJucyBpdAorCisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OnNl
dEV4cGlyeSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6OnNldE1heEFnZSk6CisgICAgICAg
ICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkNvb2tpZTo6Q29va2llKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6fkNvb2tpZSk6
CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6Om5hbWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llOjpzZXROYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6dmFsdWUpOgorICAgICAg
ICAoV2ViQ29yZTo6Q29va2llOjpzZXRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWU6
OnBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llOjpzZXRQYXRoKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvb2tpZTo6ZG9tYWluKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6c2V0RG9t
YWluKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6ZXhwaXJ5KToKKyAgICAgICAgKFdlYkNv
cmU6OkNvb2tpZTo6bGFzdEFjY2Vzc2VkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6c2V0
TGFzdEFjY2Vzc2VkKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZTo6aXNTZWN1cmUpOgorICAg
ICAgICAoV2ViQ29yZTo6Q29va2llOjpzZXRTZWN1cmVGbGFnKToKKyAgICAgICAgKFdlYkNvcmU6
OkNvb2tpZTo6aXNTZXNzaW9uKToKKyAgICAgICAgQ29va2llIHNldHRlcnMgJiBnZXR0ZXJzCisK
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcik6IHJl
dHVybiB0aGUgb25seSBpbnN0YW5jZSBvZiBDb29raWVNYW5hZ2VyCisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tp
ZU1hbmFnZXI6On5Db29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFn
ZXI6OmlzX2Nvb2tpZV9zZXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2V0
Q29va2llcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpzaG91bGRSZWplY3Qp
OiBQZXJmb3JtIHNlY3VyaXR5IGNoZWNrIG9uIGNvb2tpZQorICAgICAgICAoV2ViQ29yZTo6Q29v
a2llTWFuYWdlcjo6Z2V0Q29va2llKTogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRpbmcgYWxs
IHRoZSBjb29raWVzIGZvciBvbmUgdXJsCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2Vy
OjpyZW1vdmVBbGxDb29raWVzKTogUmVtb3ZlIGFsbCB0aGUgY29va2llcworICAgICAgICAoV2Vi
Q29yZTo6Q29va2llTWFuYWdlcjo6c2V0Q29va2llSmFyKTogQ2hhbmdlIHRoZSBmaWxlIGluIHdo
aWNoIHdlIHNhdmUgdGhlIGNvb2tpZXMKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6
OmNoZWNrQW5kVHJlYXRDb29raWUpOiBDYWxsZWQgaWYgdGhlIGNvb2tpZSBoYXMgcGFzc2VkIHRo
ZSBzZWN1cml0eSBjaGVja3MsCisgICAgICAgIHByb2Nlc3MgdGhlIGNvb2tpZSAoY3JlYXRlIHRo
ZSBDb29raWVNYXAgaWYgbmVlZGVkLCBhZGQvdXBkYXRlIHRoZSBkYXRhYmFzZSBlbnRyeSAuLi4p
CisKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmFkZENvb2tpZVRvTWFwKTogQWRk
IGEgQ29va2llIHRvIHRoZSBnaXZlbiBtYXAgYW5kIHVwZGF0ZSB0aGUgZGF0YWJhc2UgKGludGVy
bmFsKQorCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjp1cGRhdGUpOiBVcGRhdGUg
dGhlIENvb2tpZU1hbmFnZXIncyBnbG9iYWwgQ29va2llTWFwIGFuZCB0aGUgZGF0YWJhc2UgKGlu
dGVybmFsKQorCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpnZXREYXRhYmFzZUNv
b2tpZXMpOiBHZXQgY29va2llIGZyb20gdGhlIGRhdGFiYXNlIHdoZW4gd2UgY3JlYXRlIHRoZSBD
b29raWVNYW5hZ2VyCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjppbnNlcnRDb29r
aWVJbnRvRGF0YWJhc2UpOiBJbnNlcnQgb25lIGNvb2tpZSBpbiB0aGUgZGF0YWJhc2UKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnVwZGF0ZURhdGFiYXNlRW50cnkpOiBVcGRhdGUg
YSBkYXRhYmFzZSBlbnRyeQorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6cmVtb3Zl
Q29va2llRnJvbURhdGFiYXNlKTogUmVtb3ZlIGEgZGF0YWJhc2UgZW50cnkKKyAgICAgICAgKiBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OkNvb2tpZU1hbmFnZXI6OmNvb2tpZXNDb3VudCk6CisgICAgICAgIChXZWJDb3JlOjpD
b29raWVNYW5hZ2VyOjpyZW1vdmVkQ29va2llKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvQ29va2llTWFwLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6
On5Db29raWVNYXApOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjp0YWtlUHJldmlvdXMp
OiBSZW1vdmUgZnJvbSBDb29raWVNYXAgYW5kIHJldHVybiB0aGUgcHJldmlvdXMgbWF0Y2hpbmcg
Y29va2llIChzaW1pbGFyIHRvIEhhc2hNYXA6OnRha2UpCisgICAgICAgIChXZWJDb3JlOjpDb29r
aWVNYXA6OmFkZCk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OnJlbW92ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb29raWVNYXA6OnJlbW92ZU9sZGVzdENvb2tpZSk6CisgICAgICAgIChX
ZWJDb3JlOjpDb29raWVNYXA6OnVwZGF0ZVRpbWUpOiBVcGRhdGUgdGhlIENvb2tpZSBsYXN0QWNj
ZXNzZWQgZmllbGQgYW5kIGlmIG5lZWRlZCB0aGUgb2xkZXN0CisgICAgICAgIGNvb2tpZS4KKwor
ICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjp1cGRhdGVPbGRlc3RDb29raWUpOiBXZSBrZWVw
IHRyYWNrIG9mIHRoZSBvbGRlc3QgQ29va2llIGluIGNhc2Ugd2UgaGF2ZSB0bworICAgICAgICBy
ZW1vdmUgaXQsIHRoaXMgbWV0aG9kIGp1c3QgdXBkYXRlIHRoZSBvbGRlc3QgQ29va2llLgorCisg
ICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hcC5oOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZU1hcDo6Q29va2llTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkNv
b2tpZU1hcDo6Y291bnQpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFwOjpjYW5JbnNlcnRD
b29raWUpOiBSZXR1cm4gdHJ1ZSBpZiB3ZSBhcmUgdW5kZXIgdGhlIG1heGltdW0gY29va2llIHRo
cmVzaG9sZAorCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYXA6OmdldENvb2tpZU1hcCk6IFJl
dHVybiB0aGUgaW50ZXJuYWwgQ29va2llTWFwICh1c2VkIGJ5IHRoZSBDb29raWVNYW5hZ2VyIHRv
IHVwZGF0ZQorICAgICAgICB0aGUgZGF0YWJhc2UpLgorCisgICAgICAgICogcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZXNv
dXJjZUhhbmRsZTo6c2V0Q29va2llcyk6IENhbGxzIHRoZSBDb29raWVNYW5hZ2VyLgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU6OmNoZWNrQW5kU2VuZENvb2tpZXMpOiBEaXR0bwor
CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5j
cHA6IFJlbW92ZWQgbV9jb29raWVKYXJOYW1lIHJlZmVyZW5jZQorICAgICAgICAoV2ViQ29yZTo6
UmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKTogUmVwbGFjZWQg
bV9jb29raWVKYXJOYW1lIHJlZmVyZW5jZSB0byBDb29raWVNYW5hZ2VyIGVxdWl2YWxlbnQKKyAg
ICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlTWFuYWdlcjo6c2V0Q29va2llSmFyRmlsZU5h
bWUpOgorICAgICAgICAoV2ViQ29yZTo6aGVhZGVyQ2FsbGJhY2spOiBJZiB3ZSBoYXZlIGEgIlNl
dC1Db29raWUiIGhlYWRlciwgcGFzcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlIENvb2tpZU1hbmFn
ZXIKKyAgICAgICAgZm9yIHByb2Nlc3NpbmcuCisKKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNl
SGFuZGxlTWFuYWdlcjo6c3RhcnRKb2IpOiBSZW1vdmVkIG1fY29va2llSmFyTmFtZSByZWZlcmVu
Y2UuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdl
ci5oOiBSZW1vdmVkIG1fY29va2llSmFyRmlsZU5hbWUgKG1vdmVkIHRvIHRoZSBDb29raWVNYW5h
Z2VyKQorCiAyMDA4LTAyLTI5ICBBbGV4ZXkgUHJvc2t1cnlha292ICA8YXBAd2Via2l0Lm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbi4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvR05VbWFr
ZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGZlNGI1NGEuLmZlYWI0NDkg
MTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIvV2ViQ29yZS9HTlVtYWtl
ZmlsZS5hbQpAQCAtOTk4LDYgKzk5OCw5IEBAIHdlYmNvcmVfY3BwZmxhZ3MgKz0gXAogCS1JJChz
cmNkaXIpL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsCiAKIHdlYmNvcmVfc291cmNlcyAr
PSBcCisJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llLmNwcCBcCisJV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFwLmNwcCBcCisJV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAKIApkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9XZWJDb3JlLnBybyBiL1dlYkNvcmUvV2ViQ29yZS5wcm8KaW5kZXggNWRiNzJiMy4uNDdiMmFk
MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9XZWJDb3JlLnBybworKysgYi9XZWJDb3JlL1dlYkNvcmUu
cHJvCkBAIC0xMDYxLDYgKzEwNjEsOSBAQCBndGstcG9ydCB7CiAgICAgICAgIHBsYXRmb3JtL2dy
YXBoaWNzL2d0ay9JbWFnZUd0ay5jcHAgXAogICAgICAgICBwbGF0Zm9ybS9ncmFwaGljcy9ndGsv
SW50UG9pbnRHdGsuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvZ3RrL0ludFJlY3RH
dGsuY3BwIFwKKyAgICAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5jcHAgXAorICAg
ICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFwLmNwcCBcCisgICAgICAgIHBsYXRm
b3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmNwcCBcCiAgICAgICAgIHBsYXRmb3JtL25l
dHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmwuY3BwIFwKICAgICAgICAgcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAgXAogICAgICAgICBwbGF0Zm9ybS9n
cmFwaGljcy9jYWlyby9BZmZpbmVUcmFuc2Zvcm1DYWlyby5jcHAgXApkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvQ29va2llSmFyR3RrLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Rr
L0Nvb2tpZUphckd0ay5jcHAKaW5kZXggMmY3NmViYy4uMDdlNTY1MiAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvQ29va2llSmFyR3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2d0ay9Db29raWVKYXJHdGsuY3BwCkBAIC0yMywyMyArMjMsMzMgQEAKIAogI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CiAKLW5hbWVzcGFjZSBXZWJDb3JlIHsKKyNpbmNsdWRlICJDb29raWVNYW5h
Z2VyLmgiCiAKLXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBjb29raWVKYXI7CituYW1l
c3BhY2UgV2ViQ29yZSB7CiAKLXZvaWQgc2V0Q29va2llcyhEb2N1bWVudCogLypkb2N1bWVudCov
LCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0IEtVUkwmIC8qcG9saWN5VVJMKi8sIGNvbnN0IFN0cmlu
ZyYgdmFsdWUpCit2b2lkIHNldENvb2tpZXMoRG9jdW1lbnQqIC8qZG9jdW1lbnQqLywgY29uc3Qg
S1VSTCYgdXJsLCBjb25zdCBLVVJMJiBwb2xpY3lVUkwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCiB7
Ci0gICAgY29va2llSmFyLnNldCh1cmwuc3RyaW5nKCksIHZhbHVlKTsKKyAgICBDb29raWVNYW5h
Z2VyKiBtYW5hZ2VyID0gQ29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcigpOworICAgIGlm
IChtYW5hZ2VyKQorICAgICAgICBtYW5hZ2VyLT5zZXRDb29raWVzKHVybCwgcG9saWN5VVJMLCB2
YWx1ZSk7CiB9CiAKIFN0cmluZyBjb29raWVzKGNvbnN0IERvY3VtZW50KiAvKmRvY3VtZW50Ki8s
IGNvbnN0IEtVUkwmIHVybCkKIHsKLSAgICByZXR1cm4gY29va2llSmFyLmdldCh1cmwuc3RyaW5n
KCkpOworICAgIENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29r
aWVNYW5hZ2VyKCk7CisgICAgaWYgKG1hbmFnZXIpCisgICAgICAgIHJldHVybiBtYW5hZ2VyLT5n
ZXRDb29raWUodXJsKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAog
Ym9vbCBjb29raWVzRW5hYmxlZChjb25zdCBEb2N1bWVudCogLypkb2N1bWVudCovKQogewotICAg
IHJldHVybiB0cnVlOworICAgIENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2Vy
OjpnZXRDb29raWVNYW5hZ2VyKCk7CisgICAgaWYgKG1hbmFnZXIpCisgICAgICAgIHJldHVybiB0
cnVlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9CmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VIYW5kbGUuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZS5oCmluZGV4IGU1YTgwNjUuLmZiYzVkY2YgMTAw
NjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZS5oCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZS5oCkBAIC0xMzgsNiArMTM4
LDExIEBAIHB1YmxpYzoKICAgICBSZXNvdXJjZUhhbmRsZUludGVybmFsKiBnZXRJbnRlcm5hbCgp
IHsgcmV0dXJuIGQuZ2V0KCk7IH0KICNlbmRpZgogCisjaWYgVVNFKENVUkwpCisgICAgdm9pZCBj
aGVja0FuZFNlbmRDb29raWVzKEtVUkwmIHVybCk7CisgICAgdm9pZCBzZXRDb29raWVzKCk7Cisj
ZW5kaWYKKwogICAgIC8vIFVzZWQgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCB5b3UgZG9u
J3QgZ2V0IGFueSBtb3JlIE5TVVJMQ29ubmVjdGlvbiBjYWxsYmFja3MgdW50aWwgeW91IHJldHVy
biBmcm9tIHRoZSBvbmUgeW91J3JlIGluLgogICAgIHN0YXRpYyBib29sIGxvYWRzQmxvY2tlZCgp
OyAgICAKICAgICAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWUuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZTI0NmYKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWUuY3BwCkBAIC0wLDAgKzEsMzAx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZy
YWl4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb29raWUuaCIKKwor
I2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCisKKyNpbmNsdWRl
IDxjdXJsL2N1cmwuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIENvb2tpZTo6aXNf
bHdzKFVDaGFyIGMpCit7CisgICByZXR1cm4gKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Cit9CisK
Ky8vIFBhcnNlIHRoZSBzdHJpbmcgd2l0aG91dCAiU2V0LUNvb2tpZSIgYWNjb3JkaW5nIHRvIEZp
cmVmb3ggZ3JhbW1hciAobG9vc2VseSBSRkMgMjEwOSBjb21wbGlhbnQpCisvLyBzZWUgbmV0d2Vy
ay9jb29raWUvc3JjL25zQ29va2llU2VydmljZS5jcHAgY29tbWVudCBmb3IgaXQKK0Nvb2tpZSog
Q29va2llOjpwYXJzZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2llLCB1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQgZW5kLCBkb3VibGUgY3VyVGltZSkKK3sKKyAgICBDb29raWUq
IHJlcyA9IG5ldyBDb29raWUoY3VyVGltZSk7CisKKyAgICBpZiAoIXJlcykgeworICAgICAgICBM
T0dfRVJST1IoIk91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisg
ICAgLy8gUGFyc2UgW05BTUUgIj0iXSBWQUxVRQorCisgICAgdW5zaWduZWQgdG9rZW5FbmQgPSBz
dGFydDsgLy8gVG9rZW4gZW5kIGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgJz0nIG9yIHRo
ZSBlbmQgb2YgYSB0b2tlbgorICAgIHVuc2lnbmVkIHBhaXJFbmQgPSBzdGFydDsgLy8gUGFpciBl
bmQgY29udGFpbnMgYWx3YXlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgJzsnCisKKyAgICAvLyBmaW5k
IHRoZSAqZmlyc3QqICc7JyBhbmQgdGhlICc9JyAoaWYgdGhleSBleGlzdCkKKyAgICAvLyBGSVhN
RSA6IHNob3VsZCBoYW5kbGUgcXVvdGVkIHN0cmluZworICAgIHdoaWxlIChwYWlyRW5kIDwgZW5k
ICYmIGNvb2tpZVtwYWlyRW5kXSAhPSAnOycpIHsKKyAgICAgICAgaWYgKHRva2VuRW5kID09IHN0
YXJ0ICYmIGNvb2tpZVtwYWlyRW5kXSA9PSAnPScpCisgICAgICAgICAgICB0b2tlbkVuZCA9IHBh
aXJFbmQ7CisgICAgICAgIHBhaXJFbmQrKzsKKyAgICB9CisKKyAgICB1bnNpZ25lZCB0b2tlblN0
YXJ0ID0gc3RhcnQ7CisKKyAgICBpZiAodG9rZW5FbmQgIT0gc3RhcnQpIHsKKyAgICAgICAgLy8g
VGhlcmUgaXMgYSAnPScgc28gcGFyc2UgdGhlIE5BTUUKKyAgICAgICAgdW5zaWduZWQgbmFtZUVu
ZCA9IHRva2VuRW5kOworCisgICAgICAgIC8vIFJlbW92ZSBMV1MKKyAgICAgICAgd2hpbGUgKG5h
bWVFbmQgJiYgaXNfbHdzKGNvb2tpZVtuYW1lRW5kXSkpCisgICAgICAgICAgICBuYW1lRW5kLS07
CisKKyAgICAgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBuYW1lRW5kICYmIGlzX2x3cyhjb29raWVb
dG9rZW5TdGFydF0pKQorICAgICAgICAgICAgdG9rZW5TdGFydCsrOworCisgICAgICAgIGlmIChu
YW1lRW5kID09IHRva2VuU3RhcnQpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiRW1wdHkgbmFt
ZS4gUmVqZWN0aW5nIHRoZSBjb29raWUiKTsKKyAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBuYW1lID0gY29v
a2llLnN1YnN0cmluZyh0b2tlblN0YXJ0LCBuYW1lRW5kIC0gc3RhcnQpOworICAgICAgICByZXMt
PnNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgLy8gTm93IHBhcnNlIHRoZSBWQUxVRQorICAg
IHRva2VuU3RhcnQgPSB0b2tlbkVuZCArIDE7CisKKyAgICAvLyBTa2lwIExXUyBpbiBvdXIgdG9r
ZW4KKyAgICB3aGlsZSAodG9rZW5TdGFydCA8IHBhaXJFbmQgJiYgaXNfbHdzKGNvb2tpZVt0b2tl
blN0YXJ0XSkpCisgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgIHRva2VuRW5kID0gcGFpckVu
ZDsKKyAgICB3aGlsZSAodG9rZW5FbmQgPiB0b2tlblN0YXJ0ICYmIGlzX2x3cyhjb29raWVbdG9r
ZW5FbmRdKSkKKyAgICAgICAgdG9rZW5FbmQtLTsKKworICAgIFN0cmluZyB2YWx1ZTsKKyAgICBp
ZiAodG9rZW5FbmQgPT0gdG9rZW5TdGFydCkgeworICAgICAgICAvLyBGaXJlZm94IGFjY2VwdHMg
ZW1wdHkgdmFsdWUgc28gd2Ugd2lsbCBkbyB0aGUgc2FtZQorICAgICAgICB2YWx1ZSA9IFN0cmlu
ZygpOworICAgIH0gZWxzZQorICAgICAgICB2YWx1ZSA9IGNvb2tpZS5zdWJzdHJpbmcodG9rZW5T
dGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0KTsKKworICAgIHJlcy0+c2V0VmFsdWUodmFsdWUp
OworCisgICAgd2hpbGUgKHBhaXJFbmQgPCBlbmQpIHsKKyAgICAgICAgLy8gU3dpdGNoIHRvIHRo
ZSBuZXh0IHBhaXIgYXMgcGFpckVuZCBpcyBvbiB0aGUgJzsnIGFuZCBmYXN0LWZvcndhcmQgYW55
IExXUworICAgICAgICBwYWlyRW5kKys7CisgICAgICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYm
IGlzX2x3cyhjb29raWVbcGFpckVuZF0pKQorICAgICAgICAgICAgcGFpckVuZCsrOworCisgICAg
ICAgIHRva2VuU3RhcnQgPSBwYWlyRW5kOworICAgICAgICB0b2tlbkVuZCA9IHRva2VuU3RhcnQ7
IC8vIGluaXRpbGlhc2l6ZSB0b2tlbiBlbmQgdG8gY2F0Y2ggZmlyc3QgJz0nCisKKyAgICAgICAg
d2hpbGUgKHBhaXJFbmQgPCBlbmQgJiYgY29va2llW3BhaXJFbmRdICE9ICc7JykgeworICAgICAg
ICAgICAgaWYgKHRva2VuRW5kID09IHRva2VuU3RhcnQgJiYgY29va2llW3BhaXJFbmRdID09ICc9
JykKKyAgICAgICAgICAgICAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgICAgICAgICBwYWly
RW5kKys7CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRSA6IHNob3VsZCBJIHNraXAgTFdT
ID8KKworICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSB0b2tlbkVuZCAtIHRva2VuU3RhcnQ7Cisg
ICAgICAgIHVuc2lnbmVkIHRva2VuU3RhcnRTdmcgPSB0b2tlblN0YXJ0OworCisgICAgICAgIFN0
cmluZyBwYXJzZWRWYWx1ZTsKKyAgICAgICAgaWYgKHRva2VuU3RhcnQgIT0gdG9rZW5FbmQpIHsK
KyAgICAgICAgICAgIC8vIFRoZXJlIGlzIGFuIGVxdWFsIHNpZ24gc28gcmVtb3ZlIExXUyBpbiBW
QUxVRQorICAgICAgICAgICAgdG9rZW5TdGFydCA9IHRva2VuRW5kICsgMTsKKyAgICAgICAgICAg
IHdoaWxlICh0b2tlblN0YXJ0IDwgcGFpckVuZCAmJiBpc19sd3MoY29va2llW3Rva2VuU3RhcnRd
KSkKKyAgICAgICAgICAgICAgICB0b2tlblN0YXJ0Kys7CisKKyAgICAgICAgICAgIHRva2VuRW5k
ID0gcGFpckVuZDsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbkVuZCA+IHRva2VuU3RhcnQgJiYg
aXNfbHdzKGNvb2tpZVt0b2tlbkVuZF0pKQorICAgICAgICAgICAgICAgIHRva2VuRW5kLS07CisK
KyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tlblN0YXJ0LCB0
b2tlbkVuZCAtIHRva2VuU3RhcnQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIC8vIElm
IHRoZSBwYXJzZWRWYWx1ZSBpcyBlbXB0eSwgaW5pdGlhbGlzZSBpdCBpbiBjYXNlIHdlIG5lZWQg
aXQKKyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gU3RyaW5nKCk7CisKKyAgICAgICAgLy8gRGV0
ZWN0IHdoaWNoICJjb29raWUtYXYiIGlzIHBhcnNlZAorICAgICAgICAvLyBMb29rIGF0IHRoZSBm
aXJzdCBjaGFyIHRoZW4gcGFyc2UgdGhlIHdob2xlIGZvciBwZXJmb3JtYW5jZSBpc3N1ZQorICAg
ICAgICBzd2l0Y2ggKGNvb2tpZVt0b2tlblN0YXJ0U3ZnXSkgeworICAgICAgICAgICAgY2FzZSAn
UCc6CisgICAgICAgICAgICBjYXNlICdwJyA6IHsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3Ro
ID49IDQgJiYgY29va2llLmZpbmQoImF0aCIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisg
ICAgICAgICAgICAgICAgICAgIHJlcy0+c2V0UGF0aChwYXJzZWRWYWx1ZSk7CisgICAgICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29r
aWUiKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgIGNhc2Ug
J2QnIDogeworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gNiAmJiBjb29raWUuZmluZCgi
b21haW4iLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAg
IC8vIElmIHRoZSBkb21haW4gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIGRvdCwgYWRkIG9uZSBmb3Ig
c2VjdXJpdHkgY2hlY2tzCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWFsRG9tYWluID0g
cGFyc2VkVmFsdWVbMF0gPT0gJy4nID8gcGFyc2VkVmFsdWUgOiAiLiIgKyBwYXJzZWRWYWx1ZTsK
KworICAgICAgICAgICAgICAgICAgICByZXMtPnNldERvbWFpbihyZWFsRG9tYWluKTsKKyAgICAg
ICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkludmFs
aWQgY29va2llIik7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXM7CisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSAnRScgOgorICAgICAgICAg
ICAgY2FzZSAnZScgOiB7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSA3ICYmIGNvb2tp
ZS5maW5kKCJ4cGlyZXMiLCB0b2tlblN0YXJ0U3ZnICsgMSwgZmFsc2UpKQorICAgICAgICAgICAg
ICAgICAgICByZXMtPnNldEV4cGlyeShwYXJzZWRWYWx1ZSk7CisgICAgICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUiKTsKKyAg
ICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBjYXNlICdNJyA6CisgICAgICAgICAgICBjYXNlICdtJyA6IHsK
KyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgY29va2llLmZpbmQoImF4LWFnZSIs
IHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgICAgIHJlcy0+c2V0
TWF4QWdlKHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSIpOworICAgICAgICAgICAgICAgICAg
ICBkZWxldGUgcmVzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGNhc2UgJ0MnIDoKKyAgICAgICAgICAgIGNhc2UgJ2MnIDogeworICAgICAgICAgICAgICAg
IGlmIChsZW5ndGggPj0gNyAmJiBjb29raWUuZmluZCgib21tZW50IiwgdG9rZW5TdGFydFN2ZyAr
IDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgcm9vbSBm
b3IgdGhlIGNvbW1lbnQgcGFydCAoYW5kIHNvIGRvIE1vemlsbGEpIHNvIGp1c3QgbG9nIHRoZSBj
b21tZW50LgorICAgICAgICAgICAgICAgICAgICBMT0coTmV0d29yaywgIkNvbW1lbnQgJXMgZm9y
IENvb2tpZSA6ICVzXG4iLCBwYXJzZWRWYWx1ZS5hc2NpaSgpLmRhdGEoKSwgY29va2llLmFzY2lp
KCkuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAg
TE9HX0VSUk9SKCJJbnZhbGlkIGNvb2tpZSIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUg
cmVzOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2Ug
J1YnIDoKKyAgICAgICAgICAgIGNhc2UgJ3YnIDogeworICAgICAgICAgICAgICAgIGlmIChsZW5n
dGggPj0gNyAmJiBjb29raWUuZmluZCgiZXJzaW9uIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNl
KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZFZhbHVlLnRvSW50KCkgIT0gMSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDb29raWUgdmVyc2lvbiAlZCBub3Qg
c3VwcG9ydGVkIChvbmx5IHN1cHBvcnQgdmVyc2lvbj0xKSIsIHBhcnNlZFZhbHVlLnRvSW50KCkp
OworICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUiKTsK
KyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdTJyA6CisgICAgICAgICAgICBjYXNlICdzJyA6
IHsKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID49IDYgJiYgY29va2llLmZpbmQoImVjdXJl
IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgcmVzLT5z
ZXRTZWN1cmVGbGFnKHRydWUpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgICAgICBMT0dfRVJST1IoIkludmFsaWQgY29va2llIik7CisgICAgICAgICAgICAgICAgICAg
IGRlbGV0ZSByZXM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgZGVmYXVsdCA6IHsKKyAgICAgICAgICAgICAgICAvLyBJZiBsZW5ndGggPT0gMCwgd2Ugc2hv
dWxkIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNvb2tpZSAoY2FzZSA6ICI7XHIiKSBzbyBpZ25vcmUg
aXQKKyAgICAgICAgICAgICAgICBpZiAobGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIExP
R19FUlJPUigiSW52YWxpZCB0b2tlbiIpOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVz
OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0aGUgY29va2ll
IGlzIGFib3ZlIHRoZSBzaXplIGxpbWl0CisgICAgaWYgKHJlcy0+bmFtZSgpLmxlbmd0aCgpICsg
cmVzLT52YWx1ZSgpLmxlbmd0aCgpID4gbWF4X2xlbmd0aCkgeworICAgICAgICBMT0dfRVJST1Io
IkNvb2tpZSAlcyBpcyBhYm92ZSB0aGUgNGtiIGluIGxlbmd0aCA6IFJFSkVDVEVEIiwgY29va2ll
LmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgZGVsZXRlIHJlczsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorCisgICAgLy8gSWYgc29tZSBwYWlyIHdhcyBub3QgcHJvdmlkZWQsIGR1cmluZyBw
YXJzaW5nIHRoZW4gYXBwbHkgc29tZSBkZWZhdWx0IHZhbHVlCisgICAgLy8gdGhlIHJlc3QgaGFz
IGJlZW4gZG9uZSBpbiB0aGUgY29uc3RydWN0b3IuCisKKyAgICAvLyBJZiBubyBkb21haW4gd2Fz
IHByb3ZpZGVkLCBzZXQgaXQgdG8gdGhlIGhvc3QKKyAgICBpZiAoIXJlcy0+ZG9tYWluKCkgfHwg
IXJlcy0+ZG9tYWluKCkubGVuZ3RoKCkpCisgICAgICAgIHJlcy0+c2V0RG9tYWluKHVybC5ob3N0
KCkpOworCisgICAgLy8gSWYgbm8gcGF0aCB3YXMgcHJvdmlkZWQsIHNldCBpdCB0byB0aGUgaG9z
dCdzIHBhdGgKKyAgICBpZiAoIXJlcy0+cGF0aCgpIHx8ICFyZXMtPnBhdGgoKS5sZW5ndGgoKSkK
KyAgICAgICAgcmVzLT5zZXRQYXRoKHVybC5wYXRoKCkpOworCisgICAgcmV0dXJuIHJlczsKK30K
Kwordm9pZCBDb29raWU6OnNldEV4cGlyeShjb25zdCBTdHJpbmcmIGV4cGlyeSkKK3sKKyAgICBp
ZiAoZXhwaXJ5Lmxlbmd0aCgpKSB7CisKKyAgICAgICAgbV9pc1Nlc3Npb24gPSBmYWxzZTsKKwor
ICAgICAgICBtX2V4cGlyeSA9IChkb3VibGUpY3VybF9nZXRkYXRlKGV4cGlyeS5hc2NpaSgpLmRh
dGEoKSwgTlVMTCk7CisKKyAgICAgICAgaWYgKG1fZXhwaXJ5ID09IC0xKSB7CisgICAgICAgICAg
ICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBkYXRlIik7CisgICAgICAgICAgICAvLyBJbiB0
aGlzIGNhc2UsIGNvbnNpZGVyIHRoYXQgdGhlIGNvb2tpZSBpcyBzZXNzaW9uIG9ubHkKKyAgICAg
ICAgICAgIG1faXNTZXNzaW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBD
b29raWU6OnNldE1heEFnZShjb25zdCBTdHJpbmcmIG1heEFnZSkKK3sKKyAgICBib29sIG9rOwor
ICAgIG1fZXhwaXJ5ID0gbWF4QWdlLnRvRG91YmxlKCZvayk7CisgICAgaWYgKG9rICYmIG1fZXhw
aXJ5KSB7CisgICAgICAgIG1faXNTZXNzaW9uID0gZmFsc2U7CisKKyAgICAgICAgLy8gaWYgbWF4
QWdlIGlzIG51bGwsIGtlZXAgdGhlIHZhbHVlIHNvIHRoYXQgaXQgaXMgZGlzY2FyZGVkIGxhdGVy
CisgICAgICAgIGlmIChtX2V4cGlyeSkKKyAgICAgICAgICAgIG1fZXhwaXJ5ICs9IGN1cnJlbnRU
aW1lKCk7CisgICAgfSBlbHNlCisgICAgICAgIExPR19FUlJPUigiQ291bGQgbm90IHBhcnNlIE1h
eC1BZ2UgOiAlcyIsIG1heEFnZS5hc2NpaSgpLmRhdGEoKSk7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkM2ZlMAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZS5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWls
LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgQ29va2llX2gKKyNkZWZpbmUgQ29va2llX2gKKworI2luY2x1ZGUgIktVUkwu
aCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2NsYXNzIENvb2tpZSB7CitwdWJsaWM6CisgICAgLy8gRGVmYXVsdCBjb29raWUgOiBlbXB0eSBk
b21haW4sIG5vbiBzZWN1cmUgYW5kIHNlc3Npb24KKyAgICBDb29raWUoZG91YmxlIGN1cnJlbnRU
aW1lKQorICAgICAgICA6IG1fZG9tYWluKFN0cmluZygpKQorICAgICAgICAsIG1fZXhwaXJ5KDAp
CisgICAgICAgICwgbV9pc1NlY3VyZShmYWxzZSkKKyAgICAgICAgLCBtX2lzU2Vzc2lvbih0cnVl
KQorICAgICAgICAsIG1fbGFzdEFjY2Vzc2VkKGN1cnJlbnRUaW1lKQorICAgIHsKKyAgICB9CisK
KyAgICAvLyBGb3IgZGF0YWJhc2UgY29va2llcworICAgIENvb2tpZShjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25zdCBTdHJp
bmcmIHBhdGgsIGRvdWJsZSYgZXhwaXJ5LCBkb3VibGUmIGxhc3RBY2Nlc3NlZCwgYm9vbCYgaXNT
ZWN1cmUpCisgICAgICAgIDogbV9uYW1lKG5hbWUpCisgICAgICAgICwgbV92YWx1ZSh2YWx1ZSkK
KyAgICAgICAgLCBtX2RvbWFpbihkb21haW4pCisgICAgICAgICwgbV9wYXRoKHBhdGgpCisgICAg
ICAgICwgbV9leHBpcnkoZXhwaXJ5KQorICAgICAgICAsIG1faXNTZWN1cmUoaXNTZWN1cmUpCisg
ICAgICAgICwgbV9pc1Nlc3Npb24oZmFsc2UpCisgICAgICAgICwgbV9sYXN0QWNjZXNzZWQobGFz
dEFjY2Vzc2VkKQorICAgIHsKKyAgICB9CisKKyAgICB+Q29va2llKCkKKyAgICB7CisgICAgfQor
CisgICAgY29uc3QgU3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisgICAg
dm9pZCBzZXROYW1lKGNvbnN0IFN0cmluZyYgbmFtZSkgeyBtX25hbWUgPSBuYW1lOyB9CisKKyAg
ICBjb25zdCBTdHJpbmcmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorICAgIHZv
aWQgc2V0VmFsdWUoY29uc3QgU3RyaW5nJiB2YWx1ZSkgeyBtX3ZhbHVlID0gdmFsdWU7IH0KKwor
ICAgIGNvbnN0IFN0cmluZyYgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF0aDsgfQorICAgIHZv
aWQgc2V0UGF0aChjb25zdCBTdHJpbmcmIHBhdGgpIHsgbV9wYXRoID0gcGF0aDsgfQorCisgICAg
Y29uc3QgU3RyaW5nJiBkb21haW4oKSBjb25zdCB7IHJldHVybiBtX2RvbWFpbjsgfQorICAgIHZv
aWQgc2V0RG9tYWluKGNvbnN0IFN0cmluZyYgZG9tYWluKSB7IG1fZG9tYWluID0gZG9tYWluOyB9
CisKKyAgICBkb3VibGUgZXhwaXJ5KCkgY29uc3QgeyByZXR1cm4gbV9leHBpcnk7IH0KKyAgICB2
b2lkIHNldEV4cGlyeShjb25zdCBTdHJpbmcmIGV4cGlyeSk7CisgICAgdm9pZCBzZXRNYXhBZ2Uo
Y29uc3QgU3RyaW5nJiBtYXhBZ2UpOworCisgICAgZG91YmxlIGxhc3RBY2Nlc3NlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fbGFzdEFjY2Vzc2VkOyB9CisgICAgdm9pZCBzZXRMYXN0QWNjZXNzZWQoZG91
YmxlIGxhc3RBY2Nlc3NlZCkgeyBtX2xhc3RBY2Nlc3NlZCA9IGxhc3RBY2Nlc3NlZDt9CisKKyAg
ICBib29sIGlzU2VjdXJlKCkgY29uc3QgeyByZXR1cm4gbV9pc1NlY3VyZTsgfQorICAgIHZvaWQg
c2V0U2VjdXJlRmxhZyhib29sIHNlY3VyZSkgeyBtX2lzU2VjdXJlID0gc2VjdXJlOyB9CisKKyAg
ICBib29sIGlzU2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1faXNTZXNzaW9uOyB9CisKKyAgICBz
dGF0aWMgQ29va2llKiBwYXJzZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2ll
LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kLCBkb3VibGUgY3VyVGltZSk7CisKK3ByaXZh
dGU6CisgICAgU3RyaW5nIG1fbmFtZTsKKyAgICBTdHJpbmcgbV92YWx1ZTsKKyAgICBTdHJpbmcg
bV9kb21haW47CisgICAgU3RyaW5nIG1fcGF0aDsKKyAgICBkb3VibGUgbV9leHBpcnk7CisgICAg
Ym9vbCBtX2lzU2VjdXJlOworCisgICAgYm9vbCBtX2lzU2Vzc2lvbjsKKworICAgIHN0YXRpYyBp
bmxpbmUgYm9vbCBpc19sd3MoVUNoYXIgYyk7CisKKyAgICAvLyB0byBtYW5hZ2UgTFJVIHJlcGxh
Y2VtZW50IHBvbGljeQorICAgIGRvdWJsZSBtX2xhc3RBY2Nlc3NlZDsKKworICAgIC8vIENvbnN0
YW50cworICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2xlbmd0aCA9IDQwOTY7IC8vIENvb2tpZSBz
aXplIGxpbWl0IDRrQiBwZXIgUkZDMjEwOQorfTsKKworfSAvLyBOYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tp
ZU1hbmFnZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdl
ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0Njg3NwotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIu
Y3BwCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBKdWxpZW4gQ2hhZmZy
YWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lu
Y2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRl
ICJTUUxpdGVTdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIENvb2tpZU1hbmFnZXIqIHNoYXJlZE1hbmFnZXIgPSAwOwor
CitDb29raWVNYW5hZ2VyKiBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2VyKCkKK3sKKyAg
ICBpZiAoIXNoYXJlZE1hbmFnZXIpCisgICAgICAgIHNoYXJlZE1hbmFnZXIgPSBuZXcgQ29va2ll
TWFuYWdlcigpOworICAgIHJldHVybiBzaGFyZWRNYW5hZ2VyOworfQorCitDb29raWVNYW5hZ2Vy
OjpDb29raWVNYW5hZ2VyKCkKKyAgICA6IG1fY291bnQoMCkKKyAgICAsIG1fZGIoKQoreworICAg
IC8vIEtlZXAgb3VyIGluc3RhbmNlIGFzIHdlIG1heSBjYWxsIENvb2tpZU1hbmFnZXI6OmdldENv
b2tpZU1hbmFnZXIgbGF0ZXIuCisgICAgaWYgKCFzaGFyZWRNYW5hZ2VyKQorICAgICAgICBzaGFy
ZWRNYW5hZ2VyID0gdGhpczsKKworICAgIG1fY29va2llSmFyRmlsZU5hbWUgPSBTdHJpbmcoImNv
b2tpZUNvbGxlY3Rpb24uZGIiKTsKKworICAgIGdldERhdGFiYXNlQ29va2llcygpOworfQorCitD
b29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgLy8gRGVzdHJveSBhbGwgQ29v
a2llTWFwcy4KKyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3Ig
aXQgPSBtX21hbmFnZXJNYXAuYmVnaW4oKTsgaXQgIT0gbV9tYW5hZ2VyTWFwLmVuZCgpOyArK2l0
KQorICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKK30KKworYm9vbCBDb29raWVNYW5hZ2VyOjpp
c19jb29raWVfc2VwKFVDaGFyIGMpCit7CisgICAgcmV0dXJuIChjID09ICdccicgfHwgYyA9PSdc
bicpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBLVVJMJiBwb2xpY3lVUkwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgdW5z
aWduZWQgY29va2llU3RhcnQsIGNvb2tpZUVuZCA9IDA7CisKKyAgICBkb3VibGUgY3VyVGltZSA9
IGN1cnJlbnRUaW1lKCk7CisKKyAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGhlYWRlciB0byBwYXJz
ZSBhbGwgdGhlIGNvb2tpZXMuCisgICAgd2hpbGUgKGNvb2tpZUVuZCA8PSB2YWx1ZS5sZW5ndGgo
KSkgeworICAgICAgICBjb29raWVTdGFydCA9IGNvb2tpZUVuZDsKKworICAgICAgICAvLyBGaW5k
IGEgY29va2llIHNlcGFyYXRvci4KKyAgICAgICAgd2hpbGUgKGNvb2tpZUVuZCA8PSB2YWx1ZS5s
ZW5ndGgoKSAmJiAhaXNfY29va2llX3NlcCh2YWx1ZVtjb29raWVFbmRdKSkKKyAgICAgICAgICAg
IGNvb2tpZUVuZCsrOworCisgICAgICAgIENvb2tpZSogY29va2llID0gQ29va2llOjpwYXJzZSh1
cmwsIHZhbHVlLCBjb29raWVTdGFydCwgY29va2llRW5kIC0gMSwgY3VyVGltZSk7CisKKyAgICAg
ICAgaWYgKCFjb29raWUpIHsKKyAgICAgICAgICAgIExPR19FUlJPUigiSW52YWxpZCBjb29raWUg
c3RyaW5nIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IFNlY3VyaXR5IGNoZWNrcy4KKyAgICAgICAgaWYgKCFzaG91bGRSZWplY3QoY29va2llLCB1cmwp
KQorICAgICAgICAgICAgY2hlY2tBbmRUcmVhdENvb2tpZShjb29raWUpOworICAgICAgICBlbHNl
IHsKKyAgICAgICAgICAgIExPR19FUlJPUigiQ29va2llICVzIHdhcyByZWplY3RlZCBmb3Igc2Vj
dXJpdHkgcmVhc29uIiwgdmFsdWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgZGVsZXRl
IGNvb2tpZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBDb29raWVNYW5hZ2VyOjpzaG91
bGRSZWplY3QoY29uc3QgQ29va2llKiBjb29raWUsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBw
cmludGYoIiBDb29raWUgcGF0aCA6ICVzIFxuIFVSTCBwYXRoIDogJXNcblxuIiwgY29va2llLT5w
YXRoKCkuYXNjaWkoKS5kYXRhKCksIHVybC5wYXRoKCkuYXNjaWkoKS5kYXRhKCkpOworCisgICAg
Ly8gQ2hlY2sgaWYgcGF0aCBhdHRyaWJ1dGUgaXMgYSBwcmVmaXggb2YgdGhlIHJlcXVlc3QgVVJJ
LgorICAgIGlmICghY29va2llLT5wYXRoKCkuZmluZCh1cmwucGF0aCgpKSA9PSAtMSkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICBwcmludGYgKCJDb29raWUgZG9tYWluIDogJXMgXG4gVVJM
IGRvbWFpbiA6ICVzIFxuXG4iLCBjb29raWUtPmRvbWFpbigpLmFzY2lpKCkuZGF0YSgpLCB1cmwu
aG9zdCgpLmFzY2lpKCkuZGF0YSgpKTsKKworICAgIC8vIENoZWNrIGlmIGRvbWFpbiBzdGFydCB3
aXRoIGEgZG90IGFuZCBjb250YWlucyBhbiBlbWJlZGRlZCBkb3QuCisgICAgaWYgKGNvb2tpZS0+
ZG9tYWluKClbMF0gIT0gJy4nIHx8IGNvb2tpZS0+ZG9tYWluKCkuZmluZCgiLiIsIDEpID09IC0x
IHx8IGNvb2tpZS0+ZG9tYWluKCkuZmluZCgiLiIsIDEpID09IGNvb2tpZS0+ZG9tYWluKCkubGVu
Z3RoKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gVGhlIHJlcXVlc3QgaG9zdCBz
aG91bGQgZG9tYWluIG1hdGNoIHRoZSBEb21haW4gYXR0cmlidXRlLgorICAgIGludCBkaWZmUG9z
ID0gdXJsLmhvc3QoKS5maW5kKGNvb2tpZS0+ZG9tYWluKCkpOworICAgIGlmIChkaWZmUG9zID09
IC0xKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBXZSBzaG91bGQgY2hlY2sgZm9yIGFu
IGVtYmVkZGVkIGRvdCBpbiB0aGUgcG9ydGlvbiBvZiBzdHJpbmcgaW4gdGhlIGhvc3Qgbm90IGlu
IHRoZSBkb21haW4KKyAgICAvLyBidXQgdG8gbWF0Y2ggZmlyZWZveCBiZWhhdmlvdXIgd2UgZG8g
bm90LgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgQ29va2llTWFuYWdlcjo6Z2V0
Q29va2llKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAgIEtVUkwga3VybCA9IEtVUkwodXJsKTsK
KyAgICByZXR1cm4gZ2V0Q29va2llKGt1cmwpOworfQorCitTdHJpbmcgQ29va2llTWFuYWdlcjo6
Z2V0Q29va2llKGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBib29sIGlzQ29ubmVjdGlvblNlY3Vy
ZSA9IGZhbHNlOworCisgICAgaWYgKHVybC5zdHJpbmcoKS5zdGFydHNXaXRoKFN0cmluZygiaHR0
cHM6IiwgZmFsc2UpKSkKKyAgICAgICAgaXNDb25uZWN0aW9uU2VjdXJlID0gdHJ1ZTsKKworICAg
IFN0cmluZyByZXMgPSBTdHJpbmcoKTsKKyAgICBkb3VibGUgY3VyVGltZSA9IGN1cnJlbnRUaW1l
KCk7CisKKyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQg
PSBtX21hbmFnZXJNYXAuYmVnaW4oKTsgaXQgIT0gbV9tYW5hZ2VyTWFwLmVuZCgpOyArK2l0KSB7
CisgICAgICAgIC8vIEhhbmRsZSBzdWItZG9tYWluIGJ5IG9ubHkgbG9va2luZyBhdCB0aGUgZW5k
IG9mIHRoZSBob3N0LgorICAgICAgICBpZiAoaXQtPmZpcnN0LmVuZHNXaXRoKHVybC5ob3N0KCkp
IHx8IChpdC0+Zmlyc3Quc3RhcnRzV2l0aCgiLiIsIGZhbHNlKSAmJiAoIi4iICsgdXJsLmhvc3Qo
KSkuZW5kc1dpdGgoaXQtPmZpcnN0LCBmYWxzZSkpKSB7CisKKyAgICAgICAgICAgIC8vIEdldCBD
b29raWVNYXAgdG8gY2hlY2sgZm9yIGV4cGlyZWQgY29va2llcy4KKyAgICAgICAgICAgIEhhc2hN
YXA8U3RyaW5nLCBDb29raWUqPiBjdXJNYXAgPSBpdC0+c2Vjb25kLT5nZXRDb29raWVNYXAoKTsK
KyAgICAgICAgICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZSo+OjppdGVyYXRvciBpdENv
b2tpZSA9IGN1ck1hcC5iZWdpbigpOyBpdENvb2tpZSAhPSBjdXJNYXAuZW5kKCk7ICsraXRDb29r
aWUpIHsKKyAgICAgICAgICAgICAgICBDb29raWUqIGN1ckNvb2tpZSA9IGl0Q29va2llLT5zZWNv
bmQ7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG5vbiBzZXNzaW9uIGNvb2tpZSBleHBp
cmVkLgorICAgICAgICAgICAgICAgIGlmICghY3VyQ29va2llLT5pc1Nlc3Npb24oKSAmJiBjdXJD
b29raWUtPmV4cGlyeSgpIDwgY3VyVGltZSkgeworICAgICAgICAgICAgICAgICAgICBMT0coTmV0
d29yaywgIkNvb2tpZSBuYW1lOiAlcyB2YWx1ZTogJXMgcGF0aDogJXMgIGV4cGlyZWQiLCBjdXJD
b29raWUtPm5hbWUoKS5hc2NpaSgpLmRhdGEoKSwgY3VyQ29va2llLT52YWx1ZSgpLmFzY2lpKCku
ZGF0YSgpLCBjdXJDb29raWUtPnBhdGgoKS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAg
ICAgICAgIGN1ck1hcC50YWtlKGl0Q29va2llLT5maXJzdCk7CisgICAgICAgICAgICAgICAgICAg
IHJlbW92ZUNvb2tpZUZyb21EYXRhYmFzZShjdXJDb29raWUpOworICAgICAgICAgICAgICAgICAg
ICByZW1vdmVkQ29va2llKCk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjdXJDb29raWU7
CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRl
IGxhc3QgYWNjZXNzZWQgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+dXBk
YXRlVGltZShjdXJDb29raWUsIGN1clRpbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICh1
cmwucGF0aCgpLnN0YXJ0c1dpdGgoY3VyQ29va2llLT5wYXRoKCksIGZhbHNlKSAmJiAoaXNDb25u
ZWN0aW9uU2VjdXJlIHx8ICFjdXJDb29raWUtPmlzU2VjdXJlKCkpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgcmVzICs9IGN1ckNvb2tpZS0+bmFtZSgpICsgIj0iICsgY3VyQ29va2llLT52YWx1
ZSgpICsgIjsiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQor
ICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6cmVtb3Zl
QWxsQ29va2llcyhib29sIHNob3VsZFJlbW92ZUZyb21EYXRhYmFzZSkKK3sKKyAgICBmb3IgKEhh
c2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPjo6aXRlcmF0b3IgaXQgPSBtX21hbmFnZXJNYXAuYmVn
aW4oKTsgaXQgIT0gbV9tYW5hZ2VyTWFwLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEhhc2hNYXA8
U3RyaW5nLCBDb29raWUqPiBjdXJNYXAgPSBpdC0+c2Vjb25kLT5nZXRDb29raWVNYXAoKTsKKyAg
ICAgICAgZm9yIChIYXNoTWFwPFN0cmluZywgQ29va2llKj46Oml0ZXJhdG9yIGl0Q29va2llID0g
Y3VyTWFwLmJlZ2luKCk7IGl0Q29va2llICE9IGN1ck1hcC5lbmQoKTsgKytpdENvb2tpZSkgewor
ICAgICAgICAgICAgaWYgKHNob3VsZFJlbW92ZUZyb21EYXRhYmFzZSAmJiAhaXRDb29raWUtPnNl
Y29uZC0+aXNTZXNzaW9uKCkpCisgICAgICAgICAgICAgICAgcmVtb3ZlQ29va2llRnJvbURhdGFi
YXNlKGl0Q29va2llLT5zZWNvbmQpOworICAgICAgICAgICAgZGVsZXRlIGl0Q29va2llLT5zZWNv
bmQ7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAg
bV9jb3VudCA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0Q29va2llSmFyKGNvbnN0
IGNoYXIqIGZpbGVOYW1lKQoreworICAgIG1fY29va2llSmFyRmlsZU5hbWUgPSBTdHJpbmcoZmls
ZU5hbWUpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OmNoZWNrQW5kVHJlYXRDb29raWUoQ29v
a2llKiBjb29raWUpCit7CisgICAgQVNTRVJUKGNvb2tpZS0+ZG9tYWluKCkubGVuZ3RoKCkpOwor
CisgICAgQ29va2llTWFwKiBjdXJNYXAgPSBtX21hbmFnZXJNYXAuZ2V0KGNvb2tpZS0+ZG9tYWlu
KCkpOworCisgICAgLy8gQ2hlY2sgZm9yIGNvb2tpZSB0byByZW1vdmUgaW4gY2FzZSBpdCBpcyBu
b3QgYSBzZXNzaW9uIGNvb2tpZSBhbmQgaXQgaGFzIGV4cGlyZWQuCisgICAgaWYgKCFjb29raWUt
PmlzU2Vzc2lvbigpICYmIGNvb2tpZS0+ZXhwaXJ5KCkgPCBjdXJyZW50VGltZSgpKSB7CisgICAg
ICAgIC8vIFRoZSBjb29raWUgaGFzIGV4cGlyZWQgc28gY2hlY2sgd2UgaGF2ZSBhIHZhbGlkIEhh
c2hNYXAgc28gdHJ5IGRlbGV0ZSBpdC4KKyAgICAgICAgaWYgKGN1ck1hcCkgeworICAgICAgICAg
ICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNvb2tpZSB0byByZW1vdmUgYW5kIHVwZGF0ZSBpbmZv
cm1hdGlvbiBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgIENvb2tpZSogcHJldkNvb2tpZSA9IGN1
ck1hcC0+dGFrZVByZXZpb3VzKGNvb2tpZSk7CisgICAgICAgICAgICBpZiAocHJldkNvb2tpZSkg
eworICAgICAgICAgICAgICAgIHJlbW92ZUNvb2tpZUZyb21EYXRhYmFzZShjb29raWUpOworICAg
ICAgICAgICAgICAgIHJlbW92ZWRDb29raWUoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgY29v
a2llOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYg
KCFjdXJNYXApIHsKKyAgICAgICAgICAgIGN1ck1hcCA9IG5ldyBDb29raWVNYXAoKTsKKyAgICAg
ICAgICAgIG1fbWFuYWdlck1hcC5hZGQoY29va2llLT5kb21haW4oKSwgY3VyTWFwKTsKKyAgICAg
ICAgICAgIGFkZENvb2tpZVRvTWFwKGN1ck1hcCwgY29va2llKTsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcHJldmlvdXMgY29va2llLgorICAg
ICAgICAgICAgQ29va2llKiBwcmV2Q29va2llID0gY3VyTWFwLT50YWtlUHJldmlvdXMoY29va2ll
KTsKKworICAgICAgICAgICAgaWYgKHByZXZDb29raWUpIHsKKyAgICAgICAgICAgICAgICB1cGRh
dGUoY3VyTWFwLCBwcmV2Q29va2llLCBjb29raWUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBw
cmV2Q29va2llOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYWRkQ29va2ll
VG9NYXAoY3VyTWFwLCBjb29raWUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvb2tp
ZU1hbmFnZXI6OmFkZENvb2tpZVRvTWFwKENvb2tpZU1hcCogbWFwLCBDb29raWUqIGNvb2tpZSkK
K3sKKyAgICAvLyBDaGVjayBpZiB3ZSBkbyBub3QgaGF2ZSByZWFjaGVkIHRoZSBjb29raWUncyB0
aHJlc2hvbGQuCisgICAgLy8gRklYTUUgOiBzaG91bGQgc3BsaXQgdGhlIGNhc2UgYW5kIHJlbW92
ZSBvbmUgY29va2llIGFtb25nIGFsbCB0aGUgb3RoZXIgaWYgbV9jb3VudCA+PSBtYXhfY291bnQK
KyAgICBpZiAoIW1hcC0+Y2FuSW5zZXJ0Q29va2llKCkgfHwgbV9jb3VudCA+PSBtYXhfY291bnQp
IHsKKyAgICAgICAgQ29va2llKiBybUNvb2tpZSA9IG1hcC0+cmVtb3ZlT2xkZXN0Q29va2llKCk7
CisgICAgICAgIHJlbW92ZUNvb2tpZUZyb21EYXRhYmFzZShybUNvb2tpZSk7CisgICAgICAgIHJl
bW92ZWRDb29raWUoKTsKKyAgICAgICAgZGVsZXRlIHJtQ29va2llOworICAgIH0KKworICAgIG1h
cC0+YWRkKGNvb2tpZSk7CisgICAgLy8gT25seSBhZGQgbm9uIHNlc3Npb24gY29va2llIHRvIHRo
ZSBkYXRhYmFzZS4KKyAgICBpZiAoIWNvb2tpZS0+aXNTZXNzaW9uKCkpCisgICAgICAgIGluc2Vy
dENvb2tpZUludG9EYXRhYmFzZShjb29raWUpOworICAgIG1fY291bnQrKzsKK30KKwordm9pZCBD
b29raWVNYW5hZ2VyOjp1cGRhdGUoQ29va2llTWFwKiBtYXAsIENvb2tpZSogcHJldkNvb2tpZSwg
Q29va2llKiBuZXdDb29raWUpCit7CisgICAgQVNTRVJUKCFtYXAtPnRha2VQcmV2aW91cyhwcmV2
Q29va2llKSk7CisgICAgbWFwLT5hZGQobmV3Q29va2llKTsKKyAgICB1cGRhdGVEYXRhYmFzZUVu
dHJ5KG5ld0Nvb2tpZSk7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6Z2V0RGF0YWJhc2VDb29r
aWVzKCkKK3sKKyAgICBpZiAoIW1fZGIuaXNPcGVuKCkgJiYgIW1fZGIub3BlbihtX2Nvb2tpZUph
ckZpbGVOYW1lKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBvcGVuIHRoZSBjb29raWUg
ZGF0YWJhc2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQg
dGhlIGRhdGFiYXNlIGlzIGNvcnJlY3RseSBpbml0aWFsaXplZC4KKyAgICBpZiAoIW1fZGIudGFi
bGVFeGlzdHMoU3RyaW5nKCJjb29raWVzIikpKSB7CisgICAgICAgIG1fZGIuY2xvc2UoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFByb2JsZW0gaWYgdGhlIGRhdGFiYXNlIGlz
IG5vdCBjb25uZWN0ZWQKKyAgICBTUUxpdGVTdGF0ZW1lbnQgc2VsZWN0KG1fZGIsICJTRUxFQ1Qg
bmFtZSwgdmFsdWUsIGhvc3QsIHBhdGgsIGV4cGlyeSwgbGFzdEFjY2Vzc2VkLCBpc1NlY3VyZSBG
Uk9NIGNvb2tpZXM7Iik7CisKKyAgICBpZiAoc2VsZWN0LnByZXBhcmUoKSkgeworICAgICAgICBM
T0dfRVJST1IoIkNhbm5vdCByZXRyaWV2ZWQgY29va2llcyBpbiB0aGUgZGF0YWJhc2UiKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzZWxlY3Quc3RlcCgpID09IFNRTFJl
c3VsdFJvdykgeworICAgICAgICAvLyBUaGVyZSBpcyBhIHJvdyB0byBmZXRjaAorCisgICAgICAg
IFN0cmluZyBuYW1lLCB2YWx1ZSwgZG9tYWluLCBwYXRoOworICAgICAgICBkb3VibGUgZXhwaXJ5
LCBsYXN0QWNjZXNzZWQ7CisgICAgICAgIGJvb2wgaXNTZWN1cmU7CisKKyAgICAgICAgbmFtZSA9
IHNlbGVjdC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICB2YWx1ZSA9IHNlbGVjdC5nZXRDb2x1
bW5UZXh0KDEpOworICAgICAgICBkb21haW4gPSBzZWxlY3QuZ2V0Q29sdW1uVGV4dCgyKTsKKyAg
ICAgICAgcGF0aCA9IHNlbGVjdC5nZXRDb2x1bW5UZXh0KDMpOworICAgICAgICBleHBpcnkgPSBz
ZWxlY3QuZ2V0Q29sdW1uRG91YmxlKDQpOworICAgICAgICBsYXN0QWNjZXNzZWQgPSBzZWxlY3Qu
Z2V0Q29sdW1uRG91YmxlKDUpOworICAgICAgICBpc1NlY3VyZSA9IChzZWxlY3QuZ2V0Q29sdW1u
SW50KDYpICE9IDApOworCisgICAgICAgIENvb2tpZSogbmV3Q29va2llID0gbmV3IENvb2tpZShu
YW1lLCB2YWx1ZSwgZG9tYWluLCBwYXRoLCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgaXNTZWN1cmUp
OworCisgICAgICAgIGlmIChleHBpcnkgPiBjdXJyZW50VGltZSgpKSB7CisKKyAgICAgICAgICAg
IENvb2tpZU1hcCogY3VyTWFwID0gbV9tYW5hZ2VyTWFwLmdldChuZXdDb29raWUtPmRvbWFpbigp
KTsKKyAgICAgICAgICAgIGlmICghY3VyTWFwKSB7CisgICAgICAgICAgICAgICAgY3VyTWFwID0g
bmV3IENvb2tpZU1hcCgpOworICAgICAgICAgICAgICAgIG1fbWFuYWdlck1hcC5hZGQobmV3Q29v
a2llLT5kb21haW4oKSwgY3VyTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVz
ZSB0aGUgc3RyYWlnaHRmb3J3YXJkIGFkZAorICAgICAgICAgICAgY3VyTWFwLT5hZGQobmV3Q29v
a2llKTsKKyAgICAgICAgICAgIG1fY291bnQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIHJlbW92ZUNvb2tpZUZyb21EYXRhYmFzZShuZXdDb29raWUpOworICAgICAgICAgICAgZGVs
ZXRlIG5ld0Nvb2tpZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gV2UgaGF2ZSB0byBiZSBj
YXJlZnVsIGFzIHdlIGRvIG5vdCBrbm93IGlmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0ZWQsIHdo
aWNoIGNvdWxkIGluZHVjZSBtX2NvdW50IGxlYWtzCit2b2lkIENvb2tpZU1hbmFnZXI6Omluc2Vy
dENvb2tpZUludG9EYXRhYmFzZShjb25zdCBDb29raWUqIGNvb2tpZSkKK3sKKyAgICBpZiAoIW1f
ZGIuaXNPcGVuKCkgJiYgIW1fZGIub3BlbihtX2Nvb2tpZUphckZpbGVOYW1lKSkgeworICAgICAg
ICBMT0dfRVJST1IoIkNhbm5vdCBvcGVuIHRoZSBjb29raWUgZGF0YWJhc2UiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9kYi50YWJsZUV4aXN0cyhTdHJpbmcoImNvb2tp
ZXMiKSkpCisgICAgICAgIC8vIE1vemlsbGEgdXNlcyBpc0h0dHBPbmx5IHdoaWNoIGlzIG5vdCBp
bmNsdWRlZCBhcyB3ZSBkbyBub3QgdXNlIGl0CisgICAgICAgIG1fZGIuZXhlY3V0ZUNvbW1hbmQo
U3RyaW5nKCJDUkVBVEUgVEFCTEUgY29va2llcyAobmFtZSBURVhULCB2YWx1ZSBURVhULCBob3N0
IFRFWFQsIHBhdGggVEVYVCwgZXhwaXJ5IERPVUJMRSwgbGFzdEFjY2Vzc2VkIERPVUJMRSwgaXNT
ZWN1cmUgSU5URUdFUik7IikpOworCisgICAgU1FMaXRlU3RhdGVtZW50IGluc2VydChtX2RiLCBT
dHJpbmcoIklOU0VSVCBJTlRPIGNvb2tpZXMgKG5hbWUsIHZhbHVlLCBob3N0LCBwYXRoLCBleHBp
cnksIGxhc3RBY2Nlc3NlZCwgaXNTZWN1cmUpIFZBTFVFUyAoPzEsID8yLCA/MywgPzQsID81LCA/
NiwgPzcpOyIpKTsKKworICAgIGlmIChpbnNlcnQucHJlcGFyZSgpKSB7CisgICAgICAgIExPR19F
UlJPUigiQ2Fubm90IHNhdmUgY29va2llIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBCaW5kcyBhbGwgdGhlIHZhbHVlcworICAgIGlmIChpbnNlcnQuYmluZFRleHQoMSwgY29v
a2llLT5uYW1lKCkpIHx8IGluc2VydC5iaW5kVGV4dCgyLCBjb29raWUtPnZhbHVlKCkpIHx8IGlu
c2VydC5iaW5kVGV4dCgzLCBjb29raWUtPmRvbWFpbigpKSB8fCBpbnNlcnQuYmluZFRleHQoNCwg
Y29va2llLT5wYXRoKCkpIHx8IGluc2VydC5iaW5kRG91YmxlKDUsIGNvb2tpZS0+ZXhwaXJ5KCkp
IHx8IGluc2VydC5iaW5kRG91YmxlKDYsIGNvb2tpZS0+bGFzdEFjY2Vzc2VkKCkpIHx8IGluc2Vy
dC5iaW5kSW50NjQoNywgY29va2llLT5pc1NlY3VyZSgpKSkgeworICAgICAgICBMT0dfRVJST1Io
IkNhbm5vdCBzYXZlIGNvb2tpZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYg
KCFpbnNlcnQuZXhlY3V0ZUNvbW1hbmQoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBz
YXZlIGNvb2tpZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2b2lkIENvb2tpZU1h
bmFnZXI6OnVwZGF0ZURhdGFiYXNlRW50cnkoY29uc3QgQ29va2llKiBjb29raWUpCit7CisgICAg
aWYgKCFtX2RiLmlzT3BlbigpICYmICFtX2RiLm9wZW4obV9jb29raWVKYXJGaWxlTmFtZSkpIHsK
KyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3Qgb3BlbiB0aGUgY29va2llIGRhdGFiYXNlIik7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlQobV9kYi50YWJsZUV4aXN0cyhTdHJp
bmcoImNvb2tpZXMiKSkpOworCisgICAgLy8gdGhlIHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4g
dG8gbWF0Y2ggQ29va2llTWFwIGtleQorICAgIFNRTGl0ZVN0YXRlbWVudCB1cGRhdGUobV9kYiwg
U3RyaW5nKCJVUERBVEUgY29va2llcyBTRVQgbmFtZSA9ID8xLCB2YWx1ZSA9ID8yLCBob3N0ID0g
PzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nlc3NlZCA9ID82LCBpc1NlY3VyZSA9
ID83IHdoZXJlIG5hbWUgPSA/MSBhbmQgaG9zdCA9ID8zIGFuZCBwYXRoID0gPzQ7IikpOworCisg
ICAgaWYgKHVwZGF0ZS5wcmVwYXJlKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgdXBk
YXRlIGNvb2tpZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gQmluZHMgYWxs
IHRoZSB2YWx1ZXMKKyAgICBpZiAodXBkYXRlLmJpbmRUZXh0KDEsIGNvb2tpZS0+bmFtZSgpKSB8
fCB1cGRhdGUuYmluZFRleHQoMiwgY29va2llLT52YWx1ZSgpKSB8fCB1cGRhdGUuYmluZFRleHQo
MywgY29va2llLT5wYXRoKCkpIHx8IHVwZGF0ZS5iaW5kVGV4dCg0LCBjb29raWUtPmRvbWFpbigp
KSB8fCB1cGRhdGUuYmluZERvdWJsZSg1LCBjb29raWUtPmV4cGlyeSgpKSB8fCB1cGRhdGUuYmlu
ZERvdWJsZSg2LCBjb29raWUtPmxhc3RBY2Nlc3NlZCgpKSB8fCB1cGRhdGUuYmluZEludDY0KDcs
IGNvb2tpZS0+aXNTZWN1cmUoKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgdXBkYXRl
IGNvb2tpZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCF1cGRhdGUuZXhl
Y3V0ZUNvbW1hbmQoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCB1cGRhdGUgY29va2ll
Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6cmVt
b3ZlQ29va2llRnJvbURhdGFiYXNlKGNvbnN0IENvb2tpZSogY29va2llKQoreworICAgIGlmICgh
bV9kYi5pc09wZW4oKSAmJiAhbV9kYi5vcGVuKG1fY29va2llSmFyRmlsZU5hbWUpKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ2Fubm90IG9wZW4gdGhlIGNvb2tpZSBkYXRhYmFzZSIpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYoIW1fZGIudGFibGVFeGlzdHMoU3RyaW5nKCJjb29r
aWVzIikpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyB0aGUgd2hlcmUgc3RhdGVtZW50IGlz
IGNob3NlbiB0byBtYXRjaCBDb29raWVNYXAga2V5CisgICAgU1FMaXRlU3RhdGVtZW50IGRlbGV0
ZVN0bXQobV9kYiwgU3RyaW5nKCJERUxFVEUgRlJPTSBjb29raWVzIFdIRVJFIG5hbWU9PzEgYW5k
IGhvc3Q9PzIgYW5kIHBhdGg9PzM7IikpOworCisgICAgaWYgKGRlbGV0ZVN0bXQucHJlcGFyZSgp
KSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGRlbGV0ZSBjb29raWUiKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIEJpbmRzIGFsbCB0aGUgdmFsdWVzCisgICAgaWYgKGRl
bGV0ZVN0bXQuYmluZFRleHQoMSwgY29va2llLT5uYW1lKCkpIHx8IGRlbGV0ZVN0bXQuYmluZFRl
eHQoMiwgY29va2llLT5kb21haW4oKSkgfHwgZGVsZXRlU3RtdC5iaW5kVGV4dCgzLCBjb29raWUt
PnBhdGgoKSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNvb2tpZSIpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkZWxldGVTdG10LmV4ZWN1dGVDb21t
YW5kKCkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNvb2tpZSBmcm9tIGRh
dGFiYXNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1h
bmFnZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTAyOTFkCi0tLSAvZGV2L251bGwK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCkBAIC0w
LDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEp1bGllbiBDaGFmZnJhaXggPGp1bGll
bi5jaGFmZnJhaXhAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29v
a2llTWFuYWdlcl9oCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkNvb2tpZS5o
IgorI2luY2x1ZGUgIkNvb2tpZU1hcC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNRTGl0ZURhdGFiYXNlLmgiCisjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBDb29raWVNYW5h
Z2VyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgQ29va2llTWFuYWdlciogZ2V0Q29va2llTWFuYWdl
cigpOworCisgICAgdm9pZCBzZXRDb29raWVzKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgS1VSTCYg
cG9saWN5VVJMLCBjb25zdCBTdHJpbmcmIHZhbHVlKTsKKworICAgIFN0cmluZyBnZXRDb29raWUo
Y29uc3QgS1VSTCYgdXJsKTsKKyAgICBTdHJpbmcgZ2V0Q29va2llKGNvbnN0IFN0cmluZyYgdXJs
KTsKKworICAgIHZvaWQgcmVtb3ZlQWxsQ29va2llcyhib29sIHNob3VsZFJlbW92ZUZyb21EYXRh
YmFzZSA9IHRydWUpOworCisgICAgdW5zaWduZWQgc2hvcnQgY29va2llc0NvdW50KCkgeyByZXR1
cm4gbV9jb3VudDsgfQorCisgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3QgY2hhciAqKTsKKwor
ICAgIH5Db29raWVNYW5hZ2VyKCk7CisKK3ByaXZhdGU6CisgICAgQ29va2llTWFuYWdlcigpOwor
CisgICAgaW5saW5lIGJvb2wgaXNfY29va2llX3NlcChVQ2hhciBjKTsKKworICAgIHZvaWQgY2hl
Y2tBbmRUcmVhdENvb2tpZShDb29raWUqIGNvb2tpZSk7CisKKyAgICB2b2lkIGdldERhdGFiYXNl
Q29va2llcygpOworCisgICAgYm9vbCBzaG91bGRSZWplY3QoY29uc3QgQ29va2llKiBjb29raWUs
IGNvbnN0IEtVUkwmIHVybCk7CisKKyAgICAvLyBJbnRlcm5hbCBkYXRhYmFzZSBtYW5pcHVsYXRp
b24gbWV0aG9kcworICAgIHZvaWQgaW5zZXJ0Q29va2llSW50b0RhdGFiYXNlKGNvbnN0IENvb2tp
ZSogY29va2llKTsKKyAgICB2b2lkIHVwZGF0ZURhdGFiYXNlRW50cnkoY29uc3QgQ29va2llKiBj
b29raWUpOworICAgIHZvaWQgcmVtb3ZlQ29va2llRnJvbURhdGFiYXNlKGNvbnN0IENvb2tpZSog
Y29va2llKTsKKworCisgICAgdm9pZCBhZGRDb29raWVUb01hcChDb29raWVNYXAqIG1hcCwgQ29v
a2llKiBjb29raWUpOworICAgIHZvaWQgdXBkYXRlKENvb2tpZU1hcCogbWFwLCBDb29raWUqIHBy
ZXZDb29raWUsIENvb2tpZSogbmV3Q29va2llKTsKKworICAgIC8vIENvdW50IHVwZGF0ZSBtZXRo
b2QKKyAgICBpbmxpbmUgdm9pZCByZW1vdmVkQ29va2llKCkgeyBBU1NFUlQobV9jb3VudCA+IDAp
OyBtX2NvdW50LS07IH0KKworICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWVNYXAqPiBtX21hbmFn
ZXJNYXA7CisKKyAgICAvLyBDb3VudCBhbGwgY29va2llcywgY29va2llcyBhcmUgbGltaXRlZCBi
eSBtYXhfY291bnQKKyAgICB1bnNpZ25lZCBzaG9ydCBtX2NvdW50OworCisgICAgU3RyaW5nIG1f
Y29va2llSmFyRmlsZU5hbWU7CisKKyAgICBTUUxpdGVEYXRhYmFzZSBtX2RiOworCisgICAgLy8g
Q29uc3RhbnRzCisgICAgc3RhdGljIGNvbnN0IGludCBtYXhfY291bnQgPSAzMDA7Cit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFwLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL0Nvb2tpZU1hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MWM0NmQ5OAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0Nvb2tpZU1hcC5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEp1
bGllbiBDaGFmZnJhaXggPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkNvb2tpZU1hcC5oIgorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb29raWVNYXA6On5Db29raWVNYXAoKQoreworICAg
IC8vIFJlbW92ZSBhbGwgY29va2llcworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIENvb2tpZSo+
OjppdGVyYXRvciBpdCA9IG1fY29va2llTWFwLmJlZ2luKCk7IGl0ICE9IG1fY29va2llTWFwLmVu
ZCgpOyArK2l0KQorICAgICAgICBkZWxldGUgaXQtPnNlY29uZDsKK30KKworQ29va2llKiBDb29r
aWVNYXA6OnRha2VQcmV2aW91cyhjb25zdCBDb29raWUqIGNvb2tpZSkKK3sKKyAgICBTdHJpbmcg
a2V5ID0gY29va2llLT5uYW1lKCkgKyBjb29raWUtPnBhdGgoKTsKKworI2lmbmRlZiBOREVCVUcK
KyAgICBwcmludGYoIktleSA6ICVzXG4iLCBrZXkuYXNjaWkoKS5kYXRhKCkpOworI2VuZGlmCisK
KyAgICByZXR1cm4gbV9jb29raWVNYXAudGFrZShrZXkpOworfQorCit2b2lkIENvb2tpZU1hcDo6
YWRkKENvb2tpZSogY29va2llKQoreworICAgIFN0cmluZyBrZXkgPSBjb29raWUtPm5hbWUoKSAr
IGNvb2tpZS0+cGF0aCgpOworICAgIEFTU0VSVCghbV9jb29raWVNYXAuZ2V0KGtleSkpOworICAg
IG1fY29va2llTWFwLmFkZChrZXksIGNvb2tpZSk7CisgICAgaWYgKCFtX29sZGVzdENvb2tpZSB8
fCBtX29sZGVzdENvb2tpZS0+bGFzdEFjY2Vzc2VkKCkgPiBjb29raWUtPmxhc3RBY2Nlc3NlZCgp
KQorICAgICAgICBtX29sZGVzdENvb2tpZSA9IGNvb2tpZTsKK30KKwordm9pZCBDb29raWVNYXA6
OnJlbW92ZShjb25zdCBDb29raWUqIGNvb2tpZSkKK3sKKyAgICBTdHJpbmcga2V5ID0gY29va2ll
LT5uYW1lKCkgKyBjb29raWUtPnBhdGgoKTsKKworICAgIC8vIEZpbmQgYSBwcmV2aW91cyBlbnRy
eSBmb3IgZGVsZXRpb24KKyAgICBDb29raWUqIHByZXZDb29raWUgPSBtX2Nvb2tpZU1hcC50YWtl
KGtleSk7CisKKyAgICBpZiAocHJldkNvb2tpZSA9PSBtX29sZGVzdENvb2tpZSkKKyAgICAgICAg
dXBkYXRlT2xkZXN0Q29va2llKCk7CisKKyAgICBBU1NFUlQocHJldkNvb2tpZSk7CisgICAgZGVs
ZXRlIHByZXZDb29raWU7Cit9CisKK0Nvb2tpZSogQ29va2llTWFwOjpyZW1vdmVPbGRlc3RDb29r
aWUoKQoreworICAgIFN0cmluZyBrZXkgPSBtX29sZGVzdENvb2tpZS0+bmFtZSgpICsgbV9vbGRl
c3RDb29raWUtPnBhdGgoKTsKKworICAgIENvb2tpZSogcmVzdWx0ID0gbV9jb29raWVNYXAudGFr
ZShrZXkpOworCisgICAgdXBkYXRlT2xkZXN0Q29va2llKCk7CisKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCit2b2lkIENvb2tpZU1hcDo6dXBkYXRlVGltZShDb29raWUqIGNvb2tpZSwgZG91Ymxl
IG5ld1RpbWUpCit7CisgICAgY29va2llLT5zZXRMYXN0QWNjZXNzZWQobmV3VGltZSk7CisKKyAg
ICBpZiAoY29va2llID09IG1fb2xkZXN0Q29va2llKQorICAgICAgICB1cGRhdGVPbGRlc3RDb29r
aWUoKTsKK30KKwordm9pZCBDb29raWVNYXA6OnVwZGF0ZU9sZGVzdENvb2tpZSgpCit7CisgICAg
aWYgKG1fY29va2llTWFwLnNpemUoKSA9PSAwKQorICAgICAgICBtX29sZGVzdENvb2tpZSA9IDA7
CisgICAgZWxzZSB7CisgICAgICAgIEhhc2hNYXA8U3RyaW5nLCBDb29raWUqPjo6aXRlcmF0b3Ig
aXQgPSBtX2Nvb2tpZU1hcC5iZWdpbigpOworICAgICAgICBtX29sZGVzdENvb2tpZSA9IGl0LT5z
ZWNvbmQ7CisgICAgICAgICsraXQ7CisgICAgICAgIGZvciAoOyBpdCAhPSBtX2Nvb2tpZU1hcC5l
bmQoKTsgKytpdCkKKyAgICAgICAgICAgIGlmIChtX29sZGVzdENvb2tpZS0+bGFzdEFjY2Vzc2Vk
KCkgPiBpdC0+c2Vjb25kLT5sYXN0QWNjZXNzZWQoKSkKKyAgICAgICAgICAgICAgICBtX29sZGVz
dENvb2tpZSA9IGl0LT5zZWNvbmQ7CisgICAgfQorfQorCit9IC8vIE5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYXAuaCBi
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hcC5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzE5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYXAuaApAQCAtMCwwICsxLDg0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSBKdWxpZW4gQ2hhZmZyYWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWls
LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKyNpZm5kZWYgQ29va2llTWFwX2gKKyNkZWZpbmUgQ29va2llTWFwX2gKKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorCisjaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgQ29va2llTWFwIHsKK3B1YmxpYzoKKworICAgIENvb2tpZU1hcCgpCisgICAgICAgIDog
bV9vbGRlc3RDb29raWUoMCkKKyAgICB7CisgICAgfQorCisgICAgfkNvb2tpZU1hcCgpOworCisg
ICAgaW50IGNvdW50KCkgeyByZXR1cm4gbV9jb29raWVNYXAuc2l6ZSgpOyB9CisKKyAgICB2b2lk
IGFkZChDb29raWUqIGNvb2tpZSk7CisgICAgdm9pZCByZW1vdmUoY29uc3QgQ29va2llKiBjb29r
aWUpOworCisgICAgLy8gV2lsbCB0YWtlIHRoZSBjb29raWUgdGhhdCBtYXRjaCB0aGUgcGFyYW1h
dGVyCisgICAgQ29va2llKiB0YWtlUHJldmlvdXMoY29uc3QgQ29va2llKiBjb29raWUpOworCisg
ICAgYm9vbCBjYW5JbnNlcnRDb29raWUoKSB7IHJldHVybiAobV9jb29raWVNYXAuc2l6ZSgpIDwg
bWF4X2NvdW50KTsgfQorCisgICAgdm9pZCB1cGRhdGVUaW1lKENvb2tpZSogY29va2llLCBkb3Vi
bGUgbmV3VGltZSk7CisKKyAgICAvLyBSZXR1cm4gQ29va2llIHRvIHJlbW92ZSBpdCBmcm9tIHRo
ZSBkYXRhYmFzZSBpbiB0aGUgQ29va2llTWFuYWdlcgorICAgIENvb2tpZSogcmVtb3ZlT2xkZXN0
Q29va2llKCk7CisKKyAgICBIYXNoTWFwPFN0cmluZywgQ29va2llKj4gZ2V0Q29va2llTWFwKCkg
eyByZXR1cm4gbV9jb29raWVNYXA7IH0KKworcHJpdmF0ZToKKworICAgIHZvaWQgdXBkYXRlT2xk
ZXN0Q29va2llKCk7CisKKyAgICAvLyBUaGUga2V5IGlzIHRoZSB0dXBsZSAobmFtZSwgcGF0aCkK
KyAgICAvLyBUaGUgc3BlYyBhc2tzIHRvIGhhdmUgYWxzbyBkb21haW4sIHdoaWNoIGlzIGltcGxp
ZWQgYnkgY2hvb3NpbmcgdGhlIENvb2tpZU1hcCByZWxldmFudCB0byB0aGUgZG9tYWluCisgICAg
SGFzaE1hcDxTdHJpbmcsIENvb2tpZSo+IG1fY29va2llTWFwOworCisgICAgLy8gU3RvcmUgdGhl
IG9sZGVzdCBjb29raWUgdG8gc3BlZWQgdXAgTFJVIGNoZWNrcworICAgIENvb2tpZSogbV9vbGRl
c3RDb29raWU7CisKKyAgICAvLyBDb25zdGFudHMKKyAgICAvLyBUaGUgbnVtYmVyIG9mIGNvb2tp
ZSBpcyBsaW1pdGVkIHRvIG1heF9jb3VudCAoaWUgMjApCisgICAgc3RhdGljIGNvbnN0IGludCBt
YXhfY291bnQgPSAyMDsKKworICAgIC8vIEZJWE1FIDogc2hvdWxkIGhhdmUgYSBtX3Nob3VsZFVw
ZGF0ZSBmbGFnIHRvIHVwZGF0ZSB0aGUgbmV0d29yayBsYXllciBvbmx5IHdoZW4gdGhlIG1hcCBo
YXMgY2hhbmdlZAorfTsKKworfSAvLyBOYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ29v
a2llTWFwX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291
cmNlSGFuZGxlQ3VybC5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJj
ZUhhbmRsZUN1cmwuY3BwCmluZGV4IDUyZjhkYzUuLjU1YzExOTggMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcApAQCAtMjgs
NiArMjgsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
LmgiCiAKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiRG9jTG9hZGVyLmgi
CiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhhbmRsZUlu
dGVybmFsLmgiCkBAIC05NSw0ICs5Niw0OSBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpsb2FkUmVz
b3VyY2VTeW5jaHJvbm91c2x5KGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFJlc291cmNlRQogICAg
IG5vdEltcGxlbWVudGVkKCk7CiB9CiAKK3ZvaWQgUmVzb3VyY2VIYW5kbGU6OnNldENvb2tpZXMo
KQoreworICAgIENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29r
aWVNYW5hZ2VyKCk7CisgICAgS1VSTCB1cmwgPSBnZXRJbnRlcm5hbCgpLT5tX3Jlc3BvbnNlLnVy
bCgpOworCisgICAgaWYgKG1hbmFnZXIpCisgICAgICAgIG1hbmFnZXItPnNldENvb2tpZXModXJs
LCBLVVJMKCksIGdldEludGVybmFsKCktPm1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJTZXQt
Q29va2llIikpOworCisgICAgY2hlY2tBbmRTZW5kQ29va2llcyh1cmwpOworfQorCit2b2lkIFJl
c291cmNlSGFuZGxlOjpjaGVja0FuZFNlbmRDb29raWVzKEtVUkwmIHVybCkKK3sKKyAgICAvLyBD
b29raWVzIGFyZSBhIHBhcnQgb2YgdGhlIGh0dHAgcHJvdG9jb2wgb25seQorICAgIGlmICghU3Ry
aW5nKGQtPm1fdXJsKS5zdGFydHNXaXRoKCJodHRwIikpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICB1cmwgPSBLVVJMKGQtPm1fdXJsKTsKKworICAg
IENvb2tpZU1hbmFnZXIqIG1hbmFnZXIgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2Vy
KCk7CisKKyAgICBpZiAoIW1hbmFnZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFByZXBh
cmUgYSBjb29raWUgaGVhZGVyIGlmIHRoZXJlIGFyZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1
cmwuCisgICAgU3RyaW5nIGNvb2tpZVBhaXJzID0gbWFuYWdlci0+Z2V0Q29va2llKHVybCk7CisK
KyAgICAvLyBDb29raWUgc2l6ZSBzaG91bGQgbm90IGJlIGFib3ZlIDgxOTIwIChwZXIgY29uc3Ry
dWN0aW9uIGFuZCBhbHNvIGJlY2F1c2Ugd2UKKyAgICAvLyBkbyBub3Qgd2FudCB0byAgY29va2ll
KS4KKyAgICBBU1NFUlQoY29va2llUGFpcnMubGVuZ3RoKCkgPD0gODE5MjApOworCisgICAgLy8g
V2UgY2hvb3NlIGEgbWF4IHNpemUgb2YgODE5MjEgY2FyYWN0ZXJzIGJlY2F1c2UgYSBjb29raWUg
bWF4IHNpemUgaXMgNDA5NiBhbmQgYSBkb21haW4gY2FuIGhhdmUgYXQgbWF4IDIwIGNvb2tpZXMg
c28gMjAgKiA0MDk2ICsgMSAoJ1wwJykgPSA4MTkyMQorICAgIHN0YXRpYyBjaGFyIGNvb2tpZUNo
YXJbODE5MjFdOworICAgIHN0cm5jcHkoY29va2llQ2hhciwgY29va2llUGFpcnMuYXNjaWkoKS5k
YXRhKCksIDgxOTIwKTsKKworICAgIC8vIEZvcmNlIHRoZSBzdHJpbmcgdG8gYmUgemVyby10ZXJt
aW5hdGVkIGFzIHJlcXVpcmVkIGJ5IGxpYkNVUkwuCisgICAgY29va2llQ2hhcls4MTkyMF0gPSAn
XDAnOworCisgICAgaWYgKCFjb29raWVQYWlycy5pc0VtcHR5KCkgJiYgZC0+bV9oYW5kbGUpIHsK
KyAgICAgICAgTE9HKE5ldHdvcmssICJDVVJMIFBPU1QgQ29va2llIDogJXMgXG4iLCBjb29raWVD
aGFyKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChkLT5tX2hhbmRsZSwgQ1VSTE9QVF9DT09L
SUUsIGNvb2tpZUNoYXIpOworICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFu
YWdlci5jcHAKaW5kZXggYjhmYTY5Ni4uZjUzZTViYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCkBAIC0zOCw2
ICszOCw3IEBACiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgogI2luY2x1ZGUg
IkhUVFBQYXJzZXJzLmgiCiAjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ29va2llTWFu
YWdlci5oIgogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CkBA
IC01OCw3ICs1OSw2IEBAIHN0YXRpYyBjb25zdCBib29sIGlnbm9yZVNTTEVycm9ycyA9IGdldGVu
digiV0VCS0lUX0lHTk9SRV9TU0xfRVJST1JTIik7CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6
UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKCkKICAgICA6IG1fZG93bmxvYWRUaW1lcih0aGlzLCAmUmVz
b3VyY2VIYW5kbGVNYW5hZ2VyOjpkb3dubG9hZFRpbWVyQ2FsbGJhY2spCi0gICAgLCBtX2Nvb2tp
ZUphckZpbGVOYW1lKDApCiAgICAgLCBtX3J1bm5pbmdKb2JzKDApCiB7CiAgICAgY3VybF9nbG9i
YWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOwpAQCAtNzIsMTMgKzcyLDE0IEBAIFJlc291cmNlSGFu
ZGxlTWFuYWdlcjo6flJlc291cmNlSGFuZGxlTWFuYWdlcigpCiB7CiAgICAgY3VybF9tdWx0aV9j
bGVhbnVwKG1fY3VybE11bHRpSGFuZGxlKTsKICAgICBjdXJsX3NoYXJlX2NsZWFudXAobV9jdXJs
U2hhcmVIYW5kbGUpOwotICAgIGlmIChtX2Nvb2tpZUphckZpbGVOYW1lKQotICAgICAgICBmcmVl
KG1fY29va2llSmFyRmlsZU5hbWUpOwogfQogCiB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6
c2V0Q29va2llSmFyRmlsZU5hbWUoY29uc3QgY2hhciogY29va2llSmFyRmlsZU5hbWUpCiB7Ci0g
ICAgbV9jb29raWVKYXJGaWxlTmFtZSA9IHN0cmR1cChjb29raWVKYXJGaWxlTmFtZSk7CisgICAg
Q29va2llTWFuYWdlciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIo
KTsKKworICAgIGlmIChtYW5hZ2VyKQorICAgICAgICBtYW5hZ2VyLT5zZXRDb29raWVKYXIoc3Ry
ZHVwKGNvb2tpZUphckZpbGVOYW1lKSk7CiB9CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlciogUmVz
b3VyY2VIYW5kbGVNYW5hZ2VyOjpzaGFyZWRJbnN0YW5jZSgpCkBAIC0xOTMsOCArMTk0LDMwIEBA
IHN0YXRpYyBzaXplX3QgaGVhZGVyQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6
ZV90IG5tZW1iLCB2b2lkKiBkYXRhKQogCiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IHNwbGl0
UG9zID0gaGVhZGVyLmZpbmQoIjoiKTsKLSAgICAgICAgaWYgKHNwbGl0UG9zICE9IC0xKQotICAg
ICAgICAgICAgZC0+bV9yZXNwb25zZS5zZXRIVFRQSGVhZGVyRmllbGQoaGVhZGVyLmxlZnQoc3Bs
aXRQb3MpLCBoZWFkZXIuc3Vic3RyaW5nKHNwbGl0UG9zKzEpLnN0cmlwV2hpdGVTcGFjZSgpKTsK
KyAgICAgICAgaWYgKHNwbGl0UG9zICE9IC0xKSB7CisgICAgICAgICAgICBkLT5tX3Jlc3BvbnNl
LnNldEhUVFBIZWFkZXJGaWVsZChoZWFkZXIubGVmdChzcGxpdFBvcyksIGhlYWRlci5zdWJzdHJp
bmcoc3BsaXRQb3MgKyAxKS5zdHJpcFdoaXRlU3BhY2UoKSk7CisKKyAgICAgICAgICAgIC8vIEhh
bmRsZSBjb29raWUKKyAgICAgICAgICAgIGlmIChoZWFkZXIuY29udGFpbnMoIlNldC1Db29raWU6
ICIsIGZhbHNlKSkgeworCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIHVy
bCBpZiBub3QgYWxyZWFkeSBkb25lCisgICAgICAgICAgICAgICAgaWYgKGQtPm1fcmVzcG9uc2Uu
dXJsKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIENVUkxjb2RlIGVycjsKKyAg
ICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogaGRyOworICAgICAgICAgICAgICAgICAgICBl
cnIgPSBjdXJsX2Vhc3lfZ2V0aW5mbyhkLT5tX2hhbmRsZSwgQ1VSTElORk9fRUZGRUNUSVZFX1VS
TCwgJmhkcik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDVVJMRV9PSykgewor
ICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGV0ZXJtaW5lIFVSTCAt
IGNvb2tpZSByZWplY3RlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFs
U2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkLT5tX3Jl
c3BvbnNlLnNldFVybChLVVJMKGhkcikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAg
ICAgICAgIExPRyhOZXR3b3JrLCAiUmVjZWl2ZWQgY29va2llIHZhbHVlIDogJXMgISFcbiIsIGQt
Pm1fcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJTZXQtQ29va2llIikuYXNjaWkoKS5kYXRhKCkp
OworCisgICAgICAgICAgICAgICAgam9iLT5zZXRDb29raWVzKCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdG90YWxTaXplOwpAQCAtNTg1LDExICs2MDgs
NiBAQCB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6c3RhcnRKb2IoUmVzb3VyY2VIYW5kbGUq
IGpvYikKICAgICBkLT5tX3VybCA9IHN0cmR1cCh1cmwubGF0aW4xKCkuZGF0YSgpKTsKICAgICBj
dXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxlLCBDVVJMT1BUX1VSTCwgZC0+bV91cmwpOwogCi0g
ICAgaWYgKG1fY29va2llSmFyRmlsZU5hbWUpIHsKLSAgICAgICAgY3VybF9lYXN5X3NldG9wdChk
LT5tX2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVGSUxFLCBtX2Nvb2tpZUphckZpbGVOYW1lKTsKLSAg
ICAgICAgY3VybF9lYXN5X3NldG9wdChkLT5tX2hhbmRsZSwgQ1VSTE9QVF9DT09LSUVKQVIsIG1f
Y29va2llSmFyRmlsZU5hbWUpOwotICAgIH0KLQogICAgIHN0cnVjdCBjdXJsX3NsaXN0KiBoZWFk
ZXJzID0gMDsKICAgICBpZiAoam9iLT5yZXF1ZXN0KCkuaHR0cEhlYWRlckZpZWxkcygpLnNpemUo
KSA+IDApIHsKICAgICAgICAgSFRUUEhlYWRlck1hcCBjdXN0b21IZWFkZXJzID0gam9iLT5yZXF1
ZXN0KCkuaHR0cEhlYWRlckZpZWxkcygpOwpAQCAtNjIwLDYgKzYzOCwxMSBAQCB2b2lkIFJlc291
cmNlSGFuZGxlTWFuYWdlcjo6c3RhcnRKb2IoUmVzb3VyY2VIYW5kbGUqIGpvYikKICAgICB9CiAK
ICAgICBtX3J1bm5pbmdKb2JzKys7CisKKyAgICAvLyBHZXQgY29va2llcworICAgIEtVUkwgZW1w
dHlVUkw7CisgICAgam9iLT5jaGVja0FuZFNlbmRDb29raWVzKGVtcHR5VVJMKTsKKwogICAgIENV
UkxNY29kZSByZXQgPSBjdXJsX211bHRpX2FkZF9oYW5kbGUobV9jdXJsTXVsdGlIYW5kbGUsIGQt
Pm1faGFuZGxlKTsKICAgICAvLyBkb24ndCBjYWxsIHBlcmZvcm0sIGJlY2F1c2UgZXZlbnRzIG11
c3QgYmUgYXN5bmMKICAgICAvLyB0aW1lb3V0IHdpbGwgb2NjdXIgYW5kIGRvIGN1cmxfbXVsdGlf
cGVyZm9ybQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3Vy
Y2VIYW5kbGVNYW5hZ2VyLmggYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJj
ZUhhbmRsZU1hbmFnZXIuaAppbmRleCBkN2Y0M2E3Li41ZTVjMzU1IDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaApAQCAt
NTksNyArNTksNiBAQCBwcml2YXRlOgogICAgIFRpbWVyPFJlc291cmNlSGFuZGxlTWFuYWdlcj4g
bV9kb3dubG9hZFRpbWVyOwogICAgIENVUkxNKiBtX2N1cmxNdWx0aUhhbmRsZTsKICAgICBDVVJM
U0gqIG1fY3VybFNoYXJlSGFuZGxlOwotICAgIGNoYXIqIG1fY29va2llSmFyRmlsZU5hbWU7CiAg
ICAgY2hhciBtX2N1cmxFcnJvckJ1ZmZlcltDVVJMX0VSUk9SX1NJWkVdOwogICAgIFZlY3RvcjxS
ZXNvdXJjZUhhbmRsZSo+IG1fcmVzb3VyY2VIYW5kbGVMaXN0OwogICAgIGludCBtX3J1bm5pbmdK
b2JzOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>19814</attachid>
            <date>2008-03-16 18:06:52 -0700</date>
            <delta_ts>2008-09-17 09:22:02 -0700</delta_ts>
            <desc>First part : implement CookieManager stubs &amp; network bindings</desc>
            <filename>part1-CL.patch</filename>
            <type>text/plain</type>
            <size>16061</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzdmZmU2Ni4uOWUyYzU2NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MSBAQAorMjAwOC0wMy0xNiAgSnVsaWVuIENoYWZm
cmFpeCAgPGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFBhcnQgb2YgQnVnIDE0NzMwOiBbY3VybF0gQ29v
a2llIGhhbmRsaW5nCisKKyAgICAgICAgLSBBZGQgdGhlIG5ldHdvcmsgYmluZGluZ3MgZm9yIGhh
bmRsaW5nIGNvb2tpZXMKKworICAgICAgICAtIEFkZCBDb29raWVNYW5hZ2VyIHN0dWJzIChDb29r
aWVNYW5hZ2VyIHdpbGwgYmUgdGhlIGNlbnRyYWwgY2xhc3MgZGVhbGluZyB3aXRoIGNvb2tpZXMp
CisKKyAgICAgICAgLSBSZW1vdmUgcmVmZXJlbmNlcyB0byBtX2Nvb2tpZUphckZpbGVOYW1lIGlu
IFJlc291cmNlSGFuZGxlTWFuYWdlciAobW92ZWQgaW4gdGhlIENvb2tpZU1hbmFnZXIpCisKKyAg
ICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRkZWQgQ29va2llTWFuYWdlci5jcHAKKyAgICAgICAg
KiBwbGF0Zm9ybS9ndGsvQ29va2llSmFyR3RrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnNldENv
b2tpZXMpOiBTd2l0Y2hlZCB0byBDb29raWVNYW5hZ2VyLgorICAgICAgICAoV2ViQ29yZTo6Y29v
a2llcyk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Y29va2llc0VuYWJsZWQpOiBEaXR0by4K
KyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmg6IEFkZGVkIDIgbWV0
aG9kcyB0byBoYW5kbGUgY29va2llcy4KKworICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvY3Vy
bC9Db29raWVNYW5hZ2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5h
Z2VyOjpnZXRDb29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6
OkNvb2tpZU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6fkNvb2tp
ZU1hbmFnZXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6c2V0Q29va2llcyk6
CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpnZXRDb29raWVzKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OmNvb2tpZXNDb3VudCk6CisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVNYW5hZ2VyOjpzZXRDb29raWVKYXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2ll
TWFuYWdlcjo6cmVtb3ZlZENvb2tpZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJs
L1Jlc291cmNlSGFuZGxlQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRs
ZTo6c2V0Q29va2llcyk6IENhbGxlZCB3aGVuIGEgIlNldC1Db29raWUiIGhlYWRlciBpcyBmb3Vu
ZC4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOjpjaGVja0FuZFNlbmRDb29raWVz
KTogR2V0IGNvb2tpZXMgdG8gc2VuZCB0aGVtIHRvIHRoZSBDdXJsIGxheWVyLgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
KTogUmVtb3ZlZCBtX2Nvb2tpZUphckZpbGVOYW1lIChtb3ZlZCBpbiB0aGUKKyAgICAgICAgQ29v
a2llTWFuYWdlcikuCisKKyAgICAgICAgKFdlYkNvcmU6OmhlYWRlckNhbGxiYWNrKTogRGl0dG8u
CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnN0YXJ0Sm9iKTogRGl0
dG8uCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdl
ci5oOiBEaXR0by4KKwogMjAwOC0wMy0xNSAgVGltb3RoeSBIYXRjaGVyICA8dGltb3RoeUBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBSb2Jlbi4KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmluZGV4IGM0NDAw
NjAuLjAxOWY4YmIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KKysrIGIvV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMTAzNCw2ICsxMDM0LDcgQEAgd2ViY29yZV9jcHBmbGFn
cyArPSBcCiAJLUkkKHNyY2RpcikvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwKIAogd2Vi
Y29yZV9zb3VyY2VzICs9IFwKKwlXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVN
YW5hZ2VyLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVDdXJsLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5k
bGVNYW5hZ2VyLmNwcAogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9Db29raWVK
YXJHdGsuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvQ29va2llSmFyR3RrLmNwcAppbmRleCAy
Zjc2ZWJjLi41ZjFlMDU0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9Db29raWVK
YXJHdGsuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL0Nvb2tpZUphckd0ay5jcHAKQEAg
LTIzLDIzICsyMywzMSBAQAogCiAjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KIAotbmFtZXNwYWNl
IFdlYkNvcmUgeworI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKIAotc3RhdGljIEhhc2hNYXA8
U3RyaW5nLCBTdHJpbmc+IGNvb2tpZUphcjsKK25hbWVzcGFjZSBXZWJDb3JlIHsKIAotdm9pZCBz
ZXRDb29raWVzKERvY3VtZW50KiAvKmRvY3VtZW50Ki8sIGNvbnN0IEtVUkwmIHVybCwgY29uc3Qg
S1VSTCYgLypwb2xpY3lVUkwqLywgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3ZvaWQgc2V0Q29va2ll
cyhEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCwgY29uc3QgS1VSTCYgcG9saWN5
VVJMLCBjb25zdCBTdHJpbmcmIHZhbHVlKQogewotICAgIGNvb2tpZUphci5zZXQodXJsLnN0cmlu
ZygpLCB2YWx1ZSk7CisgICAgaWYgKGNvb2tpZXNFbmFibGVkKGRvY3VtZW50KSkKKyAgICAgICAg
Q29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcigpLT5zZXRDb29raWVzKHVybCwgcG9saWN5
VVJMLCB2YWx1ZSk7CiB9CiAKLVN0cmluZyBjb29raWVzKGNvbnN0IERvY3VtZW50KiAvKmRvY3Vt
ZW50Ki8sIGNvbnN0IEtVUkwmIHVybCkKK1N0cmluZyBjb29raWVzKGNvbnN0IERvY3VtZW50KiBk
b2N1bWVudCwgY29uc3QgS1VSTCYgdXJsKQogewotICAgIHJldHVybiBjb29raWVKYXIuZ2V0KHVy
bC5zdHJpbmcoKSk7CisgICAgaWYgKGNvb2tpZXNFbmFibGVkKGRvY3VtZW50KSkKKyAgICAgICAg
cmV0dXJuIENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIoKS0+Z2V0Q29va2llcyh1cmwp
OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOwogfQogCiBib29sIGNvb2tpZXNF
bmFibGVkKGNvbnN0IERvY3VtZW50KiAvKmRvY3VtZW50Ki8pCiB7Ci0gICAgcmV0dXJuIHRydWU7
CisgICAgQ29va2llTWFuYWdlciogbWFuYWdlciA9IENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1h
bmFnZXIoKTsKKyAgICBpZiAobWFuYWdlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZWxz
ZQorICAgICAgICByZXR1cm4gZmFsc2U7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L1Jlc291cmNlSGFuZGxlLmgKaW5kZXggYzBjZjE1YS4uZTdkMmQ2NyAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgKKysrIGIvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgKQEAgLTE0MSw2ICsxNDEsMTEgQEAgcHVibGlj
OgogICAgIFJlc291cmNlSGFuZGxlSW50ZXJuYWwqIGdldEludGVybmFsKCkgeyByZXR1cm4gZC5n
ZXQoKTsgfQogI2VuZGlmCiAKKyNpZiBVU0UoQ1VSTCkKKyAgICB2b2lkIGNoZWNrQW5kU2VuZENv
b2tpZXMoS1VSTCYgdXJsKTsKKyAgICB2b2lkIHNldENvb2tpZXMoKTsKKyNlbmRpZgorCiAgICAg
Ly8gVXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IHlvdSBkb24ndCBnZXQgYW55IG1v
cmUgTlNVUkxDb25uZWN0aW9uIGNhbGxiYWNrcyB1bnRpbCB5b3UgcmV0dXJuIGZyb20gdGhlIG9u
ZSB5b3UncmUgaW4uCiAgICAgc3RhdGljIGJvb2wgbG9hZHNCbG9ja2VkKCk7ICAgIAogICAgIApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTk5NTY4Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHAKQEAgLTAs
MCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgSnVsaWVuIENoYWZmcmFpeCA8anVsaWVu
LmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJDb29r
aWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgQ29va2llTWFuYWdlciogc2hhcmVk
TWFuYWdlciA9IDA7CisKK0Nvb2tpZU1hbmFnZXIqIENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1h
bmFnZXIoKQoreworICAgIGlmICghc2hhcmVkTWFuYWdlcikKKyAgICAgICAgc2hhcmVkTWFuYWdl
ciA9IG5ldyBDb29raWVNYW5hZ2VyKCk7CisgICAgcmV0dXJuIHNoYXJlZE1hbmFnZXI7Cit9CisK
K0Nvb2tpZU1hbmFnZXI6OkNvb2tpZU1hbmFnZXIoKQorICAgIDogbV9jb3VudCgwKQoreworICAg
IC8vIEZJWE1FIDogd3JpdGUgd2hlcmUgd2UgaW52b2tlIFdlYktpdCB3aGljaCBpcyBiYWQuCisg
ICAgbV9jb29raWVKYXJGaWxlTmFtZSA9IFN0cmluZygiY29va2llQ29sbGVjdGlvbi5kYiIpOwor
Cit9CisKK0Nvb2tpZU1hbmFnZXI6On5Db29raWVNYW5hZ2VyKCkKK3sKKyAgICBzaGFyZWRNYW5h
Z2VyID0gMDsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWVzKGNvbnN0IEtVUkwm
IHVybCwgY29uc3QgS1VSTCYgcG9saWN5VVJMLCBjb25zdCBTdHJpbmcmIHZhbHVlKQoreworfQor
CitTdHJpbmcgQ29va2llTWFuYWdlcjo6Z2V0Q29va2llcyhjb25zdCBLVVJMJiB1cmwpCit7Cisg
ICAgcmV0dXJuIFN0cmluZygpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnJlbW92ZUFsbENv
b2tpZXMoYm9vbCBzaG91bGRSZW1vdmVGcm9tRGF0YWJhc2UpCit7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZU1hbmFnZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFn
ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVhYWQxCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5o
CkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEp1bGllbiBDaGFmZnJhaXgg
PGp1bGllbi5jaGFmZnJhaXhAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZp
bmUgQ29va2llTWFuYWdlcl9oCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIktV
UkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFw
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIENvb2tpZU1hbmFnZXIgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIENvb2tpZU1hbmFnZXIqIGdldENvb2tpZU1hbmFn
ZXIoKTsKKworICAgICAgICB2b2lkIHNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBL
VVJMJiBwb2xpY3lVUkwsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCisgICAgICAgIFN0cmluZyBn
ZXRDb29raWVzKGNvbnN0IEtVUkwmIHVybCk7CisKKyAgICAgICAgdm9pZCByZW1vdmVBbGxDb29r
aWVzKGJvb2wgc2hvdWxkUmVtb3ZlRnJvbURhdGFiYXNlID0gdHJ1ZSk7CisKKyAgICAgICAgdW5z
aWduZWQgaW50IGNvb2tpZXNDb3VudCgpIHsgcmV0dXJuIG1fY291bnQ7IH0KKworICAgICAgICB2
b2lkIHNldENvb2tpZUphcihjb25zdCBTdHJpbmcmIGZpbGVOYW1lKSB7IG1fY29va2llSmFyRmls
ZU5hbWUgPSBmaWxlTmFtZTsgfQorCisgICAgICAgIH5Db29raWVNYW5hZ2VyKCk7CisKKyAgICBw
cml2YXRlOgorICAgICAgICBDb29raWVNYW5hZ2VyKCk7CisKKyAgICAgICAgLy8gQ291bnQgdXBk
YXRlIG1ldGhvZAorICAgICAgICBpbmxpbmUgdm9pZCByZW1vdmVkQ29va2llKCkgeyBBU1NFUlQo
bV9jb3VudCA+IDApOyBtX2NvdW50LS07IH0KKworICAgICAgICAvLyBDb3VudCBhbGwgY29va2ll
cywgY29va2llcyBhcmUgbGltaXRlZCBieSBtYXhfY291bnQKKyAgICAgICAgdW5zaWduZWQgaW50
IG1fY291bnQ7CisKKyAgICAgICAgU3RyaW5nIG1fY29va2llSmFyRmlsZU5hbWU7CisKKyAgICAg
ICAgLy8gQ29uc3RhbnRzCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWF4X2NvdW50ID0gMzAw
OworCisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmwuY3BwCmlu
ZGV4IDUyZjhkYzUuLmZkMWZmZjcgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29y
ay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVDdXJsLmNwcApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCiAKKyNpbmNsdWRlICJD
b29raWVKYXIuaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiRG9jTG9h
ZGVyLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJSZXNvdXJjZUhh
bmRsZUludGVybmFsLmgiCkBAIC05NSw0ICs5Nyw0OCBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjps
b2FkUmVzb3VyY2VTeW5jaHJvbm91c2x5KGNvbnN0IFJlc291cmNlUmVxdWVzdCYsIFJlc291cmNl
RQogICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKK3ZvaWQgUmVzb3VyY2VIYW5kbGU6OnNldENv
b2tpZXMoKQoreworICAgIEtVUkwgdXJsID0gZ2V0SW50ZXJuYWwoKS0+bV9yZXNwb25zZS51cmwo
KTsKKworICAgIC8vIEZJWE1FIDogd2UgZG8gbm90IHVzZSBEb2N1bWVudCBidXQgc2hvdWxkLgor
ICAgIGlmIChjb29raWVzRW5hYmxlZCgwKSkgeworICAgICAgICBDb29raWVNYW5hZ2VyOjpnZXRD
b29raWVNYW5hZ2VyKCktPnNldENvb2tpZXModXJsLCBLVVJMKCksIGdldEludGVybmFsKCktPm1f
cmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJTZXQtQ29va2llIikpOworICAgICAgICBjaGVja0Fu
ZFNlbmRDb29raWVzKHVybCk7CisgICAgfQorfQorCit2b2lkIFJlc291cmNlSGFuZGxlOjpjaGVj
a0FuZFNlbmRDb29raWVzKEtVUkwmIHVybCkKK3sKKyAgICAvLyBDb29raWVzIGFyZSBhIHBhcnQg
b2YgdGhlIGh0dHAgcHJvdG9jb2wgb25seQorICAgIGlmICghU3RyaW5nKGQtPm1fdXJsKS5zdGFy
dHNXaXRoKCJodHRwIikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh1cmwuaXNFbXB0eSgp
KQorICAgICAgICB1cmwgPSBLVVJMKGQtPm1fdXJsKTsKKworICAgIC8vIEZJWE1FIDogd2UgZG8g
bm90IHVzZSBEb2N1bWVudCBidXQgc2hvdWxkLgorICAgIGlmICghY29va2llc0VuYWJsZWQoMCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFByZXBhcmUgYSBjb29raWUgaGVhZGVyIGlmIHRo
ZXJlIGFyZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1cmwuCisgICAgU3RyaW5nIGNvb2tpZVBh
aXJzID0gQ29va2llTWFuYWdlcjo6Z2V0Q29va2llTWFuYWdlcigpLT5nZXRDb29raWVzKHVybCk7
CisKKyAgICAvLyBDb29raWUgc2l6ZSBzaG91bGQgbm90IGJlIGFib3ZlIDgxOTIwIChwZXIgY29u
c3RydWN0aW9uIGFuZCBhbHNvIGJlY2F1c2Ugd2UKKyAgICAvLyBkbyBub3Qgd2FudCB0byAgY29v
a2llKS4KKyAgICBBU1NFUlQoY29va2llUGFpcnMubGVuZ3RoKCkgPD0gODE5MjApOworCisgICAg
Ly8gV2UgY2hvb3NlIGEgbWF4IHNpemUgb2YgODE5MjEgY2FyYWN0ZXJzIGJlY2F1c2UgYSBjb29r
aWUgbWF4IHNpemUgaXMgNDA5NiBhbmQgYSBkb21haW4gY2FuIGhhdmUgYXQgbWF4IDIwIGNvb2tp
ZXMgc28gMjAgKiA0MDk2ICsgMSAoJ1wwJykgPSA4MTkyMQorICAgIHN0YXRpYyBjaGFyIGNvb2tp
ZUNoYXJbODE5MjFdOworICAgIHN0cm5jcHkoY29va2llQ2hhciwgY29va2llUGFpcnMuYXNjaWko
KS5kYXRhKCksIDgxOTIwKTsKKworICAgIC8vIEZvcmNlIHRoZSBzdHJpbmcgdG8gYmUgemVyby10
ZXJtaW5hdGVkIGFzIHJlcXVpcmVkIGJ5IGxpYkNVUkwuCisgICAgY29va2llQ2hhcls4MTkyMF0g
PSAnXDAnOworCisgICAgaWYgKCFjb29raWVQYWlycy5pc0VtcHR5KCkgJiYgZC0+bV9oYW5kbGUp
IHsKKyAgICAgICAgTE9HKE5ldHdvcmssICJDVVJMIFBPU1QgQ29va2llIDogJXMgXG4iLCBjb29r
aWVDaGFyKTsKKyAgICAgICAgY3VybF9lYXN5X3NldG9wdChkLT5tX2hhbmRsZSwgQ1VSTE9QVF9D
T09LSUUsIGNvb2tpZUNoYXIpOworICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVN
YW5hZ2VyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxl
TWFuYWdlci5jcHAKaW5kZXggZTlhNjMyYi4uMmRlYTE3NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCkBAIC0z
OCw2ICszOCw4IEBACiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgogI2luY2x1
ZGUgIkhUVFBQYXJzZXJzLmgiCiAjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ29va2ll
SmFyLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgogCiAjaW5jbHVkZSA8ZXJybm8uaD4K
ICNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CkBAIC01OCw3ICs2MCw2IEBAIHN0YXRpYyBjb25zdCBi
b29sIGlnbm9yZVNTTEVycm9ycyA9IGdldGVudigiV0VCS0lUX0lHTk9SRV9TU0xfRVJST1JTIik7
CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKCkKICAgICA6
IG1fZG93bmxvYWRUaW1lcih0aGlzLCAmUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpkb3dubG9hZFRp
bWVyQ2FsbGJhY2spCi0gICAgLCBtX2Nvb2tpZUphckZpbGVOYW1lKDApCiAgICAgLCBtX3J1bm5p
bmdKb2JzKDApCiB7CiAgICAgY3VybF9nbG9iYWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOwpAQCAt
NzIsMTMgKzczLDYgQEAgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYW5h
Z2VyKCkKIHsKICAgICBjdXJsX211bHRpX2NsZWFudXAobV9jdXJsTXVsdGlIYW5kbGUpOwogICAg
IGN1cmxfc2hhcmVfY2xlYW51cChtX2N1cmxTaGFyZUhhbmRsZSk7Ci0gICAgaWYgKG1fY29va2ll
SmFyRmlsZU5hbWUpCi0gICAgICAgIGZyZWUobV9jb29raWVKYXJGaWxlTmFtZSk7Ci19Ci0KLXZv
aWQgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpzZXRDb29raWVKYXJGaWxlTmFtZShjb25zdCBjaGFy
KiBjb29raWVKYXJGaWxlTmFtZSkKLXsKLSAgICBtX2Nvb2tpZUphckZpbGVOYW1lID0gc3RyZHVw
KGNvb2tpZUphckZpbGVOYW1lKTsKIH0KIAogUmVzb3VyY2VIYW5kbGVNYW5hZ2VyKiBSZXNvdXJj
ZUhhbmRsZU1hbmFnZXI6OnNoYXJlZEluc3RhbmNlKCkKQEAgLTE5Myw4ICsxODcsMzAgQEAgc3Rh
dGljIHNpemVfdCBoZWFkZXJDYWxsYmFjayhjaGFyKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qg
bm1lbWIsIHZvaWQqIGRhdGEpCiAKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgc3BsaXRQb3Mg
PSBoZWFkZXIuZmluZCgiOiIpOwotICAgICAgICBpZiAoc3BsaXRQb3MgIT0gLTEpCi0gICAgICAg
ICAgICBkLT5tX3Jlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChoZWFkZXIubGVmdChzcGxpdFBv
cyksIGhlYWRlci5zdWJzdHJpbmcoc3BsaXRQb3MrMSkuc3RyaXBXaGl0ZVNwYWNlKCkpOworICAg
ICAgICBpZiAoc3BsaXRQb3MgIT0gLTEpIHsKKyAgICAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0
SFRUUEhlYWRlckZpZWxkKGhlYWRlci5sZWZ0KHNwbGl0UG9zKSwgaGVhZGVyLnN1YnN0cmluZyhz
cGxpdFBvcyArIDEpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKworICAgICAgICAgICAgLy8gSGFuZGxl
IGNvb2tpZQorICAgICAgICAgICAgaWYgKGhlYWRlci5jb250YWlucygiU2V0LUNvb2tpZTogIiwg
ZmFsc2UpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNldCB0aGUgdXJsIGlm
IG5vdCBhbHJlYWR5IGRvbmUKKyAgICAgICAgICAgICAgICBpZiAoZC0+bV9yZXNwb25zZS51cmwo
KS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgZXJyOworICAgICAg
ICAgICAgICAgICAgICBjb25zdCBjaGFyKiBoZHI7CisgICAgICAgICAgICAgICAgICAgIGVyciA9
IGN1cmxfZWFzeV9nZXRpbmZvKGQtPm1faGFuZGxlLCBDVVJMSU5GT19FRkZFQ1RJVkVfVVJMLCAm
aGRyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IENVUkxFX09LKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBkZXRlcm1pbmUgVVJMIC0gY29v
a2llIHJlamVjdGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG90YWxTaXpl
OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGQtPm1fcmVzcG9u
c2Uuc2V0VXJsKEtVUkwoaGRyKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgTE9HKE5ldHdvcmssICJSZWNlaXZlZCBjb29raWUgdmFsdWUgOiAlcyAhIVxuIiwgZC0+bV9y
ZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIlNldC1Db29raWUiKS5hc2NpaSgpLmRhdGEoKSk7CisK
KyAgICAgICAgICAgICAgICBqb2ItPnNldENvb2tpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQogICAgIH0KIAogICAgIHJldHVybiB0b3RhbFNpemU7CkBAIC01OTEsMTEgKzYwNyw2IEBA
IHZvaWQgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpzdGFydEpvYihSZXNvdXJjZUhhbmRsZSogam9i
KQogICAgIGQtPm1fdXJsID0gc3RyZHVwKHVybC5sYXRpbjEoKS5kYXRhKCkpOwogICAgIGN1cmxf
ZWFzeV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfVVJMLCBkLT5tX3VybCk7CiAKLSAgICBp
ZiAobV9jb29raWVKYXJGaWxlTmFtZSkgewotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1f
aGFuZGxlLCBDVVJMT1BUX0NPT0tJRUZJTEUsIG1fY29va2llSmFyRmlsZU5hbWUpOwotICAgICAg
ICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxlLCBDVVJMT1BUX0NPT0tJRUpBUiwgbV9jb29r
aWVKYXJGaWxlTmFtZSk7Ci0gICAgfQotCiAgICAgc3RydWN0IGN1cmxfc2xpc3QqIGhlYWRlcnMg
PSAwOwogICAgIGlmIChqb2ItPnJlcXVlc3QoKS5odHRwSGVhZGVyRmllbGRzKCkuc2l6ZSgpID4g
MCkgewogICAgICAgICBIVFRQSGVhZGVyTWFwIGN1c3RvbUhlYWRlcnMgPSBqb2ItPnJlcXVlc3Qo
KS5odHRwSGVhZGVyRmllbGRzKCk7CkBAIC02MjYsNiArNjM3LDExIEBAIHZvaWQgUmVzb3VyY2VI
YW5kbGVNYW5hZ2VyOjpzdGFydEpvYihSZXNvdXJjZUhhbmRsZSogam9iKQogICAgIH0KIAogICAg
IG1fcnVubmluZ0pvYnMrKzsKKworICAgIC8vIEdldCBjb29raWVzCisgICAgS1VSTCBlbXB0eVVS
TDsKKyAgICBqb2ItPmNoZWNrQW5kU2VuZENvb2tpZXMoZW1wdHlVUkwpOworCiAgICAgQ1VSTE1j
b2RlIHJldCA9IGN1cmxfbXVsdGlfYWRkX2hhbmRsZShtX2N1cmxNdWx0aUhhbmRsZSwgZC0+bV9o
YW5kbGUpOwogICAgIC8vIGRvbid0IGNhbGwgcGVyZm9ybSwgYmVjYXVzZSBldmVudHMgbXVzdCBi
ZSBhc3luYwogICAgIC8vIHRpbWVvdXQgd2lsbCBvY2N1ciBhbmQgZG8gY3VybF9tdWx0aV9wZXJm
b3JtCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhh
bmRsZU1hbmFnZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFu
ZGxlTWFuYWdlci5oCmluZGV4IGQ3ZjQzYTcuLjNkNjU0NGIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5oCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5oCkBAIC00Miw3
ICs0Miw2IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyKiBzaGFy
ZWRJbnN0YW5jZSgpOwogICAgIHZvaWQgYWRkKFJlc291cmNlSGFuZGxlKik7CiAgICAgdm9pZCBj
YW5jZWwoUmVzb3VyY2VIYW5kbGUqKTsKLSAgICB2b2lkIHNldENvb2tpZUphckZpbGVOYW1lKGNv
bnN0IGNoYXIqIGNvb2tpZUphckZpbGVOYW1lKTsKIAogICAgIHZvaWQgc2V0dXBQT1NUKFJlc291
cmNlSGFuZGxlKiwgc3RydWN0IGN1cmxfc2xpc3QqKik7CiAgICAgdm9pZCBzZXR1cFBVVChSZXNv
dXJjZUhhbmRsZSosIHN0cnVjdCBjdXJsX3NsaXN0KiopOwpAQCAtNTksNyArNTgsNiBAQCBwcml2
YXRlOgogICAgIFRpbWVyPFJlc291cmNlSGFuZGxlTWFuYWdlcj4gbV9kb3dubG9hZFRpbWVyOwog
ICAgIENVUkxNKiBtX2N1cmxNdWx0aUhhbmRsZTsKICAgICBDVVJMU0gqIG1fY3VybFNoYXJlSGFu
ZGxlOwotICAgIGNoYXIqIG1fY29va2llSmFyRmlsZU5hbWU7CiAgICAgY2hhciBtX2N1cmxFcnJv
ckJ1ZmZlcltDVVJMX0VSUk9SX1NJWkVdOwogICAgIFZlY3RvcjxSZXNvdXJjZUhhbmRsZSo+IG1f
cmVzb3VyY2VIYW5kbGVMaXN0OwogICAgIGludCBtX3J1bm5pbmdKb2JzOwo=
</data>
<flag name="review"
          id="8670"
          type_id="1"
          status="-"
          setter="zecke"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23500</attachid>
            <date>2008-09-17 09:22:02 -0700</date>
            <delta_ts>2009-05-23 08:51:54 -0700</delta_ts>
            <desc>First patch rewritten: should address Zecke&apos;s comments</desc>
            <filename>cookieFirstPart-updated.patch</filename>
            <type>text/plain</type>
            <size>17807</size>
            <attacher name="Julien Chaffraix">jchaffraix</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzNjUxNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDkgQEAKKzIwMDgtMDktMTYgIEp1bGllbiBDaGFmZnJhaXggIDxqY2hhZmZyYWl4
QHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQnVnIDE0NzMwOiBbY3VybF0gQ29va2llIGhhbmRsaW5nCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDczMAorCisgICAgICAgIC0gQWRkIHRo
ZSBjb29raWUgbWFuYWdlci4KKworICAgICAgICAtIE1vdmUgdGhlIGNvb2tpZSBmaWxlIG5hbWUg
aW50byB0aGUgY29va2llIG1hbmFnZXIuCisKKyAgICAgICAgKiBHTlVtYWtlZmlsZS5hbTogQWRk
IENvb2tpZU1hbmFnZXIuY3BwLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VI
YW5kbGUuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpzZXRDb29raWVzKTogTW92ZSBjb2RlIGludG8gdGhlIENv
b2tpZU1hbmFnZXIuCisgICAgICAgIChXZWJDb3JlOjpjb29raWVzKTogRGl0dG8uCisgICAgICAg
IChXZWJDb3JlOjpjb29raWVzRW5hYmxlZCk6IFJldHVybiB3aGV0aGVyIHdlIGhhdmUgYSBnbG9i
YWwgaW5zdGFuY2UKKyAgICAgICAgb2YgdGhlIENvb2tpZU1hbmFnZXIuCisgICAgICAgICogcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OkNvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIpOiBSZXR1cm4gYSBzaGFyZWQg
aW5zdGFuY2UKKyAgICAgICAgb2YgdGhlIENvb2tpZU1hbmFnZXIuCisgICAgICAgIChXZWJDb3Jl
OjpDb29raWVNYW5hZ2VyOjpDb29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tp
ZU1hbmFnZXI6On5Db29raWVNYW5hZ2VyKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFn
ZXI6OnNldENvb2tpZXMpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6YWRkQ29v
a2llcyk6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVNYW5hZ2VyOjpjb29raWVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkNvb2tpZU1hbmFnZXI6OnJlbW92ZUFsbENvb2tpZXMpOgorICAgICAgICAq
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q29va2llTWFuYWdlcjo6Y29va2llc0NvdW50KToKKyAgICAgICAgKFdlYkNvcmU6
OkNvb2tpZU1hbmFnZXI6OnNldENvb2tpZUphcik6CisgICAgICAgIChXZWJDb3JlOjpDb29raWVN
YW5hZ2VyOjpnZXRDb29raWVKYXIpOgorICAgICAgICAoV2ViQ29yZTo6Q29va2llTWFuYWdlcjo6
cmVtb3ZlZENvb2tpZSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNl
SGFuZGxlQ3VybC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZTo6YWRkQ29v
a2llSGVhZGVySWZOZWVkZWQpOiBBZGQgdGhlICJDb29raWUiIGhlYWRlcgorICAgICAgICBpbmZv
cm1hdGlvbiB0byB0aGUgY3VybCBoYW5kbGUuCisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9j
dXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHA6IFJlbW92ZSBpbmZvcm1hdGlvbiBhYm91dAor
ICAgICAgICB0aGUgY29va2llSmFyRmlsZU5hbWUuCisgICAgICAgIChXZWJDb3JlOjpSZXNvdXJj
ZUhhbmRsZU1hbmFnZXI6OlJlc291cmNlSGFuZGxlTWFuYWdlcik6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6UmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpoZWFkZXJDYWxsYmFjayk6IENhdGNoIHRoZSAiU2V0
LUNvb2tpZSIgaGVhZGVyIGFuZCBnaXZlIHRoZQorICAgICAgICBpbmZvcm1hdGlvbiB0byB0aGUg
Q29va2llTWFuYWdlci4KKyAgICAgICAgKFdlYkNvcmU6OlJlc291cmNlSGFuZGxlTWFuYWdlcjo6
aW5pdGlhbGl6ZUhhbmRsZSk6IEtlZXAgdGhlIGN1cmwKKyAgICAgICAgY29va2llIGVuZ2luZSB1
bnRpbCB0aGUgY29kZSBpcyBmdWxseSB3b3JraW5nLgorICAgICAgICAqIHBsYXRmb3JtL25ldHdv
cmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaDogUmVtb3ZlZCBtX2Nvb2tpZUphckZpbGVO
YW1lLgorICAgICAgICAqIHdlYmNvcmUtd3guYmtsOiBBZGQgQ29va2llTWFuYWdlci5jcHAuCisK
IDIwMDgtMDktMTYgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KSW5kZXg6IFdlYkNvcmUvR05VbWFrZWZpbGUuYW0KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkocmV2aXNpb24gMzY0MzIpCisrKyBX
ZWJDb3JlL0dOVW1ha2VmaWxlLmFtCSh3b3JraW5nIGNvcHkpCkBAIC0xOTg5LDYgKzE5ODksNyBA
QCB3ZWJjb3JlX2NwcGZsYWdzICs9IFwKIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9w
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvQXV0aGVudGljYXRpb25DaGFsbGVuZ2UuaCBcCiAJV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llSmFyQ3VybC5jcHAgXAorCVdlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Gb3JtRGF0YVN0cmVhbUN1cmwuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Gb3JtRGF0YVN0cmVhbUN1cmwuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvUmVzb3VyY2VFcnJvci5oIFwKSW5kZXg6IFdlYkNvcmUvd2ViY29yZS13eC5i
a2wKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS93ZWJjb3JlLXd4LmJrbAkocmV2aXNpb24gMzY0MzIp
CisrKyBXZWJDb3JlL3dlYmNvcmUtd3guYmtsCSh3b3JraW5nIGNvcHkpCkBAIC05NCw2ICs5NCw3
IEBAIHd4V2ViQ29yZSBwb3J0IEJha2VmaWxlIHByb2plY3QgZmlsZS4KICAgICAgICAgICAgIHBs
YXRmb3JtL3d4L1dpZGdldFd4LmNwcAogICAgICAgICAgICAKICAgICAgICAgICAgIDwhLS0gZmls
ZXMgZnJvbSBvdGhlciBwb3J0cyB3ZSBjdXJyZW50bHkgcmVseSBvbiAtLT4KKyAgICAgICAgICAg
IHBsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmNwcAogICAgICAgICAgICAgcGxh
dGZvcm0vbmV0d29yay9jdXJsL0Zvcm1EYXRhU3RyZWFtQ3VybC5jcHAKICAgICAgICAgICAgIHBs
YXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZUN1cmwuY3BwCiAgICAgICAgICAgICBw
bGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcApJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgJKHJldmlzaW9uIDM2NDMyKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTE1NSw2ICsxNTUsMTAgQEAgcHVibGljOgogICAgIFJlc291cmNlSGFuZGxlSW50ZXJu
YWwqIGdldEludGVybmFsKCkgeyByZXR1cm4gZC5nZXQoKTsgfQogI2VuZGlmCiAKKyNpZiBVU0Uo
Q1VSTCkKKyAgICB2b2lkIGFkZENvb2tpZUhlYWRlcklmTmVlZGVkKCk7CisjZW5kaWYKKwogICAg
IC8vIFVzZWQgdG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCB5b3UgZG9uJ3QgZ2V0IGFueSBt
b3JlIE5TVVJMQ29ubmVjdGlvbiBjYWxsYmFja3MgdW50aWwgeW91IHJldHVybiBmcm9tIHRoZSBv
bmUgeW91J3JlIGluLgogICAgIHN0YXRpYyBib29sIGxvYWRzQmxvY2tlZCgpOyAgICAKICAgICAK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZUphckN1cmwu
Y3BwCShyZXZpc2lvbiAzNjQzMikKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nv
b2tpZUphckN1cmwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNywyOSArMTcsMjggQEAKICNpbmNs
dWRlICJjb25maWcuaCIKICNpbmNsdWRlICJDb29raWVKYXIuaCIKIAotI2luY2x1ZGUgIktVUkwu
aCIKLSNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgIlN0cmluZ0hhc2guaCIK
LQorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKICNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBj
b29raWVKYXI7Ci0KLXZvaWQgc2V0Q29va2llcyhEb2N1bWVudCogLypkb2N1bWVudCovLCBjb25z
dCBLVVJMJiB1cmwsIGNvbnN0IEtVUkwmIC8qcG9saWN5VVJMKi8sIGNvbnN0IFN0cmluZyYgdmFs
dWUpCit2b2lkIHNldENvb2tpZXMoRG9jdW1lbnQqIGRvY3VtZW50LCBjb25zdCBLVVJMJiB1cmws
IGNvbnN0IEtVUkwmIHBvbGljeVVSTCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKIHsKLSAgICBjb29r
aWVKYXIuc2V0KHVybC5zdHJpbmcoKSwgdmFsdWUpOworICAgIGlmIChjb29raWVzRW5hYmxlZChk
b2N1bWVudCkpCisgICAgICAgIENvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIoKS0+c2V0
Q29va2llcyh1cmwsIHBvbGljeVVSTCwgdmFsdWUpOwogfQogCi1TdHJpbmcgY29va2llcyhjb25z
dCBEb2N1bWVudCogLypkb2N1bWVudCovLCBjb25zdCBLVVJMJiB1cmwpCitTdHJpbmcgY29va2ll
cyhjb25zdCBEb2N1bWVudCogZG9jdW1lbnQsIGNvbnN0IEtVUkwmIHVybCkKIHsKLSAgICByZXR1
cm4gY29va2llSmFyLmdldCh1cmwuc3RyaW5nKCkpOworICAgIGlmIChjb29raWVzRW5hYmxlZChk
b2N1bWVudCkpCisgICAgICAgIHJldHVybiBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2Vy
KCktPmNvb2tpZXModXJsKTsKKworICAgIHJldHVybiBTdHJpbmcoKTsKIH0KIAogYm9vbCBjb29r
aWVzRW5hYmxlZChjb25zdCBEb2N1bWVudCogLypkb2N1bWVudCovKQogewotICAgIHJldHVybiB0
cnVlOworICAgIHJldHVybiAhIUNvb2tpZU1hbmFnZXI6OmdldENvb2tpZU1hbmFnZXIoKTsKIH0K
IAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFu
YWdlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWVNYW5hZ2VyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwOCBQbGV5by4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdo
dCAoQykgMjAwOCBKdWxpZW4gQ2hhZmZyYWl4IDxqY2hhZmZyYWl4QHdlYmtpdC5vcmc+LgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorI2luY2x1ZGUgIkhh
c2hNYXAuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5oIgorI2luY2x1
ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNs
dWRlICJTeXN0ZW1UaW1lLmgiCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKy8vIEZJWE1FOiBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZ21haWwgd29y
aworLy8gdW50aWwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaXMgYWRkZWQuCitzdGF0aWMgSGFzaE1h
cDxTdHJpbmcsIFN0cmluZz4gY29va2llSmFyOworCitzdGF0aWMgQ29va2llTWFuYWdlciogc2hh
cmVkTWFuYWdlciA9IDA7CisKK0Nvb2tpZU1hbmFnZXIqIENvb2tpZU1hbmFnZXI6OmdldENvb2tp
ZU1hbmFnZXIoKQoreworICAgIGlmICghc2hhcmVkTWFuYWdlcikKKyAgICAgICAgc2hhcmVkTWFu
YWdlciA9IG5ldyBDb29raWVNYW5hZ2VyKCk7CisgICAgcmV0dXJuIHNoYXJlZE1hbmFnZXI7Cit9
CisKK0Nvb2tpZU1hbmFnZXI6OkNvb2tpZU1hbmFnZXIoKQorICAgIDogbV9jb3VudCgwKQorewor
fQorCitDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgc2hhcmVkTWFuYWdl
ciA9IDA7Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6c2V0Q29va2llcyhjb25zdCBLVVJMJiB1
cmwsIGNvbnN0IEtVUkwmIHBvbGljeVVSTCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIGNvb2tpZUphci5zZXQodXJsLnN0cmluZygpLCB2YWx1ZSk7
Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6YWRkQ29va2llcyhjb25zdCBLVVJMJiB1cmwsIGNv
bnN0IFN0cmluZyYgdmFsdWUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworU3RyaW5n
IENvb2tpZU1hbmFnZXI6OmNvb2tpZXMoY29uc3QgS1VSTCYgdXJsKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIGNvb2tpZUphci5nZXQodXJsLnN0cmluZygpKTsKK30KKwor
dm9pZCBDb29raWVNYW5hZ2VyOjpyZW1vdmVBbGxDb29raWVzKCkKK3sKKyAgICBtX2NvdW50ID0g
MDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuaAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBQbGV5by4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBKdWxpZW4gQ2hhZmZyYWl4IDxqY2hhZmZy
YWl4QHdlYmtpdC5vcmc+LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29va2llTWFu
YWdlcl9oCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNs
dWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIENvb2tpZU1hbmFnZXIgeworICAgIHB1YmxpYzoK
KyAgICAgICAgc3RhdGljIENvb2tpZU1hbmFnZXIqIGdldENvb2tpZU1hbmFnZXIoKTsKKworICAg
ICAgICB2b2lkIHNldENvb2tpZXMoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBwb2xpY3lV
UkwsIGNvbnN0IFN0cmluZyYgdmFsdWUpOworCisgICAgICAgIC8vIFVzZWQgYnkgdGhlIG5ldHdv
cmsgbGF5ZXIgdG8gYWRkIGNvb2tpZXMgd2hlbiB0aGV5IGFyZSByZWNlaXZlZC4KKyAgICAgICAg
dm9pZCBhZGRDb29raWVzKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSk7CisK
KyAgICAgICAgU3RyaW5nIGNvb2tpZXMoY29uc3QgS1VSTCYgdXJsKTsKKworICAgICAgICB2b2lk
IHJlbW92ZUFsbENvb2tpZXMoKTsKKworICAgICAgICB1bnNpZ25lZCBjb29raWVzQ291bnQoKSB7
IHJldHVybiBtX2NvdW50OyB9CisKKyAgICAgICAgdm9pZCBzZXRDb29raWVKYXIoY29uc3QgU3Ry
aW5nJiBmaWxlTmFtZSkgeyBtX2Nvb2tpZUphckZpbGVOYW1lID0gZmlsZU5hbWU7IH0KKyAgICAg
ICAgU3RyaW5nIGdldENvb2tpZUphcigpIHsgcmV0dXJuIG1fY29va2llSmFyRmlsZU5hbWU7IH0K
KyAgICBwcml2YXRlOgorICAgICAgICBDb29raWVNYW5hZ2VyKCk7CisgICAgICAgIH5Db29raWVN
YW5hZ2VyKCk7CisKKyAgICAgICAgLy8gQ291bnQgdXBkYXRlIG1ldGhvZC4KKyAgICAgICAgaW5s
aW5lIHZvaWQgcmVtb3ZlZENvb2tpZSgpIHsgQVNTRVJUKG1fY291bnQgPiAwKTsgLS1tX2NvdW50
OyB9CisKKyAgICAgICAgdW5zaWduZWQgbV9jb3VudDsKKworICAgICAgICBTdHJpbmcgbV9jb29r
aWVKYXJGaWxlTmFtZTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8gQ29va2llIGNvbnN0YW50
cy4KKworICAgICAgICAvLyBNYXhpbXVtIGxlbmd0aCBmb3Igb25lIGNvb2tpZSBzdHJpbmcuCisg
ICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNYXhDb29raWVMZW5ndGggPSA0MDk2OworCisg
ICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGNvb2tpZXMgcGVyIGRvbWFpbi4KKyAgICAgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heENvb2tpZXNQZXJEb21haW4gPSAyMDsKKworICAgICAg
ICAvLyBNYXhpbXVtIGxlbmd0aCBmb3IgYWxsIGNvb2tpZXMgZm9yIG9uZSBVUkwuCisgICAgICAg
IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNYXhDb29raWVzTGVuZ3RoID0gTWF4Q29va2llTGVuZ3Ro
ICogTWF4Q29va2llc1BlckRvbWFpbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VI
YW5kbGVDdXJsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3Vy
bC9SZXNvdXJjZUhhbmRsZUN1cmwuY3BwCShyZXZpc2lvbiAzNjQzMikKKysrIFdlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlQ3VybC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZXNvdXJj
ZUhhbmRsZS5oIgogCisjaW5jbHVkZSAiQ29va2llSmFyLmgiCisjaW5jbHVkZSAiQ29va2llTWFu
YWdlci5oIgogI2luY2x1ZGUgIkRvY0xvYWRlci5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgpAQCAtMTk5LDQgKzIwMSw0
MSBAQCB2b2lkIFJlc291cmNlSGFuZGxlOjpyZWNlaXZlZENhbmNlbGxhdGlvCiAgICAgbm90SW1w
bGVtZW50ZWQoKTsKIH0KIAordm9pZCBSZXNvdXJjZUhhbmRsZTo6YWRkQ29va2llSGVhZGVySWZO
ZWVkZWQoKQoreworICAgIEtVUkwgdXJsID0gcmVxdWVzdCgpLnVybCgpOworICAgIEFTU0VSVCgh
dXJsLmlzRW1wdHkoKSk7CisKKyAgICAvLyBDb29raWVzIGFyZSBhIHBhcnQgb2YgdGhlIGh0dHAg
cHJvdG9jb2wgb25seS4KKyAgICBpZiAoIXVybC5wcm90b2NvbElzKCJodHRwIikpCisgICAgICAg
IHJldHVybjsKKworICAgIEFTU0VSVCghdXJsLmhhc1JlZigpKTsgLy8gVVJMIGZvciBjb29raWVz
IHNob3VsZCBub3QgaGF2ZSBhIHJlZi4KKworICAgIC8vIFByZXBhcmUgYSBjb29raWUgaGVhZGVy
IGlmIHRoZXJlIGFyZSBjb29raWVzIHJlbGF0ZWQgdG8gdGhpcyB1cmwuCisgICAgU3RyaW5nIGNv
b2tpZXMgPSBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2VyKCktPmNvb2tpZXModXJsKTsK
KworICAgIGlmIChjb29raWVzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdW5z
aWduZWQgbWF4TGVuZ3RoID0gQ29va2llTWFuYWdlcjo6TWF4Q29va2llc0xlbmd0aDsKKyAgICAv
LyBDaGVjayBhZ2FpbnN0IHRoZSBsaW1pdC4KKyAgICAvLyBJZiB3ZSBleGNlZWRzIHRoZSBsaW1p
dCwgdGhlIFJGQyBzdGF0ZXMgdGhhdCB3ZSBzaG91bGQgbm90IHNlbmQgdHJ1bmNhdGVkIGNvb2tp
ZXMsCisgICAgLy8gc28gZG8gbm90IHNlbmQgYW55IGNvb2tpZXMuCisgICAgaWYgKGNvb2tpZXMu
bGVuZ3RoKCkgPiBtYXhMZW5ndGgpIHsKKyAgICAgICAgTE9HKE5ldHdvcmssICJDb29raWVzIGZv
ciAlcyBleGNlZWRzIHRoZSBsZW5naHQgbGltaXQgKCV1KSBhbmQgd2lsbCBub3QgYmUgc2VuZFxu
IiwgdXJsLnN0cmluZygpLmltcGwoKS0+YXNjaWkoKS5kYXRhKCksIG1heExlbmd0aCk7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0aWMgY2hhciBjb29raWVzQ2hhcltDb29raWVN
YW5hZ2VyOjpNYXhDb29raWVMZW5ndGggKyAxXTsKKyAgICBpbnQgbGVuZ3RoID0gc3RkOjptaW4o
Y29va2llcy5sZW5ndGgoKSwgbWF4TGVuZ3RoKTsKKworICAgIHN0cm5jcHkoY29va2llc0NoYXIs
IGNvb2tpZXMuaW1wbCgpLT5hc2NpaSgpLmRhdGEoKSwgbGVuZ3RoKTsKKworICAgIC8vIEZvcmNl
IHRoZSBzdHJpbmcgdG8gYmUgemVyby10ZXJtaW5hdGVkIGFzIHJlcXVpcmVkIGJ5IGxpYmNVUkwu
CisgICAgY29va2llc0NoYXJbbGVuZ3RoXSA9ICdcMCc7CisKKyAgICBjdXJsX2Vhc3lfc2V0b3B0
KGQtPm1faGFuZGxlLCBDVVJMT1BUX0NPT0tJRSwgY29va2llc0NoYXIpOworfQorCiB9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNv
dXJjZUhhbmRsZU1hbmFnZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5jcHAJKHJldmlzaW9uIDM2NDMyKQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzgsNiArMzgsOCBAQAogI2luY2x1ZGUgIlJlc291cmNlSGFuZGxl
SW50ZXJuYWwuaCIKICNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgogI2luY2x1ZGUgIkJhc2U2NC5o
IgorI2luY2x1ZGUgIkNvb2tpZUphci5oIgorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKIAog
I2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgpAQCAtNTgsNyArNjAs
NiBAQCBzdGF0aWMgY29uc3QgYm9vbCBpZ25vcmVTU0xFcnJvcnMgPSBnZXRlCiAKIFJlc291cmNl
SGFuZGxlTWFuYWdlcjo6UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKCkKICAgICA6IG1fZG93bmxvYWRU
aW1lcih0aGlzLCAmUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpkb3dubG9hZFRpbWVyQ2FsbGJhY2sp
Ci0gICAgLCBtX2Nvb2tpZUphckZpbGVOYW1lKDApCiAgICAgLCBtX3J1bm5pbmdKb2JzKDApCiB7
CiAgICAgY3VybF9nbG9iYWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOwpAQCAtNzIsMTYgKzczLDkg
QEAgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjp+UmVzb3VyY2VIYW5kbGVNYQogewogICAgIGN1cmxf
bXVsdGlfY2xlYW51cChtX2N1cmxNdWx0aUhhbmRsZSk7CiAgICAgY3VybF9zaGFyZV9jbGVhbnVw
KG1fY3VybFNoYXJlSGFuZGxlKTsKLSAgICBpZiAobV9jb29raWVKYXJGaWxlTmFtZSkKLSAgICAg
ICAgZnJlZShtX2Nvb2tpZUphckZpbGVOYW1lKTsKICAgICBjdXJsX2dsb2JhbF9jbGVhbnVwKCk7
CiB9CiAKLXZvaWQgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpzZXRDb29raWVKYXJGaWxlTmFtZShj
b25zdCBjaGFyKiBjb29raWVKYXJGaWxlTmFtZSkKLXsKLSAgICBtX2Nvb2tpZUphckZpbGVOYW1l
ID0gc3RyZHVwKGNvb2tpZUphckZpbGVOYW1lKTsKLX0KLQogUmVzb3VyY2VIYW5kbGVNYW5hZ2Vy
KiBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNoYXJlZEluc3RhbmNlKCkKIHsKICAgICBzdGF0aWMg
UmVzb3VyY2VIYW5kbGVNYW5hZ2VyKiBzaGFyZWRJbnN0YW5jZSA9IDA7CkBAIC0xOTcsOCArMTkx
LDMxIEBAIHN0YXRpYyBzaXplX3QgaGVhZGVyQ2FsbGJhY2soY2hhciogcHRyLCAKIAogICAgIH0g
ZWxzZSB7CiAgICAgICAgIGludCBzcGxpdFBvcyA9IGhlYWRlci5maW5kKCI6Iik7Ci0gICAgICAg
IGlmIChzcGxpdFBvcyAhPSAtMSkKLSAgICAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0SFRUUEhl
YWRlckZpZWxkKGhlYWRlci5sZWZ0KHNwbGl0UG9zKSwgaGVhZGVyLnN1YnN0cmluZyhzcGxpdFBv
cysxKS5zdHJpcFdoaXRlU3BhY2UoKSk7CisgICAgICAgIGlmIChzcGxpdFBvcyAhPSAtMSkgewor
ICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBoZWFkZXJOYW1lID0gaGVhZGVyLmxlZnQoc3BsaXRQ
b3MpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBoZWFkZXJWYWx1ZSA9IGhlYWRlci5zdWJz
dHJpbmcoc3BsaXRQb3MgKyAxKS5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICAgICAgICAgIGQtPm1f
cmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKKwor
ICAgICAgICAgICAgLy8gSGFuZGxlIGNvb2tpZSBpZiBlbmFibGVkLgorICAgICAgICAgICAgaWYg
KGNvb2tpZXNFbmFibGVkKDApICYmIGVxdWFsSWdub3JpbmdDYXNlKGhlYWRlck5hbWUsICJzZXQt
Y29va2llIikpIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSB1cmwg
aWYgaXQgd2FzIG5vdCBhbHJlYWR5IHNldC4KKyAgICAgICAgICAgICAgICBpZiAoZC0+bV9yZXNw
b25zZS51cmwoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ1VSTGNvZGUgZXJy
OworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBoZHI7CisgICAgICAgICAgICAgICAg
ICAgIGVyciA9IGN1cmxfZWFzeV9nZXRpbmZvKGQtPm1faGFuZGxlLCBDVVJMSU5GT19FRkZFQ1RJ
VkVfVVJMLCAmaGRyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IENVUkxFX09L
KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coTmV0d29yaywgIkNhbm5vdCBkZXRlcm1p
bmUgVVJMIC0gY29va2llIFwiJXNcIiByZWplY3RlZCIsIGhlYWRlclZhbHVlLmltcGwoKS0+YXNj
aWkoKS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkLT5tX3Jlc3BvbnNl
LnNldFVybChLVVJMKGhkcikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IC8vIEFkZCB0aGUgbmV3IGNvb2tpZXMgdG8gdGhlIGV4aXN0aW5nIHNldC4KKyAgICAgICAgICAg
ICAgICBDb29raWVNYW5hZ2VyOjpnZXRDb29raWVNYW5hZ2VyKCktPmFkZENvb2tpZXMoZC0+bV9y
ZXNwb25zZS51cmwoKSwgaGVhZGVyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAg
ICAgfQogCiAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKQEAgLTU5OCw5ICs2MTUsMTIgQEAgdm9pZCBS
ZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmluaXRpYWxpemVIYQogICAgIGQtPm1fdXJsID0gc3RyZHVw
KHVybC5sYXRpbjEoKS5kYXRhKCkpOwogICAgIGN1cmxfZWFzeV9zZXRvcHQoZC0+bV9oYW5kbGUs
IENVUkxPUFRfVVJMLCBkLT5tX3VybCk7CiAKLSAgICBpZiAobV9jb29raWVKYXJGaWxlTmFtZSkg
ewotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxlLCBDVVJMT1BUX0NPT0tJRUZJ
TEUsIG1fY29va2llSmFyRmlsZU5hbWUpOwotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1f
aGFuZGxlLCBDVVJMT1BUX0NPT0tJRUpBUiwgbV9jb29raWVKYXJGaWxlTmFtZSk7CisgICAgaWYg
KGNvb2tpZXNFbmFibGVkKDApKSB7CisgICAgICAgIC8vIEZJWE1FOiBPbmNlIHRoZSBjb29raWUg
Y29kZSBpcyBmdWxseSBmdW5jdGlvbmFsLCB0aG9zZSAzIGxpbmVzIHNob3VsZCBiZSByZW1vdmVk
LgorICAgICAgICBTdHJpbmcgY29va2llSmFyRmlsZU5hbWUgPSBDb29raWVNYW5hZ2VyOjpnZXRD
b29raWVNYW5hZ2VyKCktPmdldENvb2tpZUphcigpOworICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0
KGQtPm1faGFuZGxlLCBDVVJMT1BUX0NPT0tJRUZJTEUsIGNvb2tpZUphckZpbGVOYW1lLnV0Zjgo
KS5kYXRhKCkpOworCisgICAgICAgIGpvYi0+YWRkQ29va2llSGVhZGVySWZOZWVkZWQoKTsKICAg
ICB9CiAKICAgICBzdHJ1Y3QgY3VybF9zbGlzdCogaGVhZGVycyA9IDA7CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1hbmFnZXIu
aAkocmV2aXNpb24gMzY0MzIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNv
dXJjZUhhbmRsZU1hbmFnZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsNyArNDIsNiBAQCBwdWJs
aWM6CiAgICAgc3RhdGljIFJlc291cmNlSGFuZGxlTWFuYWdlciogc2hhcmVkSW5zdGFuY2UoKTsK
ICAgICB2b2lkIGFkZChSZXNvdXJjZUhhbmRsZSopOwogICAgIHZvaWQgY2FuY2VsKFJlc291cmNl
SGFuZGxlKik7Ci0gICAgdm9pZCBzZXRDb29raWVKYXJGaWxlTmFtZShjb25zdCBjaGFyKiBjb29r
aWVKYXJGaWxlTmFtZSk7CiAKICAgICB2b2lkIGRpc3BhdGNoU3luY2hyb25vdXNKb2IoUmVzb3Vy
Y2VIYW5kbGUqKTsKIApAQCAtNjMsNyArNjIsNiBAQCBwcml2YXRlOgogICAgIFRpbWVyPFJlc291
cmNlSGFuZGxlTWFuYWdlcj4gbV9kb3dubG9hZFRpbWVyOwogICAgIENVUkxNKiBtX2N1cmxNdWx0
aUhhbmRsZTsKICAgICBDVVJMU0gqIG1fY3VybFNoYXJlSGFuZGxlOwotICAgIGNoYXIqIG1fY29v
a2llSmFyRmlsZU5hbWU7CiAgICAgY2hhciBtX2N1cmxFcnJvckJ1ZmZlcltDVVJMX0VSUk9SX1NJ
WkVdOwogICAgIFZlY3RvcjxSZXNvdXJjZUhhbmRsZSo+IG1fcmVzb3VyY2VIYW5kbGVMaXN0Owog
ICAgIGludCBtX3J1bm5pbmdKb2JzOwo=
</data>
<flag name="review"
          id="10511"
          type_id="1"
          status="-"
          setter="kevino"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>205975</attachid>
            <date>2013-07-03 01:07:25 -0700</date>
            <delta_ts>2013-07-03 01:07:25 -0700</delta_ts>
            <desc>My &quot;working progress&quot; implementation</desc>
            <filename>cookiemanager.diff</filename>
            <type>text/plain</type>
            <size>67656</size>
            <attacher name="Szabolcs David">davidsz</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1BsYXRmb3JtTml4LmNtYWtlIGIvU291cmNlL1dl
YkNvcmUvUGxhdGZvcm1OaXguY21ha2UKaW5kZXggY2NiZTc3MC4uZGQzYzFhNyAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvUGxhdGZvcm1OaXguY21ha2UKKysrIGIvU291cmNlL1dlYkNvcmUv
UGxhdGZvcm1OaXguY21ha2UKQEAgLTI4NSw2ICsyODUsOSBAQCBpZiAoV1RGX1VTRV9DVVJMKQog
ICAgIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUwogICAgICAgICBwbGF0Zm9ybS9uZXR3b3Jr
L05ldHdvcmtTdG9yYWdlU2Vzc2lvblN0dWIuY3BwCiAgICAgICAgIHBsYXRmb3JtL25ldHdvcmsv
Y3VybC9Db29raWVKYXJDdXJsLmNwcAorICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llTWFuYWdlci5jcHAKKyAgICAgICAgcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlLmNwcAorICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUGFyc2Vk
Q29va2llLmNwcAogICAgICAgICBwbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llU3RvcmFnZUN1
cmwuY3BwCiAgICAgICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9DcmVkZW50aWFsU3RvcmFnZUN1
cmwuY3BwCiAgICAgICAgIHBsYXRmb3JtL25ldHdvcmsvY3VybC9ETlNDdXJsLmNwcApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9D
b29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZS5jcHAKaW5kZXggZTY5ZGUyOS4uOGQ3YjgyYSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZURhdGFi
YXNlQmFja2luZ1N0b3JlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjgxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxl
eW8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEz
IFN6YWJvbGNzIERhdmlkIDxkYXZpZHN6QGluZi51LXN6ZWdlZC5odT4sIFVuaXZlcnNpdHkgb2Yg
U3plZ2VkCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llRGF0YWJhc2VCYWNraW5n
U3RvcmUuaCIKKworI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUu
aCIKKyNpbmNsdWRlICJTUUxpdGVTdGF0ZW1lbnQuaCIKKyNpbmNsdWRlICJTUUxpdGVUcmFuc2Fj
dGlvbi5oIgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb29raWVEYXRh
YmFzZUJhY2tpbmdTdG9yZTo6Q29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUoKQorICAgIDogbV90
YWJsZU5hbWUoImNvb2tpZXMiKQorICAgICwgbV9pbnNlcnRTdGF0ZW1lbnQoMCkKKyAgICAsIG1f
dXBkYXRlU3RhdGVtZW50KDApCisgICAgLCBtX2RlbGV0ZVN0YXRlbWVudCgwKQoreworICAgIG9w
ZW4oImNvb2tpZXMuZGIiKTsKK30KKworQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6On5Db29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpCit7CisgICAgY2xvc2UoKTsKK30KKwordm9pZCBDb29r
aWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6b3Blbihjb25zdCBTdHJpbmcmIGNvb2tpZUphcikKK3sK
KyAgICBpZiAobV9kYi5pc09wZW4oKSkKKyAgICAgICAgY2xvc2UoKTsKKworICAgIGlmICghbV9k
Yi5vcGVuKGNvb2tpZUphcikpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZCBub3Qgb3BlbiB0
aGUgY29va2llIGRhdGFiYXNlLiBObyBjb29raWUgd2lsbCBiZSBzdG9yZWQhIik7CisgICAgICAg
IExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2co
KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyIGNyZWF0ZVRh
YmxlUXVlcnk7CisgICAgY3JlYXRlVGFibGVRdWVyeS5hcHBlbmQoIkNSRUFURSBUQUJMRSBJRiBO
T1QgRVhJU1RTICIpOworICAgIGNyZWF0ZVRhYmxlUXVlcnkuYXBwZW5kKG1fdGFibGVOYW1lKTsK
KyAgICBjcmVhdGVUYWJsZVF1ZXJ5LmFwcGVuZCgiKG5hbWUgVEVYVCwgdmFsdWUgVEVYVCwgaG9z
dCBURVhULCBwYXRoIFRFWFQsIGV4cGlyeSBET1VCTEUsIGxhc3RBY2Nlc3NlZCBET1VCTEUsIGlz
U2VjdXJlIElOVEVHRVIsIGlzSHR0cE9ubHkgSU5URUdFUiwgY3JlYXRpb25UaW1lIERPVUJMRSwg
cHJvdG9jb2wgVEVYVCwgUFJJTUFSWSBLRVkgKHByb3RvY29sLCBob3N0LCBwYXRoLCBuYW1lKSk7
Iik7CisKKyAgICBpZiAoIW1fZGIuZXhlY3V0ZUNvbW1hbmQoY3JlYXRlVGFibGVRdWVyeS50b1N0
cmluZygpKSkgeworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBjcmVhdGUgdGhlIHRhYmxl
IHRvIHN0b3JlIHRoZSBjb29raWVzIGludG8uIE5vIGNvb2tpZSB3aWxsIGJlIHN0b3JlZCEiKTsK
KyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RF
cnJvck1zZygpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIFN0cmluZ0J1aWxkZXIgaW5zZXJ0UXVlcnk7CisgICAgaW5zZXJ0UXVlcnkuYXBwZW5kKCJJ
TlNFUlQgT1IgUkVQTEFDRSBJTlRPICIpOworICAgIGluc2VydFF1ZXJ5LmFwcGVuZChtX3RhYmxl
TmFtZSk7CisgICAgaW5zZXJ0UXVlcnkuYXBwZW5kKCIgKG5hbWUsIHZhbHVlLCBob3N0LCBwYXRo
LCBleHBpcnksIGxhc3RBY2Nlc3NlZCwgaXNTZWN1cmUsIGlzSHR0cE9ubHksIGNyZWF0aW9uVGlt
ZSwgcHJvdG9jb2wpIFZBTFVFUyAoPzEsID8yLCA/MywgPzQsID81LCA/NiwgPzcsID84LCA/OSwg
PzEwKTsiKTsKKworICAgIG1faW5zZXJ0U3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCht
X2RiLCBpbnNlcnRRdWVyeS50b1N0cmluZygpKTsKKyAgICBpZiAobV9pbnNlcnRTdGF0ZW1lbnQt
PnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBzYXZlIGNvb2tpZXMiKTsK
KyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RF
cnJvck1zZygpKTsKKyAgICB9CisKKyAgICBTdHJpbmdCdWlsZGVyIHVwZGF0ZVF1ZXJ5OworICAg
IHVwZGF0ZVF1ZXJ5LmFwcGVuZCgiVVBEQVRFICIpOworICAgIHVwZGF0ZVF1ZXJ5LmFwcGVuZCht
X3RhYmxlTmFtZSk7CisgICAgLy8gVGhlIHdoZXJlIHN0YXRlbWVudCBpcyBjaG9zZW4gdG8gbWF0
Y2ggQ29va2llTWFwIGtleS4KKyAgICB1cGRhdGVRdWVyeS5hcHBlbmQoIiBTRVQgbmFtZSA9ID8x
LCB2YWx1ZSA9ID8yLCBob3N0ID0gPzMsIHBhdGggPSA/NCwgZXhwaXJ5ID0gPzUsIGxhc3RBY2Nl
c3NlZCA9ID82LCBpc1NlY3VyZSA9ID83LCBpc0h0dHBPbmx5ID0gPzgsIGNyZWF0aW9uVGltZSA9
ID85LCBwcm90b2NvbCA9ID8xMCB3aGVyZSBuYW1lID0gPzEgYW5kIGhvc3QgPSA/MyBhbmQgcGF0
aCA9ID80OyIpOworICAgIG1fdXBkYXRlU3RhdGVtZW50ID0gbmV3IFNRTGl0ZVN0YXRlbWVudCht
X2RiLCB1cGRhdGVRdWVyeS50b1N0cmluZygpKTsKKworICAgIGlmIChtX3VwZGF0ZVN0YXRlbWVu
dC0+cHJlcGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IHVwZGF0ZSBjb29raWVz
Iik7CisgICAgICAgIExPR19FUlJPUigiU1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5s
YXN0RXJyb3JNc2coKSk7CisgICAgfQorCisgICAgU3RyaW5nQnVpbGRlciBkZWxldGVRdWVyeTsK
KyAgICBkZWxldGVRdWVyeS5hcHBlbmQoIkRFTEVURSBGUk9NICIpOworICAgIGRlbGV0ZVF1ZXJ5
LmFwcGVuZChtX3RhYmxlTmFtZSk7CisgICAgZGVsZXRlUXVlcnkuYXBwZW5kKCIgV0hFUkUgbmFt
ZT0/MSBhbmQgaG9zdD0/MiBhbmQgcGF0aD0/MyBhbmQgcHJvdG9jb2w9PzQ7Iik7CisgICAgbV9k
ZWxldGVTdGF0ZW1lbnQgPSBuZXcgU1FMaXRlU3RhdGVtZW50KG1fZGIsIGRlbGV0ZVF1ZXJ5LnRv
U3RyaW5nKCkpOworCisgICAgaWYgKG1fZGVsZXRlU3RhdGVtZW50LT5wcmVwYXJlKCkpIHsKKyAg
ICAgICAgTE9HX0VSUk9SKCJDYW5ub3QgZGVsZXRlIGNvb2tpZXMiKTsKKyAgICAgICAgTE9HX0VS
Uk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAg
ICB9CisKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6c2VuZENoYW5nZXNU
b0RhdGFiYXNlKCkKK3sKKyAgICBzaXplX3Qgc2l6ZU9mQ2hhbmdlID0gbV9jaGFuZ2VkQ29va2ll
cy5zaXplKCk7CisKKyAgICBpZiAoIXNpemVPZkNoYW5nZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgU1FMaXRlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24obV9kYiwgZmFsc2UpOworICAgIHRyYW5z
YWN0aW9uLmJlZ2luKCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVPZkNoYW5n
ZTsgaSsrKSB7CisKKyAgICAgICAgU1FMaXRlU3RhdGVtZW50KiBtX3N0YXRlbWVudDsKKyAgICAg
ICAgY29uc3QgUmVmUHRyPFBhcnNlZENvb2tpZT4gY29va2llID0gbV9jaGFuZ2VkQ29va2llc1tp
XS5maXJzdDsKKyAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG1fY2hhbmdlZENvb2tpZXNbaV0uc2Vj
b25kOworCisgICAgICAgIGlmIChhY3Rpb24gPT0gRGVsZXRlKSB7CisgICAgICAgICAgICBtX3N0
YXRlbWVudCA9IG1fZGVsZXRlU3RhdGVtZW50OworCisgICAgICAgICAgICAvLyBCaW5kcyBhbGwg
dGhlIHZhbHVlcworICAgICAgICAgICAgaWYgKG1fc3RhdGVtZW50LT5iaW5kVGV4dCgxLCBjb29r
aWUtPm5hbWUoKSkgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDIsIGNvb2tpZS0+ZG9tYWluKCkp
CisgICAgICAgICAgICAgICAgfHwgbV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDMsIGNvb2tpZS0+cGF0
aCgpKSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLT5wcm90b2NvbCgpKSkgewor
ICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ2Fubm90IGJpbmQgY29va2llIGRhdGEgdG8gZGVs
ZXRlIik7CisgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTog
JXMiLCBtX2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBpZiAoYWN0aW9u
ID09IFVwZGF0ZSkKKyAgICAgICAgICAgICAgICBtX3N0YXRlbWVudCA9IG1fdXBkYXRlU3RhdGVt
ZW50OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc3RhdGVtZW50ID0gbV9p
bnNlcnRTdGF0ZW1lbnQ7CisKKyAgICAgICAgICAgIC8vIEJpbmRzIGFsbCB0aGUgdmFsdWVzCisg
ICAgICAgICAgICBpZiAobV9zdGF0ZW1lbnQtPmJpbmRUZXh0KDEsIGNvb2tpZS0+bmFtZSgpKSB8
fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMiwgY29va2llLT52YWx1ZSgpKQorICAgICAgICAgICAg
ICAgIHx8IG1fc3RhdGVtZW50LT5iaW5kVGV4dCgzLCBjb29raWUtPmRvbWFpbigpKSB8fCBtX3N0
YXRlbWVudC0+YmluZFRleHQoNCwgY29va2llLT5wYXRoKCkpCisgICAgICAgICAgICAgICAgfHwg
bV9zdGF0ZW1lbnQtPmJpbmREb3VibGUoNSwgY29va2llLT5leHBpcnkoKSkgfHwgbV9zdGF0ZW1l
bnQtPmJpbmREb3VibGUoNiwgY29va2llLT5sYXN0QWNjZXNzZWQoKSkKKyAgICAgICAgICAgICAg
ICB8fCBtX3N0YXRlbWVudC0+YmluZEludDY0KDcsIGNvb2tpZS0+aXNTZWN1cmUoKSkgfHwgbV9z
dGF0ZW1lbnQtPmJpbmRJbnQ2NCg4LCBjb29raWUtPmlzSHR0cE9ubHkoKSkKKyAgICAgICAgICAg
ICAgICB8fCBtX3N0YXRlbWVudC0+YmluZERvdWJsZSg5LCBjb29raWUtPmNyZWF0aW9uVGltZSgp
KSB8fCBtX3N0YXRlbWVudC0+YmluZFRleHQoMTAsIGNvb2tpZS0+cHJvdG9jb2woKSkpIHsKKyAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBiaW5kIGNvb2tpZSBkYXRhIHRvIHNhdmUi
KTsKKyAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIs
IG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50IHJjID0gbV9zdGF0ZW1lbnQtPnN0ZXAo
KTsKKyAgICAgICAgbV9zdGF0ZW1lbnQtPnJlc2V0KCk7CisgICAgICAgIGlmIChyYyAhPSBTUUxS
ZXN1bHRPayAmJiByYyAhPSBTUUxSZXN1bHREb25lKSB7CisgICAgICAgICAgICBMT0dfRVJST1Io
IkNhbm5vdCBtYWtlIGNhbGwgdG8gdGhlIGRhdGFiYXNlIik7CisgICAgICAgICAgICBMT0dfRVJS
T1IoIlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0cmFuc2FjdGlvbi5j
b21taXQoKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZTo6Y2xvc2UoKQor
eworICAgIHNlbmRDaGFuZ2VzVG9EYXRhYmFzZSgpOworCisgICAgZGVsZXRlIG1faW5zZXJ0U3Rh
dGVtZW50OworICAgIGRlbGV0ZSBtX3VwZGF0ZVN0YXRlbWVudDsKKyAgICBkZWxldGUgbV9kZWxl
dGVTdGF0ZW1lbnQ7CisKKyAgICBpZiAobV9kYi5pc09wZW4oKSkKKyAgICAgICAgbV9kYi5jbG9z
ZSgpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpnZXRDb29raWVzRnJv
bURhdGFiYXNlKEhhc2hNYXA8U3RyaW5nLCBWZWN0b3I8UmVmUHRyPFBhcnNlZENvb2tpZT4gPiA+
JiBjb29raWVzKQoreworICAgIGlmICghbV9kYi5pc09wZW4oKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgU3RyaW5nQnVpbGRlciBzZWxlY3RRdWVyeTsKKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQo
IlNFTEVDVCBuYW1lLCB2YWx1ZSwgaG9zdCwgcGF0aCwgZXhwaXJ5LCBsYXN0QWNjZXNzZWQsIGlz
U2VjdXJlLCBpc0h0dHBPbmx5LCBjcmVhdGlvblRpbWUsIHByb3RvY29sIEZST00gIik7CisgICAg
c2VsZWN0UXVlcnkuYXBwZW5kKG1fdGFibGVOYW1lKTsKKyAgICBzZWxlY3RRdWVyeS5hcHBlbmQo
IiBPUkRFUiBCWSBsYXN0QWNjZXNzZWQgQVNDOyIpOworCisgICAgU1FMaXRlU3RhdGVtZW50IHNl
bGVjdFN0YXRlbWVudChtX2RiLCBzZWxlY3RRdWVyeS50b1N0cmluZygpKTsKKworICAgIGlmIChz
ZWxlY3RTdGF0ZW1lbnQucHJlcGFyZSgpKSB7CisgICAgICAgIExPR19FUlJPUigiQ2Fubm90IHJl
dHJpZXZlZCBjb29raWVzIGZyb20gdGhlIGRhdGFiYXNlIik7CisgICAgICAgIExPR19FUlJPUigi
U1FMaXRlIEVycm9yIE1lc3NhZ2U6ICVzIiwgbV9kYi5sYXN0RXJyb3JNc2coKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBIYXNoTWFwPFN0cmluZywgVmVjdG9yPFJlZlB0cjxQYXJz
ZWRDb29raWU+ID4gPjo6aXRlcmF0b3IgaXQ7CisKKyAgICB3aGlsZSAoc2VsZWN0U3RhdGVtZW50
LnN0ZXAoKSA9PSBTUUxSZXN1bHRSb3cpIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNlbGVj
dFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDApOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBzZWxl
Y3RTdGF0ZW1lbnQuZ2V0Q29sdW1uVGV4dCgxKTsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IHNl
bGVjdFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDIpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHNl
bGVjdFN0YXRlbWVudC5nZXRDb2x1bW5UZXh0KDMpOworICAgICAgICBkb3VibGUgZXhwaXJ5ID0g
c2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg0KTsKKyAgICAgICAgZG91YmxlIGxhc3RB
Y2Nlc3NlZCA9IHNlbGVjdFN0YXRlbWVudC5nZXRDb2x1bW5Eb3VibGUoNSk7CisgICAgICAgIGJv
b2wgaXNTZWN1cmUgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDYpOworICAgICAgICBi
b29sIGlzSHR0cE9ubHkgPSBzZWxlY3RTdGF0ZW1lbnQuZ2V0Q29sdW1uSW50KDcpOworICAgICAg
ICBkb3VibGUgY3JlYXRpb25UaW1lID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtbkRvdWJsZSg4
KTsKKyAgICAgICAgU3RyaW5nIHByb3RvY29sID0gc2VsZWN0U3RhdGVtZW50LmdldENvbHVtblRl
eHQoOSk7CisKKyAgICAgICAgUmVmUHRyPFBhcnNlZENvb2tpZT4gY29va2llID0gUGFyc2VkQ29v
a2llOjpjcmVhdGUobmFtZSwgdmFsdWUsIGRvbWFpbiwgcHJvdG9jb2wsIHBhdGgsIGV4cGlyeSwg
bGFzdEFjY2Vzc2VkLCBjcmVhdGlvblRpbWUsIGlzU2VjdXJlLCBpc0h0dHBPbmx5KTsKKworICAg
ICAgICBpdCA9IGNvb2tpZXMuZmluZChjb29raWUtPmRvbWFpbigpKTsKKworICAgICAgICBpZiAo
aXQgPT0gY29va2llcy5lbmQoKSkgeworCisgICAgICAgICAgICBWZWN0b3I8UmVmUHRyPFBhcnNl
ZENvb2tpZT4gPiB2ZWN0b3I7CisgICAgICAgICAgICB2ZWN0b3IuYXBwZW5kKGNvb2tpZSk7Cisg
ICAgICAgICAgICBjb29raWVzLmFkZChjb29raWUtPmRvbWFpbigpLCB2ZWN0b3IpOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIGl0LT52YWx1ZS5hcHBlbmQoY29va2llKTsKKyAgICB9Cit9
CisKK3ZvaWQgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmU6Omluc2VydChjb25zdCBQYXNzUmVm
UHRyPFBhcnNlZENvb2tpZT4gY29va2llKQoreworICAgIGlmICghY29va2llLT5oYXNFeHBpcmVk
KCkpCisgICAgICAgIGFkZFRvQ2hhbmdlUXVldWUoY29va2llLCBJbnNlcnQpOworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjp1cGRhdGUoY29uc3QgUGFzc1JlZlB0cjxQYXJz
ZWRDb29raWU+IGNvb2tpZSkKK3sKKyAgICBpZiAoIWNvb2tpZS0+aGFzRXhwaXJlZCgpKQorICAg
ICAgICBhZGRUb0NoYW5nZVF1ZXVlKGNvb2tpZSwgVXBkYXRlKTsKKyAgICBlbHNlCisgICAgICAg
IHJlbW92ZShjb29raWUpOworfQorCit2b2lkIENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjpy
ZW1vdmUoY29uc3QgUGFzc1JlZlB0cjxQYXJzZWRDb29raWU+IGNvb2tpZSkKK3sKKyAgICBhZGRU
b0NoYW5nZVF1ZXVlKGNvb2tpZSwgRGVsZXRlKTsKK30KKwordm9pZCBDb29raWVEYXRhYmFzZUJh
Y2tpbmdTdG9yZTo6cmVtb3ZlQWxsKCkKK3sKKyAgICBpZiAoIW1fZGIuaXNPcGVuKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIFN0cmluZ0J1aWxkZXIgZGVsZXRlUXVlcnk7CisgICAgZGVsZXRl
UXVlcnkuYXBwZW5kKCJERUxFVEUgRlJPTSAiKTsKKyAgICBkZWxldGVRdWVyeS5hcHBlbmQobV90
YWJsZU5hbWUpOworICAgIGRlbGV0ZVF1ZXJ5LmFwcGVuZCgiOyIpOworCisgICAgU1FMaXRlU3Rh
dGVtZW50IGRlbGV0ZVN0YXRlbWVudChtX2RiLCBkZWxldGVRdWVyeS50b1N0cmluZygpKTsKKyAg
ICBpZiAoZGVsZXRlU3RhdGVtZW50LnByZXBhcmUoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNv
dWxkIG5vdCBwcmVwYXJlIERFTEVURSAqIHN0YXRlbWVudCIpOworICAgICAgICBMT0dfRVJST1Io
IlNRTGl0ZSBFcnJvciBNZXNzYWdlOiAlcyIsIG1fZGIubGFzdEVycm9yTXNnKCkpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFkZWxldGVTdGF0ZW1lbnQuZXhlY3V0ZUNvbW1h
bmQoKSkgeworICAgICAgICBMT0dfRVJST1IoIkNhbm5vdCBkZWxldGUgY29va2llIGZyb20gZGF0
YWJhc2UiKTsKKyAgICAgICAgTE9HX0VSUk9SKCJTUUxpdGUgRXJyb3IgTWVzc2FnZTogJXMiLCBt
X2RiLmxhc3RFcnJvck1zZygpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworfQorCit2b2lk
IENvb2tpZURhdGFiYXNlQmFja2luZ1N0b3JlOjphZGRUb0NoYW5nZVF1ZXVlKGNvbnN0IFBhc3NS
ZWZQdHI8UGFyc2VkQ29va2llPiBjaGFuZ2VkQ29va2llLCBBY3Rpb24gYWN0aW9uUGFyYW0pCit7
CisgICAgQ29va2llQWN0aW9uIGNoYW5nZShjaGFuZ2VkQ29va2llLCBhY3Rpb25QYXJhbSk7Cisg
ICAgbV9jaGFuZ2VkQ29va2llcy5hcHBlbmQoY2hhbmdlKTsKKyAgICBzZW5kQ2hhbmdlc1RvRGF0
YWJhc2UoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZURhdGFiYXNlQmFja2luZ1N0b3Jl
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llRGF0YWJhc2VC
YWNraW5nU3RvcmUuaAppbmRleCBlNjlkZTI5Li44NTFhNmIxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llRGF0YWJh
c2VCYWNraW5nU3RvcmUuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxleW8uY29tPgorICogQ29weXJpZ2h0
IChDKSAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEzIFN6YWJvbGNzIERhdmlkIDxkYXZpZHN6QGlu
Zi51LXN6ZWdlZC5odT4sIFVuaXZlcnNpdHkgb2YgU3plZ2VkCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIENvb2tpZURhdGFiYXNl
QmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmVfaAorCisj
aW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisjaW5jbHVkZSAiU1FMaXRlRGF0YWJhc2UuaCIKKyNp
bmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ29va2llRGF0YWJhc2VCYWNraW5nU3Rv
cmUgeworCitwdWJsaWM6CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworICAg
IH5Db29raWVEYXRhYmFzZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBvcGVuKGNvbnN0IFN0
cmluZyYgY29va2llSmFyKTsKKyAgICB2b2lkIGNsb3NlKCk7CisgICAgdm9pZCBpbnNlcnQoY29u
c3QgUGFzc1JlZlB0cjxQYXJzZWRDb29raWU+KTsKKyAgICB2b2lkIHVwZGF0ZShjb25zdCBQYXNz
UmVmUHRyPFBhcnNlZENvb2tpZT4pOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IFBhc3NSZWZQdHI8
UGFyc2VkQ29va2llPik7CisgICAgdm9pZCBnZXRDb29raWVzRnJvbURhdGFiYXNlKEhhc2hNYXA8
U3RyaW5nLCBWZWN0b3I8UmVmUHRyPFBhcnNlZENvb2tpZT4gPiA+Jik7CisgICAgdm9pZCByZW1v
dmVBbGwoKTsKKworcHJpdmF0ZToKKworICAgIGVudW0gQWN0aW9uIHsKKworICAgICAgICBJbnNl
cnQsCisgICAgICAgIFVwZGF0ZSwKKyAgICAgICAgRGVsZXRlCisgICAgfTsKKworICAgIHZvaWQg
YWRkVG9DaGFuZ2VRdWV1ZShjb25zdCBQYXNzUmVmUHRyPFBhcnNlZENvb2tpZT4gY2hhbmdlZENv
b2tpZSwgQWN0aW9uIGFjdGlvblBhcmFtKTsKKyAgICB2b2lkIHNlbmRDaGFuZ2VzVG9EYXRhYmFz
ZSgpOworCisgICAgdHlwZWRlZiBwYWlyPGNvbnN0IFJlZlB0cjxQYXJzZWRDb29raWU+LCBBY3Rp
b24+IENvb2tpZUFjdGlvbjsKKyAgICBWZWN0b3I8Q29va2llQWN0aW9uPiBtX2NoYW5nZWRDb29r
aWVzOworCisgICAgU3RyaW5nIG1fdGFibGVOYW1lOworICAgIFNRTGl0ZURhdGFiYXNlIG1fZGI7
CisgICAgU1FMaXRlU3RhdGVtZW50ICptX2luc2VydFN0YXRlbWVudDsKKyAgICBTUUxpdGVTdGF0
ZW1lbnQgKm1fdXBkYXRlU3RhdGVtZW50OworICAgIFNRTGl0ZVN0YXRlbWVudCAqbV9kZWxldGVT
dGF0ZW1lbnQ7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIENv
b2tpZURhdGFiYXNlQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVKYXJDdXJsLmNwcAppbmRleCA1YTJkNTY3Li42Yjkx
ZGQ2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29v
a2llSmFyQ3VybC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJs
L0Nvb2tpZUphckN1cmwuY3BwCkBAIC0xLDQgKzEsNiBAQAogLyoKKyAqICBDb3B5cmlnaHQgKEMp
IDIwMTMgU3phYm9sY3MgRGF2aWQgPGRhdmlkc3pAaW5mLnUtc3plZ2VkLmh1PiwgVW5pdmVyc2l0
eSBvZiBTemVnZWQKKyAqCiAgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKQEAgLTE1LDEwICsxNywx
MCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybUNvb2tp
ZUphci5oIgogCi0jaW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5o
IgogI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvb2tpZUphci5oIgogI2lu
Y2x1ZGUgIlJlc291cmNlSGFuZGxlTWFuYWdlci5oIgogCiAjaW5jbHVkZSA8d3RmL0RhdGVNYXRo
Lmg+CkBAIC0yOSwyNjYgKzMxLDIwIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGlj
IHZvaWQgcmVhZEN1cmxDb29raWVUb2tlbihjb25zdCBjaGFyKiYgY29va2llLCBTdHJpbmcmIHRv
a2VuKQotewotICAgIC8vIFJlYWQgdGhlIG5leHQgdG9rZW4gZnJvbSBhIGNvb2tpZSB3aXRoIHRo
ZSBOZXRzY2FwZSBjb29raWUgZm9ybWF0LgotICAgIC8vIEN1cmwgc2VwYXJhdGVzIGVhY2ggdG9r
ZW4gaW4gbGluZSB3aXRoIHRhYiBjaGFyYWN0ZXIuCi0gICAgd2hpbGUgKGNvb2tpZSAmJiBjb29r
aWVbMF0gJiYgY29va2llWzBdICE9ICdcdCcpIHsKLSAgICAgICAgdG9rZW4uYXBwZW5kKGNvb2tp
ZVswXSk7Ci0gICAgICAgIGNvb2tpZSsrOwotICAgIH0KLSAgICBpZiAoY29va2llWzBdID09ICdc
dCcpCi0gICAgICAgIGNvb2tpZSsrOwotfQotCi1zdGF0aWMgdm9pZCBhZGRNYXRjaGluZ0N1cmxD
b29raWUoY29uc3QgY2hhciogY29va2llLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3Ry
aW5nJiBwYXRoLCBTdHJpbmdCdWlsZGVyJiBjb29raWVzLCBib29sIGh0dHBvbmx5KQotewotICAg
IC8vIENoZWNrIGlmIHRoZSBjb29raWUgbWF0Y2hlcyBkb21haW4gYW5kIHBhdGgsIGFuZCBpcyBu
b3QgZXhwaXJlZC4KLSAgICAvLyBJZiBzbywgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIGNvb2tpZXMu
Ci0gICAgLy8KLSAgICAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgTmV0c2NhcGUgY29va2llIGZpbGUg
Zm9ybWF0IHdoaWNoIEN1cmwgdXNlczoKLSAgICAvLwotICAgIC8vIC5uZXRzY2FwZS5jb20gICAg
IFRSVUUgICAvICBGQUxTRSAgOTQ2Njg0Nzk5ICAgTkVUU0NBUEVfSUQgIDEwMDEwMwotICAgIC8v
Ci0gICAgLy8gRWFjaCBsaW5lIHJlcHJlc2VudHMgYSBzaW5nbGUgcGllY2Ugb2Ygc3RvcmVkIGlu
Zm9ybWF0aW9uLiBBIHRhYiBpcyBpbnNlcnRlZCBiZXR3ZWVuIGVhY2ggb2YgdGhlIGZpZWxkcy4K
LSAgICAvLwotICAgIC8vIEZyb20gbGVmdC10by1yaWdodCwgaGVyZSBpcyB3aGF0IGVhY2ggZmll
bGQgcmVwcmVzZW50czoKLSAgICAvLwotICAgIC8vIGRvbWFpbiAtIFRoZSBkb21haW4gdGhhdCBj
cmVhdGVkIEFORCB0aGF0IGNhbiByZWFkIHRoZSB2YXJpYWJsZS4KLSAgICAvLyBmbGFnIC0gQSBU
UlVFL0ZBTFNFIHZhbHVlIGluZGljYXRpbmcgaWYgYWxsIG1hY2hpbmVzIHdpdGhpbiBhIGdpdmVu
IGRvbWFpbiBjYW4gYWNjZXNzIHRoZSB2YXJpYWJsZS4gVGhpcyB2YWx1ZSBpcyBzZXQgYXV0b21h
dGljYWxseSBieSB0aGUgYnJvd3NlciwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSB5b3Ugc2V0IGZv
ciBkb21haW4uCi0gICAgLy8gcGF0aCAtIFRoZSBwYXRoIHdpdGhpbiB0aGUgZG9tYWluIHRoYXQg
dGhlIHZhcmlhYmxlIGlzIHZhbGlkIGZvci4KLSAgICAvLyBzZWN1cmUgLSBBIFRSVUUvRkFMU0Ug
dmFsdWUgaW5kaWNhdGluZyBpZiBhIHNlY3VyZSBjb25uZWN0aW9uIHdpdGggdGhlIGRvbWFpbiBp
cyBuZWVkZWQgdG8gYWNjZXNzIHRoZSB2YXJpYWJsZS4KLSAgICAvLyBleHBpcmF0aW9uIC0gVGhl
IFVOSVggdGltZSB0aGF0IHRoZSB2YXJpYWJsZSB3aWxsIGV4cGlyZSBvbi4gVU5JWCB0aW1lIGlz
IGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbiAxLCAxOTcwIDAwOjAw
OjAwIEdNVC4KLSAgICAvLyBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgotICAgIC8v
IHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZS4KLQotICAgIGlmICghY29va2llKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgY29va2llRG9tYWluOwotICAgIHJlYWRDdXJs
Q29va2llVG9rZW4oY29va2llLCBjb29raWVEb21haW4pOwotCi0gICAgYm9vbCBzdWJEb21haW4g
PSBmYWxzZTsKLQotICAgIC8vIEh0dHBPbmx5IGNvb2tpZSBlbnRyaWVzIGJlZ2luIHdpdGggIiNI
dHRwT25seV8iLgotICAgIGlmIChjb29raWVEb21haW4uc3RhcnRzV2l0aCgiI0h0dHBPbmx5XyIp
KSB7Ci0gICAgICAgIGlmIChodHRwb25seSkKLSAgICAgICAgICAgIGNvb2tpZURvbWFpbi5yZW1v
dmUoMCwgMTApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0K
LSAgICBpZiAoY29va2llRG9tYWluWzBdID09ICcuJykgewotICAgICAgICAvLyBDaGVjayBpZiBk
b21haW4gaXMgYSBzdWJkb21haW4gb2YgdGhlIGRvbWFpbiBpbiB0aGUgY29va2llLgotICAgICAg
ICAvLyBDdXJsIHVzZXMgYSAnLicgaW4gZnJvbnQgb2YgZG9tYWlucyB0byBpbmRpY2F0ZSBpdHMg
dmFsaWQgb24gc3ViZG9tYWlucy4KLSAgICAgICAgY29va2llRG9tYWluLnJlbW92ZSgwKTsKLSAg
ICAgICAgaW50IGxlbkRpZmYgPSBkb21haW4ubGVuZ3RoKCkgLSBjb29raWVEb21haW4ubGVuZ3Ro
KCk7Ci0gICAgICAgIGludCBpbmRleCA9IGRvbWFpbi5maW5kKGNvb2tpZURvbWFpbik7Ci0gICAg
ICAgIGlmIChpbmRleCA9PSBsZW5EaWZmKQotICAgICAgICAgICAgc3ViRG9tYWluID0gdHJ1ZTsK
LSAgICB9Ci0KLSAgICBpZiAoIXN1YkRvbWFpbiAmJiBjb29raWVEb21haW4gIT0gZG9tYWluKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgc3RyQm9vbGVhbjsKLSAgICByZWFkQ3VybENv
b2tpZVRva2VuKGNvb2tpZSwgc3RyQm9vbGVhbik7Ci0KLSAgICBTdHJpbmcgc3RyUGF0aDsKLSAg
ICByZWFkQ3VybENvb2tpZVRva2VuKGNvb2tpZSwgc3RyUGF0aCk7Ci0KLSAgICAvLyBDaGVjayBp
ZiBwYXRoIG1hdGNoZXMKLSAgICBpbnQgaW5kZXggPSBwYXRoLmZpbmQoc3RyUGF0aCk7Ci0gICAg
aWYgKGluZGV4KQotICAgICAgICByZXR1cm47Ci0KLSAgICBTdHJpbmcgc3RyU2VjdXJlOwotICAg
IHJlYWRDdXJsQ29va2llVG9rZW4oY29va2llLCBzdHJTZWN1cmUpOwotCi0gICAgU3RyaW5nIHN0
ckV4cGlyZXM7Ci0gICAgcmVhZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0ckV4cGlyZXMpOwot
Ci0gICAgaW50IGV4cGlyZXMgPSBzdHJFeHBpcmVzLnRvSW50KCk7Ci0KLSAgICB0aW1lX3Qgbm93
ID0gMDsKLSAgICB0aW1lKCZub3cpOwotCi0gICAgLy8gQ2hlY2sgaWYgY29va2llIGhhcyBleHBp
cmVkCi0gICAgaWYgKGV4cGlyZXMgJiYgbm93ID4gZXhwaXJlcykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgU3RyaW5nIHN0ck5hbWU7Ci0gICAgcmVhZEN1cmxDb29raWVUb2tlbihjb29raWUsIHN0
ck5hbWUpOwotCi0gICAgU3RyaW5nIHN0clZhbHVlOwotICAgIHJlYWRDdXJsQ29va2llVG9rZW4o
Y29va2llLCBzdHJWYWx1ZSk7Ci0KLSAgICAvLyBUaGUgY29va2llIG1hdGNoZXMsIGFkZCBpdCB0
byB0aGUgY29va2llIGxpc3QuCi0KLSAgICBpZiAoY29va2llcy5sZW5ndGgoKSA+IDApCi0gICAg
ICAgIGNvb2tpZXMuYXBwZW5kKCI7ICIpOwotCi0gICAgY29va2llcy5hcHBlbmQoc3RyTmFtZSk7
Ci0gICAgY29va2llcy5hcHBlbmQoIj0iKTsKLSAgICBjb29raWVzLmFwcGVuZChzdHJWYWx1ZSk7
Ci0KLX0KLQotc3RhdGljIFN0cmluZyBnZXROZXRzY2FwZUNvb2tpZUZvcm1hdChjb25zdCBLVVJM
JiB1cmwsIGNvbnN0IFN0cmluZyYgdmFsdWUpCi17Ci0gICAgLy8gQ29uc3RydWN0cyBhIGNvb2tp
ZSBzdHJpbmcgaW4gTmV0c2NhcGUgQ29va2llIGZpbGUgZm9ybWF0LgotCi0gICAgaWYgKHZhbHVl
LmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgU3RyaW5nIHZhbHVlU3RyOwot
ICAgIGlmICh2YWx1ZS5pczhCaXQoKSkKLSAgICAgICAgdmFsdWVTdHIgPSB2YWx1ZTsKLSAgICBl
bHNlCi0gICAgICAgIHZhbHVlU3RyID0gU3RyaW5nOjptYWtlOEJpdEZyb20xNkJpdFNvdXJjZSh2
YWx1ZS5jaGFyYWN0ZXJzMTYoKSwgdmFsdWUubGVuZ3RoKCkpOwotCi0gICAgVmVjdG9yPFN0cmlu
Zz4gYXR0cmlidXRlczsKLSAgICB2YWx1ZVN0ci5zcGxpdCgnOycsIGZhbHNlLCBhdHRyaWJ1dGVz
KTsKLQotICAgIGlmICghYXR0cmlidXRlcy5zaXplKCkpCi0gICAgICAgIHJldHVybiAiIjsKLQot
ICAgIC8vIEZpcnN0IGF0dHJpYnV0ZSBzaG91bGQgYmUgPGNvb2tpZW5hbWU+PTxjb29raWV2YWx1
ZT4KLSAgICBTdHJpbmcgY29va2llTmFtZSwgY29va2llVmFsdWU7Ci0gICAgVmVjdG9yPFN0cmlu
Zz46Oml0ZXJhdG9yIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuYmVnaW4oKTsKLSAgICBpZiAoYXR0
cmlidXRlLT5jb250YWlucygnPScpKSB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmc+IG5hbWVWYWx1
ZVBhaXI7Ci0gICAgICAgIGF0dHJpYnV0ZS0+c3BsaXQoJz0nLCB0cnVlLCBuYW1lVmFsdWVQYWly
KTsKLSAgICAgICAgY29va2llTmFtZSA9IG5hbWVWYWx1ZVBhaXJbMF07Ci0gICAgICAgIGNvb2tp
ZVZhbHVlID0gbmFtZVZhbHVlUGFpclsxXTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBY2Nv
cmRpbmcgdG8gUkZDNjI2NSB3ZSBzaG91bGQgaWdub3JlIHRoZSBlbnRpcmUKLSAgICAgICAgLy8g
c2V0LWNvb2tpZSBzdHJpbmcgbm93LCBidXQgb3RoZXIgYnJvd3NlcnMgYXBwZWFyCi0gICAgICAg
IC8vIHRvIHRyZWF0IHRoaXMgYXMgPGNvb2tpZW5hbWU+PTxlbXB0eT4KLSAgICAgICAgY29va2ll
TmFtZSA9ICphdHRyaWJ1dGU7Ci0gICAgfQotICAgIAotICAgIGludCBleHBpcmVzID0gMDsKLSAg
ICBTdHJpbmcgc2VjdXJlID0gIkZBTFNFIjsKLSAgICBTdHJpbmcgcGF0aCA9IHVybC5iYXNlQXNT
dHJpbmcoKS5zdWJzdHJpbmcodXJsLnBhdGhTdGFydCgpKTsKLSAgICBpZiAocGF0aC5sZW5ndGgo
KSA+IDEgJiYgcGF0aC5lbmRzV2l0aCgnLycpKQotICAgICAgICBwYXRoLnJlbW92ZShwYXRoLmxl
bmd0aCgpIC0gMSk7Ci0gICAgU3RyaW5nIGRvbWFpbiA9IHVybC5ob3N0KCk7Ci0KLSAgICAvLyBJ
dGVyYXRlIHRocm91Z2ggcmVtYWluaW5nIGF0dHJpYnV0ZXMKLSAgICBmb3IgKCsrYXR0cmlidXRl
OyBhdHRyaWJ1dGUgIT0gYXR0cmlidXRlcy5lbmQoKTsgKythdHRyaWJ1dGUpIHsKLSAgICAgICAg
aWYgKGF0dHJpYnV0ZS0+Y29udGFpbnMoJz0nKSkgewotICAgICAgICAgICAgVmVjdG9yPFN0cmlu
Zz4ga2V5VmFsdWVQYWlyOwotICAgICAgICAgICAgYXR0cmlidXRlLT5zcGxpdCgnPScsIHRydWUs
IGtleVZhbHVlUGFpcik7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5VmFsdWVQYWlyWzBd
LnN0cmlwV2hpdGVTcGFjZSgpLmxvd2VyKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsID0ga2V5
VmFsdWVQYWlyWzFdLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICAgICAgaWYgKGtleSA9PSAi
ZXhwaXJlcyIpIHsKLSAgICAgICAgICAgICAgICBDU3RyaW5nIGRhdGVTdHIocmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBjaGFyKj4odmFsLmNoYXJhY3RlcnM4KCkpLCB2YWwubGVuZ3RoKCkpOwotICAg
ICAgICAgICAgICAgIGV4cGlyZXMgPSBXVEY6OnBhcnNlRGF0ZUZyb21OdWxsVGVybWluYXRlZENo
YXJhY3RlcnMoZGF0ZVN0ci5kYXRhKCkpIC8gV1RGOjptc1BlclNlY29uZDsKLSAgICAgICAgICAg
IH0gZWxzZSBpZiAoa2V5ID09ICJtYXgtYWdlIikKLSAgICAgICAgICAgICAgICBleHBpcmVzID0g
dGltZSgwKSArIHZhbC50b0ludCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoa2V5ID09ICJkb21h
aW4iKSAKLSAgICAgICAgICAgICAgICBkb21haW4gPSB2YWw7Ci0gICAgICAgICAgICBlbHNlIGlm
IChrZXkgPT0gInBhdGgiKSAKLSAgICAgICAgICAgICAgICBwYXRoID0gdmFsOwotICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IGF0dHJpYnV0ZS0+c3RyaXBXaGl0ZVNw
YWNlKCkubG93ZXIoKTsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gInNlY3VyZSIpCi0gICAgICAg
ICAgICAgICAgc2VjdXJlID0gIlRSVUUiOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIFN0
cmluZyBhbGxvd1N1YmRvbWFpbnMgPSBkb21haW4uc3RhcnRzV2l0aCgnLicpID8gIlRSVUUiIDog
IkZBTFNFIjsKLSAgICBTdHJpbmcgZXhwaXJlc1N0ciA9IFN0cmluZzo6bnVtYmVyKGV4cGlyZXMp
OwotCi0gICAgaW50IGZpbmFsU3RyaW5nTGVuZ3RoID0gZG9tYWluLmxlbmd0aCgpICsgcGF0aC5s
ZW5ndGgoKSArIGV4cGlyZXNTdHIubGVuZ3RoKCkgKyBjb29raWVOYW1lLmxlbmd0aCgpOwotICAg
IGZpbmFsU3RyaW5nTGVuZ3RoICs9IGNvb2tpZVZhbHVlLmxlbmd0aCgpICsgc2VjdXJlLmxlbmd0
aCgpICsgYWxsb3dTdWJkb21haW5zLmxlbmd0aCgpOwotICAgIGZpbmFsU3RyaW5nTGVuZ3RoICs9
IDY7IC8vIEFjY291bnQgZm9yIFx0IHNlcGFyYXRvcnMuCi0gICAgCi0gICAgU3RyaW5nQnVpbGRl
ciBjb29raWVTdHI7Ci0gICAgY29va2llU3RyLnJlc2VydmVDYXBhY2l0eShmaW5hbFN0cmluZ0xl
bmd0aCk7Ci0gICAgY29va2llU3RyLmFwcGVuZChkb21haW4gKyAiXHQiKTsKLSAgICBjb29raWVT
dHIuYXBwZW5kKGFsbG93U3ViZG9tYWlucyArICJcdCIpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQo
cGF0aCArICJcdCIpOwotICAgIGNvb2tpZVN0ci5hcHBlbmQoc2VjdXJlICsgIlx0Iik7Ci0gICAg
Y29va2llU3RyLmFwcGVuZChleHBpcmVzU3RyICsgIlx0Iik7Ci0gICAgY29va2llU3RyLmFwcGVu
ZChjb29raWVOYW1lICsgIlx0Iik7Ci0gICAgY29va2llU3RyLmFwcGVuZChjb29raWVWYWx1ZSk7
Ci0KLSAgICByZXR1cm4gY29va2llU3RyLnRvU3RyaW5nKCk7Ci19Ci0KIHZvaWQgc2V0Q29va2ll
c0Zyb21ET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJiwgY29uc3QgS1VSTCYsIGNvbnN0
IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKIHsKLSAgICBDVVJMKiBjdXJsID0gY3Vy
bF9lYXN5X2luaXQoKTsKLQotICAgIGlmICghY3VybCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Y29uc3QgY2hhciogY29va2llSmFyRmlsZU5hbWUgPSBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNo
YXJlZEluc3RhbmNlKCktPmdldENvb2tpZUphckZpbGVOYW1lKCk7Ci0gICAgQ1VSTFNIKiBjdXJs
c2ggPSBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OnNoYXJlZEluc3RhbmNlKCktPmdldEN1cmxTaGFy
ZUhhbmRsZSgpOwotCi0gICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUpB
UiwgY29va2llSmFyRmlsZU5hbWUpOwotICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9Q
VF9TSEFSRSwgY3VybHNoKTsKLQotICAgIC8vIENVUkwgYWNjZXB0cyBjb29raWVzIGluIGVpdGhl
ciBTZXQtQ29va2llIG9yIE5ldHNjYXBlIGZpbGUgZm9ybWF0LgotICAgIC8vIEhvd2V2ZXIgd2l0
aCBTZXQtQ29va2llIGZvcm1hdCwgdGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgdGhhdCB3ZQot
ICAgIC8vIHNob3VsZCBub3QgYWxsb3cgY29va2llcyB0byBiZSByZWFkIGZyb20gc3ViZG9tYWlu
cywgd2hpY2ggaXMgdGhlCi0gICAgLy8gcmVxdWlyZWQgYmVoYXZpb3IgaWYgdGhlIGRvbWFpbiBm
aWVsZCBpcyBub3QgZXhwbGljaXR5IHNwZWNpZmllZC4KLSAgICBTdHJpbmcgY29va2llID0gZ2V0
TmV0c2NhcGVDb29raWVGb3JtYXQodXJsLCB2YWx1ZSk7Ci0KLSAgICBDU3RyaW5nIHN0ckNvb2tp
ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihjb29raWUuY2hhcmFjdGVyczgoKSksIGNv
b2tpZS5sZW5ndGgoKSk7Ci0KLSAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09P
S0lFTElTVCwgc3RyQ29va2llLmRhdGEoKSk7Ci0KLSAgICBjdXJsX2Vhc3lfY2xlYW51cChjdXJs
KTsKLX0KLQotc3RhdGljIFN0cmluZyBjb29raWVzRm9yU2Vzc2lvbihjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mLCBjb25zdCBLVVJMJiwgY29uc3QgS1VSTCYgdXJsLCBib29sIGh0dHBvbmx5
KQotewotICAgIFN0cmluZyBjb29raWVzOwotICAgIENVUkwqIGN1cmwgPSBjdXJsX2Vhc3lfaW5p
dCgpOwotCi0gICAgaWYgKCFjdXJsKQotICAgICAgICByZXR1cm4gY29va2llczsKLQotICAgIENV
UkxTSCogY3VybHNoID0gUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpzaGFyZWRJbnN0YW5jZSgpLT5n
ZXRDdXJsU2hhcmVIYW5kbGUoKTsKLQotICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9Q
VF9TSEFSRSwgY3VybHNoKTsKLQotICAgIHN0cnVjdCBjdXJsX3NsaXN0KiBsaXN0ID0gMDsKLSAg
ICBjdXJsX2Vhc3lfZ2V0aW5mbyhjdXJsLCBDVVJMSU5GT19DT09LSUVMSVNULCAmbGlzdCk7Ci0K
LSAgICBpZiAobGlzdCkgewotICAgICAgICBTdHJpbmcgZG9tYWluID0gdXJsLmhvc3QoKTsKLSAg
ICAgICAgU3RyaW5nIHBhdGggPSB1cmwucGF0aCgpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGNv
b2tpZXNCdWlsZGVyOwotCi0gICAgICAgIHN0cnVjdCBjdXJsX3NsaXN0KiBpdGVtID0gbGlzdDsK
LSAgICAgICAgd2hpbGUgKGl0ZW0pIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvb2tpZSA9
IGl0ZW0tPmRhdGE7Ci0gICAgICAgICAgICBhZGRNYXRjaGluZ0N1cmxDb29raWUoY29va2llLCBk
b21haW4sIHBhdGgsIGNvb2tpZXNCdWlsZGVyLCBodHRwb25seSk7Ci0gICAgICAgICAgICBpdGVt
ID0gaXRlbS0+bmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIGNvb2tpZXMgPSBjb29raWVzQnVp
bGRlci50b1N0cmluZygpOwotICAgICAgICBjdXJsX3NsaXN0X2ZyZWVfYWxsKGxpc3QpOwotICAg
IH0KLQotICAgIGN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOwotCi0gICAgcmV0dXJuIGNvb2tpZXM7
CisgICAgQ29va2llTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5zZXRDb29raWUodXJsLCB2YWx1ZSwg
Tm9IdHRwT25seUNvb2tpZXMpOworICAgIENvb2tpZU1hbmFnZXI6OmdldEluc3RhbmNlKCkuZGVi
dWcoKTsKIH0KIAotU3RyaW5nIGNvb2tpZXNGb3JET00oY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNz
aW9uJiBzZXNzaW9uLCBjb25zdCBLVVJMJiBmaXJzdFBhcnR5LCBjb25zdCBLVVJMJiB1cmwpCitT
dHJpbmcgY29va2llc0ZvckRPTShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mIC8qc2Vzc2lv
biovLCBjb25zdCBLVVJMJiAvKmZpcnN0UGFydHkqLywgY29uc3QgS1VSTCYgdXJsKQogewotICAg
IHJldHVybiBjb29raWVzRm9yU2Vzc2lvbihzZXNzaW9uLCBmaXJzdFBhcnR5LCB1cmwsIGZhbHNl
KTsKKyAgICByZXR1cm4gQ29va2llTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5jb29raWVzRm9yU2Vz
c2lvbih1cmwsIE5vSHR0cE9ubHlDb29raWVzKTsKIH0KIAotU3RyaW5nIGNvb2tpZVJlcXVlc3RI
ZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgc2Vzc2lvbiwgY29u
c3QgS1VSTCYgZmlyc3RQYXJ0eSwgY29uc3QgS1VSTCYgdXJsKQorU3RyaW5nIGNvb2tpZVJlcXVl
c3RIZWFkZXJGaWVsZFZhbHVlKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYgLypzZXNzaW9u
Ki8sIGNvbnN0IEtVUkwmIC8qZmlyc3RQYXJ0eSovLCBjb25zdCBLVVJMJiB1cmwpCiB7Ci0gICAg
cmV0dXJuIGNvb2tpZXNGb3JTZXNzaW9uKHNlc3Npb24sIGZpcnN0UGFydHksIHVybCwgdHJ1ZSk7
CisgICAgcmV0dXJuIENvb2tpZU1hbmFnZXI6OmdldEluc3RhbmNlKCkuY29va2llc0ZvclNlc3Np
b24odXJsLCBXaXRoSHR0cE9ubHlDb29raWVzKTsKIH0KIAogYm9vbCBjb29raWVzRW5hYmxlZChj
b25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBLVVJMJiAvKmZpcnN0UGFydHkqLywg
Y29uc3QgS1VSTCYgLyp1cmwqLykKQEAgLTI5NiwzMSArNTIsMzAgQEAgYm9vbCBjb29raWVzRW5h
YmxlZChjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBLVVJMJiAvKmZpcnN0UGFy
dHkqLywgY28KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBnZXRSYXdDb29raWVzKGNvbnN0
IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IEtVUkwmIC8qZmlyc3RQYXJ0eSovLCBjb25z
dCBLVVJMJiAvKnVybCovLCBWZWN0b3I8Q29va2llPiYgcmF3Q29va2llcykKK2Jvb2wgZ2V0UmF3
Q29va2llcyhjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBLVVJMJiAvKmZpcnN0
UGFydHkqLywgY29uc3QgS1VSTCYgdXJsLCBWZWN0b3I8Q29va2llPiYgY29va2llcykKIHsKLSAg
ICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAotICAgIHJhd0Nvb2tpZXMuY2xlYXIoKTsK
LSAgICByZXR1cm4gZmFsc2U7IC8vIHJldHVybiB0cnVlIHdoZW4gaW1wbGVtZW50ZWQKKyAgICBD
b29raWVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmdldFJhd0Nvb2tpZXModXJsLCBjb29raWVzKTsK
KyAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBkZWxldGVDb29raWUoY29uc3QgTmV0d29ya1N0
b3JhZ2VTZXNzaW9uJiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYpCit2b2lkIGRlbGV0ZUNv
b2tpZShjb25zdCBOZXR3b3JrU3RvcmFnZVNlc3Npb24mLCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0
IFN0cmluZyYgbmFtZSkKIHsKLSAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorICAg
IENvb2tpZU1hbmFnZXI6OmdldEluc3RhbmNlKCkucmVtb3ZlQ29va2llV2l0aE5hbWUodXJsLCBu
YW1lKTsKIH0KIAogdm9pZCBnZXRIb3N0bmFtZXNXaXRoQ29va2llcyhjb25zdCBOZXR3b3JrU3Rv
cmFnZVNlc3Npb24mLCBIYXNoU2V0PFN0cmluZz4mIGhvc3RuYW1lcykKIHsKLSAgICAvLyBGSVhN
RTogTm90IHlldCBpbXBsZW1lbnRlZAorICAgIENvb2tpZU1hbmFnZXI6OmdldEluc3RhbmNlKCku
Z2V0SG9zdG5hbWVzKGhvc3RuYW1lcyk7CiB9CiAKIHZvaWQgZGVsZXRlQ29va2llc0Zvckhvc3Ru
YW1lKGNvbnN0IE5ldHdvcmtTdG9yYWdlU2Vzc2lvbiYsIGNvbnN0IFN0cmluZyYgaG9zdG5hbWUp
CiB7Ci0gICAgLy8gRklYTUU6IE5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICBDb29raWVNYW5hZ2Vy
OjpnZXRJbnN0YW5jZSgpLnJlbW92ZUNvb2tpZXNXaXRoSG9zdG5hbWUoaG9zdG5hbWUpOwogfQog
CiB2b2lkIGRlbGV0ZUFsbENvb2tpZXMoY29uc3QgTmV0d29ya1N0b3JhZ2VTZXNzaW9uJikKIHsK
LSAgICAvLyBGSVhNRTogTm90IHlldCBpbXBsZW1lbnRlZAorICAgIENvb2tpZU1hbmFnZXI6Omdl
dEluc3RhbmNlKCkucmVtb3ZlQWxsQ29va2llcyh0cnVlKTsKIH0KIAogfQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuY3BwCmlu
ZGV4IGU2OWRlMjkuLjMwOTk5ZTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdlci5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSnVsaWVuIENoYWZmcmFpeCA8amNoYWZmcmFpeEBwbGV5
by5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90
aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMg
U3phYm9sY3MgRGF2aWQgPGRhdmlkc3pAaW5mLnUtc3plZ2VkLmh1PiwgVW5pdmVyc2l0eSBvZiBT
emVnZWQKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
IAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29va2llTWFuYWdlci5oIgorCisj
aW5jbHVkZSAiQ29va2llLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBhcnNlZENv
b2tpZS5oIgorI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5j
bHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8
d3RmL0RhdGVNYXRoLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3dGYv
SGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjZGVmaW5lIExPR19FUlJPUl9BTkRfUkVUVVJOKGZv
cm1hdCwgLi4uKSBcCisgICAgeyBcCisgICAgICAgIExPR19FUlJPUihmb3JtYXQsICMjIF9fVkFf
QVJHU19fKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0KKworc3RhdGljIGlubGluZSBi
b29sIGlzTGlnaHR3ZWlnaHRTcGFjZShVQ2hhciBjKQoreworICAgIHJldHVybiAoYyA9PSAnICcg
fHwgYyA9PSAnXHQnKTsKK30KKworQ29va2llTWFuYWdlcjo6Q29va2llTWFuYWdlcigpCit7Cisg
ICAgbV9iYWNraW5nU3RvcmUgPSBuZXcgQ29va2llRGF0YWJhc2VCYWNraW5nU3RvcmUoKTsKKyAg
ICBtX2JhY2tpbmdTdG9yZS0+Z2V0Q29va2llc0Zyb21EYXRhYmFzZShtX2Nvb2tpZXMpOworfQor
CitDb29raWVNYW5hZ2VyOjp+Q29va2llTWFuYWdlcigpCit7CisgICAgcmVtb3ZlQWxsQ29va2ll
cyhmYWxzZSk7CisgICAgZGVsZXRlIG1fYmFja2luZ1N0b3JlOworfQorCitDb29raWVNYW5hZ2Vy
JiBDb29raWVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpCit7CisgICAgc3RhdGljIENvb2tpZU1hbmFn
ZXIgKmNvb2tpZU1hbmFnZXIgPSAwOworICAgIGlmICghY29va2llTWFuYWdlcikKKyAgICAgICAg
Y29va2llTWFuYWdlciA9IG5ldyBDb29raWVNYW5hZ2VyOworICAgIHJldHVybiAqY29va2llTWFu
YWdlcjsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpzZXRDb29raWUoY29uc3QgS1VSTCYgdXJs
LCBjb25zdCBTdHJpbmcmIHZhbHVlLCBDb29raWVGaWx0ZXIgZmlsdGVyKQoreworICAgIFJlZlB0
cjxQYXJzZWRDb29raWU+IGNvb2tpZSA9IHBhcnNlT25lQ29va2llKHVybCwgdmFsdWUsIDAsIHZh
bHVlLmxlbmd0aCgpKTsKKworICAgIGlmIChmaWx0ZXIgPT0gTm9IdHRwT25seUNvb2tpZXMgJiYg
Y29va2llLT5pc0h0dHBPbmx5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhhc2hNYXA8U3Ry
aW5nLCBWZWN0b3I8UmVmUHRyPFBhcnNlZENvb2tpZT4gPiA+OjppdGVyYXRvciBpdCA9IG1fY29v
a2llcy5maW5kKGNvb2tpZS0+ZG9tYWluKCkpOworCisgICAgVmVjdG9yPFJlZlB0cjxQYXJzZWRD
b29raWU+ID4mIHZlY3RvciA9IGl0LT52YWx1ZTsKKworICAgIGlmIChpdCAhPSBtX2Nvb2tpZXMu
ZW5kKCkpIHsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmVjdG9yLnNpemUo
KTsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChjb29raWUtPm5hbWUoKSA9PSB2ZWN0b3IuYXQo
aSktPm5hbWUoKSAmJiBjb29raWUtPnBhdGgoKSA9PSB2ZWN0b3IuYXQoaSktPnBhdGgoKSkgewor
CisgICAgICAgICAgICAgICAgaWYgKCEodmVjdG9yLmF0KGkpLT5pc0h0dHBPbmx5KCkgJiYgZmls
dGVyID09IE5vSHR0cE9ubHlDb29raWVzKSkgeworICAgICAgICAgICAgICAgICAgICB2ZWN0b3Jb
aV0gPSBjb29raWU7CisgICAgICAgICAgICAgICAgICAgIG1fYmFja2luZ1N0b3JlLT51cGRhdGUo
Y29va2llKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdmVjdG9yLmFwcGVuZChjb29raWUpOwor
CisgICAgfSBlbHNlIHsKKworICAgICAgICBWZWN0b3I8UmVmUHRyPFBhcnNlZENvb2tpZT4gPiBu
ZXdWZWN0b3I7CisgICAgICAgIG5ld1ZlY3Rvci5hcHBlbmQoY29va2llKTsKKyAgICAgICAgbV9j
b29raWVzLmFkZChjb29raWUtPmRvbWFpbigpLCBuZXdWZWN0b3IpOworICAgIH0KKworICAgIG1f
YmFja2luZ1N0b3JlLT5pbnNlcnQoY29va2llKTsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpn
ZXRSYXdDb29raWVzKGNvbnN0IEtVUkwmIHVybCwgVmVjdG9yPENvb2tpZT4mIGNvb2tpZXMpCit7
CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgVmVjdG9yPFJlZlB0cjxQYXJzZWRDb29raWU+ID4g
Pjo6aXRlcmF0b3IgaXQgPSBtX2Nvb2tpZXMuYmVnaW4oKTsgaXQgIT0gbV9jb29raWVzLmVuZCgp
OyArK2l0KSB7CisKKyAgICAgICAgVmVjdG9yPFJlZlB0cjxQYXJzZWRDb29raWU+ID4mIHZlY3Rv
ciA9IGl0LT52YWx1ZTsKKyAgICAgICAgU3RyaW5nJiBkb21haW4gPSBpdC0+a2V5OworCisgICAg
ICAgIGlmICgodXJsLmhvc3QoKS5lbmRzV2l0aChkb21haW4sIGZhbHNlKSAmJiBkb21haW4uc3Rh
cnRzV2l0aCgiLiIpKSB8fCB1cmwuaG9zdCgpID09IGRvbWFpbikgeworCisgICAgICAgICAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgaSsrKQorICAgICAgICAgICAg
ICAgIHZlY3Rvci5hdChpKS0+YXBwZW5kV2ViQ29yZUNvb2tpZShjb29raWVzKTsKKyAgICAgICAg
fQorICAgIH0KK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpnZXRIb3N0bmFtZXMoSGFzaFNldDxT
dHJpbmc+JiBob3N0bmFtZXMpCit7CisgICAgZm9yIChIYXNoTWFwPFN0cmluZywgVmVjdG9yPFJl
ZlB0cjxQYXJzZWRDb29raWU+ID4gPjo6aXRlcmF0b3IgaXQgPSBtX2Nvb2tpZXMuYmVnaW4oKTsg
aXQgIT0gbV9jb29raWVzLmVuZCgpOyArK2l0KSB7CisKKyAgICAgICAgU3RyaW5nJiBkb21haW4g
PSBpdC0+a2V5OworCisgICAgICAgIGlmIChkb21haW4uc3RhcnRzV2l0aCgiLiIpKQorICAgICAg
ICAgICAgaG9zdG5hbWVzLmFkZChkb21haW4ucmlnaHQoZG9tYWluLmxlbmd0aCgpLTEpKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgaG9zdG5hbWVzLmFkZChkb21haW4pOworICAgIH0KK30K
KworU3RyaW5nIENvb2tpZU1hbmFnZXI6OmNvb2tpZXNGb3JTZXNzaW9uKGNvbnN0IEtVUkwmIHVy
bCwgQ29va2llRmlsdGVyIGZpbHRlcikKK3sKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBT
dHJpbmdCdWlsZGVyIGNvb2tpZTsKKworICAgIGZvciAoSGFzaE1hcDxTdHJpbmcsIFZlY3RvcjxS
ZWZQdHI8UGFyc2VkQ29va2llPiA+ID46Oml0ZXJhdG9yIGl0ID0gbV9jb29raWVzLmJlZ2luKCk7
IGl0ICE9IG1fY29va2llcy5lbmQoKTsgKytpdCkgeworCisgICAgICAgIFN0cmluZyYgZG9tYWlu
ID0gaXQtPmtleTsKKworICAgICAgICBpZiAoKHVybC5ob3N0KCkuZW5kc1dpdGgoZG9tYWluLCBm
YWxzZSkgJiYgZG9tYWluLnN0YXJ0c1dpdGgoIi4iKSkgfHwgdXJsLmhvc3QoKSA9PSBkb21haW4p
IHsKKworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0LT52YWx1ZS5zaXpl
KCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgUmVmUHRyPFBhcnNlZENvb2tpZT4mIGN1cnJl
bnRDb29raWUgPSBpdC0+dmFsdWVbaV07CisKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRD
b29raWUtPmhhc0V4cGlyZWQoKQorICAgICAgICAgICAgICAgICAgICAmJiB1cmwucGF0aCgpLnN0
YXJ0c1dpdGgoY3VycmVudENvb2tpZS0+cGF0aCgpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAg
ICAgJiYgKAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID09IFdpdGhIdHRwT25seUNv
b2tpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmaWx0ZXIgPT0gTm9IdHRwT25seUNvb2tpZXMKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmJiAhY3VycmVudENvb2tpZS0+aXNIdHRwT25seSgpCisgICAgICAgICAgICAgICAg
ICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgJiYg
KAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsLnByb3RvY29sSXMoImh0dHBzIikKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHx8ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwu
cHJvdG9jb2xJcygiaHR0cCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWN1cnJl
bnRDb29raWUtPmlzU2VjdXJlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAg
ICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICAgICBp
ZiAoIWZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmFwcGVuZCgiOyAiKTsK
KyAgICAgICAgICAgICAgICAgICAgY29va2llLmFwcGVuZChjdXJyZW50Q29va2llLT50b05hbWVW
YWx1ZVBhaXIoKSk7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IGNvb2tpZS50b1N0cmluZygpOworfQorCisKK3ZvaWQgQ29va2llTWFuYWdlcjo6cmVtb3ZlQWxs
Q29va2llcyhib29sIGZyb21CYWNraW5nU3RvcmUpCit7CisgICAgbV9jb29raWVzLmNsZWFyKCk7
CisKKyAgICBpZiAoZnJvbUJhY2tpbmdTdG9yZSkKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPnJl
bW92ZUFsbCgpOworfQorCit2b2lkIENvb2tpZU1hbmFnZXI6OnJlbW92ZUNvb2tpZVdpdGhOYW1l
KGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIGZvciAoSGFzaE1h
cDxTdHJpbmcsIFZlY3RvcjxSZWZQdHI8UGFyc2VkQ29va2llPiA+ID46Oml0ZXJhdG9yIGl0ID0g
bV9jb29raWVzLmJlZ2luKCk7IGl0ICE9IG1fY29va2llcy5lbmQoKTsgKytpdCkgeworCisgICAg
ICAgIFZlY3RvcjxSZWZQdHI8UGFyc2VkQ29va2llPiA+JiB2ZWN0b3IgPSBpdC0+dmFsdWU7Cisg
ICAgICAgIFN0cmluZyYgZG9tYWluID0gaXQtPmtleTsKKworICAgICAgICBpZiAoKHVybC5ob3N0
KCkuZW5kc1dpdGgoZG9tYWluLCBmYWxzZSkgJiYgZG9tYWluLnN0YXJ0c1dpdGgoIi4iKSkgfHwg
dXJsLmhvc3QoKSA9PSBkb21haW4pIHsKKworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHZlY3Rvci5zaXplKCk7IGkrKykgeworCisgICAgICAgICAgICAgICAgUmVmUHRyPFBh
cnNlZENvb2tpZT4gYWN0dWFsID0gdmVjdG9yLmF0KGkpOworCisgICAgICAgICAgICAgICAgaWYg
KG5hbWUgPT0gYWN0dWFsLT5uYW1lKCkpIHsKKworICAgICAgICAgICAgICAgICAgICB2ZWN0b3Iu
cmVtb3ZlKGkpOworICAgICAgICAgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+cmVtb3ZlKGFj
dHVhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29va2llTWFuYWdlcjo6
cmVtb3ZlQ29va2llc1dpdGhIb3N0bmFtZShjb25zdCBTdHJpbmcmIGhvc3RuYW1lKQoreworICAg
IGZvciAoSGFzaE1hcDxTdHJpbmcsIFZlY3RvcjxSZWZQdHI8UGFyc2VkQ29va2llPiA+ID46Oml0
ZXJhdG9yIGl0ID0gbV9jb29raWVzLmJlZ2luKCk7IGl0ICE9IG1fY29va2llcy5lbmQoKTsgKytp
dCkgeworCisgICAgICAgIFN0cmluZyYgZG9tYWluID0gaXQtPmtleTsKKworICAgICAgICBpZiAo
KGhvc3RuYW1lLmVuZHNXaXRoKGRvbWFpbiwgZmFsc2UpICYmIGRvbWFpbi5zdGFydHNXaXRoKCIu
IikpIHx8IGhvc3RuYW1lID09IGRvbWFpbikKKyAgICAgICAgICAgIG1fY29va2llcy5yZW1vdmUo
ZG9tYWluKTsKKyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8UGFyc2VkQ29va2llPiBDb29raWVNYW5h
Z2VyOjpwYXJzZU9uZUNvb2tpZShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgY29va2ll
LCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworICAgIGRvdWJsZSBjdXJUaW1lID0g
Y3VycmVudFRpbWUoKTsKKyAgICBSZWZQdHI8UGFyc2VkQ29va2llPiByZXMgPSBQYXJzZWRDb29r
aWU6OmNyZWF0ZShjdXJUaW1lKTsKKworICAgIHJlcy0+c2V0UHJvdG9jb2wodXJsLnByb3RvY29s
KCkpOworCisgICAgdW5zaWduZWQgdG9rZW5FbmQgPSBzdGFydDsgLy8gVG9rZW4gZW5kIGNvbnRh
aW5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgJz0nIG9yIHRoZSBlbmQgb2YgYSB0b2tlbgorICAgIHVu
c2lnbmVkIHBhaXJFbmQgPSBzdGFydDsgLy8gUGFpciBlbmQgY29udGFpbnMgYWx3YXlzIHRoZSBw
b3NpdGlvbiBvZiB0aGUgJzsnCisKKyAgICAvLyBGaW5kIHRoZSBmaXJzdCAnOycgd2hpY2ggaXMg
bm90IGRvdWJsZS1xdW90ZWQgYW5kIHRoZSAnPScgKGlmIHRoZXkgZXhpc3QpLgorICAgIGJvb2wg
Zm91bmRFcXVhbCA9IGZhbHNlOworICAgIHdoaWxlIChwYWlyRW5kIDwgZW5kICYmIGNvb2tpZVtw
YWlyRW5kXSAhPSAnOycpIHsKKyAgICAgICAgaWYgKGNvb2tpZVtwYWlyRW5kXSA9PSAnPScpIHsK
KyAgICAgICAgICAgIGlmICh0b2tlbkVuZCA9PSBzdGFydCkgeworICAgICAgICAgICAgICAgIHRv
a2VuRW5kID0gcGFpckVuZDsKKyAgICAgICAgICAgICAgICBmb3VuZEVxdWFsID0gdHJ1ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb29raWVbcGFpckVuZF0gPT0gJyInKSB7
CisgICAgICAgICAgICBzaXplX3Qgc2Vjb25kUXVvdGVQb3NpdGlvbiA9IGNvb2tpZS5maW5kKCci
JywgcGFpckVuZCArIDEpOworICAgICAgICAgICAgaWYgKHNlY29uZFF1b3RlUG9zaXRpb24gIT0g
bm90Rm91bmQgJiYgc2Vjb25kUXVvdGVQb3NpdGlvbiA8PSBlbmQpIHsKKyAgICAgICAgICAgICAg
ICBwYWlyRW5kID0gc2Vjb25kUXVvdGVQb3NpdGlvbiArIDE7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGFpckVuZCsrOworICAg
IH0KKworICAgIHVuc2lnbmVkIHRva2VuU3RhcnQgPSBzdGFydDsKKworICAgIGJvb2wgaGFzTmFt
ZSA9IGZhbHNlOyAvLyBUaGlzIGlzIGEgaGFjayB0byBhdm9pZCBjaGFuZ2luZyB0b28gbXVjaCBp
biB0aGlzIGJydXRhbGx5IGJyaXR0bGUgY29kZS4KKyAgICBpZiAodG9rZW5FbmQgIT0gc3RhcnQp
IHsKKyAgICAgICAgLy8gVGhlcmUgaXMgYSAnPScgc28gcGFyc2UgdGhlIE5BTUUKKyAgICAgICAg
dW5zaWduZWQgbmFtZUVuZCA9IHRva2VuRW5kOworCisgICAgICAgIC8vIFRoZSB0b2tlbkVuZCBp
cyB0aGUgcG9zaXRpb24gb2YgdGhlICc9JyBzbyB0aGUgbmFtZUVuZCBpcyBvbmUgbGVzcworICAg
ICAgICBuYW1lRW5kLS07CisKKyAgICAgICAgLy8gUmVtb3ZlIGxpZ2h0d2VpZ2h0IHNwYWNlcy4K
KyAgICAgICAgd2hpbGUgKG5hbWVFbmQgJiYgaXNMaWdodHdlaWdodFNwYWNlKGNvb2tpZVtuYW1l
RW5kXSkpCisgICAgICAgICAgICBuYW1lRW5kLS07CisKKyAgICAgICAgd2hpbGUgKHRva2VuU3Rh
cnQgPCBuYW1lRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQor
ICAgICAgICAgICAgdG9rZW5TdGFydCsrOworCisgICAgICAgIGlmIChuYW1lRW5kICsgMSA8PSB0
b2tlblN0YXJ0KQorICAgICAgICAgICAgTE9HX0VSUk9SX0FORF9SRVRVUk4oIkVtcHR5IG5hbWUu
IFJlamVjdGluZyB0aGUgY29va2llIik7CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjb29raWUu
c3Vic3RyaW5nKHRva2VuU3RhcnQsIG5hbWVFbmQgKyAxIC0gc3RhcnQpOworICAgICAgICByZXMt
PnNldE5hbWUobmFtZSk7CisgICAgICAgIGhhc05hbWUgPSB0cnVlOworICAgIH0KKworICAgIC8v
IE5vdyBwYXJzZSB0aGUgVkFMVUUKKyAgICB0b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAg
IGlmICghaGFzTmFtZSkKKyAgICAgICAgLS10b2tlblN0YXJ0OworCisgICAgLy8gU2tpcCBsaWdo
dHdlaWdodCBzcGFjZXMgaW4gb3VyIHRva2VuCisgICAgd2hpbGUgKHRva2VuU3RhcnQgPCBwYWly
RW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5TdGFydF0pKQorICAgICAgICB0
b2tlblN0YXJ0Kys7CisKKyAgICB0b2tlbkVuZCA9IHBhaXJFbmQ7CisgICAgd2hpbGUgKHRva2Vu
RW5kID4gdG9rZW5TdGFydCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0g
MV0pKQorICAgICAgICB0b2tlbkVuZC0tOworCisgICAgU3RyaW5nIHZhbHVlOworICAgIGlmICh0
b2tlbkVuZCA9PSB0b2tlblN0YXJ0KSB7CisgICAgICAgIC8vIEZpcmVmb3ggYWNjZXB0cyBlbXB0
eSB2YWx1ZSBzbyB3ZSB3aWxsIGRvIHRoZSBzYW1lCisgICAgICAgIHZhbHVlID0gU3RyaW5nKCk7
CisgICAgfSBlbHNlCisgICAgICAgIHZhbHVlID0gY29va2llLnN1YnN0cmluZyh0b2tlblN0YXJ0
LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQpOworCisgICAgaWYgKGhhc05hbWUpCisgICAgICAgIHJl
cy0+c2V0VmFsdWUodmFsdWUpOworICAgIGVsc2UgaWYgKGZvdW5kRXF1YWwpCisgICAgICAgIHJl
dHVybiBQYXJzZWRDb29raWU6OmNyZWF0ZShjdXJUaW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJl
cy0+c2V0TmFtZSh2YWx1ZSk7IC8vIE5vIE5BTUU9VkFMVUUsIG9ubHkgTkFNRQorCisgICAgd2hp
bGUgKHBhaXJFbmQgPCBlbmQpIHsKKyAgICAgICAgLy8gU3dpdGNoIHRvIHRoZSBuZXh0IHBhaXIg
YXMgcGFpckVuZCBpcyBvbiB0aGUgJzsnIGFuZCBmYXN0LWZvcndhcmQgYW55IGxpZ2h0d2VpZ2h0
IHNwYWNlcy4KKyAgICAgICAgcGFpckVuZCsrOworICAgICAgICB3aGlsZSAocGFpckVuZCA8IGVu
ZCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3BhaXJFbmRdKSkKKyAgICAgICAgICAgIHBh
aXJFbmQrKzsKKworICAgICAgICB0b2tlblN0YXJ0ID0gcGFpckVuZDsKKyAgICAgICAgdG9rZW5F
bmQgPSB0b2tlblN0YXJ0OyAvLyBpbml0aWFsaXplIHRva2VuIGVuZCB0byBjYXRjaCBmaXJzdCAn
PScKKworICAgICAgICB3aGlsZSAocGFpckVuZCA8IGVuZCAmJiBjb29raWVbcGFpckVuZF0gIT0g
JzsnKSB7CisgICAgICAgICAgICBpZiAodG9rZW5FbmQgPT0gdG9rZW5TdGFydCAmJiBjb29raWVb
cGFpckVuZF0gPT0gJz0nKQorICAgICAgICAgICAgICAgIHRva2VuRW5kID0gcGFpckVuZDsKKyAg
ICAgICAgICAgIHBhaXJFbmQrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FIDogc2hv
dWxkIHdlIHNraXAgbGlnaHR3ZWlnaHQgc3BhY2VzIGhlcmUgPworCisgICAgICAgIHVuc2lnbmVk
IGxlbmd0aCA9IHRva2VuRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgdW5zaWduZWQgdG9rZW5T
dGFydFN2ZyA9IHRva2VuU3RhcnQ7CisKKyAgICAgICAgU3RyaW5nIHBhcnNlZFZhbHVlOworICAg
ICAgICBpZiAodG9rZW5TdGFydCAhPSB0b2tlbkVuZCkgeworICAgICAgICAgICAgLy8gVGhlcmUg
aXMgYW4gZXF1YWwgc2lnbiBzbyByZW1vdmUgbGlnaHR3ZWlnaHQgc3BhY2VzIGluIFZBTFVFCisg
ICAgICAgICAgICB0b2tlblN0YXJ0ID0gdG9rZW5FbmQgKyAxOworICAgICAgICAgICAgd2hpbGUg
KHRva2VuU3RhcnQgPCBwYWlyRW5kICYmIGlzTGlnaHR3ZWlnaHRTcGFjZShjb29raWVbdG9rZW5T
dGFydF0pKQorICAgICAgICAgICAgICAgIHRva2VuU3RhcnQrKzsKKworICAgICAgICAgICAgdG9r
ZW5FbmQgPSBwYWlyRW5kOworICAgICAgICAgICAgd2hpbGUgKHRva2VuRW5kID4gdG9rZW5TdGFy
dCAmJiBpc0xpZ2h0d2VpZ2h0U3BhY2UoY29va2llW3Rva2VuRW5kIC0gMV0pKQorICAgICAgICAg
ICAgICAgIHRva2VuRW5kLS07CisKKyAgICAgICAgICAgIHBhcnNlZFZhbHVlID0gY29va2llLnN1
YnN0cmluZyh0b2tlblN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQpOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIHBhcnNlZFZhbHVlIGlzIGVtcHR5LCBpbml0aWFs
aXNlIGl0IGluIGNhc2Ugd2UgbmVlZCBpdAorICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBTdHJp
bmcoKTsKKyAgICAgICAgICAgIC8vIEhhbmRsZSBhIHRva2VuIHdpdGhvdXQgdmFsdWUuCisgICAg
ICAgICAgICBsZW5ndGggPSBwYWlyRW5kIC0gdG9rZW5TdGFydDsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIERldGVjdCB3aGljaCAiY29va2llLWF2IiBpcyBwYXJzZWQKKyAgICAgICAgLy8gTG9v
ayBhdCB0aGUgZmlyc3QgY2hhciB0aGVuIHBhcnNlIHRoZSB3aG9sZSBmb3IgcGVyZm9ybWFuY2Ug
aXNzdWUKKyAgICAgICAgc3dpdGNoIChjb29raWVbdG9rZW5TdGFydFN2Z10pIHsKKyAgICAgICAg
Y2FzZSAnUCc6CisgICAgICAgIGNhc2UgJ3AnIDogeworICAgICAgICAgICAgaWYgKGxlbmd0aCA+
PSA0ICYmICgoY29va2llLmZpbmQoImF0aCIsIHRva2VuU3RhcnRTdmcgKyAxLCBmYWxzZSkgLSB0
b2tlblN0YXJ0U3ZnKSA9PSAxKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIHBh
dGggdG8gYmUgZGVjb2RlZCB0byBtYXRjaCB0aG9zZSByZXR1cm5lZCBmcm9tIEtVUkw6OnBhdGgo
KS4KKyAgICAgICAgICAgICAgICAvLyBUaGUgcGF0aCBhdHRyaWJ1dGUgbWF5IG9yIG1heSBub3Qg
aW5jbHVkZSBwZXJjZW50LWVuY29kZWQgY2hhcmFjdGVycy4gRm9ydHVuYXRlbHkKKyAgICAgICAg
ICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcGVyY2VudC1lbmNvZGVkIGNoYXJhY3RlcnMsIGRl
Y29kaW5nIHRoZSB1cmwgaXMgYSBuby1vcC4KKyAgICAgICAgICAgICAgICByZXMtPnNldFBhdGgo
Y3VybF91bmVzY2FwZShwYXJzZWRWYWx1ZS51dGY4KCkuZGF0YSgpLCBwYXJzZWRWYWx1ZS5sZW5n
dGgoKSkpOworCisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBmb2xs
b3dpbmcgY2hlY2sgYmVjYXVzZSBzaXRlcyBsaWtlIEZhY2Vib29rIGFuZAorICAgICAgICAgICAg
ICAgIC8vIEdtYWlsIGN1cnJlbnRseSBkbyBub3QgZm9sbG93IHRoZSBzcGVjLgorCisgICAgICAg
ICAgICAgICAgLy8gQ2hlY2sgaWYgcGF0aCBhdHRyaWJ1dGUgaXMgYSBwcmVmaXggb2YgdGhlIHJl
cXVlc3QgVVJJLgorICAgICAgICAgICAgICAgIGlmICghdXJsLnBhdGgoKS5zdGFydHNXaXRoKHJl
cy0+cGF0aCgpKSkKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SX0FORF9SRVRVUk4oIklu
dmFsaWQgY29va2llIGF0dHJpYnV0ZSAlcyAocGF0aCk6IGl0IGRvZXMgbm90IG1hdGggdGhlIFVS
TCIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAg
ICAgICAgICBMT0dfRVJST1JfQU5EX1JFVFVSTigiSW52YWxpZCBjb29raWUgYXR0cmlidXRlICVz
IChwYXRoKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICBjYXNlICdkJyA6IHsKKyAgICAg
ICAgICAgIGlmIChsZW5ndGggPj0gNiAmJiAoKGNvb2tpZS5maW5kKCJvbWFpbiIsIHRva2VuU3Rh
cnRTdmcgKyAxLCBmYWxzZSkgLSB0b2tlblN0YXJ0U3ZnKSA9PSAxKSkgeworICAgICAgICAgICAg
ICAgIGlmIChwYXJzZWRWYWx1ZS5sZW5ndGgoKSA+IDEgJiYgcGFyc2VkVmFsdWVbMF0gPT0gJyIn
ICYmIHBhcnNlZFZhbHVlW3BhcnNlZFZhbHVlLmxlbmd0aCgpIC0gMV0gPT0gJyInKQorICAgICAg
ICAgICAgICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnN1YnN0cmluZygxLCBwYXJz
ZWRWYWx1ZS5sZW5ndGgoKSAtIDIpOworCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhl
IGRvbWFpbiBjb250YWlucyBhbiBlbWJlZGRlZCBkb3QuCisgICAgICAgICAgICAgICAgc2l6ZV90
IGRvdFBvc2l0aW9uID0gcGFyc2VkVmFsdWUuZmluZCgiLiIsIDEpOworICAgICAgICAgICAgICAg
IGlmIChkb3RQb3NpdGlvbiA9PSBub3RGb3VuZCB8fCBkb3RQb3NpdGlvbiA9PSBwYXJzZWRWYWx1
ZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SX0FORF9SRVRVUk4oIklu
dmFsaWQgY29va2llIGF0dHJpYnV0ZSAlcyAoZG9tYWluKTogaXQgZG9lcyBub3QgY29udGFpbiBh
biBlbWJlZGRlZCBkb3QiLCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworCisgICAgICAgICAgICAg
ICAgaWYgKCF1cmwuaG9zdCgpLmVuZHNXaXRoKHBhcnNlZFZhbHVlLCBmYWxzZSkpCisgICAgICAg
ICAgICAgICAgICAgIExPR19FUlJPUl9BTkRfUkVUVVJOKCJJbnZhbGlkIGNvb2tpZSBhdHRyaWJ1
dGUgJXMgKGRvbWFpbik6IGl0IGRvZXMgbm90IGRvbWFpbiBtYXRjaCB0aGUgaG9zdCIsIGNvb2tp
ZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVz
LT5zZXREb21haW4ocGFyc2VkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICAgICAgTE9HX0VSUk9SX0FORF9SRVRVUk4oIkludmFsaWQgY29va2llIGF0dHJpYnV0ZSAlcyAo
ZG9tYWluKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIGNhc2UgJ0UnIDoKKyAgICAgICAgY2FzZSAnZScgOiB7CisgICAg
ICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgKChjb29raWUuZmluZCgieHBpcmVzIiwgdG9rZW5T
dGFydFN2ZyArIDEsIGZhbHNlKSAtIHRva2VuU3RhcnRTdmcpID09IDEpKQorICAgICAgICAgICAg
ICAgIHJlcy0+c2V0RXhwaXJ5KHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICBMT0dfRVJST1JfQU5EX1JFVFVSTigiSW52YWxpZCBjb29raWUgYXR0cmlidXRl
ICVzIChleHBpcmVzKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ00nIDoKKyAgICAgICAgY2FzZSAnbScgOiB7
CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgKChjb29raWUuZmluZCgiYXgtYWdlIiwg
dG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSAtIHRva2VuU3RhcnRTdmcpID09IDEpKQorICAgICAg
ICAgICAgICAgIHJlcy0+c2V0TWF4QWdlKHBhcnNlZFZhbHVlKTsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBMT0dfRVJST1JfQU5EX1JFVFVSTigiSW52YWxpZCBjb29raWUgYXR0
cmlidXRlICVzIChtYXgtYWdlKSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ0MnIDoKKyAgICAgICAgY2FzZSAn
YycgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgKChjb29raWUuZmluZCgib21t
ZW50IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSAtIHRva2VuU3RhcnRTdmcpID09IDEpKQor
ICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYXZlIHJvb20gZm9yIHRoZSBjb21tZW50IHBh
cnQgKGFuZCBzbyBkbyBNb3ppbGxhKSBzbyBqdXN0IGxvZyB0aGUgY29tbWVudC4KKyAgICAgICAg
ICAgICAgICBMT0coTmV0d29yaywgIkNvbW1lbnQgJXMgZm9yIFBhcnNlZENvb2tpZSA6ICVzXG4i
LCBwYXJzZWRWYWx1ZS5hc2NpaSgpLmRhdGEoKSwgY29va2llLmFzY2lpKCkuZGF0YSgpKTsKKyAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfRVJST1JfQU5EX1JFVFVSTigiSW52
YWxpZCBjb29raWUgYXR0cmlidXRlICVzIChjb21tZW50KSIsIGNvb2tpZS5hc2NpaSgpLmRhdGEo
KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ1YnIDoK
KyAgICAgICAgY2FzZSAndicgOiB7CisgICAgICAgICAgICBpZiAobGVuZ3RoID49IDcgJiYgKChj
b29raWUuZmluZCgiZXJzaW9uIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNlKSAtIHRva2VuU3Rh
cnRTdmcpID09IDEpKSB7CisgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggdGhlIG91dC1vZi1k
YXRlZCBDb29raWUgU3BlYyhSRkMyOTY1LCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMy
OTY1KSBkZWZpbmVkCisgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIG9mIHZlcnNpb24gY2Fu
IG9ubHkgY29udGFpbiBESUdJVCwgc29tZSByYW5kb20gc2l0ZXMsIGUuZy4gaHR0cHM6Ly9kZXZm
b3J1bXMuYXBwbGUuY29tCisgICAgICAgICAgICAgICAgLy8gd291bGQgdXNlIGRvdWJsZSBxdW90
YXRpb24gbWFya3MgdG8gcXVvdGUgdGhlIGRpZ2l0LiBTbyB3ZSBuZWVkIHRvIGdldCByaWQgb2Yg
dGhlbSBmb3IgY29tcGxpYW5jZS4KKyAgICAgICAgICAgICAgICBpZiAocGFyc2VkVmFsdWUubGVu
Z3RoKCkgPiAxICYmIHBhcnNlZFZhbHVlWzBdID09ICciJyAmJiBwYXJzZWRWYWx1ZVtwYXJzZWRW
YWx1ZS5sZW5ndGgoKSAtIDFdID09ICciJykKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VkVmFs
dWUgPSBwYXJzZWRWYWx1ZS5zdWJzdHJpbmcoMSwgcGFyc2VkVmFsdWUubGVuZ3RoKCkgLSAyKTsK
KworICAgICAgICAgICAgICAgIGlmIChwYXJzZWRWYWx1ZS50b0ludCgpICE9IDEpCisgICAgICAg
ICAgICAgICAgICAgIExPR19FUlJPUl9BTkRfUkVUVVJOKCJQYXJzZWRDb29raWUgdmVyc2lvbiAl
ZCBub3Qgc3VwcG9ydGVkIChvbmx5IHN1cHBvcnQgdmVyc2lvbj0xKSIsIHBhcnNlZFZhbHVlLnRv
SW50KCkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgTE9HX0VSUk9SX0FO
RF9SRVRVUk4oIkludmFsaWQgY29va2llIGF0dHJpYnV0ZSAlcyAodmVyc2lvbikiLCBjb29raWUu
YXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAg
ICBjYXNlICdTJyA6CisgICAgICAgIGNhc2UgJ3MnIDogeworICAgICAgICAgICAgLy8gU2VjdXJl
IGlzIGEgc3RhbmRhbG9uZSB0b2tlbiAoIlNlY3VyZTsiKQorICAgICAgICAgICAgaWYgKGxlbmd0
aCA+PSA2ICYmICgoY29va2llLmZpbmQoImVjdXJlIiwgdG9rZW5TdGFydFN2ZyArIDEsIGZhbHNl
KSAtIHRva2VuU3RhcnRTdmcpID09IDEpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0U2VjdXJl
RmxhZyh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfRVJST1Jf
QU5EX1JFVFVSTigiSW52YWxpZCBjb29raWUgYXR0cmlidXRlICVzIChzZWN1cmUpIiwgY29va2ll
LmFzY2lpKCkuZGF0YSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNhc2UgJ0gnOgorICAgICAgICBjYXNlICdoJzogeworICAgICAgICAgICAgLy8gSHR0cE9ubHkg
aXMgYSBzdGFuZGFsb25lIHRva2VuICgiSHR0cE9ubHk7IikKKyAgICAgICAgICAgIGlmIChsZW5n
dGggPj0gOCAmJiAoKGNvb2tpZS5maW5kKCJ0dHBPbmx5IiwgdG9rZW5TdGFydFN2ZyArIDEsIGZh
bHNlKSAtIHRva2VuU3RhcnRTdmcpID09IDEpKQorICAgICAgICAgICAgICAgIHJlcy0+c2V0SXNI
dHRwT25seSh0cnVlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBMT0dfRVJS
T1JfQU5EX1JFVFVSTigiSW52YWxpZCBjb29raWUgYXR0cmlidXRlICVzIChIdHRwT25seSkiLCBj
b29raWUuYXNjaWkoKS5kYXRhKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwor
ICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgLy8gSWYgbGVuZ3RoID09IDAsIHdlIHNo
b3VsZCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjb29raWUgKGNhc2UgOiAiO1xyIikgc28gaWdub3Jl
IGl0CisgICAgICAgICAgICBpZiAobGVuZ3RoKQorICAgICAgICAgICAgICAgIExPR19FUlJPUl9B
TkRfUkVUVVJOKCJJbnZhbGlkIHRva2VuIGZvciBjb29raWUgJXMiLCBjb29raWUuYXNjaWkoKS5k
YXRhKCkpOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB0
aGUgY29va2llIGlzIHZhbGlkIHdpdGggcmVzcGVjdCB0byB0aGUgc2l6ZSBsaW1pdC4KKyAgICBp
ZiAoIXJlcy0+aXNVbmRlclNpemVMaW1pdCgpKQorICAgICAgICBMT0dfRVJST1JfQU5EX1JFVFVS
TigiUGFyc2VkQ29va2llICVzIGlzIGFib3ZlIHRoZSA0a2IgaW4gbGVuZ3RoIDogUkVKRUNURUQi
LCBjb29raWUuYXNjaWkoKS5kYXRhKCkpOworCisgICAgLy8gSWYgbm8gZG9tYWluIHdhcyBwcm92
aWRlZCwgc2V0IGl0IHRvIHRoZSBob3N0CisKKyAgICBpZiAoIXJlcy0+ZG9tYWluKCkpCisgICAg
ICAgIHJlcy0+c2V0RG9tYWluKHVybC5ob3N0KCkpOworCisgICAgLy8gQWNjb3JkaW5nIHRvIHRo
ZSBDb29raWUgU3BlY2lmaWNhaXRvbiAoUkZDNjI2NSwgc2VjdGlvbiA0LjEuMi40IGFuZCA1LjIu
NCwgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2NSksCisgICAgLy8gSWYgbm8gcGF0
aCB3YXMgcHJvdmlkZWQgb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgcGF0aCB2YWx1ZSBp
cyBub3QgJy8nLCBzZXQgaXQgdG8gdGhlIGhvc3QncyBwYXRoCisgICAgLy8KKyAgICAvLyBSRUZF
UkVOQ0UKKyAgICAvLyA0LjEuMi40LiBUaGUgUGF0aCBBdHRyaWJ1dGUKKyAgICAvLworICAgIC8v
IFRoZSBzY29wZSBvZiBlYWNoIGNvb2tpZSBpcyBsaW1pdGVkIHRvIGEgc2V0IG9mIHBhdGhzLCBj
b250cm9sbGVkIGJ5CisgICAgLy8gdGhlIFBhdGggYXR0cmlidXRlLiBJZiB0aGUgc2VydmVyIG9t
aXRzIHRoZSBQYXRoIGF0dHJpYnV0ZSwgdGhlIHVzZXIKKyAgICAvLyBhZ2VudCB3aWxsIHVzZSB0
aGUgImRpcmVjdG9yeSIgb2YgdGhlIHJlcXVlc3QtdXJpJ3MgcGF0aCBjb21wb25lbnQgYXMKKyAg
ICAvLyB0aGUgZGVmYXVsdCB2YWx1ZS4gKFNlZSBTZWN0aW9uIDUuMS40IGZvciBtb3JlIGRldGFp
bHMuKQorICAgIC8vIC4uLi4uLi4uLi4uCisgICAgLy8gNS4yLjQuIFRoZSBQYXRoIEF0dHJpYnV0
ZQorICAgIC8vCisgICAgLy8gSWYgdGhlIGF0dHJpYnV0ZS1uYW1lIGNhc2UtaW5zZW5zaXRpdmVs
eSBtYXRjaGVzIHRoZSBzdHJpbmcgIlBhdGgiLAorICAgIC8vIHRoZSB1c2VyIGFnZW50IE1VU1Qg
cHJvY2VzcyB0aGUgY29va2llLWF2IGFzIGZvbGxvd3MuCisgICAgLy8KKyAgICAvLyBJZiB0aGUg
YXR0cmlidXRlLXZhbHVlIGlzIGVtcHR5IG9yIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhl
CisgICAgLy8gYXR0cmlidXRlLXZhbHVlIGlzIG5vdCAleDJGICgiLyIpOgorICAgIC8vCisgICAg
Ly8gTGV0IGNvb2tpZS1wYXRoIGJlIHRoZSBkZWZhdWx0LXBhdGguCisgICAgLy8KKyAgICAvLyBP
dGhlcndpc2U6CisgICAgLy8KKyAgICAvLyBMZXQgY29va2llLXBhdGggYmUgdGhlIGF0dHJpYnV0
ZS12YWx1ZS4KKyAgICAvLworICAgIC8vIEFwcGVuZCBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvb2tp
ZS1hdHRyaWJ1dGUtbGlzdCB3aXRoIGFuIGF0dHJpYnV0ZS0KKyAgICAvLyBuYW1lIG9mIFBhdGgg
YW5kIGFuIGF0dHJpYnV0ZS12YWx1ZSBvZiBjb29raWUtcGF0aC4KKyAgICBpZiAoIXJlcy0+cGF0
aCgpIHx8ICFyZXMtPnBhdGgoKS5sZW5ndGgoKSB8fCAhcmVzLT5wYXRoKCkuc3RhcnRzV2l0aCgi
LyIsIGZhbHNlKSkgeworICAgICAgICBTdHJpbmcgcGF0aCA9IHVybC5zdHJpbmcoKS5zdWJzdHJp
bmcodXJsLnBhdGhTdGFydCgpLCB1cmwucGF0aEFmdGVyTGFzdFNsYXNoKCkgLSB1cmwucGF0aFN0
YXJ0KCkgLSAxKTsKKyAgICAgICAgaWYgKHBhdGguaXNFbXB0eSgpKQorICAgICAgICAgICAgcGF0
aCA9ICIvIjsKKyAgICAgICAgLy8gU2luY2UgdGhpcyBpcyByZWFkaW5nIHRoZSByYXcgdXJsIHN0
cmluZywgaXQgY291bGQgY29udGFpbiBwZXJjZW50LWVuY29kZWQgc2VxdWVuY2VzLiBXZQorICAg
ICAgICAvLyB3YW50IGl0IHRvIGJlIGNvbXBhcmFibGUgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiB1
cmwucGF0aCgpLCB3aGljaCBpcyBub3QgcGVyY2VudC1lbmNvZGVkLAorICAgICAgICAvLyBzbyB3
ZSBtdXN0IHJlbW92ZSB0aGUgZXNjYXBlIHNlcXVlbmNlcy4KKyAgICAgICAgcmVzLT5zZXRQYXRo
KGN1cmxfdW5lc2NhcGUocGF0aC51dGY4KCkuZGF0YSgpLCBwYXRoLmxlbmd0aCgpKSk7CisgICAg
fQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBDb29raWVNYW5hZ2VyOjpkZWJ1ZygpCit7
CisgICAgZnByaW50ZihzdGRlcnIsICJcbi0tLS0tLS0tLS1cbkNvb2tpZXM6XG4iKTsKKworICAg
IGZvciAoSGFzaE1hcDxTdHJpbmcsIFZlY3RvcjxSZWZQdHI8UGFyc2VkQ29va2llPiA+ID46Oml0
ZXJhdG9yIGkgPSBtX2Nvb2tpZXMuYmVnaW4oKTsgaSAhPSBtX2Nvb2tpZXMuZW5kKCk7ICsraSkg
eworCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLSAlc1xuIiwgaS0+a2V5LnV0ZjgoKS5kYXRh
KCkpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBpLT52YWx1ZS5zaXplKCk7
IGorKykKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiLS0tICVzXG4iLCBpLT52YWx1ZS5h
dChqKS0+dG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0
ZGVyciwgIi0tLS0tLS0tLS1cblxuIik7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5h
Z2VyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvQ29va2llTWFuYWdl
ci5oCmluZGV4IGU2OWRlMjkuLjU1MmRmYWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY3VybC9Db29raWVNYW5hZ2VyLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9jdXJsL0Nvb2tpZU1hbmFnZXIuaApAQCAtMCwwICsxLDc4IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA5IEp1bGllbiBDaGFmZnJhaXggPGpjaGFmZnJhaXhAcGxl
eW8uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1v
dGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEz
IFN6YWJvbGNzIERhdmlkIDxkYXZpZHN6QGluZi51LXN6ZWdlZC5odT4sIFVuaXZlcnNpdHkgb2Yg
U3plZ2VkCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LyAKKworI2lmbmRlZiBDb29raWVNYW5hZ2VyX2gKKyNkZWZpbmUgQ29va2llTWFuYWdlcl9oCisK
KyNpbmNsdWRlICJDb29raWUuaCIKKyNpbmNsdWRlICJDb29raWVEYXRhYmFzZUJhY2tpbmdTdG9y
ZS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQYXJzZWRDb29raWUuaCIKKyNpbmNs
dWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2VudW0gQ29va2llRmlsdGVyIHsKKyAgICBOb0h0dHBPbmx5Q29va2ll
cywKKyAgICBXaXRoSHR0cE9ubHlDb29raWVzLAorfTsKKworY2xhc3MgQ29va2llTWFuYWdlciB7
CisKK3B1YmxpYzoKKworICAgIHZvaWQgZ2V0UmF3Q29va2llcyhjb25zdCBLVVJMJiwgVmVjdG9y
PENvb2tpZT4mKTsKKyAgICB2b2lkIGdldEhvc3RuYW1lcyhIYXNoU2V0PFN0cmluZz4mKTsKKyAg
ICBTdHJpbmcgY29va2llc0ZvclNlc3Npb24oY29uc3QgS1VSTCYsIENvb2tpZUZpbHRlcik7Cisg
ICAgdm9pZCBzZXRDb29raWUoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIENvb2tpZUZpbHRl
cik7CisgICAgdm9pZCByZW1vdmVBbGxDb29raWVzKGJvb2wpOworICAgIHZvaWQgcmVtb3ZlQ29v
a2llV2l0aE5hbWUoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgcmVtb3Zl
Q29va2llc1dpdGhIb3N0bmFtZShjb25zdCBTdHJpbmcmKTsKKyAgICBQYXNzUmVmUHRyPFBhcnNl
ZENvb2tpZT4gcGFyc2VPbmVDb29raWUoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIHVuc2ln
bmVkLCB1bnNpZ25lZCk7CisgICAgdm9pZCBkZWJ1ZygpOworCisgICAgc3RhdGljIENvb2tpZU1h
bmFnZXImIGdldEluc3RhbmNlKCk7CisgICAgc3RhdGljIHVuc2lnbmVkIG1heENvb2tpZUxlbmd0
aCgpIHsgcmV0dXJuIHNfbWF4Q29va2llTGVuZ3RoOyB9CisKK3ByaXZhdGU6CisgICAgQ29va2ll
TWFuYWdlcigpOworICAgIENvb2tpZU1hbmFnZXIoQ29va2llTWFuYWdlciBjb25zdCYpOworICAg
IENvb2tpZU1hbmFnZXImIG9wZXJhdG9yPShDb29raWVNYW5hZ2VyIGNvbnN0Jik7CisgICAgdmly
dHVhbCB+Q29va2llTWFuYWdlcigpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX21heENv
b2tpZUxlbmd0aCA9IDQwOTY7CisKKyAgICBIYXNoTWFwPFN0cmluZywgVmVjdG9yPFJlZlB0cjxQ
YXJzZWRDb29raWU+ID4gPiBtX2Nvb2tpZXM7CisKKyAgICBDb29raWVEYXRhYmFzZUJhY2tpbmdT
dG9yZSogbV9iYWNraW5nU3RvcmU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBDb29raWVNYW5hZ2VyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL25ldHdvcmsvY3VybC9ETlNDdXJsLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25l
dHdvcmsvY3VybC9ETlNDdXJsLmNwcAppbmRleCA1MDVlYzE1Li4zNjg2YWQwIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvRE5TQ3VybC5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL0ROU0N1cmwuY3BwCkBAIC0zOSw2
ICszOSw3IEBAIHZvaWQgcHJlZmV0Y2hETlMoY29uc3QgU3RyaW5nJiBob3N0bmFtZSkKIGJvb2wg
RE5TUmVzb2x2ZVF1ZXVlOjpwbGF0Zm9ybVByb3h5SXNFbmFibGVkSW5TeXN0ZW1QcmVmZXJlbmNl
cygpCiB7CiAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZv
aWQgRE5TUmVzb2x2ZVF1ZXVlOjpwbGF0Zm9ybVJlc29sdmUoY29uc3QgU3RyaW5nJiBob3N0bmFt
ZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9QYXJz
ZWRDb29raWUuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1BhcnNl
ZENvb2tpZS5jcHAKaW5kZXggZTY5ZGUyOS4uNmMyODNmNSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1BhcnNlZENvb2tpZS5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1BhcnNlZENvb2tpZS5jcHAKQEAgLTAsMCAr
MSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgSnVsaWVuIENoYWZmcmFp
eCA8anVsaWVuLmNoYWZmcmFpeEBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEsIDIw
MTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFyc2VkQ29va2llLmgiCisKKyNpbmNsdWRlICJDb29r
aWVNYW5hZ2VyLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNp
bmNsdWRlIDxjdXJsL2N1cmwuaD4KKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNs
dWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRl
ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhcnNlZENvb2tpZTo6UGFyc2VkQ29va2ll
KGRvdWJsZSBjdXJyZW50VGltZSkKKyAgICA6IG1fZXhwaXJ5KC0xKQorICAgICwgbV9jcmVhdGlv
blRpbWUoY3VycmVudFRpbWUpCisgICAgLCBtX2xhc3RBY2Nlc3NlZChjdXJyZW50VGltZSkKKyAg
ICAsIG1faXNTZWN1cmUoZmFsc2UpCisgICAgLCBtX2lzSHR0cE9ubHkoZmFsc2UpCisgICAgLCBt
X2lzU2Vzc2lvbih0cnVlKQorICAgICwgbV9pc0ZvcmNlRXhwaXJlZChmYWxzZSkKK3sKK30KKwor
UGFyc2VkQ29va2llOjpQYXJzZWRDb29raWUoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBTdHJp
bmcmIHZhbHVlLCBjb25zdCBTdHJpbmcmIGRvbWFpbiwgY29uc3QgU3RyaW5nJiBwcm90b2NvbCwg
Y29uc3QgU3RyaW5nJiBwYXRoLCBkb3VibGUgZXhwaXJ5LCBkb3VibGUgbGFzdEFjY2Vzc2VkLCBk
b3VibGUgY3JlYXRpb25UaW1lLCBib29sIGlzU2VjdXJlLCBib29sIGlzSHR0cE9ubHkpCisgICAg
OiBtX25hbWUobmFtZSkKKyAgICAsIG1fdmFsdWUodmFsdWUpCisgICAgLCBtX2RvbWFpbihkb21h
aW4pCisgICAgLCBtX3Byb3RvY29sKHByb3RvY29sKQorICAgICwgbV9wYXRoKHBhdGgpCisgICAg
LCBtX2V4cGlyeShleHBpcnkpCisgICAgLCBtX2NyZWF0aW9uVGltZShjcmVhdGlvblRpbWUpCisg
ICAgLCBtX2xhc3RBY2Nlc3NlZChsYXN0QWNjZXNzZWQpCisgICAgLCBtX2lzU2VjdXJlKGlzU2Vj
dXJlKQorICAgICwgbV9pc0h0dHBPbmx5KGlzSHR0cE9ubHkpCisgICAgLCBtX2lzU2Vzc2lvbihm
YWxzZSkKKyAgICAsIG1faXNGb3JjZUV4cGlyZWQoZmFsc2UpCit7Cit9CisKK3ZvaWQgUGFyc2Vk
Q29va2llOjpzZXRFeHBpcnkoY29uc3QgU3RyaW5nJiBleHBpcnkpCit7CisgICAgLy8gSWYgYSBj
b29raWUgaGFzIGJvdGggdGhlIE1heC1BZ2UgYW5kIHRoZSBFeHBpcmVzIGF0dHJpYnV0ZSwKKyAg
ICAvLyB0aGUgTWF4LUFnZSBhdHRyaWJ1dGUgaGFzIHByZWNlZGVuY2UgYW5kIGNvbnRyb2xzIHRo
ZSBleHBpcmF0aW9uIGRhdGUgb2YgdGhlIGNvb2tpZS4KKyAgICBpZiAobV9leHBpcnkgIT0gLTEg
fHwgZXhwaXJ5LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pc1Nlc3Npb24g
PSBmYWxzZTsKKworICAgIG1fZXhwaXJ5ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihjdXJsX2dldGRh
dGUoZXhwaXJ5LnV0ZjgoKS5kYXRhKCksIDApKTsKKworICAgIGlmIChtX2V4cGlyeSA9PSAtMSkg
eworICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBkYXRlIik7CisgICAgICAgIC8v
IEluIHRoaXMgY2FzZSwgY29uc2lkZXIgdGhhdCB0aGUgY29va2llIGlzIHNlc3Npb24gb25seQor
ICAgICAgICBtX2lzU2Vzc2lvbiA9IHRydWU7CisgICAgfQorfQorCit2b2lkIFBhcnNlZENvb2tp
ZTo6c2V0TWF4QWdlKGNvbnN0IFN0cmluZyYgbWF4QWdlKQoreworICAgIC8vIEFjY29yZGluZyB0
byB0aGUgSFRUUCBDb29raWUgc3BlY2lmaWNhdGlvbiAoUkZDNjI2NSwgaHR0cDovL3Rvb2xzLmll
dGYub3JnL2h0bWwvcmZjNjI2NSksCisgICAgLy8gdGhlIGZpcnN0IGNoYXJhY3RlciBjYW4gYmUg
YSBESUdJVCBvciBhICItIiwgYW5kIHRoZSByZW1pbmRlcgorICAgIC8vIG9mIHRoZSB2YWx1ZSBj
YW4gb25seSBjb250YWluIERJR0lUIGNoYXJhY3RlcnMuCisgICAgaWYgKG1heEFnZS5pc0VtcHR5
KCkgfHwgKG1heEFnZVswXSAhPSAnLScgJiYgIWlzQVNDSUlEaWdpdChtYXhBZ2VbMF0pKSkgewor
ICAgICAgICBMT0dfRVJST1IoIkNvdWxkIG5vdCBwYXJzZSBNYXgtQWdlIDogJXMsIGZpcnN0IGNo
YXJhY3RlciBjYW4gb25seSBiZSAnLScgb3IgYXNjaWkgZGlnaXQuIiwgbWF4QWdlLmFzY2lpKCku
ZGF0YSgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgb2s7CisgICAgaW50
IHZhbHVlID0gbWF4QWdlLnRvSW50U3RyaWN0KCZvayk7CisKKyAgICBpZiAoIW9rKSB7CisgICAg
ICAgIExPR19FUlJPUigiQ291bGQgbm90IHBhcnNlIE1heC1BZ2UgOiAlcyIsIG1heEFnZS5hc2Np
aSgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9leHBpcnkgPSB2YWx1
ZTsKKyAgICBtX2lzU2Vzc2lvbiA9IGZhbHNlOworCisgICAgLy8gSWYgbWF4QWdlIHZhbHVlIGlz
IG5vdCBwb3NpdGl2ZSwgbGV0IGV4cGlyeS10aW1lIGJlIHRoZSBlYXJsaWVzdCByZXByZXNlbnRh
YmxlIHRpbWUuCisgICAgaWYgKG1fZXhwaXJ5ID4gMCkKKyAgICAgICAgbV9leHBpcnkgKz0gY3Vy
cmVudFRpbWUoKTsKKyAgICBlbHNlCisgICAgICAgIG1fZXhwaXJ5ID0gMDsKK30KKworYm9vbCBQ
YXJzZWRDb29raWU6Omhhc0V4cGlyZWQoKSBjb25zdAoreworICAgIC8vIFNlc3Npb24gY29va2ll
cyBkbyBub3QgZXhwaXJlLCB0aGV5IHdpbGwganVzdCBub3QgYmUgc2F2ZWQgdG8gdGhlIGJhY2tp
bmcgc3RvcmUuCisgICAgcmV0dXJuICFtX2lzU2Vzc2lvbiAmJiAobV9pc0ZvcmNlRXhwaXJlZCB8
fCBtX2V4cGlyeSA8IGN1cnJlbnRUaW1lKCkpOworfQorCitib29sIFBhcnNlZENvb2tpZTo6aXNV
bmRlclNpemVMaW1pdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmFsdWUubGVuZ3RoKCkgPD0g
Q29va2llTWFuYWdlcjo6bWF4Q29va2llTGVuZ3RoKCkgJiYgbV9uYW1lLmxlbmd0aCgpIDw9IENv
b2tpZU1hbmFnZXI6Om1heENvb2tpZUxlbmd0aCgpOworfQorCitTdHJpbmcgUGFyc2VkQ29va2ll
Ojp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyOworICAgIGJ1
aWxkZXIuYXBwZW5kKG5hbWUoKSk7CisgICAgYnVpbGRlci5hcHBlbmQoIiA9ICIpOworICAgIGJ1
aWxkZXIuYXBwZW5kKHZhbHVlKCkpOworICAgIGJ1aWxkZXIuYXBwZW5kKCI7IERvbWFpbiA9ICIp
OworICAgIGJ1aWxkZXIuYXBwZW5kKGRvbWFpbigpKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiOyBQ
YXRoID0gIik7CisgICAgYnVpbGRlci5hcHBlbmQocGF0aCgpKTsKKyAgICBidWlsZGVyLmFwcGVu
ZCgiOyBQcm90b2NvbCA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKHByb3RvY29sKCkpOworICAg
IGJ1aWxkZXIuYXBwZW5kKCI7IEV4cGlyeSA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKFN0cmlu
Zzo6Zm9ybWF0KCIlZiIsIGV4cGlyeSgpKSk7CisgICAgYnVpbGRlci5hcHBlbmQoIjsgSHR0cE9u
bHkgPSAiKTsKKyAgICBidWlsZGVyLmFwcGVuZChtX2lzSHR0cE9ubHkgPyAidHJ1ZSIgOiAiZmFs
c2UiKTsKKyAgICBidWlsZGVyLmFwcGVuZCgiOyBTZWN1cmUgPSAiKTsKKyAgICBidWlsZGVyLmFw
cGVuZChpc1NlY3VyZSgpID8gInRydWUiIDogImZhbHNlIik7CisgICAgYnVpbGRlci5hcHBlbmQo
IjsgSGFzRXhwaXJlZCA9ICIpOworICAgIGJ1aWxkZXIuYXBwZW5kKGhhc0V4cGlyZWQoKSA/ICJ0
cnVlIiA6ICJmYWxzZSIpOworCisgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKK30KKwor
U3RyaW5nIFBhcnNlZENvb2tpZTo6dG9OYW1lVmFsdWVQYWlyKCkgY29uc3QKK3sKKyAgICBzdGF0
aWMgY29uc3QgU3RyaW5nIGVxdWFsKCI9Iik7CisKKyAgICBzaXplX3QgY29va2llTGVuZ3RoID0g
bV9uYW1lLmxlbmd0aCgpICsgbV92YWx1ZS5sZW5ndGgoKSArIDI7CisgICAgVmVjdG9yPFVDaGFy
PiByZXN1bHQ7CisgICAgcmVzdWx0LnJlc2VydmVJbml0aWFsQ2FwYWNpdHkoY29va2llTGVuZ3Ro
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX25hbWUpOworICAgIGFwcGVuZChyZXN1bHQsIGVxdWFs
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBtX3ZhbHVlKTsKKworICAgIHJldHVybiBTdHJpbmc6OmFk
b3B0KHJlc3VsdCk7Cit9CisKK3ZvaWQgUGFyc2VkQ29va2llOjphcHBlbmRXZWJDb3JlQ29va2ll
KFZlY3RvcjxDb29raWU+JiBjb29raWVWZWN0b3IpIGNvbnN0Cit7CisgICAgY29va2llVmVjdG9y
LmFwcGVuZChDb29raWUoU3RyaW5nKG1fbmFtZSksIFN0cmluZyhtX3ZhbHVlKSwgU3RyaW5nKG1f
ZG9tYWluKSwKKyAgICAgICAgLy8gV2UgbXVsdGlwbHkgbV9leHBpcnkgYnkgMTAwMCB0byBjb252
ZXJ0IGZyb20gc2Vjb25kcyB0byBtaWxsaXNlY29uZHMuCisgICAgICAgIC8vIFRoaXMgdmFsdWUg
aXMgcGFzc2VkIHRvIFdlYiBJbnNwZWN0b3IgYW5kIHVzZWQgaW4gdGhlIEphdmFTY3JpcHQgRGF0
ZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgU3RyaW5nKG1fcGF0aCksIChtX2V4cGlyeSAqIDEwMDAp
LCBtX2lzSHR0cE9ubHksIG1faXNTZWN1cmUsIG1faXNTZXNzaW9uKSk7Cit9Cit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3Jr
L2N1cmwvUGFyc2VkQ29va2llLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvUGFyc2VkQ29va2llLmgKaW5kZXggZTY5ZGUyOS4uYzg3MThiOCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1BhcnNlZENvb2tpZS5oCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9QYXJzZWRDb29raWUuaApAQCAtMCww
ICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBKdWxpZW4gQ2hhZmZy
YWl4IDxqdWxpZW4uY2hhZmZyYWl4QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgUGFyc2VkQ29va2llX2gKKyNkZWZpbmUgUGFyc2VkQ29va2llX2gKKworI2luY2x1ZGUgIkNv
b2tpZS5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNv
dW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXVEYgeworY2xh
c3MgU3RyaW5nOworfQorbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBLVVJMOworCisvLyBU
aGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb29raWUgaW50ZXJuYWxseQorLy8gSXQgY2FuIGVpdGhl
ciBiZSBjcmVhdGVkIGJ5IHRoZSBDb29raWVQYXJzZXIgd2hpY2ggd2lsbCB0aGVuIGZpbGwgaXQK
Ky8vIG9yIGl0IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSBiYWNraW5nIHN0b3JlIGZpbGxpbmcgaXQg
aW4gdGhlIGNvbnN0cnVjdG9yLgorY2xhc3MgUGFyc2VkQ29va2llIDogcHVibGljIFJlZkNvdW50
ZWQ8UGFyc2VkQ29va2llPiB7CitwdWJsaWM6CisKKyAgICAvLyBEZWZhdWx0IGNvb2tpZSA6IGVt
cHR5IGRvbWFpbiwgbm9uIHNlY3VyZSBhbmQgc2Vzc2lvbgorICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFBhcnNlZENvb2tpZT4gY3JlYXRlKGRvdWJsZSBjdXJyZW50VGltZSkgeyByZXR1cm4gYWRvcHRS
ZWYobmV3IFBhcnNlZENvb2tpZShjdXJyZW50VGltZSkpOyB9CisKKyAgICAvLyBGb3IgYmFja2lu
ZyBzdG9yZSBjb29raWVzICh0aG9zZSBjb29raWVzIGFyZSBuZXZlciBzZXNzaW9uIGNvb2tpZXMp
LgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFBhcnNlZENvb2tpZT4gY3JlYXRlKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgU3RyaW5nJiB2YWx1ZSwgY29uc3QgU3RyaW5nJiBkb21haW4sIGNvbnN0
IFN0cmluZyYgcHJvdG9jb2wsIGNvbnN0IFN0cmluZyYgcGF0aCwgZG91YmxlIGV4cGlyeSwgZG91
YmxlIGxhc3RBY2Nlc3NlZCwgZG91YmxlIGNyZWF0aW9uVGltZSwgYm9vbCBpc1NlY3VyZSwgYm9v
bCBpc0h0dHBPbmx5KSAgeyByZXR1cm4gYWRvcHRSZWYobmV3IFBhcnNlZENvb2tpZShuYW1lLCB2
YWx1ZSwgZG9tYWluLCBwcm90b2NvbCwgcGF0aCwgZXhwaXJ5LCBsYXN0QWNjZXNzZWQsIGNyZWF0
aW9uVGltZSwgaXNTZWN1cmUsIGlzSHR0cE9ubHkpKTsgfTsKKworICAgIGNvbnN0IFN0cmluZyYg
bmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIHZvaWQgc2V0TmFtZShjb25zdCBT
dHJpbmcmIG5hbWUpIHsgbV9uYW1lID0gbmFtZTsgfQorCisgICAgY29uc3QgU3RyaW5nJiB2YWx1
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmFsdWU7IH0KKyAgICB2b2lkIHNldFZhbHVlKGNvbnN0IFN0
cmluZyYgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CisKKyAgICBjb25zdCBTdHJpbmcmIHBh
dGgoKSBjb25zdCB7IHJldHVybiBtX3BhdGg7IH0KKyAgICB2b2lkIHNldFBhdGgoY29uc3QgU3Ry
aW5nJiBwYXRoKSB7IG1fcGF0aCA9IHBhdGg7IH0KKworICAgIGNvbnN0IFN0cmluZyYgZG9tYWlu
KCkgY29uc3QgeyByZXR1cm4gbV9kb21haW47IH0KKyAgICB2b2lkIHNldERvbWFpbihjb25zdCBT
dHJpbmcmIGRvbWFpbikgeyBtX2RvbWFpbiA9IGRvbWFpbi5sb3dlcigpOyB9CisKKyAgICBjb25z
dCBTdHJpbmcmIHByb3RvY29sKCkgY29uc3QgeyByZXR1cm4gbV9wcm90b2NvbDsgfQorICAgIHZv
aWQgc2V0UHJvdG9jb2woY29uc3QgU3RyaW5nJiBwcm90b2NvbCkgeyBtX3Byb3RvY29sID0gcHJv
dG9jb2w7IH0KKworICAgIGRvdWJsZSBleHBpcnkoKSBjb25zdCB7IHJldHVybiBtX2V4cGlyeTsg
fQorICAgIHZvaWQgc2V0RXhwaXJ5KGNvbnN0IFN0cmluZyYpOworICAgIHZvaWQgZm9yY2VFeHBp
cmUoKSB7IG1faXNGb3JjZUV4cGlyZWQgID0gdHJ1ZTsgfQorICAgIHZvaWQgc2V0TWF4QWdlKGNv
bnN0IFN0cmluZyYpOworCisgICAgZG91YmxlIGxhc3RBY2Nlc3NlZCgpIGNvbnN0IHsgcmV0dXJu
IG1fbGFzdEFjY2Vzc2VkOyB9CisgICAgdm9pZCBzZXRMYXN0QWNjZXNzZWQoZG91YmxlIGxhc3RB
Y2Nlc3NlZCkgeyBtX2xhc3RBY2Nlc3NlZCA9IGxhc3RBY2Nlc3NlZDt9CisKKyAgICBkb3VibGUg
Y3JlYXRpb25UaW1lKCkgY29uc3QgeyByZXR1cm4gbV9jcmVhdGlvblRpbWU7IH0KKyAgICB2b2lk
IHNldENyZWF0aW9uVGltZShkb3VibGUgY3JlYXRpb25UaW1lKSB7IG1fY3JlYXRpb25UaW1lID0g
Y3JlYXRpb25UaW1lOyB9CisKKyAgICBib29sIGlzU2VjdXJlKCkgY29uc3QgeyByZXR1cm4gbV9p
c1NlY3VyZTsgfQorICAgIHZvaWQgc2V0U2VjdXJlRmxhZyhib29sIHNlY3VyZSkgeyBtX2lzU2Vj
dXJlID0gc2VjdXJlOyB9CisKKyAgICBib29sIGlzSHR0cE9ubHkoKSBjb25zdCB7IHJldHVybiBt
X2lzSHR0cE9ubHk7IH0KKyAgICB2b2lkIHNldElzSHR0cE9ubHkoYm9vbCBpc0h0dHBPbmx5KSB7
IG1faXNIdHRwT25seSA9IGlzSHR0cE9ubHk7IH0KKworICAgIGJvb2wgaXNTZXNzaW9uKCkgY29u
c3QgeyByZXR1cm4gbV9pc1Nlc3Npb247IH0KKworICAgIGJvb2wgaGFzRXhwaXJlZCgpIGNvbnN0
OworICAgIGJvb2wgaXNGb3JjZUV4cGlyZWQoKSBjb25zdCB7IHJldHVybiBtX2lzRm9yY2VFeHBp
cmVkOyB9CisgICAgYm9vbCBpc1VuZGVyU2l6ZUxpbWl0KCkgY29uc3Q7CisKKyAgICBTdHJpbmcg
dG9TdHJpbmcoKSBjb25zdDsKKyAgICBTdHJpbmcgdG9OYW1lVmFsdWVQYWlyKCkgY29uc3Q7Cisg
ICAgdm9pZCBhcHBlbmRXZWJDb3JlQ29va2llKFZlY3RvcjxDb29raWU+JiBjb29raWVWZWN0b3Ip
IGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIERlZmF1bHQgY29va2llIDogZW1wdHkgZG9tYWlu
LCBub24gc2VjdXJlIGFuZCBzZXNzaW9uCisgICAgUGFyc2VkQ29va2llKGRvdWJsZSBjdXJyZW50
VGltZSk7CisKKyAgICAvLyBGb3IgYmFja2luZyBzdG9yZSBjb29raWVzICh0aG9zZSBjb29raWVz
IGFyZSBuZXZlciBzZXNzaW9uIGNvb2tpZXMpLgorICAgIFBhcnNlZENvb2tpZShjb25zdCBTdHJp
bmcmIG5hbWUsIGNvbnN0IFN0cmluZyYgdmFsdWUsIGNvbnN0IFN0cmluZyYgZG9tYWluLCBjb25z
dCBTdHJpbmcmIHByb3RvY29sLCBjb25zdCBTdHJpbmcmIHBhdGgsIGRvdWJsZSBleHBpcnksIGRv
dWJsZSBsYXN0QWNjZXNzZWQsIGRvdWJsZSBjcmVhdGlvblRpbWUsIGJvb2wgaXNTZWN1cmUsIGJv
b2wgaXNIdHRwT25seSk7CisKKyAgICBTdHJpbmcgbV9uYW1lOworICAgIFN0cmluZyBtX3ZhbHVl
OworICAgIFN0cmluZyBtX2RvbWFpbjsKKyAgICBTdHJpbmcgbV9wcm90b2NvbDsKKyAgICBTdHJp
bmcgbV9wYXRoOworICAgIGRvdWJsZSBtX2V4cGlyeTsKKyAgICBkb3VibGUgbV9jcmVhdGlvblRp
bWU7CisgICAgLy8gVGhpcyBpcyB1c2VkIGZvciB0aGUgTFJVIHJlcGxhY2VtZW50IHBvbGljeS4K
KyAgICBkb3VibGUgbV9sYXN0QWNjZXNzZWQ7CisKKyAgICAvLyBib29sIG1fYWxsb3dTdWJkb21h
aW5zOworCisgICAgYm9vbCBtX2lzU2VjdXJlOworICAgIGJvb2wgbV9pc0h0dHBPbmx5OworICAg
IGJvb2wgbV9pc1Nlc3Npb247CisgICAgYm9vbCBtX2lzRm9yY2VFeHBpcmVkOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUGFyc2VkQ29va2llX2gKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9SZXNvdXJjZUhhbmRsZU1h
bmFnZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNl
SGFuZGxlTWFuYWdlci5jcHAKaW5kZXggZWEzMDBjYi4uNzBiYWQ4ZiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFu
ZGxlTWFuYWdlci5jcHAKQEAgLTgsNiArOCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBw
Y2VsZXJhdG9yIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAwOSBCcmVudCBGdWxnaGFtIDxiZnVs
Z2hhbUB3ZWJraXQub3JnPgogICogQ29weXJpZ2h0IChDKSAyMDEzIFBldGVyIEdhbCA8Z2FscGV0
ZXJAaW5mLnUtc3plZ2VkLmh1PiwgVW5pdmVyc2l0eSBvZiBTemVnZWQKKyAqIENvcHlyaWdodCAo
QykgMjAxMyBTemFib2xjcyBEYXZpZCA8ZGF2aWRzekBpbmYudS1zemVnZWQuaHU+LCBVbml2ZXJz
aXR5IG9mIFN6ZWdlZAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
QEAgLTM1LDYgKzM2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJSZXNvdXJj
ZUhhbmRsZU1hbmFnZXIuaCIKIAorI2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKICNpbmNsdWRl
ICJEYXRhVVJMLmgiCiAjaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKICNpbmNsdWRlICJNSU1FVHlw
ZVJlZ2lzdHJ5LmgiCkBAIC04NSwyMyArODcsMTEgQEAgc3RhdGljIENTdHJpbmcgY2VydGlmaWNh
dGVQYXRoKCkKICAgICByZXR1cm4gQ1N0cmluZygpOwogfQogCi1zdGF0aWMgY2hhciogY29va2ll
SmFyUGF0aCgpCi17Ci0gICAgY2hhciogY29va2llSmFyUGF0aCA9IGdldGVudigiQ1VSTF9DT09L
SUVfSkFSX1BBVEgiKTsKLSAgICBpZiAoY29va2llSmFyUGF0aCkKLSAgICAgICAgcmV0dXJuIGZh
c3RTdHJEdXAoY29va2llSmFyUGF0aCk7Ci0KLSAgICByZXR1cm4gZmFzdFN0ckR1cCgiY29va2ll
cy5kYXQiKTsKLX0KLQogc3RhdGljIE11dGV4KiBzaGFyZWRSZXNvdXJjZU11dGV4KGN1cmxfbG9j
a19kYXRhIGRhdGEpIHsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE11dGV4LCBjb29raWVNdXRl
eCwgKCkpOwogICAgIERFRklORV9TVEFUSUNfTE9DQUwoTXV0ZXgsIGRuc011dGV4LCAoKSk7CiAg
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChNdXRleCwgc2hhcmVNdXRleCwgKCkpOwogCiAgICAgc3dp
dGNoIChkYXRhKSB7Ci0gICAgICAgIGNhc2UgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFOgotICAgICAg
ICAgICAgcmV0dXJuICZjb29raWVNdXRleDsKICAgICAgICAgY2FzZSBDVVJMX0xPQ0tfREFUQV9E
TlM6CiAgICAgICAgICAgICByZXR1cm4gJmRuc011dGV4OwogICAgICAgICBjYXNlIENVUkxfTE9D
S19EQVRBX1NIQVJFOgpAQCAtMTM5LDI3ICsxMjksMjEgQEAgaW5saW5lIHN0YXRpYyBib29sIGlz
SHR0cFJlZGlyZWN0KGludCBzdGF0dXNDb2RlKQogCiBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OlJl
c291cmNlSGFuZGxlTWFuYWdlcigpCiAgICAgOiBtX2Rvd25sb2FkVGltZXIodGhpcywgJlJlc291
cmNlSGFuZGxlTWFuYWdlcjo6ZG93bmxvYWRUaW1lckNhbGxiYWNrKQotICAgICwgbV9jb29raWVK
YXJGaWxlTmFtZShjb29raWVKYXJQYXRoKCkpCiAgICAgLCBtX2NlcnRpZmljYXRlUGF0aCAoY2Vy
dGlmaWNhdGVQYXRoKCkpCiAgICAgLCBtX3J1bm5pbmdKb2JzKDApCiB7CiAgICAgY3VybF9nbG9i
YWxfaW5pdChDVVJMX0dMT0JBTF9BTEwpOwogICAgIG1fY3VybE11bHRpSGFuZGxlID0gY3VybF9t
dWx0aV9pbml0KCk7CiAgICAgbV9jdXJsU2hhcmVIYW5kbGUgPSBjdXJsX3NoYXJlX2luaXQoKTsK
LSAgICBjdXJsX3NoYXJlX3NldG9wdChtX2N1cmxTaGFyZUhhbmRsZSwgQ1VSTFNIT1BUX1NIQVJF
LCBDVVJMX0xPQ0tfREFUQV9DT09LSUUpOwogICAgIGN1cmxfc2hhcmVfc2V0b3B0KG1fY3VybFNo
YXJlSGFuZGxlLCBDVVJMU0hPUFRfU0hBUkUsIENVUkxfTE9DS19EQVRBX0ROUyk7CiAgICAgY3Vy
bF9zaGFyZV9zZXRvcHQobV9jdXJsU2hhcmVIYW5kbGUsIENVUkxTSE9QVF9MT0NLRlVOQywgY3Vy
bF9sb2NrX2NhbGxiYWNrKTsKICAgICBjdXJsX3NoYXJlX3NldG9wdChtX2N1cmxTaGFyZUhhbmRs
ZSwgQ1VSTFNIT1BUX1VOTE9DS0ZVTkMsIGN1cmxfdW5sb2NrX2NhbGxiYWNrKTsKLQotICAgIGlu
aXRDb29raWVTZXNzaW9uKCk7CiB9CiAKIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6flJlc291cmNl
SGFuZGxlTWFuYWdlcigpCiB7CiAgICAgY3VybF9tdWx0aV9jbGVhbnVwKG1fY3VybE11bHRpSGFu
ZGxlKTsKICAgICBjdXJsX3NoYXJlX2NsZWFudXAobV9jdXJsU2hhcmVIYW5kbGUpOwotICAgIGlm
IChtX2Nvb2tpZUphckZpbGVOYW1lKQotICAgICAgICBmYXN0RnJlZShtX2Nvb2tpZUphckZpbGVO
YW1lKTsKICAgICBjdXJsX2dsb2JhbF9jbGVhbnVwKCk7CiB9CgpAQCAtMzY2LDYgKzM0OSwxNCBA
QCBzdGF0aWMgc2l6ZV90IGhlYWRlckNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90IHNpemUsIHNp
emVfdCBubWVtYiwgdm9pZCogZGF0YSkKICAgICAgICAgICAgICAgICBkLT5tX3Jlc3BvbnNlLmFk
ZEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAg
ICAgICAgICBkLT5tX3Jlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChrZXksIHZhbHVlKTsKKwor
ICAgICAgICAgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGtleSwgInNldC1jb29raWUiKSkgewor
ICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGhkcjsKKyAgICAgICAgICAgICAgICBjdXJsX2Vh
c3lfZ2V0aW5mbyhkLT5tX2hhbmRsZSwgQ1VSTElORk9fRUZGRUNUSVZFX1VSTCwgJmhkcik7Cisg
ICAgICAgICAgICAgICAgQ29va2llTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5zZXRDb29raWUoS1VS
TChQYXJzZWRVUkxTdHJpbmcsIGhkciksIHZhbHVlLCBXaXRoSHR0cE9ubHlDb29raWVzKTsKKyAg
ICAgICAgICAgICAgICBDb29raWVNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLmRlYnVnKCk7CisgICAg
ICAgICAgICB9CisKICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuc3RhcnRzV2l0aCgiSFRUUCIs
IGZhbHNlKSkgewogICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgbGluZSBvZiB0aGUg
cmVzcG9uc2UuCiAgICAgICAgICAgICAvLyBFeHRyYWN0IHRoZSBodHRwIHN0YXR1cyB0ZXh0IGZy
b20gdGhpcy4KQEAgLTgxOCw5ICs4MDksNiBAQCB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6
aW5pdGlhbGl6ZUhhbmRsZShSZXNvdXJjZUhhbmRsZSogam9iKQogICAgIGQtPm1fdXJsID0gZmFz
dFN0ckR1cCh1cmwubGF0aW4xKCkuZGF0YSgpKTsKICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1f
aGFuZGxlLCBDVVJMT1BUX1VSTCwgZC0+bV91cmwpOwogCi0gICAgaWYgKG1fY29va2llSmFyRmls
ZU5hbWUpCi0gICAgICAgIGN1cmxfZWFzeV9zZXRvcHQoZC0+bV9oYW5kbGUsIENVUkxPUFRfQ09P
S0lFSkFSLCBtX2Nvb2tpZUphckZpbGVOYW1lKTsKLQogICAgIHN0cnVjdCBjdXJsX3NsaXN0KiBo
ZWFkZXJzID0gMDsKICAgICBpZiAoam9iLT5maXJzdFJlcXVlc3QoKS5odHRwSGVhZGVyRmllbGRz
KCkuc2l6ZSgpID4gMCkgewogICAgICAgICBIVFRQSGVhZGVyTWFwIGN1c3RvbUhlYWRlcnMgPSBq
b2ItPmZpcnN0UmVxdWVzdCgpLmh0dHBIZWFkZXJGaWVsZHMoKTsKQEAgLTg0MSw2ICs4MjksMTQg
QEAgdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmluaXRpYWxpemVIYW5kbGUoUmVzb3VyY2VI
YW5kbGUqIGpvYikKICAgICAgICAgfQogICAgIH0KIAorICAgIFN0cmluZyBjb29raWVzID0gQ29v
a2llTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS5jb29raWVzRm9yU2Vzc2lvbihLVVJMKFBhcnNlZFVS
TFN0cmluZywgZC0+bV91cmwpLCBXaXRoSHR0cE9ubHlDb29raWVzKTsKKworICAgIGlmICghY29v
a2llcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlcigiQ29va2llOiAiKTsKKyAg
ICAgICAgaGVhZGVyLmFwcGVuZChjb29raWVzKTsKKyAgICAgICAgaGVhZGVycyA9IGN1cmxfc2xp
c3RfYXBwZW5kKGhlYWRlcnMsIGhlYWRlci5sYXRpbjEoKS5kYXRhKCkpOworICAgIH0KKwogICAg
IFN0cmluZyBtZXRob2QgPSBqb2ItPmZpcnN0UmVxdWVzdCgpLmh0dHBNZXRob2QoKTsKICAgICBp
ZiAoIkdFVCIgPT0gbWV0aG9kKQogICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQtPm1faGFuZGxl
LCBDVVJMT1BUX0hUVFBHRVQsIFRSVUUpOwpAQCAtODcyLDI4ICs4NjgsNiBAQCB2b2lkIFJlc291
cmNlSGFuZGxlTWFuYWdlcjo6aW5pdGlhbGl6ZUhhbmRsZShSZXNvdXJjZUhhbmRsZSogam9iKQog
ICAgIH0KIH0KIAotdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmluaXRDb29raWVTZXNzaW9u
KCkKLXsKLSAgICAvLyBDdXJsIHNhdmVzIGJvdGggcGVyc2lzdGVudCBjb29raWVzLCBhbmQgc2Vz
c2lvbiBjb29raWVzIHRvIHRoZSBjb29raWUgZmlsZS4KLSAgICAvLyBUaGUgc2Vzc2lvbiBjb29r
aWVzIHNob3VsZCBiZSBkZWxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ldyBzZXNzaW9uLgotCi0g
ICAgQ1VSTCogY3VybCA9IGN1cmxfZWFzeV9pbml0KCk7Ci0KLSAgICBpZiAoIWN1cmwpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9TSEFSRSwg
bV9jdXJsU2hhcmVIYW5kbGUpOwotCi0gICAgaWYgKG1fY29va2llSmFyRmlsZU5hbWUpIHsKLSAg
ICAgICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX0NPT0tJRUZJTEUsIG1fY29va2ll
SmFyRmlsZU5hbWUpOwotICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfQ09P
S0lFSkFSLCBtX2Nvb2tpZUphckZpbGVOYW1lKTsKLSAgICB9Ci0KLSAgICBjdXJsX2Vhc3lfc2V0
b3B0KGN1cmwsIENVUkxPUFRfQ09PS0lFU0VTU0lPTiwgMSk7Ci0KLSAgICBjdXJsX2Vhc3lfY2xl
YW51cChjdXJsKTsKLX0KLQogdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmNhbmNlbChSZXNv
dXJjZUhhbmRsZSogam9iKQogewogICAgIGlmIChyZW1vdmVTY2hlZHVsZWRKb2Ioam9iKSkK
</data>

          </attachment>
      

    </bug>

</bugzilla>