<?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>28058</bug_id>
          
          <creation_ts>2009-08-06 17:13:59 -0700</creation_ts>
          <short_desc>SharedWorkers should be shared</short_desc>
          <delta_ts>2009-08-07 16:25:13 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andrew Wilson">atwilson</reporter>
          <assigned_to name="Andrew Wilson">atwilson</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>137693</commentid>
    <comment_count>0</comment_count>
    <who name="Andrew Wilson">atwilson</who>
    <bug_when>2009-08-06 17:13:59 -0700</bug_when>
    <thetext>We need to cache SharedWorkerProxy objects in a single repository, so they can be shared across pages.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137701</commentid>
    <comment_count>1</comment_count>
      <attachid>34238</attachid>
    <who name="Andrew Wilson">atwilson</who>
    <bug_when>2009-08-06 17:59:54 -0700</bug_when>
    <thetext>Created attachment 34238
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137829</commentid>
    <comment_count>2</comment_count>
      <attachid>34238</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-07 01:49:16 -0700</bug_when>
    <thetext>Comment on attachment 34238
proposed patch

Thanks this is looking good.  Just a few things to consider/address.



&gt; diff --git a/LayoutTests/fast/workers/shared-worker-shared.html-disabled b/LayoutTests/fast/workers/shared-worker-shared.html-disabled
&gt; +&lt;body&gt;
&gt; +&lt;p&gt;Test simple shared worker sharing cases.&lt;/p&gt;

It is nice to tell people what to expect here.  When this runs you should see a bunch of PASSes followed by a DONE.

&gt; +
&gt; +function testNewWorker()
&gt; +{
&gt; +    // New name, so should be a distinct worker from the previous one

Please add &quot;.&quot;.

&gt; +function testAlreadyLoaded()
&gt; +{
&gt; +    // Make sure that referencing a worker that is already loaded yields the same instance

Please add &quot;.&quot;.


&gt; +function done()
&gt; +{

Please print done here.


&gt; diff --git a/WebCore/workers/DefaultSharedWorkerRepository.cpp b/WebCore/workers/DefaultSharedWorkerRepository.cpp

&gt;  namespace WebCore {
&gt;  
&gt; -class SharedWorkerProxy : public WorkerLoaderProxy {
&gt; +class SharedWorkerProxy : public ThreadSafeShared&lt;SharedWorkerProxy&gt;, public WorkerLoaderProxy {
&gt;  public:
&gt; +    static PassRefPtr&lt;SharedWorkerProxy&gt; create(const String&amp; name, const KURL&amp; url) { return adoptRef(new SharedWorkerProxy(name.copy(), url)); }

No need to do name.copy() here. It is done in the constructor as it should be.

&gt; +    bool closing() { return m_closing; }
Make it const.

&gt; +    KURL url() { return m_url; }
Since SharedWorkerProxy can be used on different threads, I think this should return m_url.copy() (and make the method const).


&gt; +    String name() { return m_name; }
Since SharedWorkerProxy can be used on different threads, I think this should return m_name.copy() (and make the method const).

&gt; +    SharedWorkerProxy(const String&amp;, const KURL&amp;);

Nice to add param name for the const String&amp;.

&gt; +void SharedWorkerProxy::addToDocumentSet(ScriptExecutionContext* context)

I didn&apos;t know what should be in a DocumentSet.  I do know what a referring document is.

So why not make the name addReferringDocument()?

&gt; +    // FIXME: track referring documents so we can shutdown the thread when the last one exits.

Also nice to mention that this needs to remove the SharedWorkerProxy from the SharedWorkerProxyCache.

&gt; +// Loads the script on behalf of a worker.
&gt; +class SharedWorkerScriptLoader : public RefCounted&lt;SharedWorkerScriptLoader&gt;, public ActiveDOMObject, private WorkerScriptLoaderClient {

Why is the callback
   virtual void notifyFinished();
public? (Make it private if possible.)

I guess you did this before during the big code review but I&apos;m noticing it now :)


&gt; +void DefaultSharedWorkerRepository::connectToWorker(PassRefPtr&lt;SharedWorker&gt; worker, PassOwnPtr&lt;MessagePortChannel&gt; port, const KURL&amp; url, const String&amp; name, ExceptionCode&amp; ec)
&gt;  {
&gt; +    MutexLocker lock(m_lock);
&gt; +    ASSERT(worker-&gt;scriptExecutionContext()-&gt;securityOrigin()-&gt;canAccess(SecurityOrigin::create(url).get()));
&gt; +    // Fetch a proxy corresponding to this SharedWorker.
&gt; +    RefPtr&lt;SharedWorkerProxy&gt; proxy = getProxy(name, url);
&gt; +    proxy-&gt;addToDocumentSet(worker-&gt;scriptExecutionContext());

This also needs to put the proxy in the worker.

&gt; +    if (proxy-&gt;url() != url) {
&gt; +        // Proxy already existed under alternate URL - return an error.
&gt; +        ec = URL_MISMATCH_ERR;
&gt; +        return;
&gt; +    }

Up to here, it feels like generic code that should go in SharedWorkerRepository.  It would be nice to push as much as possible into common code.  Of course, doing that, means that getProxy() would be a method on SharedWorkerRepository that is implemented in here.  It would just call DefaultSharedWorkerRepository::getProxy which would do the lock.

&gt; +PassRefPtr&lt;SharedWorkerProxy&gt; DefaultSharedWorkerRepository::getProxy(const String&amp; name, const KURL&amp; url)
&gt; +{
&gt; +    // Look for an existing worker, and create one if it doesn&apos;t exist.
&gt; +    RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::create(url);

If SecurityOrigin actually stored the url, this would be broken because origin may be used on multiple threads, so it feels fragile.  At the same time it feels wasteful to do url.copy() when it isn&apos;t needed, but I favor less fragile so consider:

   RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::create(url.copy());

or you could do the copy only when doing the set below.

&gt; +    SharedWorkerNameMap* nameMap = m_cache.get(origin);
&gt; +    if (!nameMap) {
&gt; +        nameMap = new SharedWorkerNameMap();
&gt; +        m_cache.set(origin, nameMap);
&gt; +    }


&gt; diff --git a/WebCore/workers/DefaultSharedWorkerRepository.h b/WebCore/workers/DefaultSharedWorkerRepository.h
&gt;  #include &quot;SharedWorkerRepository.h&quot;
&gt;  
Why have a blank line here?

&gt; +#include &quot;StringHash.h&quot;

&gt; +        PassRefPtr&lt;SharedWorkerProxy&gt; getProxy(const String&amp;, const KURL&amp;);

Nice to have param name for the string.

&gt; +        typedef HashMap&lt;String, RefPtr&lt;SharedWorkerProxy&gt; &gt; SharedWorkerNameMap;
&gt; +        typedef HashMap&lt;RefPtr&lt;SecurityOrigin&gt;, SharedWorkerNameMap*, SecurityOriginHash&gt; SharedWorkerProxyCache;

This was pretty tricky to review because there are several objects in these HashMaps that don&apos;t like to be ref&apos;ed on multiple threads at once (StringImpl, SecurityOrigin).
However, it is safe because you create things from scratch to put in them and they are only accessed/used within a mutex.

It would be easy to mess this up by putting something in that wasn&apos;t created fresh or by passing one of these items out without copying it.

I think it would be good to be a nice warning comment about the tight restrictions that one must follow when using this structure.


&gt; +        SharedWorkerProxyCache m_cache;
&gt;      };</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>137953</commentid>
    <comment_count>3</comment_count>
    <who name="Andrew Wilson">atwilson</who>
    <bug_when>2009-08-07 10:22:29 -0700</bug_when>
    <thetext>(In reply to comment #2)

&gt; 
&gt; So why not make the name addReferringDocument()?
&gt; 

The terminology used in the spec is &quot;list of worker&apos;s documents&quot; so I&apos;ve updated this API to more precisely reflect that (document set is the old terminology that I invented and which Ian ignored :), and also added a reference to the spec.


&gt; 
&gt; &gt; +void DefaultSharedWorkerRepository::connectToWorker(PassRefPtr&lt;SharedWorker&gt; worker, PassOwnPtr&lt;MessagePortChannel&gt; port, const KURL&amp; url, const String&amp; name, ExceptionCode&amp; ec)
&gt; &gt;  {
&gt; &gt; +    MutexLocker lock(m_lock);
&gt; &gt; +    ASSERT(worker-&gt;scriptExecutionContext()-&gt;securityOrigin()-&gt;canAccess(SecurityOrigin::create(url).get()));
&gt; &gt; +    // Fetch a proxy corresponding to this SharedWorker.
&gt; &gt; +    RefPtr&lt;SharedWorkerProxy&gt; proxy = getProxy(name, url);
&gt; &gt; +    proxy-&gt;addToDocumentSet(worker-&gt;scriptExecutionContext());
&gt; 
&gt; This also needs to put the proxy in the worker.

Shouldn&apos;t be needed. The SharedWorker object is basically just a container for exposing the onerror attribute (for load errors) and the .port attribute. There&apos;s no connection between the SharedWorker object and a running shared worker thread, so we don&apos;t need to keep a reference to the proxy in the worker.

The proxy is only required for the Repository to interact with the worker.

&gt; 
&gt; &gt; +    if (proxy-&gt;url() != url) {
&gt; &gt; +        // Proxy already existed under alternate URL - return an error.
&gt; &gt; +        ec = URL_MISMATCH_ERR;
&gt; &gt; +        return;
&gt; &gt; +    }
&gt; 
&gt; Up to here, it feels like generic code that should go in
&gt; SharedWorkerRepository.  It would be nice to push as much as possible into
&gt; common code. 

I&apos;m not certain about that. For chrome, this stuff is all getting proxied off to the browser process with different params passed along to identify things like the parent context. So I&apos;d like to avoid making assumptions about common code until I&apos;ve started on the Chromium port - I&apos;ll make sure to do appropriate refactoring when I tackle that port. Basically, I don&apos;t want to do premature refactoring.

&gt; Of course, doing that, means that getProxy() would be a method on
&gt; SharedWorkerRepository that is implemented in here.  It would just call
&gt; DefaultSharedWorkerRepository::getProxy which would do the lock.
&gt; 

Can&apos;t do that, I suspect. You need to hold the lock through the entire method, as otherwise the proxy object might get evicted from the cache early if some other document exits before this one gets a chance to add itself to the worker documents.

&gt; &gt; +PassRefPtr&lt;SharedWorkerProxy&gt; DefaultSharedWorkerRepository::getProxy(const String&amp; name, const KURL&amp; url)
&gt; &gt; +{
&gt; &gt; +    // Look for an existing worker, and create one if it doesn&apos;t exist.
&gt; &gt; +    RefPtr&lt;SecurityOrigin&gt; origin = SecurityOrigin::create(url);
&gt; 
&gt; If SecurityOrigin actually stored the url, this would be broken because origin
&gt; may be used on multiple threads, so it feels fragile.  At the same time it
&gt; feels wasteful to do url.copy() when it isn&apos;t needed, but I favor less fragile
&gt; so consider:
&gt; 

Good catch. Yeah, looks like SecurityOrigin shares a bunch of references down into string fragments from the URL.



&gt; It would be easy to mess this up by putting something in that wasn&apos;t created
&gt; fresh or by passing one of these items out without copying it.
&gt; 
&gt; I think it would be good to be a nice warning comment about the tight
&gt; restrictions that one must follow when using this structure.
&gt; 

Agreed. I thought I had all the synchronization issues covered (using the proxy&apos;s copy of the name, for example), but I didn&apos;t think about the fact that we have hidden references in things like the SecurityOrigin. This is easy to screw up, so I&apos;ve added a warning in the code and in the header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138122</commentid>
    <comment_count>4</comment_count>
      <attachid>34324</attachid>
    <who name="Andrew Wilson">atwilson</who>
    <bug_when>2009-08-07 13:49:32 -0700</bug_when>
    <thetext>Created attachment 34324
Patch addressing Levin&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138182</commentid>
    <comment_count>5</comment_count>
      <attachid>34324</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-08-07 15:10:53 -0700</bug_when>
    <thetext>Comment on attachment 34324
Patch addressing Levin&apos;s comments

Thanks for all the fixes. This looks good. I don&apos;t think cache/tracking reflects what it does though...  I think tracking/tracker works better, so it would be nice to do some name changes around that on landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138210</commentid>
    <comment_count>6</comment_count>
    <who name="Andrew Wilson">atwilson</who>
    <bug_when>2009-08-07 16:25:13 -0700</bug_when>
    <thetext>Committed as r46925.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34238</attachid>
            <date>2009-08-06 17:59:54 -0700</date>
            <delta_ts>2009-08-07 13:49:32 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>x</filename>
            <type>text/plain</type>
            <size>20110</size>
            <attacher name="Andrew Wilson">atwilson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBhNTc4NGJkLi5jZTA4MGMzIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMDktMDgt
MDYgIERyZXcgV2lsc29uICA8YXR3aWxzb25AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTaGFyZWRXb3JrZXJzIHNob3VsZCBiZSBz
aGFyZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4
MDU4CisKKyAgICAgICAgQWRkZWQgY2FjaGluZyB0byB0aGUgU2hhcmVkV29ya2VyUmVwb3NpdG9y
eSBzbyBpbnN0YW5jZXMgb2YgU2hhcmVkV29ya2VycyBhcmUgc2hhcmVkIGFjcm9zcyBwYWdlcy4K
KworICAgICAgICAqIGZhc3Qvd29ya2Vycy9zaGFyZWQtd29ya2VyLXNoYXJlZC1leHBlY3RlZC50
eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zaGFyZWQtd29ya2VyLXNoYXJlZC5o
dG1sLWRpc2FibGVkOiBBZGRlZCBzaGFyaW5nIHRlc3QuCisKIDIwMDktMDgtMDYgIE1pY2hlbGFu
Z2VsbyBEZSBTaW1vbmUgIDxtaWNkZXNpbUBnbWFpbC5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc2hh
cmVkLXdvcmtlci1zaGFyZWQtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3NoYXJlZC13b3JrZXItc2hhcmVkLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4zYTQwMTVlCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3NoYXJlZC13b3JrZXItc2hhcmVkLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDgg
QEAKK1Rlc3Qgc2ltcGxlIHNoYXJlZCB3b3JrZXIgc2hhcmluZyBjYXNlcy4KKworUEFTUzogRXhj
ZXB0aW9uIHRocm93biB3aGVuIGNyZWF0aW5nIFNoYXJlZFdvcmtlciB3aXRoIGRpZmZlcmVudCBV
UkxzIGJ1dCBzYW1lIG5hbWU6IEVycm9yOiBVUkxfTUlTTUFUQ0hfRVJSOiBET00gRXhjZXB0aW9u
IDIxCitQQVNTOiBTZXR0aW5nIGdsb2JhbCB2YXJpYWJsZSBpbiBzaGFyZWQgd29ya2VyOiBzZWxm
LmZvbyA9IDEyMzQ6IDEyMzQKK1BBU1M6IEFjY2Vzc2luZyBzaW11bHRhbmVvdXNseS1sb2FkZWQg
aW5zdGFuY2Ugb2Ygc2hhcmVkIHdvcmtlcjogc2VsZi5mb286IDEyMzQKK1BBU1M6IEFjY2Vzc2lu
ZyBuZXcgaW5zdGFuY2Ugb2Ygc2hhcmVkIHdvcmtlcjogc2VsZi5mb286IHVuZGVmaW5lZAorUEFT
UzogQWNjZXNzaW5nIGFscmVhZHktbG9hZGVkIGluc3RhbmNlIG9mIHNoYXJlZCB3b3JrZXI6IHNl
bGYuZm9vOiAxMjM0CisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9zaGFy
ZWQtd29ya2VyLXNoYXJlZC5odG1sLWRpc2FibGVkIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3NoYXJlZC13b3JrZXItc2hhcmVkLmh0bWwtZGlzYWJsZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uN2UxMTc0NQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zh
c3Qvd29ya2Vycy9zaGFyZWQtd29ya2VyLXNoYXJlZC5odG1sLWRpc2FibGVkCkBAIC0wLDAgKzEs
NzEgQEAKKzxib2R5PgorPHA+VGVzdCBzaW1wbGUgc2hhcmVkIHdvcmtlciBzaGFyaW5nIGNhc2Vz
LjwvcD4KKzxkaXYgaWQ9cmVzdWx0PjwvZGl2PgorPHNjcmlwdD4KK2Z1bmN0aW9uIGxvZyhtZXNz
YWdlKQoreworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZXN1bHQiKS5pbm5lckhUTUwg
Kz0gbWVzc2FnZSArICI8YnI+IjsKK30KKworaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxl
cikgeworICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICBsYXlvdXRU
ZXN0Q29udHJvbGxlci53YWl0VW50aWxEb25lKCk7Cit9CisKKy8vIExvYWQgdHdvIHdvcmtlcnMg
c2ltdWx0YW5lb3VzbHksIHRvIGVuc3VyZSB0aGF0IHNpbXVsdGFuZW91cyBsb2FkcyBhbHNvIHlp
ZWxkIHRoZSBzYW1lIGluc3RhbmNlLgordmFyIHdvcmtlciA9IG5ldyBTaGFyZWRXb3JrZXIoJ3Jl
c291cmNlcy9zaGFyZWQtd29ya2VyLWNvbW1vbi5qcycsICduYW1lJyk7Cit2YXIgd29ya2VyMiA9
IG5ldyBTaGFyZWRXb3JrZXIoJ3Jlc291cmNlcy9zaGFyZWQtd29ya2VyLWNvbW1vbi5qcycsICdu
YW1lJyk7CisKK3RyeSB7CisgICAgbmV3IFNoYXJlZFdvcmtlcigncmVzb3VyY2VzL3NvbWUtb3Ro
ZXItdXJsLmpzJywgJ25hbWUnKTsKKyAgICBsb2coIkZBSUw6IENyZWF0aW5nIFNoYXJlZFdvcmtl
ciB3aXRoIGRpZmZlcmVudCBVUkxzIGJ1dCB0aGUgc2FtZSBuYW1lIHNob3VsZCBmYWlsIik7Cit9
IGNhdGNoIChleCkgeworICAgIGxvZygiUEFTUzogRXhjZXB0aW9uIHRocm93biB3aGVuIGNyZWF0
aW5nIFNoYXJlZFdvcmtlciB3aXRoIGRpZmZlcmVudCBVUkxzIGJ1dCBzYW1lIG5hbWU6ICIgKyBl
eCk7Cit9CisKKworLy8gU2V0IHNvbWV0aGluZyBpbiBnbG9iYWwgY29udGV4dCBpbiBvbmUgd29y
a2VyLCByZWFkIHZhbHVlIGJhY2sgb24gb3RoZXIgd29ya2VyLCB0byBtYWtlIHN1cmUgdGhleSBh
cmUgdHJ1bHkgc2hhcmVkLgord29ya2VyLnBvcnQucG9zdE1lc3NhZ2UoImV2YWwgc2VsZi5mb28g
PSAxMjM0Iik7CisKK3dvcmtlci5wb3J0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KQorewor
ICAgIGxvZygoZXZlbnQuZGF0YSA9PSAic2VsZi5mb28gPSAxMjM0OiAxMjM0IiA/ICJQQVNTOiAi
IDogIkZBSUw6ICIpICsgIlNldHRpbmcgZ2xvYmFsIHZhcmlhYmxlIGluIHNoYXJlZCB3b3JrZXI6
ICIgKyBldmVudC5kYXRhKTsKKyAgICB3b3JrZXIyLnBvcnQucG9zdE1lc3NhZ2UoImV2YWwgc2Vs
Zi5mb28iKTsKKyAgICB3b3JrZXIyLnBvcnQub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpCisg
ICAgeworICAgICAgICBsb2coKGV2ZW50LmRhdGEgPT0gInNlbGYuZm9vOiAxMjM0IiA/ICJQQVNT
OiAiIDogIkZBSUw6ICIpICsgIkFjY2Vzc2luZyBzaW11bHRhbmVvdXNseS1sb2FkZWQgaW5zdGFu
Y2Ugb2Ygc2hhcmVkIHdvcmtlcjogIiArIGV2ZW50LmRhdGEpOworICAgICAgICB0ZXN0TmV3V29y
a2VyKCk7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0TmV3V29ya2VyKCkKK3sKKyAgICAvLyBO
ZXcgbmFtZSwgc28gc2hvdWxkIGJlIGEgZGlzdGluY3Qgd29ya2VyIGZyb20gdGhlIHByZXZpb3Vz
IG9uZQorICAgIHZhciB3b3JrZXIzID0gbmV3IFNoYXJlZFdvcmtlcigncmVzb3VyY2VzL3NoYXJl
ZC13b3JrZXItY29tbW9uLmpzJywgJ25hbWUyJyk7CisgICAgd29ya2VyMy5wb3J0LnBvc3RNZXNz
YWdlKCJldmFsIHNlbGYuZm9vIik7CisgICAgd29ya2VyMy5wb3J0Lm9ubWVzc2FnZSA9IGZ1bmN0
aW9uKGV2ZW50KQorICAgIHsKKyAgICAgICAgbG9nKChldmVudC5kYXRhID09ICJzZWxmLmZvbzog
dW5kZWZpbmVkIiA/ICJQQVNTOiAiIDogIkZBSUw6ICIpICsgIkFjY2Vzc2luZyBuZXcgaW5zdGFu
Y2Ugb2Ygc2hhcmVkIHdvcmtlcjogIiArIGV2ZW50LmRhdGEpOworICAgICAgICB0ZXN0QWxyZWFk
eUxvYWRlZCgpOworICAgIH07Cit9CisKK2Z1bmN0aW9uIHRlc3RBbHJlYWR5TG9hZGVkKCkKK3sK
KyAgICAvLyBNYWtlIHN1cmUgdGhhdCByZWZlcmVuY2luZyBhIHdvcmtlciB0aGF0IGlzIGFscmVh
ZHkgbG9hZGVkIHlpZWxkcyB0aGUgc2FtZSBpbnN0YW5jZQorICAgIHZhciB3b3JrZXI0ID0gbmV3
IFNoYXJlZFdvcmtlcigncmVzb3VyY2VzL3NoYXJlZC13b3JrZXItY29tbW9uLmpzJywgJ25hbWUn
KTsKKyAgICB3b3JrZXI0LnBvcnQucG9zdE1lc3NhZ2UoImV2YWwgc2VsZi5mb28iKTsKKyAgICB3
b3JrZXI0LnBvcnQub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpCisgICAgeworICAgICAgICBs
b2coKGV2ZW50LmRhdGEgPT0gInNlbGYuZm9vOiAxMjM0IiA/ICJQQVNTOiAiIDogIkZBSUw6ICIp
ICsgIkFjY2Vzc2luZyBhbHJlYWR5LWxvYWRlZCBpbnN0YW5jZSBvZiBzaGFyZWQgd29ya2VyOiAi
ICsgZXZlbnQuZGF0YSk7CisgICAgICAgIGRvbmUoKTsKKyAgICB9OworfQorCitmdW5jdGlvbiBk
b25lKCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICBs
YXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9Cis8L3NjcmlwdD4KKzwvYm9keT4K
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ODdmM2E0OS4uMDhlOWM1YyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NCBAQAorMjAwOS0wOC0wNiAgRHJldyBXaWxzb24g
IDxhdHdpbHNvbkBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFNoYXJlZFdvcmtlcnMgc2hvdWxkIGJlIHNoYXJlZAorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNTgKKworICAgICAgICBB
ZGRlZCBjYWNoaW5nIHRvIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5LgorCisgICAgICAgICog
d29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpTaGFyZWRXb3JrZXJQcm94eTo6Y3JlYXRlKToKKyAgICAgICAgQ2hhbmdlZCBTaGFyZWRX
b3JrZXJQcm94eSB0byBkZXJpdmUgZnJvbSBUaHJlYWRTYWZlU2hhcmVkLCBhcyBpdCBuZWVkcyB0
byBvdXRsaXZlIHRoZSBjYWNoZSAoaWYgY2xvc2VkIHdoaWxlIHNvbWUgZG9jdW1lbnRzIGFyZSBz
dGlsbCBsb2FkaW5nKS4KKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFdvcmtlclByb3h5Ojp0aHJl
YWQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkV29ya2VyUHJveHk6OmNsb3NpbmcpOgorICAg
ICAgICBBZGRlZCBmbGFnIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHdvcmtlciBoYXMg
Y2xvc2VkIGl0c2VsZiB3aGlsZSBsb2FkaW5nLgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkV29y
a2VyUHJveHk6OnVybCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJQcm94eTo6bmFt
ZSk6CisgICAgICAgIFByb3h5IG5vdyB0cmFja3Mgd29ya2VyIFVSTCBhbmQgbmFtZSB0byBhbGxv
dyB2YWxpZGl0eSBjaGVja3MgcGVyIHNlY3Rpb24gNC44LjMgb2YgdGhlIFdlYldvcmtlcnMgc3Bl
Yy4KKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFdvcmtlclByb3h5OjpTaGFyZWRXb3JrZXJQcm94
eSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJQcm94eTo6YWRkVG9Eb2N1bWVudFNl
dCk6CisgICAgICAgIEFkZGVkIEFQSSB0byB0cmFjayB0aGUgZG9jdW1lbnQgc2V0IGZvciBhIHdv
cmtlciB0byBhbGxvdyB3b3JrZXIgc2h1dGRvd24uIEN1cnJlbnRseSBkb2VzIG5vdGhpbmcuCisg
ICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OlNoYXJlZFdvcmtlclNj
cmlwdExvYWRlcik6CisgICAgICAgIFJlbmFtZWQgU2hhcmVkV29ya2VyTG9hZGVyIHRvIGJlIFNo
YXJlZFdvcmtlclNjcmlwdExvYWRlciBmb3IgY2xhcml0eS4KKyAgICAgICAgKFdlYkNvcmU6OlNo
YXJlZFdvcmtlclNjcmlwdExvYWRlcjo6bG9hZCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRX
b3JrZXJTY3JpcHRMb2FkZXI6Om5vdGlmeUZpbmlzaGVkKToKKyAgICAgICAgKFdlYkNvcmU6OkRl
ZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjppbnN0YW5jZSk6CisgICAgICAgIChXZWJDb3Jl
OjpEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6d29ya2VyU2NyaXB0TG9hZGVkKToKKyAg
ICAgICAgTm93IGhhbmRsZXMgIndvcmtlciBhbHJlYWR5IGxvYWRlZCIgY2FzZS4KKyAgICAgICAg
KFdlYkNvcmU6OlNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5lY3QpOgorICAgICAgICBEZWxl
Z2F0ZXMgdG8gRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5lY3RUb1dvcmtlcgor
ICAgICAgICAoV2ViQ29yZTo6RGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5lY3RU
b1dvcmtlcik6CisgICAgICAgIEFkZGVkIGNvZGUgdG8gdHJhY2sgdGhlIFNoYXJlZFdvcmtlclBy
b3h5IGluIGEgY2FjaGUsIGFuZCB0byBoYW5kbGUgdGhlICJ3b3JrZXIgYWxyZWFkeSBsb2FkZWQi
IGNhc2UuCisgICAgICAgIChXZWJDb3JlOjpEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6
Z2V0UHJveHkpOgorICAgICAgICBBdG9taWMgZ2V0LW9yLWNyZWF0ZSBvcGVyYXRpb24gb24gdGhl
IGludGVybmFsIGNhY2hlLgorICAgICAgICAqIHdvcmtlcnMvRGVmYXVsdFNoYXJlZFdvcmtlclJl
cG9zaXRvcnkuaDoKKyAgICAgICAgKiB3b3JrZXJzL1NoYXJlZFdvcmtlci5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpTaGFyZWRXb3JrZXI6OlNoYXJlZFdvcmtlcik6CisgICAgICAgICogd29ya2Vy
cy9TaGFyZWRXb3JrZXJSZXBvc2l0b3J5Lmg6CisgICAgICAgIFJlbW92ZWQgaW5zdGFuY2UoKSBB
UEkgYW5kIG1hZGUgY29uc3RydWN0b3IgcHJpdmF0ZSB0byBwcmV2ZW50IGluc3RhbnRpYXRpb24u
CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjpTaGFyZWRXb3JrZXJS
ZXBvc2l0b3J5KToKKwogMjAwOS0wOC0wNiAgTWljaGVsYW5nZWxvIERlIFNpbW9uZSAgPG1pY2Rl
c2ltQGdtYWlsLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBBZGxlci4KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5jcHAg
Yi9XZWJDb3JlL3dvcmtlcnMvRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkuY3BwCmluZGV4
IDljMDc1MzYuLjk3MmU1OWQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hh
cmVkV29ya2VyUmVwb3NpdG9yeS5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL0RlZmF1bHRTaGFy
ZWRXb3JrZXJSZXBvc2l0b3J5LmNwcApAQCAtMzcsNiArMzcsOSBAQAogI2luY2x1ZGUgIkFjdGl2
ZURPTU9iamVjdC5oIgogI2luY2x1ZGUgIk1lc3NhZ2VQb3J0LmgiCiAjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlNlY3Vy
aXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW5IYXNoLmgiCiAjaW5jbHVkZSAi
U2hhcmVkV29ya2VyLmgiCiAjaW5jbHVkZSAiU2hhcmVkV29ya2VyQ29udGV4dC5oIgogI2luY2x1
ZGUgIlNoYXJlZFdvcmtlclRocmVhZC5oIgpAQCAtNDQsMjAgKzQ3LDQ4IEBACiAjaW5jbHVkZSAi
V29ya2VyU2NyaXB0TG9hZGVyLmgiCiAjaW5jbHVkZSAiV29ya2VyU2NyaXB0TG9hZGVyQ2xpZW50
LmgiCiAKKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotY2xhc3MgU2hhcmVkV29ya2VyUHJveHkgOiBwdWJsaWMgV29ya2VyTG9hZGVyUHJveHkgewor
Y2xhc3MgU2hhcmVkV29ya2VyUHJveHkgOiBwdWJsaWMgVGhyZWFkU2FmZVNoYXJlZDxTaGFyZWRX
b3JrZXJQcm94eT4sIHB1YmxpYyBXb3JrZXJMb2FkZXJQcm94eSB7CiBwdWJsaWM6CisgICAgc3Rh
dGljIFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+IGNyZWF0ZShjb25zdCBTdHJpbmcmIG5h
bWUsIGNvbnN0IEtVUkwmIHVybCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNoYXJlZFdvcmtlclBy
b3h5KG5hbWUuY29weSgpLCB1cmwpKTsgfQorCiAgICAgdm9pZCBzZXRUaHJlYWQoUGFzc1JlZlB0
cjxTaGFyZWRXb3JrZXJUaHJlYWQ+IHRocmVhZCkgeyBtX3RocmVhZCA9IHRocmVhZDsgfQorICAg
IFNoYXJlZFdvcmtlclRocmVhZCogdGhyZWFkKCkgeyByZXR1cm4gbV90aHJlYWQuZ2V0KCk7IH0K
KyAgICBib29sIGNsb3NpbmcoKSB7IHJldHVybiBtX2Nsb3Npbmc7IH0KKyAgICBLVVJMIHVybCgp
IHsgcmV0dXJuIG1fdXJsOyB9CisgICAgU3RyaW5nIG5hbWUoKSB7IHJldHVybiBtX25hbWU7IH0K
IAogICAgIC8vIFdvcmtlckxvYWRlclByb3h5CiAgICAgLy8gRklYTUU6IEltcGxlbWVudCBXb3Jr
ZXJMb2FkZXJQcm94eSBBUElzIGJ5IHByb3h5aW5nIHRvIGFuIGFjdGl2ZSBkb2N1bWVudC4KICAg
ICB2aXJ0dWFsIHZvaWQgcG9zdFRhc2tUb0xvYWRlcihQYXNzUmVmUHRyPFNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQ6OlRhc2s+KSB7IG5vdEltcGxlbWVudGVkKCk7IH0KICAgICB2aXJ0dWFsIHZvaWQg
cG9zdFRhc2tGb3JNb2RlVG9Xb3JrZXJDb250ZXh0KFBhc3NSZWZQdHI8U2NyaXB0RXhlY3V0aW9u
Q29udGV4dDo6VGFzaz4sIGNvbnN0IFN0cmluZyYpIHsgbm90SW1wbGVtZW50ZWQoKTsgfQorCisg
ICAgdm9pZCBhZGRUb0RvY3VtZW50U2V0KFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqKTsKIHByaXZh
dGU6CisgICAgU2hhcmVkV29ya2VyUHJveHkoY29uc3QgU3RyaW5nJiwgY29uc3QgS1VSTCYpOwor
ICAgIGJvb2wgbV9jbG9zaW5nOworICAgIFN0cmluZyBtX25hbWU7CisgICAgS1VSTCBtX3VybDsK
ICAgICBSZWZQdHI8U2hhcmVkV29ya2VyVGhyZWFkPiBtX3RocmVhZDsKIH07CiAKK1NoYXJlZFdv
cmtlclByb3h5OjpTaGFyZWRXb3JrZXJQcm94eShjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtV
UkwmIHVybCkKKyAgICA6IG1fY2xvc2luZyhmYWxzZSkKKyAgICAsIG1fbmFtZShuYW1lLmNvcHko
KSkKKyAgICAsIG1fdXJsKHVybC5jb3B5KCkpCit7Cit9CisKK3ZvaWQgU2hhcmVkV29ya2VyUHJv
eHk6OmFkZFRvRG9jdW1lbnRTZXQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCkKK3sK
KyAgICAvLyBOZXN0ZWQgd29ya2VycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQsIHNvIHBhc3NlZC1p
biBjb250ZXh0IHNob3VsZCBhbHdheXMgYmUgYSBEb2N1bWVudC4KKyAgICBBU1NFUlQoY29udGV4
dC0+aXNEb2N1bWVudCgpKTsKKyAgICAvLyBGSVhNRTogdHJhY2sgcmVmZXJyaW5nIGRvY3VtZW50
cyBzbyB3ZSBjYW4gc2h1dGRvd24gdGhlIHRocmVhZCB3aGVuIHRoZSBsYXN0IG9uZSBleGl0cy4K
K30KKwogY2xhc3MgU2hhcmVkV29ya2VyQ29ubmVjdFRhc2sgOiBwdWJsaWMgU2NyaXB0RXhlY3V0
aW9uQ29udGV4dDo6VGFzayB7CiBwdWJsaWM6CiAgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hhcmVk
V29ya2VyQ29ubmVjdFRhc2s+IGNyZWF0ZShQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbD4g
Y2hhbm5lbCkKQEAgLTg0LDkgKzExNSwxMCBAQCBwcml2YXRlOgogICAgIE93blB0cjxNZXNzYWdl
UG9ydENoYW5uZWw+IG1fY2hhbm5lbDsKIH07CiAKLWNsYXNzIFNoYXJlZFdvcmtlckxvYWRlciA6
IHB1YmxpYyBSZWZDb3VudGVkPFNoYXJlZFdvcmtlckxvYWRlcj4sIHB1YmxpYyBBY3RpdmVET01P
YmplY3QsIHByaXZhdGUgV29ya2VyU2NyaXB0TG9hZGVyQ2xpZW50IHsKKy8vIExvYWRzIHRoZSBz
Y3JpcHQgb24gYmVoYWxmIG9mIGEgd29ya2VyLgorY2xhc3MgU2hhcmVkV29ya2VyU2NyaXB0TG9h
ZGVyIDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkV29ya2VyU2NyaXB0TG9hZGVyPiwgcHVibGlj
IEFjdGl2ZURPTU9iamVjdCwgcHJpdmF0ZSBXb3JrZXJTY3JpcHRMb2FkZXJDbGllbnQgewogcHVi
bGljOgotICAgIFNoYXJlZFdvcmtlckxvYWRlcihQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4sIFBh
c3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiwgY29uc3QgU3RyaW5nJik7CisgICAgU2hhcmVk
V29ya2VyU2NyaXB0TG9hZGVyKFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyPiwgUGFzc093blB0cjxN
ZXNzYWdlUG9ydENoYW5uZWw+LCBQYXNzUmVmUHRyPFNoYXJlZFdvcmtlclByb3h5Pik7CiAgICAg
dm9pZCBsb2FkKGNvbnN0IEtVUkwmKTsKIAogICAgIC8vIFdvcmtlclNjcmlwdExvYWRlckNsaWVu
dCBjYWxsYmFjawpAQCAtOTUsMTkgKzEyNywxOSBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIFJl
ZlB0cjxTaGFyZWRXb3JrZXI+IG1fd29ya2VyOwogICAgIE93blB0cjxNZXNzYWdlUG9ydENoYW5u
ZWw+IG1fcG9ydDsKLSAgICBTdHJpbmcgbV9uYW1lOworICAgIFJlZlB0cjxTaGFyZWRXb3JrZXJQ
cm94eT4gbV9wcm94eTsKICAgICBPd25QdHI8V29ya2VyU2NyaXB0TG9hZGVyPiBtX3NjcmlwdExv
YWRlcjsKIH07CiAKLVNoYXJlZFdvcmtlckxvYWRlcjo6U2hhcmVkV29ya2VyTG9hZGVyKFBhc3NS
ZWZQdHI8U2hhcmVkV29ya2VyPiB3b3JrZXIsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVs
PiBwb3J0LCBjb25zdCBTdHJpbmcmIG5hbWUpCitTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OlNo
YXJlZFdvcmtlclNjcmlwdExvYWRlcihQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4gd29ya2VyLCBQ
YXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbD4gcG9ydCwgUGFzc1JlZlB0cjxTaGFyZWRXb3Jr
ZXJQcm94eT4gcHJveHkpCiAgICAgOiBBY3RpdmVET01PYmplY3Qod29ya2VyLT5zY3JpcHRFeGVj
dXRpb25Db250ZXh0KCksIHRoaXMpCiAgICAgLCBtX3dvcmtlcih3b3JrZXIpCiAgICAgLCBtX3Bv
cnQocG9ydCkKLSAgICAsIG1fbmFtZShuYW1lKQorICAgICwgbV9wcm94eShwcm94eSkKIHsKIH0K
IAotdm9pZCBTaGFyZWRXb3JrZXJMb2FkZXI6OmxvYWQoY29uc3QgS1VSTCYgdXJsKQordm9pZCBT
aGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OmxvYWQoY29uc3QgS1VSTCYgdXJsKQogewogICAgIC8v
IE1hcmsgdGhpcyBvYmplY3QgYXMgYWN0aXZlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQu
CiAgICAgQVNTRVJUKCFoYXNQZW5kaW5nQWN0aXZpdHkoKSk7CkBAIC0xMTgsNDQgKzE1MCw4MiBA
QCB2b2lkIFNoYXJlZFdvcmtlckxvYWRlcjo6bG9hZChjb25zdCBLVVJMJiB1cmwpCiAgICAgc2V0
UGVuZGluZ0FjdGl2aXR5KHRoaXMpOwogfQogCi12b2lkIFNoYXJlZFdvcmtlckxvYWRlcjo6bm90
aWZ5RmluaXNoZWQoKQordm9pZCBTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6Om5vdGlmeUZpbmlz
aGVkKCkKIHsKICAgICAvLyBIYW5kIG9mZiB0aGUganVzdC1sb2FkZWQgY29kZSB0byB0aGUgcmVw
b3NpdG9yeSB0byBzdGFydCB1cCB0aGUgd29ya2VyIHRocmVhZC4KICAgICBpZiAobV9zY3JpcHRM
b2FkZXItPmZhaWxlZCgpKQogICAgICAgICBtX3dvcmtlci0+ZGlzcGF0Y2hMb2FkRXJyb3JFdmVu
dCgpOwogICAgIGVsc2UKLSAgICAgICAgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6Omlu
c3RhbmNlKCktPndvcmtlclNjcmlwdExvYWRlZChtX25hbWUsIG1fc2NyaXB0TG9hZGVyLT51cmwo
KSwgc2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT51c2VyQWdlbnQobV9zY3JpcHRMb2FkZXItPnVy
bCgpKSwgbV9zY3JpcHRMb2FkZXItPnNjcmlwdCgpLCBtX3BvcnQucmVsZWFzZSgpKTsKKyAgICAg
ICAgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6Omluc3RhbmNlKCkud29ya2VyU2NyaXB0
TG9hZGVkKCptX3Byb3h5LCBzY3JpcHRFeGVjdXRpb25Db250ZXh0KCktPnVzZXJBZ2VudChtX3Nj
cmlwdExvYWRlci0+dXJsKCkpLCBtX3NjcmlwdExvYWRlci0+c2NyaXB0KCksIG1fcG9ydC5yZWxl
YXNlKCkpOwogCiAgICAgLy8gVGhpcyBmcmVlcyB0aGlzIG9iamVjdCAtIG11c3QgYmUgdGhlIGxh
c3QgYWN0aW9uIGluIHRoaXMgZnVuY3Rpb24uCiAgICAgdW5zZXRQZW5kaW5nQWN0aXZpdHkodGhp
cyk7CiB9CiAKLVNoYXJlZFdvcmtlclJlcG9zaXRvcnkqIFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6
Omluc3RhbmNlKCkKK0RlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5JiBEZWZhdWx0U2hhcmVk
V29ya2VyUmVwb3NpdG9yeTo6aW5zdGFuY2UoKQogewotICAgIHJldHVybiBEZWZhdWx0U2hhcmVk
V29ya2VyUmVwb3NpdG9yeTo6aW5zdGFuY2UoKTsKKyAgICBBdG9taWNhbGx5SW5pdGlhbGl6ZWRT
dGF0aWMoRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkqLCBpbnN0YW5jZSA9IG5ldyBEZWZh
dWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSk7CisgICAgcmV0dXJuICppbnN0YW5jZTsKIH0KIAot
RGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkqIERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0
b3J5OjppbnN0YW5jZSgpCit2b2lkIERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojp3b3Jr
ZXJTY3JpcHRMb2FkZWQoU2hhcmVkV29ya2VyUHJveHkmIHByb3h5LCBjb25zdCBTdHJpbmcmIHVz
ZXJBZ2VudCwgY29uc3QgU3RyaW5nJiB3b3JrZXJTY3JpcHQsIFBhc3NPd25QdHI8TWVzc2FnZVBv
cnRDaGFubmVsPiBwb3J0KQogewotICAgIEF0b21pY2FsbHlJbml0aWFsaXplZFN0YXRpYyhEZWZh
dWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSosIGluc3RhbmNlID0gbmV3IERlZmF1bHRTaGFyZWRX
b3JrZXJSZXBvc2l0b3J5KTsKLSAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgTXV0ZXhMb2NrZXIg
bG9jayhtX2xvY2spOworICAgIGlmIChwcm94eS5jbG9zaW5nKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIC8vIEFub3RoZXIgbG9hZGVyIG1heSBoYXZlIGFscmVhZHkgc3RhcnRlZCB1cCBhIHRo
cmVhZCBmb3IgdGhpcyBwcm94eSAtIGlmIHNvLCBqdXN0IHNlbmQgYSBjb25uZWN0IHRvIHRoZSBw
cmUtZXhpc3RpbmcgdGhyZWFkLgorICAgIGlmICghcHJveHkudGhyZWFkKCkpIHsKKyAgICAgICAg
UmVmUHRyPFNoYXJlZFdvcmtlclRocmVhZD4gdGhyZWFkID0gU2hhcmVkV29ya2VyVGhyZWFkOjpj
cmVhdGUocHJveHkubmFtZSgpLCBwcm94eS51cmwoKSwgdXNlckFnZW50LCB3b3JrZXJTY3JpcHQs
IHByb3h5KTsKKyAgICAgICAgcHJveHkuc2V0VGhyZWFkKHRocmVhZCk7CisgICAgICAgIHRocmVh
ZC0+c3RhcnQoKTsKKyAgICB9CisgICAgcHJveHkudGhyZWFkKCktPnJ1bkxvb3AoKS5wb3N0VGFz
ayhTaGFyZWRXb3JrZXJDb25uZWN0VGFzazo6Y3JlYXRlKHBvcnQpKTsKIH0KIAotdm9pZCBEZWZh
dWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6d29ya2VyU2NyaXB0TG9hZGVkKGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHVzZXJBZ2VudCwgY29uc3Qg
U3RyaW5nJiB3b3JrZXJTY3JpcHQsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiBwb3J0
KQordm9pZCBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojpjb25uZWN0KFBhc3NSZWZQdHI8U2hhcmVk
V29ya2VyPiB3b3JrZXIsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiBwb3J0LCBjb25z
dCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiB7Ci0g
ICAgLy8gRklYTUU6IENhY2hlIHRoZSBwcm94eSB0byBhbGxvdyBzaGFyaW5nIGFuZCB0byBhbGxv
dyBjbGVhbnVwIGFmdGVyIHRoZSB0aHJlYWQgZXhpdHMuCi0gICAgU2hhcmVkV29ya2VyUHJveHkq
IHByb3h5ID0gbmV3IFNoYXJlZFdvcmtlclByb3h5KCk7Ci0gICAgUmVmUHRyPFNoYXJlZFdvcmtl
clRocmVhZD4gdGhyZWFkID0gU2hhcmVkV29ya2VyVGhyZWFkOjpjcmVhdGUobmFtZSwgdXJsLCB1
c2VyQWdlbnQsIHdvcmtlclNjcmlwdCwgKnByb3h5KTsKLSAgICBwcm94eS0+c2V0VGhyZWFkKHRo
cmVhZCk7Ci0gICAgdGhyZWFkLT5zdGFydCgpOwotICAgIHRocmVhZC0+cnVuTG9vcCgpLnBvc3RU
YXNrKFNoYXJlZFdvcmtlckNvbm5lY3RUYXNrOjpjcmVhdGUocG9ydCkpOworICAgIERlZmF1bHRT
aGFyZWRXb3JrZXJSZXBvc2l0b3J5OjppbnN0YW5jZSgpLmNvbm5lY3RUb1dvcmtlcih3b3JrZXIs
IHBvcnQsIHVybCwgbmFtZSwgZWMpOwogfQogCi12b2lkIFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6
OmNvbm5lY3QoUGFzc1JlZlB0cjxTaGFyZWRXb3JrZXI+IHdvcmtlciwgUGFzc093blB0cjxNZXNz
YWdlUG9ydENoYW5uZWw+IHBvcnQsIGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBuYW1l
LCBFeGNlcHRpb25Db2RlJikKK3ZvaWQgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNv
bm5lY3RUb1dvcmtlcihQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4gd29ya2VyLCBQYXNzT3duUHRy
PE1lc3NhZ2VQb3J0Q2hhbm5lbD4gcG9ydCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcm
IG5hbWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIC8vIENyZWF0ZSBhIGxvYWRlciB0byBs
b2FkL2luaXRpYWxpemUgdGhlIHJlcXVlc3RlZCB3b3JrZXIuCi0gICAgUmVmUHRyPFNoYXJlZFdv
cmtlckxvYWRlcj4gbG9hZGVyID0gYWRvcHRSZWYobmV3IFNoYXJlZFdvcmtlckxvYWRlcih3b3Jr
ZXIsIHBvcnQsIG5hbWUpKTsKLSAgICBsb2FkZXItPmxvYWQodXJsKTsKKyAgICBNdXRleExvY2tl
ciBsb2NrKG1fbG9jayk7CisgICAgQVNTRVJUKHdvcmtlci0+c2NyaXB0RXhlY3V0aW9uQ29udGV4
dCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3MoU2VjdXJpdHlPcmlnaW46OmNyZWF0ZSh1
cmwpLmdldCgpKSk7CisgICAgLy8gRmV0Y2ggYSBwcm94eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMg
U2hhcmVkV29ya2VyLgorICAgIFJlZlB0cjxTaGFyZWRXb3JrZXJQcm94eT4gcHJveHkgPSBnZXRQ
cm94eShuYW1lLCB1cmwpOworICAgIHByb3h5LT5hZGRUb0RvY3VtZW50U2V0KHdvcmtlci0+c2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCgpKTsKKyAgICBpZiAocHJveHktPnVybCgpICE9IHVybCkgewor
ICAgICAgICAvLyBQcm94eSBhbHJlYWR5IGV4aXN0ZWQgdW5kZXIgYWx0ZXJuYXRlIFVSTCAtIHJl
dHVybiBhbiBlcnJvci4KKyAgICAgICAgZWMgPSBVUkxfTUlTTUFUQ0hfRVJSOworICAgICAgICBy
ZXR1cm47CisgICAgfQorICAgIC8vIElmIHByb3h5IGlzIGFscmVhZHkgcnVubmluZywganVzdCBj
b25uZWN0IHRvIGl0IC0gb3RoZXJ3aXNlLCBraWNrIG9mZiBhIGxvYWRlciB0byBsb2FkIHRoZSBz
Y3JpcHQuCisgICAgaWYgKHByb3h5LT50aHJlYWQoKSkKKyAgICAgICAgcHJveHktPnRocmVhZCgp
LT5ydW5Mb29wKCkucG9zdFRhc2soU2hhcmVkV29ya2VyQ29ubmVjdFRhc2s6OmNyZWF0ZShwb3J0
KSk7CisgICAgZWxzZSB7CisgICAgICAgIFJlZlB0cjxTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI+
IGxvYWRlciA9IGFkb3B0UmVmKG5ldyBTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXIod29ya2VyLCBw
b3J0LnJlbGVhc2UoKSwgcHJveHkucmVsZWFzZSgpKSk7CisgICAgICAgIGxvYWRlci0+bG9hZCh1
cmwpOworICAgIH0KK30KKworLy8gQ3JlYXRlcyBhIG5ldyBTaGFyZWRXb3JrZXJQcm94eSBvciBy
ZXR1cm5zIGFuIGV4aXN0aW5nIG9uZSBmcm9tIHRoZSByZXBvc2l0b3J5LiBNdXN0IG9ubHkgYmUg
Y2FsbGVkIHdoaWxlIHRoZSByZXBvc2l0b3J5IG11dGV4IGlzIGhlbGQuCitQYXNzUmVmUHRyPFNo
YXJlZFdvcmtlclByb3h5PiBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6Z2V0UHJveHko
Y29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBLVVJMJiB1cmwpCit7CisgICAgLy8gTG9vayBmb3Ig
YW4gZXhpc3Rpbmcgd29ya2VyLCBhbmQgY3JlYXRlIG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0Lgor
ICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2luID0gU2VjdXJpdHlPcmlnaW46OmNyZWF0
ZSh1cmwpOworICAgIFNoYXJlZFdvcmtlck5hbWVNYXAqIG5hbWVNYXAgPSBtX2NhY2hlLmdldChv
cmlnaW4pOworICAgIGlmICghbmFtZU1hcCkgeworICAgICAgICBuYW1lTWFwID0gbmV3IFNoYXJl
ZFdvcmtlck5hbWVNYXAoKTsKKyAgICAgICAgbV9jYWNoZS5zZXQob3JpZ2luLCBuYW1lTWFwKTsK
KyAgICB9CisKKyAgICBSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+IHByb3h5ID0gbmFtZU1hcC0+
Z2V0KG5hbWUpOworICAgIGlmICghcHJveHkuZ2V0KCkpIHsKKyAgICAgICAgcHJveHkgPSBTaGFy
ZWRXb3JrZXJQcm94eTo6Y3JlYXRlKG5hbWUsIHVybCk7CisgICAgICAgIG5hbWVNYXAtPnNldChw
cm94eS0+bmFtZSgpLCBwcm94eSk7CisgICAgfQorICAgIHJldHVybiBwcm94eTsKIH0KIAogRGVm
YXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OkRlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5
KCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3Np
dG9yeS5oIGIvV2ViQ29yZS93b3JrZXJzL0RlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5LmgK
aW5kZXggNzVkY2QwOS4uZjIxNzhjMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS93b3JrZXJzL0RlZmF1
bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5LmgKKysrIGIvV2ViQ29yZS93b3JrZXJzL0RlZmF1bHRT
aGFyZWRXb3JrZXJSZXBvc2l0b3J5LmgKQEAgLTM1LDI0ICszNSw0OCBAQAogCiAjaW5jbHVkZSAi
U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oIgogCisjaW5jbHVkZSAiU3RyaW5nSGFzaC5oIgorCisj
aW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNp
bmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFzcyBLVVJMOworICAgIGNsYXNzIFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQ7CisgICAgY2xhc3MgU2VjdXJpdHlPcmlnaW47CisgICAgY2xhc3MgU2hhcmVk
V29ya2VyUHJveHk7CisKKyAgICBzdHJ1Y3QgU2VjdXJpdHlPcmlnaW5IYXNoOworICAgIHN0cnVj
dCBTZWN1cml0eU9yaWdpblRyYWl0czsKIAotICAgIC8vIFBsYXRmb3JtLXNwZWNpZmljIGltcGxl
bWVudGF0aW9uIG9mIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5IHNpbmdsZXRvbi4KLSAgICBj
bGFzcyBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSA6IHB1YmxpYyBTaGFyZWRXb3JrZXJS
ZXBvc2l0b3J5LCBwdWJsaWMgTm9uY29weWFibGUgeworICAgIC8vIFBsYXRmb3JtLXNwZWNpZmlj
IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5IHN0YXRpYyBpbnRl
cmZhY2UuCisgICAgY2xhc3MgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkgOiBwdWJsaWMg
Tm9uY29weWFibGUgewogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSW52b2tlZCBvbmNlIHRoZSB3
b3JrZXIgc2NyaXB0IGhhcyBiZWVuIGxvYWRlZCB0byBmaXJlIHVwIHRoZSB3b3JrZXIgdGhyZWFk
LgorICAgICAgICB2b2lkIHdvcmtlclNjcmlwdExvYWRlZChTaGFyZWRXb3JrZXJQcm94eSYsIGNv
bnN0IFN0cmluZyYgdXNlckFnZW50LCBjb25zdCBTdHJpbmcmIHdvcmtlclNjcmlwdCwgUGFzc093
blB0cjxNZXNzYWdlUG9ydENoYW5uZWw+KTsKKworICAgICAgICAvLyBJbnRlcm5hbCBpbXBsZW1l
bnRhdGlvbiBvZiBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojpjb25uZWN0KCkKKyAgICAgICAgdm9p
ZCBjb25uZWN0VG9Xb3JrZXIoUGFzc1JlZlB0cjxTaGFyZWRXb3JrZXI+LCBQYXNzT3duUHRyPE1l
c3NhZ2VQb3J0Q2hhbm5lbD4sIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2Vw
dGlvbkNvZGUmKTsKKworICAgICAgICBzdGF0aWMgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRv
cnkmIGluc3RhbmNlKCk7CisgICAgcHJpdmF0ZToKICAgICAgICAgRGVmYXVsdFNoYXJlZFdvcmtl
clJlcG9zaXRvcnkoKTsKICAgICAgICAgfkRlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5KCk7
CiAKLSAgICAgICAgLy8gSW52b2tlZCBvbmNlIHRoZSB3b3JrZXIgc2NyaXB0IGhhcyBiZWVuIGxv
YWRlZCB0byBmaXJlIHVwIHRoZSB3b3JrZXIgdGhyZWFkLgotICAgICAgICB2b2lkIHdvcmtlclNj
cmlwdExvYWRlZChjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcm
IHVzZXJBZ2VudCwgY29uc3QgU3RyaW5nJiB3b3JrZXJTY3JpcHQsIFBhc3NPd25QdHI8TWVzc2Fn
ZVBvcnRDaGFubmVsPik7CisgICAgICAgIFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+IGdl
dFByb3h5KGNvbnN0IFN0cmluZyYsIGNvbnN0IEtVUkwmKTsKKyAgICAgICAgLy8gTXV0ZXggdXNl
ZCB0byBwcm90ZWN0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgICAgTXV0ZXggbV9s
b2NrOwogCi0gICAgICAgIHN0YXRpYyBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSogaW5z
dGFuY2UoKTsKKyAgICAgICAgdHlwZWRlZiBIYXNoTWFwPFN0cmluZywgUmVmUHRyPFNoYXJlZFdv
cmtlclByb3h5PiA+IFNoYXJlZFdvcmtlck5hbWVNYXA7CisgICAgICAgIHR5cGVkZWYgSGFzaE1h
cDxSZWZQdHI8U2VjdXJpdHlPcmlnaW4+LCBTaGFyZWRXb3JrZXJOYW1lTWFwKiwgU2VjdXJpdHlP
cmlnaW5IYXNoPiBTaGFyZWRXb3JrZXJQcm94eUNhY2hlOworCisgICAgICAgIFNoYXJlZFdvcmtl
clByb3h5Q2FjaGUgbV9jYWNoZTsKICAgICB9OwotfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CiAKICNlbmRpZiAvLyBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCiAKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvd29ya2Vycy9TaGFyZWRXb3JrZXIuY3BwIGIvV2ViQ29yZS93b3JrZXJzL1NoYXJlZFdvcmtl
ci5jcHAKaW5kZXggYTAyYTcyMi4uNzFmY2M2OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS93b3JrZXJz
L1NoYXJlZFdvcmtlci5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL1NoYXJlZFdvcmtlci5jcHAK
QEAgLTUyLDcgKzUyLDcgQEAgU2hhcmVkV29ya2VyOjpTaGFyZWRXb3JrZXIoY29uc3QgU3RyaW5n
JiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSwgU2NyaXB0RXhlY3V0aW8KICAgICBLVVJMIHNjcmlw
dFVybCA9IHJlc29sdmVVUkwodXJsLCBlYyk7CiAgICAgaWYgKGVjKQogICAgICAgICByZXR1cm47
Ci0gICAgU2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6aW5zdGFuY2UoKS0+Y29ubmVjdCh0aGlzLCBy
ZW1vdGVQb3J0LnJlbGVhc2UoKSwgc2NyaXB0VXJsLCBuYW1lLCBlYyk7CisgICAgU2hhcmVkV29y
a2VyUmVwb3NpdG9yeTo6Y29ubmVjdCh0aGlzLCByZW1vdGVQb3J0LnJlbGVhc2UoKSwgc2NyaXB0
VXJsLCBuYW1lLCBlYyk7CiB9CiAKIFNoYXJlZFdvcmtlcjo6flNoYXJlZFdvcmtlcigpCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvU2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oIGIvV2ViQ29y
ZS93b3JrZXJzL1NoYXJlZFdvcmtlclJlcG9zaXRvcnkuaAppbmRleCA5ZTExMDdhLi44NGFjZjc3
IDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvU2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oCisr
KyBiL1dlYkNvcmUvd29ya2Vycy9TaGFyZWRXb3JrZXJSZXBvc2l0b3J5LmgKQEAgLTQ4LDEzICs0
OCwxMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgLy8gSW50ZXJmYWNlIHRvIGEgcmVwb3Np
dG9yeSB3aGljaCBtYW5hZ2VzIHJlZmVyZW5jZXMgdG8gdGhlIHNldCBvZiBhY3RpdmUgc2hhcmVk
IHdvcmtlcnMuCiAgICAgY2xhc3MgU2hhcmVkV29ya2VyUmVwb3NpdG9yeSB7CiAgICAgcHVibGlj
OgotICAgICAgICAvLyBTdGF0aWMgZmFjdG9yeSBmb3IgZ2V0dGluZyB0aGUgYnJvd3Nlci1zcGVj
aWZpYyByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uLgotICAgICAgICBzdGF0aWMgU2hhcmVkV29y
a2VyUmVwb3NpdG9yeSogaW5zdGFuY2UoKTsKLQogICAgICAgICAvLyBDb25uZWN0cyB0aGUgcGFz
c2VkIFNoYXJlZFdvcmtlciBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHdvcmtlciB0aHJlYWQs
IGNyZWF0aW5nIGEgbmV3IHRocmVhZCBpZiBuZWNlc3NhcnkuCi0gICAgICAgIHZvaWQgY29ubmVj
dChQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4sIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVs
PiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOwotICAg
IHByb3RlY3RlZDoKLSAgICAgICAgflNoYXJlZFdvcmtlclJlcG9zaXRvcnkoKSB7IH0KKyAgICAg
ICAgc3RhdGljIHZvaWQgY29ubmVjdChQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4sIFBhc3NPd25Q
dHI8TWVzc2FnZVBvcnRDaGFubmVsPiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgbmFtZSwg
RXhjZXB0aW9uQ29kZSYpOworICAgIHByaXZhdGU6CisgICAgICAgIFNoYXJlZFdvcmtlclJlcG9z
aXRvcnkoKSB7IH0KICAgICB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="18400"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34324</attachid>
            <date>2009-08-07 13:49:32 -0700</date>
            <delta_ts>2009-08-07 15:10:52 -0700</delta_ts>
            <desc>Patch addressing Levin&apos;s comments</desc>
            <filename>x</filename>
            <type>text/plain</type>
            <size>20761</size>
            <attacher name="Andrew Wilson">atwilson</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCBhNTc4NGJkLi5jZTA4MGMzIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMDktMDgt
MDYgIERyZXcgV2lsc29uICA8YXR3aWxzb25AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBTaGFyZWRXb3JrZXJzIHNob3VsZCBiZSBz
aGFyZWQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI4
MDU4CisKKyAgICAgICAgQWRkZWQgY2FjaGluZyB0byB0aGUgU2hhcmVkV29ya2VyUmVwb3NpdG9y
eSBzbyBpbnN0YW5jZXMgb2YgU2hhcmVkV29ya2VycyBhcmUgc2hhcmVkIGFjcm9zcyBwYWdlcy4K
KworICAgICAgICAqIGZhc3Qvd29ya2Vycy9zaGFyZWQtd29ya2VyLXNoYXJlZC1leHBlY3RlZC50
eHQ6IEFkZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy9zaGFyZWQtd29ya2VyLXNoYXJlZC5o
dG1sLWRpc2FibGVkOiBBZGRlZCBzaGFyaW5nIHRlc3QuCisKIDIwMDktMDgtMDYgIE1pY2hlbGFu
Z2VsbyBEZSBTaW1vbmUgIDxtaWNkZXNpbUBnbWFpbC5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgRGFyaW4gQWRsZXIuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvc2hh
cmVkLXdvcmtlci1zaGFyZWQtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3NoYXJlZC13b3JrZXItc2hhcmVkLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4xNzU0ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3NoYXJlZC13b3JrZXItc2hhcmVkLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDkg
QEAKK1Rlc3Qgc2ltcGxlIHNoYXJlZCB3b3JrZXIgc2hhcmluZyBjYXNlcy4gU2hvdWxkIHByaW50
IHNldmVyYWwgUEFTUyBsaW5lcyBmb2xsb3dlZCBieSBET05FLgorCitQQVNTOiBFeGNlcHRpb24g
dGhyb3duIHdoZW4gY3JlYXRpbmcgU2hhcmVkV29ya2VyIHdpdGggZGlmZmVyZW50IFVSTHMgYnV0
IHNhbWUgbmFtZTogRXJyb3I6IFVSTF9NSVNNQVRDSF9FUlI6IERPTSBFeGNlcHRpb24gMjEKK1BB
U1M6IFNldHRpbmcgZ2xvYmFsIHZhcmlhYmxlIGluIHNoYXJlZCB3b3JrZXI6IHNlbGYuZm9vID0g
MTIzNDogMTIzNAorUEFTUzogQWNjZXNzaW5nIHNpbXVsdGFuZW91c2x5LWxvYWRlZCBpbnN0YW5j
ZSBvZiBzaGFyZWQgd29ya2VyOiBzZWxmLmZvbzogMTIzNAorUEFTUzogQWNjZXNzaW5nIG5ldyBp
bnN0YW5jZSBvZiBzaGFyZWQgd29ya2VyOiBzZWxmLmZvbzogdW5kZWZpbmVkCitQQVNTOiBBY2Nl
c3NpbmcgYWxyZWFkeS1sb2FkZWQgaW5zdGFuY2Ugb2Ygc2hhcmVkIHdvcmtlcjogc2VsZi5mb286
IDEyMzQKK0RPTkUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3NoYXJl
ZC13b3JrZXItc2hhcmVkLmh0bWwtZGlzYWJsZWQgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMv
c2hhcmVkLXdvcmtlci1zaGFyZWQuaHRtbC1kaXNhYmxlZApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4xOTZhNjJmCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3NoYXJlZC13b3JrZXItc2hhcmVkLmh0bWwtZGlzYWJsZWQKQEAgLTAsMCArMSw3
MiBAQAorPGJvZHk+Cis8cD5UZXN0IHNpbXBsZSBzaGFyZWQgd29ya2VyIHNoYXJpbmcgY2FzZXMu
IFNob3VsZCBwcmludCBzZXZlcmFsIFBBU1MgbGluZXMgZm9sbG93ZWQgYnkgRE9ORS48L3A+Cis8
ZGl2IGlkPXJlc3VsdD48L2Rpdj4KKzxzY3JpcHQ+CitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sK
KyAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVzdWx0IikuaW5uZXJIVE1MICs9IG1lc3Nh
Z2UgKyAiPGJyPiI7Cit9CisKK2lmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAg
ICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIud2FpdFVudGlsRG9uZSgpOworfQorCisvLyBMb2FkIHR3byB3b3JrZXJzIHNpbXVsdGFu
ZW91c2x5LCB0byBlbnN1cmUgdGhhdCBzaW11bHRhbmVvdXMgbG9hZHMgYWxzbyB5aWVsZCB0aGUg
c2FtZSBpbnN0YW5jZS4KK3ZhciB3b3JrZXIgPSBuZXcgU2hhcmVkV29ya2VyKCdyZXNvdXJjZXMv
c2hhcmVkLXdvcmtlci1jb21tb24uanMnLCAnbmFtZScpOwordmFyIHdvcmtlcjIgPSBuZXcgU2hh
cmVkV29ya2VyKCdyZXNvdXJjZXMvc2hhcmVkLXdvcmtlci1jb21tb24uanMnLCAnbmFtZScpOwor
Cit0cnkgeworICAgIG5ldyBTaGFyZWRXb3JrZXIoJ3Jlc291cmNlcy9zb21lLW90aGVyLXVybC5q
cycsICduYW1lJyk7CisgICAgbG9nKCJGQUlMOiBDcmVhdGluZyBTaGFyZWRXb3JrZXIgd2l0aCBk
aWZmZXJlbnQgVVJMcyBidXQgdGhlIHNhbWUgbmFtZSBzaG91bGQgZmFpbCIpOworfSBjYXRjaCAo
ZXgpIHsKKyAgICBsb2coIlBBU1M6IEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBjcmVhdGluZyBTaGFy
ZWRXb3JrZXIgd2l0aCBkaWZmZXJlbnQgVVJMcyBidXQgc2FtZSBuYW1lOiAiICsgZXgpOworfQor
CisKKy8vIFNldCBzb21ldGhpbmcgaW4gZ2xvYmFsIGNvbnRleHQgaW4gb25lIHdvcmtlciwgcmVh
ZCB2YWx1ZSBiYWNrIG9uIG90aGVyIHdvcmtlciwgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHRydWx5
IHNoYXJlZC4KK3dvcmtlci5wb3J0LnBvc3RNZXNzYWdlKCJldmFsIHNlbGYuZm9vID0gMTIzNCIp
OworCit3b3JrZXIucG9ydC5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkKK3sKKyAgICBsb2co
KGV2ZW50LmRhdGEgPT0gInNlbGYuZm9vID0gMTIzNDogMTIzNCIgPyAiUEFTUzogIiA6ICJGQUlM
OiAiKSArICJTZXR0aW5nIGdsb2JhbCB2YXJpYWJsZSBpbiBzaGFyZWQgd29ya2VyOiAiICsgZXZl
bnQuZGF0YSk7CisgICAgd29ya2VyMi5wb3J0LnBvc3RNZXNzYWdlKCJldmFsIHNlbGYuZm9vIik7
CisgICAgd29ya2VyMi5wb3J0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KQorICAgIHsKKyAg
ICAgICAgbG9nKChldmVudC5kYXRhID09ICJzZWxmLmZvbzogMTIzNCIgPyAiUEFTUzogIiA6ICJG
QUlMOiAiKSArICJBY2Nlc3Npbmcgc2ltdWx0YW5lb3VzbHktbG9hZGVkIGluc3RhbmNlIG9mIHNo
YXJlZCB3b3JrZXI6ICIgKyBldmVudC5kYXRhKTsKKyAgICAgICAgdGVzdE5ld1dvcmtlcigpOwor
ICAgIH0KK30KKworZnVuY3Rpb24gdGVzdE5ld1dvcmtlcigpCit7CisgICAgLy8gTmV3IG5hbWUs
IHNvIHNob3VsZCBiZSBhIGRpc3RpbmN0IHdvcmtlciBmcm9tIHRoZSBwcmV2aW91cyBvbmUuCisg
ICAgdmFyIHdvcmtlcjMgPSBuZXcgU2hhcmVkV29ya2VyKCdyZXNvdXJjZXMvc2hhcmVkLXdvcmtl
ci1jb21tb24uanMnLCAnbmFtZTInKTsKKyAgICB3b3JrZXIzLnBvcnQucG9zdE1lc3NhZ2UoImV2
YWwgc2VsZi5mb28iKTsKKyAgICB3b3JrZXIzLnBvcnQub25tZXNzYWdlID0gZnVuY3Rpb24oZXZl
bnQpCisgICAgeworICAgICAgICBsb2coKGV2ZW50LmRhdGEgPT0gInNlbGYuZm9vOiB1bmRlZmlu
ZWQiID8gIlBBU1M6ICIgOiAiRkFJTDogIikgKyAiQWNjZXNzaW5nIG5ldyBpbnN0YW5jZSBvZiBz
aGFyZWQgd29ya2VyOiAiICsgZXZlbnQuZGF0YSk7CisgICAgICAgIHRlc3RBbHJlYWR5TG9hZGVk
KCk7CisgICAgfTsKK30KKworZnVuY3Rpb24gdGVzdEFscmVhZHlMb2FkZWQoKQoreworICAgIC8v
IE1ha2Ugc3VyZSB0aGF0IHJlZmVyZW5jaW5nIGEgd29ya2VyIHRoYXQgaXMgYWxyZWFkeSBsb2Fk
ZWQgeWllbGRzIHRoZSBzYW1lIGluc3RhbmNlLgorICAgIHZhciB3b3JrZXI0ID0gbmV3IFNoYXJl
ZFdvcmtlcigncmVzb3VyY2VzL3NoYXJlZC13b3JrZXItY29tbW9uLmpzJywgJ25hbWUnKTsKKyAg
ICB3b3JrZXI0LnBvcnQucG9zdE1lc3NhZ2UoImV2YWwgc2VsZi5mb28iKTsKKyAgICB3b3JrZXI0
LnBvcnQub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpCisgICAgeworICAgICAgICBsb2coKGV2
ZW50LmRhdGEgPT0gInNlbGYuZm9vOiAxMjM0IiA/ICJQQVNTOiAiIDogIkZBSUw6ICIpICsgIkFj
Y2Vzc2luZyBhbHJlYWR5LWxvYWRlZCBpbnN0YW5jZSBvZiBzaGFyZWQgd29ya2VyOiAiICsgZXZl
bnQuZGF0YSk7CisgICAgICAgIGRvbmUoKTsKKyAgICB9OworfQorCitmdW5jdGlvbiBkb25lKCkK
K3sKKyAgICBsb2coIkRPTkUiKTsKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVy
KQorICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7Cit9Cis8L3Njcmlw
dD4KKzwvYm9keT4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFu
Z2VMb2cKaW5kZXggODdmM2E0OS4uMDhlOWM1YyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VM
b2cKKysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NCBAQAorMjAwOS0wOC0wNiAg
RHJldyBXaWxzb24gIDxhdHdpbHNvbkBnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFNoYXJlZFdvcmtlcnMgc2hvdWxkIGJlIHNoYXJl
ZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjgwNTgK
KworICAgICAgICBBZGRlZCBjYWNoaW5nIHRvIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Lgor
CisgICAgICAgICogd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJQcm94eTo6Y3JlYXRlKToKKyAgICAgICAgQ2hh
bmdlZCBTaGFyZWRXb3JrZXJQcm94eSB0byBkZXJpdmUgZnJvbSBUaHJlYWRTYWZlU2hhcmVkLCBh
cyBpdCBuZWVkcyB0byBvdXRsaXZlIHRoZSBjYWNoZSAoaWYgY2xvc2VkIHdoaWxlIHNvbWUgZG9j
dW1lbnRzIGFyZSBzdGlsbCBsb2FkaW5nKS4KKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFdvcmtl
clByb3h5Ojp0aHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6U2hhcmVkV29ya2VyUHJveHk6OmNs
b3NpbmcpOgorICAgICAgICBBZGRlZCBmbGFnIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhl
IHdvcmtlciBoYXMgY2xvc2VkIGl0c2VsZiB3aGlsZSBsb2FkaW5nLgorICAgICAgICAoV2ViQ29y
ZTo6U2hhcmVkV29ya2VyUHJveHk6OnVybCk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3Jr
ZXJQcm94eTo6bmFtZSk6CisgICAgICAgIFByb3h5IG5vdyB0cmFja3Mgd29ya2VyIFVSTCBhbmQg
bmFtZSB0byBhbGxvdyB2YWxpZGl0eSBjaGVja3MgcGVyIHNlY3Rpb24gNC44LjMgb2YgdGhlIFdl
YldvcmtlcnMgc3BlYy4KKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFdvcmtlclByb3h5OjpTaGFy
ZWRXb3JrZXJQcm94eSk6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJQcm94eTo6YWRk
VG9Eb2N1bWVudFNldCk6CisgICAgICAgIEFkZGVkIEFQSSB0byB0cmFjayB0aGUgZG9jdW1lbnQg
c2V0IGZvciBhIHdvcmtlciB0byBhbGxvdyB3b3JrZXIgc2h1dGRvd24uIEN1cnJlbnRseSBkb2Vz
IG5vdGhpbmcuCisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OlNo
YXJlZFdvcmtlclNjcmlwdExvYWRlcik6CisgICAgICAgIFJlbmFtZWQgU2hhcmVkV29ya2VyTG9h
ZGVyIHRvIGJlIFNoYXJlZFdvcmtlclNjcmlwdExvYWRlciBmb3IgY2xhcml0eS4KKyAgICAgICAg
KFdlYkNvcmU6OlNoYXJlZFdvcmtlclNjcmlwdExvYWRlcjo6bG9hZCk6CisgICAgICAgIChXZWJD
b3JlOjpTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6Om5vdGlmeUZpbmlzaGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OkRlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjppbnN0YW5jZSk6CisgICAg
ICAgIChXZWJDb3JlOjpEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6d29ya2VyU2NyaXB0
TG9hZGVkKToKKyAgICAgICAgTm93IGhhbmRsZXMgIndvcmtlciBhbHJlYWR5IGxvYWRlZCIgY2Fz
ZS4KKyAgICAgICAgKFdlYkNvcmU6OlNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5lY3QpOgor
ICAgICAgICBEZWxlZ2F0ZXMgdG8gRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5l
Y3RUb1dvcmtlcgorICAgICAgICAoV2ViQ29yZTo6RGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRv
cnk6OmNvbm5lY3RUb1dvcmtlcik6CisgICAgICAgIEFkZGVkIGNvZGUgdG8gdHJhY2sgdGhlIFNo
YXJlZFdvcmtlclByb3h5IGluIGEgY2FjaGUsIGFuZCB0byBoYW5kbGUgdGhlICJ3b3JrZXIgYWxy
ZWFkeSBsb2FkZWQiIGNhc2UuCisgICAgICAgIChXZWJDb3JlOjpEZWZhdWx0U2hhcmVkV29ya2Vy
UmVwb3NpdG9yeTo6Z2V0UHJveHkpOgorICAgICAgICBBdG9taWMgZ2V0LW9yLWNyZWF0ZSBvcGVy
YXRpb24gb24gdGhlIGludGVybmFsIGNhY2hlLgorICAgICAgICAqIHdvcmtlcnMvRGVmYXVsdFNo
YXJlZFdvcmtlclJlcG9zaXRvcnkuaDoKKyAgICAgICAgKiB3b3JrZXJzL1NoYXJlZFdvcmtlci5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXI6OlNoYXJlZFdvcmtlcik6CisgICAg
ICAgICogd29ya2Vycy9TaGFyZWRXb3JrZXJSZXBvc2l0b3J5Lmg6CisgICAgICAgIFJlbW92ZWQg
aW5zdGFuY2UoKSBBUEkgYW5kIG1hZGUgY29uc3RydWN0b3IgcHJpdmF0ZSB0byBwcmV2ZW50IGlu
c3RhbnRpYXRpb24uCisgICAgICAgIChXZWJDb3JlOjpTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjpT
aGFyZWRXb3JrZXJSZXBvc2l0b3J5KToKKwogMjAwOS0wOC0wNiAgTWljaGVsYW5nZWxvIERlIFNp
bW9uZSAgPG1pY2Rlc2ltQGdtYWlsLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBB
ZGxlci4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVw
b3NpdG9yeS5jcHAgYi9XZWJDb3JlL3dvcmtlcnMvRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRv
cnkuY3BwCmluZGV4IDljMDc1MzYuLjFjMWVkNGMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvd29ya2Vy
cy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJz
L0RlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5LmNwcApAQCAtMzcsNiArMzcsOSBAQAogI2lu
Y2x1ZGUgIkFjdGl2ZURPTU9iamVjdC5oIgogI2luY2x1ZGUgIk1lc3NhZ2VQb3J0LmgiCiAjaW5j
bHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2lu
Y2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW5IYXNoLmgi
CiAjaW5jbHVkZSAiU2hhcmVkV29ya2VyLmgiCiAjaW5jbHVkZSAiU2hhcmVkV29ya2VyQ29udGV4
dC5oIgogI2luY2x1ZGUgIlNoYXJlZFdvcmtlclRocmVhZC5oIgpAQCAtNDQsMjAgKzQ3LDQ5IEBA
CiAjaW5jbHVkZSAiV29ya2VyU2NyaXB0TG9hZGVyLmgiCiAjaW5jbHVkZSAiV29ya2VyU2NyaXB0
TG9hZGVyQ2xpZW50LmgiCiAKKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKIG5hbWVzcGFj
ZSBXZWJDb3JlIHsKIAotY2xhc3MgU2hhcmVkV29ya2VyUHJveHkgOiBwdWJsaWMgV29ya2VyTG9h
ZGVyUHJveHkgeworY2xhc3MgU2hhcmVkV29ya2VyUHJveHkgOiBwdWJsaWMgVGhyZWFkU2FmZVNo
YXJlZDxTaGFyZWRXb3JrZXJQcm94eT4sIHB1YmxpYyBXb3JrZXJMb2FkZXJQcm94eSB7CiBwdWJs
aWM6CisgICAgc3RhdGljIFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+IGNyZWF0ZShjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtVUkwmIHVybCkgeyByZXR1cm4gYWRvcHRSZWYobmV3IFNo
YXJlZFdvcmtlclByb3h5KG5hbWUsIHVybCkpOyB9CisKICAgICB2b2lkIHNldFRocmVhZChQYXNz
UmVmUHRyPFNoYXJlZFdvcmtlclRocmVhZD4gdGhyZWFkKSB7IG1fdGhyZWFkID0gdGhyZWFkOyB9
CisgICAgU2hhcmVkV29ya2VyVGhyZWFkKiB0aHJlYWQoKSB7IHJldHVybiBtX3RocmVhZC5nZXQo
KTsgfQorICAgIGJvb2wgY2xvc2luZygpIGNvbnN0IHsgcmV0dXJuIG1fY2xvc2luZzsgfQorICAg
IEtVUkwgdXJsKCkgY29uc3QgeyByZXR1cm4gbV91cmwuY29weSgpOyB9CisgICAgU3RyaW5nIG5h
bWUoKSBjb25zdCB7IHJldHVybiBtX25hbWUuY29weSgpOyB9CiAKICAgICAvLyBXb3JrZXJMb2Fk
ZXJQcm94eQogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgV29ya2VyTG9hZGVyUHJveHkgQVBJcyBi
eSBwcm94eWluZyB0byBhbiBhY3RpdmUgZG9jdW1lbnQuCiAgICAgdmlydHVhbCB2b2lkIHBvc3RU
YXNrVG9Mb2FkZXIoUGFzc1JlZlB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPikgeyBu
b3RJbXBsZW1lbnRlZCgpOyB9CiAgICAgdmlydHVhbCB2b2lkIHBvc3RUYXNrRm9yTW9kZVRvV29y
a2VyQ29udGV4dChQYXNzUmVmUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+LCBjb25z
dCBTdHJpbmcmKSB7IG5vdEltcGxlbWVudGVkKCk7IH0KKworICAgIC8vIFVwZGF0ZXMgdGhlIGxp
c3Qgb2YgdGhlIHdvcmtlcidzIGRvY3VtZW50cywgcGVyIHNlY3Rpb24gNC41IG9mIHRoZSBXZWJX
b3JrZXJzIHNwZWMuCisgICAgdm9pZCBhZGRUb1dvcmtlckRvY3VtZW50cyhTY3JpcHRFeGVjdXRp
b25Db250ZXh0Kik7CiBwcml2YXRlOgorICAgIFNoYXJlZFdvcmtlclByb3h5KGNvbnN0IFN0cmlu
ZyYgbmFtZSwgY29uc3QgS1VSTCYpOworICAgIGJvb2wgbV9jbG9zaW5nOworICAgIFN0cmluZyBt
X25hbWU7CisgICAgS1VSTCBtX3VybDsKICAgICBSZWZQdHI8U2hhcmVkV29ya2VyVGhyZWFkPiBt
X3RocmVhZDsKIH07CiAKK1NoYXJlZFdvcmtlclByb3h5OjpTaGFyZWRXb3JrZXJQcm94eShjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtVUkwmIHVybCkKKyAgICA6IG1fY2xvc2luZyhmYWxzZSkK
KyAgICAsIG1fbmFtZShuYW1lLmNvcHkoKSkKKyAgICAsIG1fdXJsKHVybC5jb3B5KCkpCit7Cit9
CisKK3ZvaWQgU2hhcmVkV29ya2VyUHJveHk6OmFkZFRvV29ya2VyRG9jdW1lbnRzKFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgLy8gTmVzdGVkIHdvcmtlcnMgYXJlIG5v
dCB5ZXQgc3VwcG9ydGVkLCBzbyBwYXNzZWQtaW4gY29udGV4dCBzaG91bGQgYWx3YXlzIGJlIGEg
RG9jdW1lbnQuCisgICAgQVNTRVJUKGNvbnRleHQtPmlzRG9jdW1lbnQoKSk7CisgICAgLy8gRklY
TUU6IHRyYWNrIHJlZmVycmluZyBkb2N1bWVudHMgc28gd2UgY2FuIHNodXRkb3duIHRoZSB0aHJl
YWQgd2hlbiB0aGUgbGFzdCBvbmUgZXhpdHMgYW5kIHJlbW92ZSB0aGUgcHJveHkgZnJvbSB0aGUg
Y2FjaGUuCit9CisKIGNsYXNzIFNoYXJlZFdvcmtlckNvbm5lY3RUYXNrIDogcHVibGljIFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2sgewogcHVibGljOgogICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFNoYXJlZFdvcmtlckNvbm5lY3RUYXNrPiBjcmVhdGUoUGFzc093blB0cjxNZXNzYWdlUG9ydENo
YW5uZWw+IGNoYW5uZWwpCkBAIC04NCwzMCArMTE2LDMxIEBAIHByaXZhdGU6CiAgICAgT3duUHRy
PE1lc3NhZ2VQb3J0Q2hhbm5lbD4gbV9jaGFubmVsOwogfTsKIAotY2xhc3MgU2hhcmVkV29ya2Vy
TG9hZGVyIDogcHVibGljIFJlZkNvdW50ZWQ8U2hhcmVkV29ya2VyTG9hZGVyPiwgcHVibGljIEFj
dGl2ZURPTU9iamVjdCwgcHJpdmF0ZSBXb3JrZXJTY3JpcHRMb2FkZXJDbGllbnQgeworLy8gTG9h
ZHMgdGhlIHNjcmlwdCBvbiBiZWhhbGYgb2YgYSB3b3JrZXIuCitjbGFzcyBTaGFyZWRXb3JrZXJT
Y3JpcHRMb2FkZXIgOiBwdWJsaWMgUmVmQ291bnRlZDxTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI+
LCBwdWJsaWMgQWN0aXZlRE9NT2JqZWN0LCBwcml2YXRlIFdvcmtlclNjcmlwdExvYWRlckNsaWVu
dCB7CiBwdWJsaWM6Ci0gICAgU2hhcmVkV29ya2VyTG9hZGVyKFBhc3NSZWZQdHI8U2hhcmVkV29y
a2VyPiwgUGFzc093blB0cjxNZXNzYWdlUG9ydENoYW5uZWw+LCBjb25zdCBTdHJpbmcmKTsKKyAg
ICBTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXIoUGFzc1JlZlB0cjxTaGFyZWRXb3JrZXI+LCBQYXNz
T3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbD4sIFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+
KTsKICAgICB2b2lkIGxvYWQoY29uc3QgS1VSTCYpOwogCitwcml2YXRlOgogICAgIC8vIFdvcmtl
clNjcmlwdExvYWRlckNsaWVudCBjYWxsYmFjawogICAgIHZpcnR1YWwgdm9pZCBub3RpZnlGaW5p
c2hlZCgpOwogCi1wcml2YXRlOgogICAgIFJlZlB0cjxTaGFyZWRXb3JrZXI+IG1fd29ya2VyOwog
ICAgIE93blB0cjxNZXNzYWdlUG9ydENoYW5uZWw+IG1fcG9ydDsKLSAgICBTdHJpbmcgbV9uYW1l
OworICAgIFJlZlB0cjxTaGFyZWRXb3JrZXJQcm94eT4gbV9wcm94eTsKICAgICBPd25QdHI8V29y
a2VyU2NyaXB0TG9hZGVyPiBtX3NjcmlwdExvYWRlcjsKIH07CiAKLVNoYXJlZFdvcmtlckxvYWRl
cjo6U2hhcmVkV29ya2VyTG9hZGVyKFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyPiB3b3JrZXIsIFBh
c3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiBwb3J0LCBjb25zdCBTdHJpbmcmIG5hbWUpCitT
aGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OlNoYXJlZFdvcmtlclNjcmlwdExvYWRlcihQYXNzUmVm
UHRyPFNoYXJlZFdvcmtlcj4gd29ya2VyLCBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbD4g
cG9ydCwgUGFzc1JlZlB0cjxTaGFyZWRXb3JrZXJQcm94eT4gcHJveHkpCiAgICAgOiBBY3RpdmVE
T01PYmplY3Qod29ya2VyLT5zY3JpcHRFeGVjdXRpb25Db250ZXh0KCksIHRoaXMpCiAgICAgLCBt
X3dvcmtlcih3b3JrZXIpCiAgICAgLCBtX3BvcnQocG9ydCkKLSAgICAsIG1fbmFtZShuYW1lKQor
ICAgICwgbV9wcm94eShwcm94eSkKIHsKIH0KIAotdm9pZCBTaGFyZWRXb3JrZXJMb2FkZXI6Omxv
YWQoY29uc3QgS1VSTCYgdXJsKQordm9pZCBTaGFyZWRXb3JrZXJTY3JpcHRMb2FkZXI6OmxvYWQo
Y29uc3QgS1VSTCYgdXJsKQogewogICAgIC8vIE1hcmsgdGhpcyBvYmplY3QgYXMgYWN0aXZlIGZv
ciB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCiAgICAgQVNTRVJUKCFoYXNQZW5kaW5nQWN0aXZp
dHkoKSk7CkBAIC0xMTgsNDQgKzE1MSw4MyBAQCB2b2lkIFNoYXJlZFdvcmtlckxvYWRlcjo6bG9h
ZChjb25zdCBLVVJMJiB1cmwpCiAgICAgc2V0UGVuZGluZ0FjdGl2aXR5KHRoaXMpOwogfQogCi12
b2lkIFNoYXJlZFdvcmtlckxvYWRlcjo6bm90aWZ5RmluaXNoZWQoKQordm9pZCBTaGFyZWRXb3Jr
ZXJTY3JpcHRMb2FkZXI6Om5vdGlmeUZpbmlzaGVkKCkKIHsKICAgICAvLyBIYW5kIG9mZiB0aGUg
anVzdC1sb2FkZWQgY29kZSB0byB0aGUgcmVwb3NpdG9yeSB0byBzdGFydCB1cCB0aGUgd29ya2Vy
IHRocmVhZC4KICAgICBpZiAobV9zY3JpcHRMb2FkZXItPmZhaWxlZCgpKQogICAgICAgICBtX3dv
cmtlci0+ZGlzcGF0Y2hMb2FkRXJyb3JFdmVudCgpOwogICAgIGVsc2UKLSAgICAgICAgRGVmYXVs
dFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6Omluc3RhbmNlKCktPndvcmtlclNjcmlwdExvYWRlZCht
X25hbWUsIG1fc2NyaXB0TG9hZGVyLT51cmwoKSwgc2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT51
c2VyQWdlbnQobV9zY3JpcHRMb2FkZXItPnVybCgpKSwgbV9zY3JpcHRMb2FkZXItPnNjcmlwdCgp
LCBtX3BvcnQucmVsZWFzZSgpKTsKKyAgICAgICAgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRv
cnk6Omluc3RhbmNlKCkud29ya2VyU2NyaXB0TG9hZGVkKCptX3Byb3h5LCBzY3JpcHRFeGVjdXRp
b25Db250ZXh0KCktPnVzZXJBZ2VudChtX3NjcmlwdExvYWRlci0+dXJsKCkpLCBtX3NjcmlwdExv
YWRlci0+c2NyaXB0KCksIG1fcG9ydC5yZWxlYXNlKCkpOwogCiAgICAgLy8gVGhpcyBmcmVlcyB0
aGlzIG9iamVjdCAtIG11c3QgYmUgdGhlIGxhc3QgYWN0aW9uIGluIHRoaXMgZnVuY3Rpb24uCiAg
ICAgdW5zZXRQZW5kaW5nQWN0aXZpdHkodGhpcyk7CiB9CiAKLVNoYXJlZFdvcmtlclJlcG9zaXRv
cnkqIFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6Omluc3RhbmNlKCkKK0RlZmF1bHRTaGFyZWRXb3Jr
ZXJSZXBvc2l0b3J5JiBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6aW5zdGFuY2UoKQog
ewotICAgIHJldHVybiBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6aW5zdGFuY2UoKTsK
KyAgICBBdG9taWNhbGx5SW5pdGlhbGl6ZWRTdGF0aWMoRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9z
aXRvcnkqLCBpbnN0YW5jZSA9IG5ldyBEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSk7Cisg
ICAgcmV0dXJuICppbnN0YW5jZTsKIH0KIAotRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkq
IERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjppbnN0YW5jZSgpCit2b2lkIERlZmF1bHRT
aGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojp3b3JrZXJTY3JpcHRMb2FkZWQoU2hhcmVkV29ya2VyUHJv
eHkmIHByb3h5LCBjb25zdCBTdHJpbmcmIHVzZXJBZ2VudCwgY29uc3QgU3RyaW5nJiB3b3JrZXJT
Y3JpcHQsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiBwb3J0KQogewotICAgIEF0b21p
Y2FsbHlJbml0aWFsaXplZFN0YXRpYyhEZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSosIGlu
c3RhbmNlID0gbmV3IERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5KTsKLSAgICByZXR1cm4g
aW5zdGFuY2U7CisgICAgTXV0ZXhMb2NrZXIgbG9jayhtX2xvY2spOworICAgIGlmIChwcm94eS5j
bG9zaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFub3RoZXIgbG9hZGVyIG1heSBo
YXZlIGFscmVhZHkgc3RhcnRlZCB1cCBhIHRocmVhZCBmb3IgdGhpcyBwcm94eSAtIGlmIHNvLCBq
dXN0IHNlbmQgYSBjb25uZWN0IHRvIHRoZSBwcmUtZXhpc3RpbmcgdGhyZWFkLgorICAgIGlmICgh
cHJveHkudGhyZWFkKCkpIHsKKyAgICAgICAgUmVmUHRyPFNoYXJlZFdvcmtlclRocmVhZD4gdGhy
ZWFkID0gU2hhcmVkV29ya2VyVGhyZWFkOjpjcmVhdGUocHJveHkubmFtZSgpLCBwcm94eS51cmwo
KSwgdXNlckFnZW50LCB3b3JrZXJTY3JpcHQsIHByb3h5KTsKKyAgICAgICAgcHJveHkuc2V0VGhy
ZWFkKHRocmVhZCk7CisgICAgICAgIHRocmVhZC0+c3RhcnQoKTsKKyAgICB9CisgICAgcHJveHku
dGhyZWFkKCktPnJ1bkxvb3AoKS5wb3N0VGFzayhTaGFyZWRXb3JrZXJDb25uZWN0VGFzazo6Y3Jl
YXRlKHBvcnQpKTsKK30KKwordm9pZCBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojpjb25uZWN0KFBh
c3NSZWZQdHI8U2hhcmVkV29ya2VyPiB3b3JrZXIsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFu
bmVsPiBwb3J0LCBjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9u
Q29kZSYgZWMpCit7CisgICAgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6Omluc3RhbmNl
KCkuY29ubmVjdFRvV29ya2VyKHdvcmtlciwgcG9ydCwgdXJsLCBuYW1lLCBlYyk7CiB9CiAKLXZv
aWQgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OndvcmtlclNjcmlwdExvYWRlZChjb25z
dCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB1c2VyQWdlbnQs
IGNvbnN0IFN0cmluZyYgd29ya2VyU2NyaXB0LCBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5l
bD4gcG9ydCkKK3ZvaWQgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnk6OmNvbm5lY3RUb1dv
cmtlcihQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4gd29ya2VyLCBQYXNzT3duUHRyPE1lc3NhZ2VQ
b3J0Q2hhbm5lbD4gcG9ydCwgY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIG5hbWUsIEV4
Y2VwdGlvbkNvZGUmIGVjKQogewotICAgIC8vIEZJWE1FOiBDYWNoZSB0aGUgcHJveHkgdG8gYWxs
b3cgc2hhcmluZyBhbmQgdG8gYWxsb3cgY2xlYW51cCBhZnRlciB0aGUgdGhyZWFkIGV4aXRzLgot
ICAgIFNoYXJlZFdvcmtlclByb3h5KiBwcm94eSA9IG5ldyBTaGFyZWRXb3JrZXJQcm94eSgpOwot
ICAgIFJlZlB0cjxTaGFyZWRXb3JrZXJUaHJlYWQ+IHRocmVhZCA9IFNoYXJlZFdvcmtlclRocmVh
ZDo6Y3JlYXRlKG5hbWUsIHVybCwgdXNlckFnZW50LCB3b3JrZXJTY3JpcHQsICpwcm94eSk7Ci0g
ICAgcHJveHktPnNldFRocmVhZCh0aHJlYWQpOwotICAgIHRocmVhZC0+c3RhcnQoKTsKLSAgICB0
aHJlYWQtPnJ1bkxvb3AoKS5wb3N0VGFzayhTaGFyZWRXb3JrZXJDb25uZWN0VGFzazo6Y3JlYXRl
KHBvcnQpKTsKKyAgICBNdXRleExvY2tlciBsb2NrKG1fbG9jayk7CisgICAgQVNTRVJUKHdvcmtl
ci0+c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpLT5zZWN1cml0eU9yaWdpbigpLT5jYW5BY2Nlc3Mo
U2VjdXJpdHlPcmlnaW46OmNyZWF0ZSh1cmwpLmdldCgpKSk7CisgICAgLy8gRmV0Y2ggYSBwcm94
eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgU2hhcmVkV29ya2VyLgorICAgIFJlZlB0cjxTaGFyZWRX
b3JrZXJQcm94eT4gcHJveHkgPSBnZXRQcm94eShuYW1lLCB1cmwpOworICAgIHByb3h5LT5hZGRU
b1dvcmtlckRvY3VtZW50cyh3b3JrZXItPnNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSk7CisgICAg
aWYgKHByb3h5LT51cmwoKSAhPSB1cmwpIHsKKyAgICAgICAgLy8gUHJveHkgYWxyZWFkeSBleGlz
dGVkIHVuZGVyIGFsdGVybmF0ZSBVUkwgLSByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgIGVjID0g
VVJMX01JU01BVENIX0VSUjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiBwcm94
eSBpcyBhbHJlYWR5IHJ1bm5pbmcsIGp1c3QgY29ubmVjdCB0byBpdCAtIG90aGVyd2lzZSwga2lj
ayBvZmYgYSBsb2FkZXIgdG8gbG9hZCB0aGUgc2NyaXB0LgorICAgIGlmIChwcm94eS0+dGhyZWFk
KCkpCisgICAgICAgIHByb3h5LT50aHJlYWQoKS0+cnVuTG9vcCgpLnBvc3RUYXNrKFNoYXJlZFdv
cmtlckNvbm5lY3RUYXNrOjpjcmVhdGUocG9ydCkpOworICAgIGVsc2UgeworICAgICAgICBSZWZQ
dHI8U2hhcmVkV29ya2VyU2NyaXB0TG9hZGVyPiBsb2FkZXIgPSBhZG9wdFJlZihuZXcgU2hhcmVk
V29ya2VyU2NyaXB0TG9hZGVyKHdvcmtlciwgcG9ydC5yZWxlYXNlKCksIHByb3h5LnJlbGVhc2Uo
KSkpOworICAgICAgICBsb2FkZXItPmxvYWQodXJsKTsKKyAgICB9CiB9CiAKLXZvaWQgU2hhcmVk
V29ya2VyUmVwb3NpdG9yeTo6Y29ubmVjdChQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4gd29ya2Vy
LCBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0Q2hhbm5lbD4gcG9ydCwgY29uc3QgS1VSTCYgdXJsLCBj
b25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUmKQorLy8gQ3JlYXRlcyBhIG5ldyBTaGFy
ZWRXb3JrZXJQcm94eSBvciByZXR1cm5zIGFuIGV4aXN0aW5nIG9uZSBmcm9tIHRoZSByZXBvc2l0
b3J5LiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoaWxlIHRoZSByZXBvc2l0b3J5IG11dGV4IGlzIGhl
bGQuCitQYXNzUmVmUHRyPFNoYXJlZFdvcmtlclByb3h5PiBEZWZhdWx0U2hhcmVkV29ya2VyUmVw
b3NpdG9yeTo6Z2V0UHJveHkoY29uc3QgU3RyaW5nJiBuYW1lLCBjb25zdCBLVVJMJiB1cmwpCiB7
Ci0gICAgLy8gQ3JlYXRlIGEgbG9hZGVyIHRvIGxvYWQvaW5pdGlhbGl6ZSB0aGUgcmVxdWVzdGVk
IHdvcmtlci4KLSAgICBSZWZQdHI8U2hhcmVkV29ya2VyTG9hZGVyPiBsb2FkZXIgPSBhZG9wdFJl
ZihuZXcgU2hhcmVkV29ya2VyTG9hZGVyKHdvcmtlciwgcG9ydCwgbmFtZSkpOwotICAgIGxvYWRl
ci0+bG9hZCh1cmwpOworICAgIC8vIExvb2sgZm9yIGFuIGV4aXN0aW5nIHdvcmtlciwgYW5kIGNy
ZWF0ZSBvbmUgaWYgaXQgZG9lc24ndCBleGlzdC4KKyAgICAvLyBJdGVtcyBpbiB0aGUgY2FjaGUg
YXJlIGZyZWVkIG9uIGFub3RoZXIgdGhyZWFkLCBzbyBjb3B5IHRoZSBVUkwgYmVmb3JlIGNyZWF0
aW5nIHRoZSBvcmlnaW4sIHRvIG1ha2Ugc3VyZSBubyByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHN0
cmluZ3MgbGluZ2VyLgorICAgIFJlZlB0cjxTZWN1cml0eU9yaWdpbj4gb3JpZ2luID0gU2VjdXJp
dHlPcmlnaW46OmNyZWF0ZSh1cmwuY29weSgpKTsKKyAgICBTaGFyZWRXb3JrZXJOYW1lTWFwKiBu
YW1lTWFwID0gbV9jYWNoZS5nZXQob3JpZ2luKTsKKyAgICBpZiAoIW5hbWVNYXApIHsKKyAgICAg
ICAgbmFtZU1hcCA9IG5ldyBTaGFyZWRXb3JrZXJOYW1lTWFwKCk7CisgICAgICAgIG1fY2FjaGUu
c2V0KG9yaWdpbiwgbmFtZU1hcCk7CisgICAgfQorCisgICAgUmVmUHRyPFNoYXJlZFdvcmtlclBy
b3h5PiBwcm94eSA9IG5hbWVNYXAtPmdldChuYW1lKTsKKyAgICBpZiAoIXByb3h5LmdldCgpKSB7
CisgICAgICAgIHByb3h5ID0gU2hhcmVkV29ya2VyUHJveHk6OmNyZWF0ZShuYW1lLCB1cmwpOwor
ICAgICAgICBuYW1lTWFwLT5zZXQocHJveHktPm5hbWUoKSwgcHJveHkpOworICAgIH0KKyAgICBy
ZXR1cm4gcHJveHk7CiB9CiAKIERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5OjpEZWZhdWx0
U2hhcmVkV29ya2VyUmVwb3NpdG9yeSgpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvRGVm
YXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkuaCBiL1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hh
cmVkV29ya2VyUmVwb3NpdG9yeS5oCmluZGV4IDc1ZGNkMDkuLjBiNGU2NmMgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oCisrKyBiL1dl
YkNvcmUvd29ya2Vycy9EZWZhdWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeS5oCkBAIC0zNCwyNSAr
MzQsNDggQEAKICNpZiBFTkFCTEUoU0hBUkVEX1dPUktFUlMpCiAKICNpbmNsdWRlICJTaGFyZWRX
b3JrZXJSZXBvc2l0b3J5LmgiCi0KKyNpbmNsdWRlICJTdHJpbmdIYXNoLmgiCisjaW5jbHVkZSA8
d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3
dGYvUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgogCiBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAKICAgICBjbGFzcyBLVVJMOworICAgIGNsYXNzIFNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQ7CisgICAgY2xhc3MgU2VjdXJpdHlPcmlnaW47CisgICAgY2xhc3MgU2hhcmVkV29ya2VyUHJv
eHk7CisKKyAgICBzdHJ1Y3QgU2VjdXJpdHlPcmlnaW5IYXNoOworICAgIHN0cnVjdCBTZWN1cml0
eU9yaWdpblRyYWl0czsKIAotICAgIC8vIFBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9u
IG9mIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5IHNpbmdsZXRvbi4KLSAgICBjbGFzcyBEZWZh
dWx0U2hhcmVkV29ya2VyUmVwb3NpdG9yeSA6IHB1YmxpYyBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5
LCBwdWJsaWMgTm9uY29weWFibGUgeworICAgIC8vIFBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVu
dGF0aW9uIG9mIHRoZSBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5IHN0YXRpYyBpbnRlcmZhY2UuCisg
ICAgY2xhc3MgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkgOiBwdWJsaWMgTm9uY29weWFi
bGUgewogICAgIHB1YmxpYzoKKyAgICAgICAgLy8gSW52b2tlZCBvbmNlIHRoZSB3b3JrZXIgc2Ny
aXB0IGhhcyBiZWVuIGxvYWRlZCB0byBmaXJlIHVwIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgICAg
ICB2b2lkIHdvcmtlclNjcmlwdExvYWRlZChTaGFyZWRXb3JrZXJQcm94eSYsIGNvbnN0IFN0cmlu
ZyYgdXNlckFnZW50LCBjb25zdCBTdHJpbmcmIHdvcmtlclNjcmlwdCwgUGFzc093blB0cjxNZXNz
YWdlUG9ydENoYW5uZWw+KTsKKworICAgICAgICAvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBv
ZiBTaGFyZWRXb3JrZXJSZXBvc2l0b3J5Ojpjb25uZWN0KCkKKyAgICAgICAgdm9pZCBjb25uZWN0
VG9Xb3JrZXIoUGFzc1JlZlB0cjxTaGFyZWRXb3JrZXI+LCBQYXNzT3duUHRyPE1lc3NhZ2VQb3J0
Q2hhbm5lbD4sIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIG5hbWUsIEV4Y2VwdGlvbkNvZGUm
KTsKKworICAgICAgICBzdGF0aWMgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRvcnkmIGluc3Rh
bmNlKCk7CisgICAgcHJpdmF0ZToKICAgICAgICAgRGVmYXVsdFNoYXJlZFdvcmtlclJlcG9zaXRv
cnkoKTsKICAgICAgICAgfkRlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5KCk7CiAKLSAgICAg
ICAgLy8gSW52b2tlZCBvbmNlIHRoZSB3b3JrZXIgc2NyaXB0IGhhcyBiZWVuIGxvYWRlZCB0byBm
aXJlIHVwIHRoZSB3b3JrZXIgdGhyZWFkLgotICAgICAgICB2b2lkIHdvcmtlclNjcmlwdExvYWRl
ZChjb25zdCBTdHJpbmcmIG5hbWUsIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHVzZXJBZ2Vu
dCwgY29uc3QgU3RyaW5nJiB3b3JrZXJTY3JpcHQsIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFu
bmVsPik7CisgICAgICAgIFBhc3NSZWZQdHI8U2hhcmVkV29ya2VyUHJveHk+IGdldFByb3h5KGNv
bnN0IFN0cmluZyYgbmFtZSwgY29uc3QgS1VSTCYpOworICAgICAgICAvLyBNdXRleCB1c2VkIHRv
IHByb3RlY3QgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzLgorICAgICAgICBNdXRleCBtX2xvY2s7
CiAKLSAgICAgICAgc3RhdGljIERlZmF1bHRTaGFyZWRXb3JrZXJSZXBvc2l0b3J5KiBpbnN0YW5j
ZSgpOworICAgICAgICB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBSZWZQdHI8U2hhcmVkV29ya2Vy
UHJveHk+ID4gU2hhcmVkV29ya2VyTmFtZU1hcDsKKyAgICAgICAgdHlwZWRlZiBIYXNoTWFwPFJl
ZlB0cjxTZWN1cml0eU9yaWdpbj4sIFNoYXJlZFdvcmtlck5hbWVNYXAqLCBTZWN1cml0eU9yaWdp
bkhhc2g+IFNoYXJlZFdvcmtlclByb3h5Q2FjaGU7CisKKyAgICAgICAgLy8gSXRlbXMgaW4gdGhp
cyBjYWNoZSBtYXkgYmUgZnJlZWQgb24gYW5vdGhlciB0aHJlYWQsIHNvIGFsbCBrZXlzIGFuZCB2
YWx1ZXMgbXVzdCBiZSBlaXRoZXIgY29waWVkIGJlZm9yZSBpbnNlcnRpb24gb3IgdGhyZWFkIHNh
ZmUuCisgICAgICAgIFNoYXJlZFdvcmtlclByb3h5Q2FjaGUgbV9jYWNoZTsKICAgICB9OwotfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAvLyBFTkFCTEUoU0hBUkVEX1dPUktF
UlMpCiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vycy9TaGFyZWRXb3JrZXIuY3BwIGIvV2Vi
Q29yZS93b3JrZXJzL1NoYXJlZFdvcmtlci5jcHAKaW5kZXggYTAyYTcyMi4uNzFmY2M2OCAxMDA2
NDQKLS0tIGEvV2ViQ29yZS93b3JrZXJzL1NoYXJlZFdvcmtlci5jcHAKKysrIGIvV2ViQ29yZS93
b3JrZXJzL1NoYXJlZFdvcmtlci5jcHAKQEAgLTUyLDcgKzUyLDcgQEAgU2hhcmVkV29ya2VyOjpT
aGFyZWRXb3JrZXIoY29uc3QgU3RyaW5nJiB1cmwsIGNvbnN0IFN0cmluZyYgbmFtZSwgU2NyaXB0
RXhlY3V0aW8KICAgICBLVVJMIHNjcmlwdFVybCA9IHJlc29sdmVVUkwodXJsLCBlYyk7CiAgICAg
aWYgKGVjKQogICAgICAgICByZXR1cm47Ci0gICAgU2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6aW5z
dGFuY2UoKS0+Y29ubmVjdCh0aGlzLCByZW1vdGVQb3J0LnJlbGVhc2UoKSwgc2NyaXB0VXJsLCBu
YW1lLCBlYyk7CisgICAgU2hhcmVkV29ya2VyUmVwb3NpdG9yeTo6Y29ubmVjdCh0aGlzLCByZW1v
dGVQb3J0LnJlbGVhc2UoKSwgc2NyaXB0VXJsLCBuYW1lLCBlYyk7CiB9CiAKIFNoYXJlZFdvcmtl
cjo6flNoYXJlZFdvcmtlcigpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvU2hhcmVkV29y
a2VyUmVwb3NpdG9yeS5oIGIvV2ViQ29yZS93b3JrZXJzL1NoYXJlZFdvcmtlclJlcG9zaXRvcnku
aAppbmRleCA5ZTExMDdhLi44NGFjZjc3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvU2hh
cmVkV29ya2VyUmVwb3NpdG9yeS5oCisrKyBiL1dlYkNvcmUvd29ya2Vycy9TaGFyZWRXb3JrZXJS
ZXBvc2l0b3J5LmgKQEAgLTQ4LDEzICs0OCwxMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAg
Ly8gSW50ZXJmYWNlIHRvIGEgcmVwb3NpdG9yeSB3aGljaCBtYW5hZ2VzIHJlZmVyZW5jZXMgdG8g
dGhlIHNldCBvZiBhY3RpdmUgc2hhcmVkIHdvcmtlcnMuCiAgICAgY2xhc3MgU2hhcmVkV29ya2Vy
UmVwb3NpdG9yeSB7CiAgICAgcHVibGljOgotICAgICAgICAvLyBTdGF0aWMgZmFjdG9yeSBmb3Ig
Z2V0dGluZyB0aGUgYnJvd3Nlci1zcGVjaWZpYyByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uLgot
ICAgICAgICBzdGF0aWMgU2hhcmVkV29ya2VyUmVwb3NpdG9yeSogaW5zdGFuY2UoKTsKLQogICAg
ICAgICAvLyBDb25uZWN0cyB0aGUgcGFzc2VkIFNoYXJlZFdvcmtlciBvYmplY3Qgd2l0aCB0aGUg
c3BlY2lmaWVkIHdvcmtlciB0aHJlYWQsIGNyZWF0aW5nIGEgbmV3IHRocmVhZCBpZiBuZWNlc3Nh
cnkuCi0gICAgICAgIHZvaWQgY29ubmVjdChQYXNzUmVmUHRyPFNoYXJlZFdvcmtlcj4sIFBhc3NP
d25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgbmFt
ZSwgRXhjZXB0aW9uQ29kZSYpOwotICAgIHByb3RlY3RlZDoKLSAgICAgICAgflNoYXJlZFdvcmtl
clJlcG9zaXRvcnkoKSB7IH0KKyAgICAgICAgc3RhdGljIHZvaWQgY29ubmVjdChQYXNzUmVmUHRy
PFNoYXJlZFdvcmtlcj4sIFBhc3NPd25QdHI8TWVzc2FnZVBvcnRDaGFubmVsPiwgY29uc3QgS1VS
TCYsIGNvbnN0IFN0cmluZyYgbmFtZSwgRXhjZXB0aW9uQ29kZSYpOworICAgIHByaXZhdGU6Cisg
ICAgICAgIFNoYXJlZFdvcmtlclJlcG9zaXRvcnkoKSB7IH0KICAgICB9OwogCiB9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="18498"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="18512"
          type_id="3"
          status="-"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>