<?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>46543</bug_id>
          
          <creation_ts>2010-09-24 17:40:45 -0700</creation_ts>
          <short_desc>Fix passing blob data with string data item between threads</short_desc>
          <delta_ts>2010-10-12 17:42:07 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jian Li">jianli</reporter>
          <assigned_to name="Jian Li">jianli</assigned_to>
          <cc>abarth</cc>
    
    <cc>dglazkov</cc>
    
    <cc>dimich</cc>
    
    <cc>eric</cc>
    
    <cc>levin</cc>
    
    <cc>michaeln</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>284874</commentid>
    <comment_count>0</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-09-24 17:40:45 -0700</bug_when>
    <thetext>We need to fix string data passing problem in order to cross thread safely.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284879</commentid>
    <comment_count>1</comment_count>
      <attachid>68794</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-09-24 17:57:07 -0700</bug_when>
    <thetext>Created attachment 68794
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>284884</commentid>
    <comment_count>2</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-09-24 18:08:41 -0700</bug_when>
    <thetext>I&apos;ll look at this. Jian and I already discussed one issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>285289</commentid>
    <comment_count>3</comment_count>
      <attachid>68794</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-09-26 21:33:59 -0700</bug_when>
    <thetext>Comment on attachment 68794
Proposed Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=68794&amp;action=review

&gt; WebCore/fileapi/BlobBuilder.cpp:52
&gt; +    DEFINE_STATIC_LOCAL(AtomicString, transparent, (&quot;transparent&quot;));
&gt; +    DEFINE_STATIC_LOCAL(AtomicString, native, (&quot;native&quot;));

Why AtomicString?  You&apos;re comparing against a non-Atomic string.

&gt; WebCore/fileapi/BlobBuilder.cpp:59
&gt; +    CString ctext = UTF8Encoding().encode(text.characters(), text.length(), EntitiesForUnencodables);

ctext?  Can we use a more descriptive variable name?

&gt; WebCore/fileapi/BlobBuilder.cpp:73
&gt; +            buffer.grow(buffer.size() + ctext.length());
&gt; +            memcpy(buffer.data() + oldSize, ctext.data(), ctext.length());

Why not just use buffer.append() ?

&gt; WebCore/platform/network/BlobData.cpp:46
&gt; +    : m_data(data.leakPtr())

leakPtr ? So sad.

&gt; WebCore/platform/network/BlobData.h:62
&gt; +        Vector&lt;char&gt;* m_data;

Why can&apos;t this be an OwnPtr?

&gt; WebCore/platform/text/LineEnding.cpp:73
&gt; +#if OS(WINDOWS)

Why is this windows-specific?

&gt; WebCore/platform/text/LineEnding.cpp:93
&gt; +        unsigned oldSize = m_buffer.size();
&gt; +        m_buffer.grow(oldSize + src.length());
&gt; +        memcpy(m_buffer.data() + oldSize, src.data(), src.length());

again, why not just m_buffer.append() ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>287277</commentid>
    <comment_count>4</comment_count>
      <attachid>68794</attachid>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-09-29 18:05:24 -0700</bug_when>
    <thetext>Comment on attachment 68794
Proposed Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=68794&amp;action=review

&gt; WebCore/fileapi/BlobBuilder.cpp:66
&gt; +        Vector&lt;char&gt;&amp; buffer = *m_items[m_items.size() - 1].data.mutableData();

Is this the only use case for mutableData? Maybe instead of mutating an existing &apos;DataItem&apos;, just dump new data into a plain old Vector&lt;char&gt; that&apos;s owned by the builder and defer adding a DataItem to the list until you have a fully formed thing... buffer stuff up in a Vector, then flush it out as a DataItem.

&gt; WebCore/platform/network/BlobData.h:63
&gt; +        RefPtr&lt;SharedRawData&gt; m_sharedData;

Why have the m_data ptr at all, you can access the vector thru m_sharedData as needed, maybe a helper to return a const Vector&lt;char&gt;*</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>289983</commentid>
    <comment_count>5</comment_count>
      <attachid>68794</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-05 17:05:02 -0700</bug_when>
    <thetext>Comment on attachment 68794
Proposed Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=68794&amp;action=review

There are enough things in here to be addressed at the moment that I&apos;m r-&apos;ing.  I think once they are fixed some items will be a little clearer and there may be a few more comments.

&gt; WebCore/platform/network/BlobData.h:36
&gt; +#include &lt;wtf/CrossThreadRefCounted.h&gt;

I&apos;d strongly discourage using CrossThreadRefCounted. It has a very special use case when the ref counting must live outside of the class (and probably a few other things that I don&apos;t remember right off).

Instead create a class that derives from ThreadSafeShared.  I suspect this change will make this code much easier to read and may clear up some issues that others were concerned about.

&gt; WebCore/platform/network/BlobData.h:54
&gt; +        void makeCrossThread();

makeCrossThread is a terrible name that I think I started.  I like the suggestion of detachFromCurrentThread (or something like that).

&gt; WebCore/platform/text/LineEnding.cpp:89
&gt; +    virtual void copy(const CString&amp; src)

avoid abbreviations &quot;src&quot;

&gt; WebKit/chromium/public/WebBlobData.h:31
&gt;  #ifndef WebBlobData_h

If you break out this part of the change in to a separate patch, it would be better as Darin could review just that patch and likely do it quickly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291353</commentid>
    <comment_count>6</comment_count>
      <attachid>70179</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-10-07 17:42:34 -0700</bug_when>
    <thetext>Created attachment 70179
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291360</commentid>
    <comment_count>7</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-10-07 17:51:05 -0700</bug_when>
    <thetext>All others are fixed.

(In reply to comment #3) 
&gt; &gt; WebCore/platform/text/LineEnding.cpp:73
&gt; &gt; +#if OS(WINDOWS)
&gt; 
&gt; Why is this windows-specific?
&gt; 

This is because if the ending type is specified as &quot;native&quot;, we need to do the line ending normalization per the platform-specific logic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291361</commentid>
    <comment_count>8</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-10-07 17:53:21 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 68794 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=68794&amp;action=review
&gt; 
&gt; &gt; WebCore/fileapi/BlobBuilder.cpp:66
&gt; &gt; +        Vector&lt;char&gt;&amp; buffer = *m_items[m_items.size() - 1].data.mutableData();
&gt; 
&gt; Is this the only use case for mutableData? Maybe instead of mutating an existing &apos;DataItem&apos;, just dump new data into a plain old Vector&lt;char&gt; that&apos;s owned by the builder and defer adding a DataItem to the list until you have a fully formed thing... buffer stuff up in a Vector, then flush it out as a DataItem.

Since now I put a Vector&lt;char&gt; directly in RawData, it will add up some more complexity to change as suggest, though it does simply the logic in BlobBuilder, but it would add up the complexity in BlobData. I rather keep it as is now.

&gt; 
&gt; &gt; WebCore/platform/network/BlobData.h:63
&gt; &gt; +        RefPtr&lt;SharedRawData&gt; m_sharedData;
&gt; 
&gt; Why have the m_data ptr at all, you can access the vector thru m_sharedData as needed, maybe a helper to return a const Vector&lt;char&gt;*

Removed due to the new structure change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291362</commentid>
    <comment_count>9</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-10-07 17:54:07 -0700</bug_when>
    <thetext>All fixed. WebBlobData is stripped out and it will be included in another patch for review.

(In reply to comment #5)
&gt; (From update of attachment 68794 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=68794&amp;action=review
&gt; 
&gt; There are enough things in here to be addressed at the moment that I&apos;m r-&apos;ing.  I think once they are fixed some items will be a little clearer and there may be a few more comments.
&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291475</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-07 23:56:07 -0700</bug_when>
    <thetext>Attachment 70179 did not build on chromium:
Build output: http://queues.webkit.org/results/4259033</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>291485</commentid>
    <comment_count>11</comment_count>
      <attachid>70179</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-08 00:34:50 -0700</bug_when>
    <thetext>Comment on attachment 70179
Proposed Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=70179&amp;action=review

&gt; WebCore/fileapi/BlobBuilder.cpp:53
&gt; +    if (!endingType.isEmpty() &amp;&amp; !isEndingTypeTransparent &amp;&amp; !isEndingTypeNative) {

This looks like an interesting error. Is there a test case for it? Could there be one?

&gt; WebCore/platform/text/LineEnding.cpp:73
&gt; +#if OS(WINDOWS)

I wouldn&apos;t ifdef this because it make it confusing to try to guess why it is ifdef&apos;ed out.

&gt; WebCore/platform/text/LineEnding.cpp:128
&gt; +    char* q = buffer.allocate(newLen);

It would be nice to have a more descriptive variable name than &quot;q&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293161</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-12 16:09:36 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/69610 might have broken Chromium Win Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>293220</commentid>
    <comment_count>13</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2010-10-12 17:42:07 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/69610.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>68794</attachid>
            <date>2010-09-24 17:57:07 -0700</date>
            <delta_ts>2010-10-07 17:42:34 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>46543</filename>
            <type>text/plain</type>
            <size>25785</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZTQwZDE2Ny4uMDFkMGVhOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1NCBAQAorMjAxMC0wOS0yNCAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgRml4IHBhc3NpbmcgYmxvYiBkYXRhIHdpdGggc3RyaW5nIGRhdGEgaXRlbSBi
ZXR3ZWVuIHRocmVhZHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00NjU0MworCisgICAgICAgIFRoZSBmaXggaXMgdG8gdXNlIGEgdGhyZWFkLXNhZmUg
cmVmLWNvdW50ZWQgVmVjdG9yPGNoYXI+IHRvIHN0b3JlIHRoZQorICAgICAgICBzdHJpbmcgZGF0
YS4gVGhpcyBhbHNvIG1ha2VzIHVzIGJlIGFibGUgdG8gc3RvcmUgYW55IGJpbmFyeSBkYXRhIGlu
IGl0LgorCisgICAgICAgIEkndmUgYWxzbyBmaXggQmxvYkJ1aWxkZXIgYW5kIEJsb2JSZWdpc3Ry
eUltcGwgdG8gYXZvaWQgc29tZSBhZGRpdGlvbmFsCisgICAgICAgIGNvcGllcyB0byBtYWtlIGJs
b2IgaGFuZGxpbmcgZmFzdGVyLgorCisgICAgICAgICogZmlsZWFwaS9CbG9iQnVpbGRlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpCbG9iQnVpbGRlcjo6YXBwZW5kKToKKyAgICAgICAgKiBmaWxl
YXBpL1RocmVhZGFibGVCbG9iUmVnaXN0cnkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QmxvYlJl
Z2lzdHJ5Q29udGV4dDo6QmxvYlJlZ2lzdHJ5Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0v
bmV0d29yay9CbG9iRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0ZW06OlJh
d0RhdGE6OlJhd0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjpSYXdEYXRh
OjptYWtlQ3Jvc3NUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjptYWtl
Q3Jvc3NUaHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGE6OmNyZWF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0ZW06OkJsb2JEYXRhSXRlbSk6CisgICAgICAgIChXZWJD
b3JlOjpCbG9iRGF0YTo6bWFrZUNyb3NzVGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkJsb2JE
YXRhOjphcHBlbmREYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9uZXR3b3JrL0Jsb2JEYXRhLmg6
CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0ZW06OlJhd0RhdGE6OlJhd0RhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjpSYXdEYXRhOjpkYXRhKToKKyAgICAgICAgKFdl
YkNvcmU6OkJsb2JEYXRhSXRlbTo6UmF3RGF0YTo6bGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6
OkJsb2JEYXRhSXRlbTo6UmF3RGF0YTo6bXV0YWJsZURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6
QmxvYkRhdGFJdGVtOjpCbG9iRGF0YUl0ZW0pOgorICAgICAgICAqIHBsYXRmb3JtL25ldHdvcmsv
QmxvYlJlZ2lzdHJ5SW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpCbG9iUmVnaXN0cnlJbXBs
OjpyZWdpc3RlckJsb2JVUkwpOgorICAgICAgICAqIHBsYXRmb3JtL3RleHQvTGluZUVuZGluZy5j
cHA6CisgICAgICAgIChPdXRwdXRCdWZmZXI6OkNTdHJpbmdCdWZmZXI6OkNTdHJpbmdCdWZmZXIp
OgorICAgICAgICAoT3V0cHV0QnVmZmVyOjpDU3RyaW5nQnVmZmVyOjp+Q1N0cmluZ0J1ZmZlcik6
CisgICAgICAgIChPdXRwdXRCdWZmZXI6OkNTdHJpbmdCdWZmZXI6OmFsbG9jYXRlKToKKyAgICAg
ICAgKE91dHB1dEJ1ZmZlcjo6Q1N0cmluZ0J1ZmZlcjo6Y29weSk6CisgICAgICAgIChPdXRwdXRC
dWZmZXI6OkNTdHJpbmdCdWZmZXI6OmJ1ZmZlcik6CisgICAgICAgIChPdXRwdXRCdWZmZXI6OlZl
Y3RvckNoYXJBcHBlbmRCdWZmZXI6OlZlY3RvckNoYXJBcHBlbmRCdWZmZXIpOgorICAgICAgICAo
T3V0cHV0QnVmZmVyOjpWZWN0b3JDaGFyQXBwZW5kQnVmZmVyOjp+VmVjdG9yQ2hhckFwcGVuZEJ1
ZmZlcik6CisgICAgICAgIChPdXRwdXRCdWZmZXI6OlZlY3RvckNoYXJBcHBlbmRCdWZmZXI6OmFs
bG9jYXRlKToKKyAgICAgICAgKE91dHB1dEJ1ZmZlcjo6VmVjdG9yQ2hhckFwcGVuZEJ1ZmZlcjo6
Y29weSk6CisgICAgICAgIChPdXRwdXRCdWZmZXI6OmludGVybmFsTm9ybWFsaXplTGluZUVuZGlu
Z3NUb0NSTEYpOgorICAgICAgICAoV2ViQ29yZTo6bm9ybWFsaXplVG9DUk9yTEYpOgorICAgICAg
ICAoV2ViQ29yZTo6bm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYpOgorICAgICAgICAoV2ViQ29y
ZTo6bm9ybWFsaXplTGluZUVuZGluZ3NUb0NSKToKKyAgICAgICAgKFdlYkNvcmU6Om5vcm1hbGl6
ZUxpbmVFbmRpbmdzVG9MRik6CisgICAgICAgIChXZWJDb3JlOjpub3JtYWxpemVMaW5lRW5kaW5n
c1RvTmF0aXZlKToKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuaDoKKwogMjAx
MC0wOS0yNCAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3
ZWQgYnkgU2FtIFdlaW5pZy4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvZmlsZWFwaS9CbG9iQnVpbGRl
ci5jcHAgYi9XZWJDb3JlL2ZpbGVhcGkvQmxvYkJ1aWxkZXIuY3BwCmluZGV4IDM0ODY0YTUuLmM4
NTEyMzAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZmlsZWFwaS9CbG9iQnVpbGRlci5jcHAKKysrIGIv
V2ViQ29yZS9maWxlYXBpL0Jsb2JCdWlsZGVyLmNwcApAQCAtNDEsMzYgKzQxLDYgQEAKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgQ1N0cmluZyBjb252ZXJ0VG9DU3RyaW5nKGNvbnN0
IFN0cmluZyYgdGV4dCwgY29uc3QgU3RyaW5nJiBlbmRpbmdUeXBlLCBFeGNlcHRpb25Db2RlJiBl
YykKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgdHJhbnNwYXJlbnQs
ICgidHJhbnNwYXJlbnQiKSk7Ci0gICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcs
IG5hdGl2ZSwgKCJuYXRpdmUiKSk7Ci0KLSAgICBlYyA9IDA7Ci0KLSAgICBpZiAoZW5kaW5nVHlw
ZS5pc0VtcHR5KCkgfHwgZW5kaW5nVHlwZSA9PSB0cmFuc3BhcmVudCkKLSAgICAgICAgcmV0dXJu
IFVURjhFbmNvZGluZygpLmVuY29kZSh0ZXh0LmNoYXJhY3RlcnMoKSwgdGV4dC5sZW5ndGgoKSwg
RW50aXRpZXNGb3JVbmVuY29kYWJsZXMpOwotICAgIGlmIChlbmRpbmdUeXBlID09IG5hdGl2ZSkK
LSAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9OYXRpdmUoVVRGOEVuY29kaW5n
KCkuZW5jb2RlKHRleHQuY2hhcmFjdGVycygpLCB0ZXh0Lmxlbmd0aCgpLCBFbnRpdGllc0ZvclVu
ZW5jb2RhYmxlcykpOwotCi0gICAgZWMgPSBTWU5UQVhfRVJSOwotICAgIHJldHVybiBDU3RyaW5n
KCk7Ci19Ci0KLXN0YXRpYyBDU3RyaW5nIGNvbmNhdGVuYXRlVHdvQ1N0cmluZ3MoY29uc3QgQ1N0
cmluZyYgYSwgY29uc3QgQ1N0cmluZyYgYikKLXsKLSAgICBpZiAoYS5pc051bGwoKSAmJiBiLmlz
TnVsbCgpKQotICAgICAgICByZXR1cm4gQ1N0cmluZygpOwotCi0gICAgY2hhciogcTsKLSAgICBD
U3RyaW5nIHJlc3VsdCA9IENTdHJpbmc6Om5ld1VuaW5pdGlhbGl6ZWQoYS5sZW5ndGgoKSArIGIu
bGVuZ3RoKCksIHEpOwotICAgIGlmIChhLmxlbmd0aCgpKQotICAgICAgICBtZW1jcHkocSwgYS5k
YXRhKCksIGEubGVuZ3RoKCkpOwotICAgIGlmIChiLmxlbmd0aCgpKQotICAgICAgICBtZW1jcHko
cSArIGEubGVuZ3RoKCksIGIuZGF0YSgpLCBiLmxlbmd0aCgpKTsKLSAgICByZXR1cm4gcmVzdWx0
OwotfQotCiBCbG9iQnVpbGRlcjo6QmxvYkJ1aWxkZXIoKQogICAgIDogbV9zaXplKDApCiB7CkBA
IC03OCwxNyArNDgsMzMgQEAgQmxvYkJ1aWxkZXI6OkJsb2JCdWlsZGVyKCkKIAogYm9vbCBCbG9i
QnVpbGRlcjo6YXBwZW5kKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgU3RyaW5nJiBlbmRpbmdU
eXBlLCBFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAgICBDU3RyaW5nIGNzdHIgPSBjb252ZXJ0VG9D
U3RyaW5nKHRleHQsIGVuZGluZ1R5cGUsIGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEF0b21pY1N0cmluZywgdHJhbnNwYXJl
bnQsICgidHJhbnNwYXJlbnQiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChBdG9taWNTdHJp
bmcsIG5hdGl2ZSwgKCJuYXRpdmUiKSk7CisKKyAgICBpZiAoIWVuZGluZ1R5cGUuaXNFbXB0eSgp
ICYmIGVuZGluZ1R5cGUgIT0gdHJhbnNwYXJlbnQgJiYgZW5kaW5nVHlwZSAhPSBuYXRpdmUpIHsK
KyAgICAgICAgZWMgPSBTWU5UQVhfRVJSOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAg
ICBtX3NpemUgKz0gY3N0ci5sZW5ndGgoKTsKKyAgICBDU3RyaW5nIGN0ZXh0ID0gVVRGOEVuY29k
aW5nKCkuZW5jb2RlKHRleHQuY2hhcmFjdGVycygpLCB0ZXh0Lmxlbmd0aCgpLCBFbnRpdGllc0Zv
clVuZW5jb2RhYmxlcyk7CisKKyAgICAvLyBJZiB0aGUgbGFzdCBpdGVtIGlzIG5vdCBhIGRhdGEg
aXRlbSwgY3JlYXRlIG9uZS4gT3RoZXJ3aXNlLCB3ZSBzaW1wbHkgYXBwZW5kIHRoZSBuZXcgc3Ry
aW5nIHRvIHRoZSBsYXN0IGRhdGEgaXRlbS4KKyAgICBpZiAobV9pdGVtcy5pc0VtcHR5KCkgfHwg
bV9pdGVtc1ttX2l0ZW1zLnNpemUoKSAtIDFdLnR5cGUgIT0gQmxvYkRhdGFJdGVtOjpEYXRhKQor
ICAgICAgICBtX2l0ZW1zLmFwcGVuZChCbG9iRGF0YUl0ZW0oYWRvcHRQdHIobmV3IFZlY3Rvcjxj
aGFyPigpKSkpOworCisgICAgaWYgKCFjdGV4dC5pc051bGwoKSkgeworICAgICAgICBWZWN0b3I8
Y2hhcj4mIGJ1ZmZlciA9ICptX2l0ZW1zW21faXRlbXMuc2l6ZSgpIC0gMV0uZGF0YS5tdXRhYmxl
RGF0YSgpOworICAgICAgICB1bnNpZ25lZCBvbGRTaXplID0gYnVmZmVyLnNpemUoKTsKKworICAg
ICAgICBpZiAoZW5kaW5nVHlwZSA9PSBuYXRpdmUpCisgICAgICAgICAgICBub3JtYWxpemVMaW5l
RW5kaW5nc1RvTmF0aXZlKGN0ZXh0LCBidWZmZXIpOworICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgIGJ1ZmZlci5ncm93KGJ1ZmZlci5zaXplKCkgKyBjdGV4dC5sZW5ndGgoKSk7CisgICAgICAg
ICAgICBtZW1jcHkoYnVmZmVyLmRhdGEoKSArIG9sZFNpemUsIGN0ZXh0LmRhdGEoKSwgY3RleHQu
bGVuZ3RoKCkpOworICAgICAgICB9CisgICAgICAgIG1fc2l6ZSArPSBidWZmZXIuc2l6ZSgpIC0g
b2xkU2l6ZTsKKyAgICB9CiAKLSAgICAvLyBJZiB0aGUgbGFzdCBpdGVtIGlzIGEgc3RyaW5nLCBj
b25jYXRlbmF0ZSBpdCB3aXRoIGN1cnJlbnQgc3RyaW5nLgotICAgIGlmICghbV9pdGVtcy5pc0Vt
cHR5KCkgJiYgbV9pdGVtc1ttX2l0ZW1zLnNpemUoKSAtIDFdLnR5cGUgPT0gQmxvYkRhdGFJdGVt
OjpEYXRhKQotICAgICAgICBtX2l0ZW1zW21faXRlbXMuc2l6ZSgpIC0gMV0uZGF0YSA9IGNvbmNh
dGVuYXRlVHdvQ1N0cmluZ3MobV9pdGVtc1ttX2l0ZW1zLnNpemUoKSAtIDFdLmRhdGEsIGNzdHIp
OwotICAgIGVsc2UKLSAgICAgICAgbV9pdGVtcy5hcHBlbmQoQmxvYkRhdGFJdGVtKGNzdHIpKTsK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9maWxlYXBpL1RocmVh
ZGFibGVCbG9iUmVnaXN0cnkuY3BwIGIvV2ViQ29yZS9maWxlYXBpL1RocmVhZGFibGVCbG9iUmVn
aXN0cnkuY3BwCmluZGV4IGY3NGM2ODAuLmNhODFjNDUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZmls
ZWFwaS9UaHJlYWRhYmxlQmxvYlJlZ2lzdHJ5LmNwcAorKysgYi9XZWJDb3JlL2ZpbGVhcGkvVGhy
ZWFkYWJsZUJsb2JSZWdpc3RyeS5jcHAKQEAgLTQxLDggKzQxLDkgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogc3RydWN0IEJsb2JSZWdpc3RyeUNvbnRleHQgewogICAgIEJsb2JSZWdpc3RyeUNvbnRl
eHQoY29uc3QgS1VSTCYgdXJsLCBQYXNzT3duUHRyPEJsb2JEYXRhPiBibG9iRGF0YSkKICAgICAg
ICAgOiB1cmwodXJsLmNvcHkoKSkKLSAgICAgICAgLCBibG9iRGF0YShibG9iRGF0YS0+Y29weSgp
KQorICAgICAgICAsIGJsb2JEYXRhKGJsb2JEYXRhKQogICAgIHsKKyAgICAgICAgdGhpcy0+Ymxv
YkRhdGEtPm1ha2VDcm9zc1RocmVhZCgpOwogICAgIH0KIAogICAgIEJsb2JSZWdpc3RyeUNvbnRl
eHQoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBzcmNVUkwpCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvQmxvYkRhdGEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL0Jsb2JEYXRhLmNwcAppbmRleCAyMWU4OTE3Li5hMjRmZGY3IDEwMDY0NAotLS0gYS9XZWJD
b3JlL3BsYXRmb3JtL25ldHdvcmsvQmxvYkRhdGEuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9CbG9iRGF0YS5jcHAKQEAgLTMxLDQwICszMSw2NCBAQAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIkJsb2JEYXRhLmgiCiAKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+Cisj
aW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAogY29uc3QgbG9uZyBsb25nIEJsb2JEYXRhSXRlbTo6dG9FbmRPZkZp
bGUgPSAtMTsKIGNvbnN0IGRvdWJsZSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxlQ2hhbmdl
ID0gMDsKIAotdm9pZCBCbG9iRGF0YUl0ZW06OmNvcHkoY29uc3QgQmxvYkRhdGFJdGVtJiBpdGVt
KQorQmxvYkRhdGFJdGVtOjpSYXdEYXRhOjpSYXdEYXRhKFBhc3NPd25QdHI8VmVjdG9yPGNoYXI+
ID4gZGF0YSkKKyAgICA6IG1fZGF0YShkYXRhLmxlYWtQdHIoKSkKKyAgICAsIG1fc2hhcmVkRGF0
YShTaGFyZWRSYXdEYXRhOjpjcmVhdGUobmV3IFNoYXJhYmxlUmF3RGF0YShtX2RhdGEpKSkKIHsK
LSAgICB0eXBlID0gaXRlbS50eXBlOwotICAgIGRhdGEgPSBpdGVtLmRhdGE7IC8vIFRoaXMgaXMg
T0sgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGlzIFZlY3RvcjxjaGFyPi4KLSAgICBw
YXRoID0gaXRlbS5wYXRoLmNyb3NzVGhyZWFkU3RyaW5nKCk7Ci0gICAgdXJsID0gaXRlbS51cmwu
Y29weSgpOwotICAgIG9mZnNldCA9IGl0ZW0ub2Zmc2V0OwotICAgIGxlbmd0aCA9IGl0ZW0ubGVu
Z3RoOwotICAgIGV4cGVjdGVkTW9kaWZpY2F0aW9uVGltZSA9IGl0ZW0uZXhwZWN0ZWRNb2RpZmlj
YXRpb25UaW1lOwogfQogCi1QYXNzT3duUHRyPEJsb2JEYXRhPiBCbG9iRGF0YTo6Y29weSgpIGNv
bnN0Cit2b2lkIEJsb2JEYXRhSXRlbTo6UmF3RGF0YTo6bWFrZUNyb3NzVGhyZWFkKCkKIHsKLSAg
ICBPd25QdHI8QmxvYkRhdGE+IGJsb2JEYXRhID0gYWRvcHRQdHIobmV3IEJsb2JEYXRhKCkpOwot
ICAgIGJsb2JEYXRhLT5tX2NvbnRlbnRUeXBlID0gbV9jb250ZW50VHlwZS5jcm9zc1RocmVhZFN0
cmluZygpOwotICAgIGJsb2JEYXRhLT5tX2NvbnRlbnREaXNwb3NpdGlvbiA9IG1fY29udGVudERp
c3Bvc2l0aW9uLmNyb3NzVGhyZWFkU3RyaW5nKCk7Ci0gICAgYmxvYkRhdGEtPm1faXRlbXMucmVz
aXplKG1faXRlbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1faXRlbXMu
c2l6ZSgpOyArK2kpCi0gICAgICAgIGJsb2JEYXRhLT5tX2l0ZW1zLmF0KGkpLmNvcHkobV9pdGVt
cy5hdChpKSk7CisgICAgaWYgKG1fc2hhcmVkRGF0YSkKKyAgICAgICAgbV9zaGFyZWREYXRhID0g
bV9zaGFyZWREYXRhLT5jcm9zc1RocmVhZENvcHkoKTsKK30KIAotICAgIHJldHVybiBibG9iRGF0
YS5yZWxlYXNlKCk7Cit2b2lkIEJsb2JEYXRhSXRlbTo6bWFrZUNyb3NzVGhyZWFkKCkKK3sKKyAg
ICBkYXRhLm1ha2VDcm9zc1RocmVhZCgpOworICAgIHBhdGggPSBwYXRoLmNyb3NzVGhyZWFkU3Ry
aW5nKCk7CisgICAgdXJsID0gdXJsLmNvcHkoKTsKK30KKworUGFzc093blB0cjxCbG9iRGF0YT4g
QmxvYkRhdGE6OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBCbG9iRGF0YSgp
KTsKK30KKworQmxvYkRhdGFJdGVtOjpCbG9iRGF0YUl0ZW0oUGFzc093blB0cjxWZWN0b3I8Y2hh
cj4gPiBkYXRhKQorICAgIDogdHlwZShEYXRhKQorICAgICwgZGF0YShkYXRhKQorICAgICwgb2Zm
c2V0KDApCisgICAgLCBsZW5ndGgodG9FbmRPZkZpbGUpCisgICAgLCBleHBlY3RlZE1vZGlmaWNh
dGlvblRpbWUoZG9Ob3RDaGVja0ZpbGVDaGFuZ2UpCit7Cit9CisgCit2b2lkIEJsb2JEYXRhOjpt
YWtlQ3Jvc3NUaHJlYWQoKQoreworICAgIG1fY29udGVudFR5cGUgPSBtX2NvbnRlbnRUeXBlLmNy
b3NzVGhyZWFkU3RyaW5nKCk7CisgICAgbV9jb250ZW50RGlzcG9zaXRpb24gPSBtX2NvbnRlbnRE
aXNwb3NpdGlvbi5jcm9zc1RocmVhZFN0cmluZygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9pdGVtcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9pdGVtcy5hdChpKS5tYWtlQ3Jvc3NU
aHJlYWQoKTsKIH0KIAotdm9pZCBCbG9iRGF0YTo6YXBwZW5kRGF0YShjb25zdCBDU3RyaW5nJiBk
YXRhKQordm9pZCBCbG9iRGF0YTo6YXBwZW5kRGF0YShQYXNzT3duUHRyPFZlY3RvcjxjaGFyPiA+
IGRhdGEpCiB7CiAgICAgbV9pdGVtcy5hcHBlbmQoQmxvYkRhdGFJdGVtKGRhdGEpKTsKIH0KIAot
dm9pZCBCbG9iRGF0YTo6YXBwZW5kRGF0YShjb25zdCBDU3RyaW5nJiBkYXRhLCBsb25nIGxvbmcg
b2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKQordm9pZCBCbG9iRGF0YTo6YXBwZW5kRGF0YShjb25z
dCBCbG9iRGF0YUl0ZW06OlJhd0RhdGEmIGRhdGEsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9u
ZyBsZW5ndGgpCiB7CiAgICAgbV9pdGVtcy5hcHBlbmQoQmxvYkRhdGFJdGVtKGRhdGEsIG9mZnNl
dCwgbGVuZ3RoKSk7CiB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvQmxv
YkRhdGEuaCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iRGF0YS5oCmluZGV4IDEzZTNi
OWMuLjA0NjRkMTMgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iRGF0
YS5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iRGF0YS5oCkBAIC0zMywxMyAr
MzMsMzYgQEAKIAogI2luY2x1ZGUgIktVUkwuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgotI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgot
I2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvQ3Jvc3NUaHJlYWRS
ZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KIAogbmFtZXNwYWNlIFdlYkNv
cmUgewogCiBzdHJ1Y3QgQmxvYkRhdGFJdGVtIHsKKyAgICBjbGFzcyBSYXdEYXRhIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIHR5cGVkZWYgT3duUHRyPFZlY3RvcjxjaGFyPiA+IFNoYXJhYmxlUmF3
RGF0YTsKKyAgICAgICAgdHlwZWRlZiBDcm9zc1RocmVhZFJlZkNvdW50ZWQ8U2hhcmFibGVSYXdE
YXRhPiBTaGFyZWRSYXdEYXRhOworCisgICAgICAgIFJhd0RhdGEoKQorICAgICAgICAgICAgOiBt
X2RhdGEoMCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgUmF3RGF0YShQYXNzT3du
UHRyPFZlY3RvcjxjaGFyPiA+IGRhdGEpOworCisgICAgICAgIHZvaWQgbWFrZUNyb3NzVGhyZWFk
KCk7CisKKyAgICAgICAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YSA/
IG1fZGF0YS0+ZGF0YSgpIDogMDsgfQorICAgICAgICB1bnNpZ25lZCBsZW5ndGgoKSBjb25zdCB7
IHJldHVybiBtX2RhdGEgPyBtX2RhdGEtPnNpemUoKSA6IDA7IH0KKworICAgICAgICBWZWN0b3I8
Y2hhcj4qIG11dGFibGVEYXRhKCkgeyByZXR1cm4gbV9kYXRhOyB9CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBWZWN0b3I8Y2hhcj4qIG1fZGF0YTsKKyAgICAgICAgUmVmUHRyPFNoYXJlZFJhd0Rh
dGE+IG1fc2hhcmVkRGF0YTsKKyAgICB9OworCiAgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyB0
b0VuZE9mRmlsZTsKICAgICBzdGF0aWMgY29uc3QgZG91YmxlIGRvTm90Q2hlY2tGaWxlQ2hhbmdl
OwogCkBAIC01MywyNCArNzYsNyBAQCBzdHJ1Y3QgQmxvYkRhdGFJdGVtIHsKICAgICB9CiAKICAg
ICAvLyBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nIHR5cGUgKGNvbXBsZXRlIHN0cmluZykuCi0gICAg
ZXhwbGljaXQgQmxvYkRhdGFJdGVtKGNvbnN0IENTdHJpbmcmIGRhdGEpCi0gICAgICAgIDogdHlw
ZShEYXRhKQotICAgICAgICAsIGRhdGEoZGF0YSkKLSAgICAgICAgLCBvZmZzZXQoMCkKLSAgICAg
ICAgLCBsZW5ndGgodG9FbmRPZkZpbGUpCi0gICAgICAgICwgZXhwZWN0ZWRNb2RpZmljYXRpb25U
aW1lKGRvTm90Q2hlY2tGaWxlQ2hhbmdlKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBDb25zdHJ1
Y3RvciBmb3IgU3RyaW5nIHR5cGUgKHBhcnRpYWwgc3RyaW5nKS4KLSAgICBCbG9iRGF0YUl0ZW0o
Y29uc3QgQ1N0cmluZyYgZGF0YSwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkK
LSAgICAgICAgOiB0eXBlKERhdGEpCi0gICAgICAgICwgZGF0YShkYXRhKQotICAgICAgICAsIG9m
ZnNldChvZmZzZXQpCi0gICAgICAgICwgbGVuZ3RoKGxlbmd0aCkKLSAgICAgICAgLCBleHBlY3Rl
ZE1vZGlmaWNhdGlvblRpbWUoZG9Ob3RDaGVja0ZpbGVDaGFuZ2UpCi0gICAgewotICAgIH0KKyAg
ICBleHBsaWNpdCBCbG9iRGF0YUl0ZW0oUGFzc093blB0cjxWZWN0b3I8Y2hhcj4gPiBkYXRhKTsK
IAogICAgIC8vIENvbnN0cnVjdG9yIGZvciBGaWxlIHR5cGUgKGNvbXBsZXRlIGZpbGUpLgogICAg
IGV4cGxpY2l0IEJsb2JEYXRhSXRlbShjb25zdCBTdHJpbmcmIHBhdGgpCkBAIC0xMDIsMTMgKzEw
OCwxMyBAQCBzdHJ1Y3QgQmxvYkRhdGFJdGVtIHsKICAgICB7CiAgICAgfQogCi0gICAgLy8gR2V0
cyBhIGNvcHkgb2YgdGhlIGRhdGEgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gYW5vdGhlciB0aHJl
YWQuCi0gICAgdm9pZCBjb3B5KGNvbnN0IEJsb2JEYXRhSXRlbSYpOworICAgIC8vIE1ha2VzIGl0
IHNhZmUgdG8gcGFzcyB0byBhbnRoZXIgdGhyZWFkLgorICAgIHZvaWQgbWFrZUNyb3NzVGhyZWFk
KCk7CiAKICAgICBlbnVtIHsgRGF0YSwgRmlsZSwgQmxvYiB9IHR5cGU7CiAgICAgCiAgICAgLy8g
Rm9yIERhdGEgdHlwZS4KLSAgICBDU3RyaW5nIGRhdGE7CisgICAgUmF3RGF0YSBkYXRhOwogCiAg
ICAgLy8gRm9yIEZpbGUgdHlwZS4KICAgICBTdHJpbmcgcGF0aDsKQEAgLTExOSwxOSArMTI1LDI5
IEBAIHN0cnVjdCBCbG9iRGF0YUl0ZW0gewogICAgIGxvbmcgbG9uZyBvZmZzZXQ7CiAgICAgbG9u
ZyBsb25nIGxlbmd0aDsKICAgICBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lOworCitw
cml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBCbG9iRGF0YTsKKworICAgIC8vIENvbnN0cnVjdG9y
IGZvciBTdHJpbmcgdHlwZSAocGFydGlhbCBzdHJpbmcpLgorICAgIEJsb2JEYXRhSXRlbShjb25z
dCBCbG9iRGF0YUl0ZW06OlJhd0RhdGEmIGRhdGEsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9u
ZyBsZW5ndGgpCisgICAgICAgIDogdHlwZShEYXRhKQorICAgICAgICAsIGRhdGEoZGF0YSkKKyAg
ICAgICAgLCBvZmZzZXQob2Zmc2V0KQorICAgICAgICAsIGxlbmd0aChsZW5ndGgpCisgICAgICAg
ICwgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKGRvTm90Q2hlY2tGaWxlQ2hhbmdlKQorICAgIHsK
KyAgICB9CiB9OwogCiB0eXBlZGVmIFZlY3RvcjxCbG9iRGF0YUl0ZW0+IEJsb2JEYXRhSXRlbUxp
c3Q7CiAKIGNsYXNzIEJsb2JEYXRhIHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc093blB0cjxC
bG9iRGF0YT4gY3JlYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgQmxv
YkRhdGEoKSk7Ci0gICAgfQorICAgIHN0YXRpYyBQYXNzT3duUHRyPEJsb2JEYXRhPiBjcmVhdGUo
KTsKIAotICAgIC8vIEdldHMgYSBjb3B5IG9mIHRoZSBkYXRhIHN1aXRhYmxlIGZvciBwYXNzaW5n
IHRvIGFub3RoZXIgdGhyZWFkLgotICAgIFBhc3NPd25QdHI8QmxvYkRhdGE+IGNvcHkoKSBjb25z
dDsKKyAgICAvLyBNYWtlcyBpdCBzYWZlIHRvIHBhc3MgdG8gYW50aGVyIHRocmVhZC4KKyAgICB2
b2lkIG1ha2VDcm9zc1RocmVhZCgpOwogCiAgICAgY29uc3QgU3RyaW5nJiBjb250ZW50VHlwZSgp
IGNvbnN0IHsgcmV0dXJuIG1fY29udGVudFR5cGU7IH0KICAgICB2b2lkIHNldENvbnRlbnRUeXBl
KGNvbnN0IFN0cmluZyYgY29udGVudFR5cGUpIHsgbV9jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBl
OyB9CkBAIC0xNDIsNyArMTU4LDcgQEAgcHVibGljOgogICAgIGNvbnN0IEJsb2JEYXRhSXRlbUxp
c3QmIGl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtczsgfQogICAgIHZvaWQgc3dhcEl0ZW1z
KEJsb2JEYXRhSXRlbUxpc3QmKTsKICAgICAKLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgQ1N0
cmluZyYpOworICAgIHZvaWQgYXBwZW5kRGF0YShQYXNzT3duUHRyPFZlY3RvcjxjaGFyPiA+KTsK
ICAgICB2b2lkIGFwcGVuZEZpbGUoY29uc3QgU3RyaW5nJiBwYXRoKTsKICAgICB2b2lkIGFwcGVu
ZEZpbGUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVu
Z3RoLCBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lKTsKICAgICB2b2lkIGFwcGVuZEJs
b2IoY29uc3QgS1VSTCYsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBsZW5ndGgpOwpAQCAt
MTU0LDcgKzE3MCw3IEBAIHByaXZhdGU6CiAgICAgQmxvYkRhdGEoKSB7IH0KIAogICAgIC8vIFRo
aXMgaXMgb25seSBleHBvc2VkIHRvIEJsb2JTdG9yYWdlRGF0YS4KLSAgICB2b2lkIGFwcGVuZERh
dGEoY29uc3QgQ1N0cmluZyYsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBsZW5ndGgpOwor
ICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBCbG9iRGF0YUl0ZW06OlJhd0RhdGEmLCBsb25nIGxv
bmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKTsKIAogICAgIFN0cmluZyBtX2NvbnRlbnRUeXBl
OwogICAgIFN0cmluZyBtX2NvbnRlbnREaXNwb3NpdGlvbjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9CbG9iUmVnaXN0cnlJbXBsLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0v
bmV0d29yay9CbG9iUmVnaXN0cnlJbXBsLmNwcAppbmRleCBjNWJlYjY0Li45YjBjNjZmIDEwMDY0
NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvQmxvYlJlZ2lzdHJ5SW1wbC5jcHAKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0Jsb2JSZWdpc3RyeUltcGwuY3BwCkBAIC0xNTgs
MTAgKzE1OCw3IEBAIHZvaWQgQmxvYlJlZ2lzdHJ5SW1wbDo6cmVnaXN0ZXJCbG9iVVJMKGNvbnN0
IEtVUkwmIHVybCwgY29uc3QgS1VSTCYgc3JjVVJMKQogICAgIGlmICghc3JjKQogICAgICAgICBy
ZXR1cm47CiAKLSAgICBSZWZQdHI8QmxvYlN0b3JhZ2VEYXRhPiBibG9iU3RvcmFnZURhdGEgPSBC
bG9iU3RvcmFnZURhdGE6OmNyZWF0ZShzcmMtPmNvbnRlbnRUeXBlKCksIHNyYy0+Y29udGVudERp
c3Bvc2l0aW9uKCkpOwotICAgIGFwcGVuZFN0b3JhZ2VJdGVtcyhibG9iU3RvcmFnZURhdGEuZ2V0
KCksIHNyYy0+aXRlbXMoKSk7Ci0gICAgCi0gICAgbV9ibG9icy5zZXQodXJsLnN0cmluZygpLCBi
bG9iU3RvcmFnZURhdGEpOworICAgIG1fYmxvYnMuc2V0KHVybC5zdHJpbmcoKSwgc3JjKTsKIH0K
IAogdm9pZCBCbG9iUmVnaXN0cnlJbXBsOjp1bnJlZ2lzdGVyQmxvYlVSTChjb25zdCBLVVJMJiB1
cmwpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTGluZUVuZGluZy5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL3RleHQvTGluZUVuZGluZy5jcHAKaW5kZXggNTQ1ZjIyYi4uYTkzMTAy
NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuY3BwCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9MaW5lRW5kaW5nLmNwcApAQCAtMzUsMTEgKzM1LDcyIEBA
CiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5n
Lmg+CiAKLW5hbWVzcGFjZSBXZWJDb3JlIHsKK25hbWVzcGFjZSB7CiAKLS8vIE5vcm1hbGl6ZSBh
bGwgbGluZS1lbmRpbmdzIHRvIENSTEYuCi1DU3RyaW5nIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9D
UkxGKGNvbnN0IENTdHJpbmcmIGZyb20pCitjbGFzcyBPdXRwdXRCdWZmZXIgeworcHVibGljOgor
ICAgIHZpcnR1YWwgY2hhciogYWxsb2NhdGUodW5zaWduZWQgc2l6ZSkgPSAwOworICAgIHZpcnR1
YWwgdm9pZCBjb3B5KGNvbnN0IENTdHJpbmcmKSA9IDA7CisgICAgdmlydHVhbCB+T3V0cHV0QnVm
ZmVyKCkgeyB9Cit9OworCitjbGFzcyBDU3RyaW5nQnVmZmVyIDogcHVibGljIE91dHB1dEJ1ZmZl
ciB7CitwdWJsaWM6CisgICAgQ1N0cmluZ0J1ZmZlcihjb25zdCBDU3RyaW5nJiBidWZmZXIpCisg
ICAgICAgIDogbV9idWZmZXIoYnVmZmVyKQorICAgIHsKKyAgICB9CisgICAgdmlydHVhbCB+Q1N0
cmluZ0J1ZmZlcigpIHsgfQorCisgICAgdmlydHVhbCBjaGFyKiBhbGxvY2F0ZSh1bnNpZ25lZCBz
aXplKQorICAgIHsKKyAgICAgICAgY2hhciogcHRyOworICAgICAgICBtX2J1ZmZlciA9IENTdHJp
bmc6Om5ld1VuaW5pdGlhbGl6ZWQoc2l6ZSwgcHRyKTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY29weShjb25zdCBDU3RyaW5nJiBzcmMpCisgICAgewor
ICAgICAgICBtX2J1ZmZlciA9IHNyYzsgCisgICAgfQorCisgICAgY29uc3QgQ1N0cmluZyYgYnVm
ZmVyKCkgY29uc3QgeyByZXR1cm4gbV9idWZmZXI7IH0KKworcHJpdmF0ZToKKyAgICBDU3RyaW5n
IG1fYnVmZmVyOworfTsKKworI2lmIE9TKFdJTkRPV1MpCitjbGFzcyBWZWN0b3JDaGFyQXBwZW5k
QnVmZmVyIDogcHVibGljIE91dHB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgVmVjdG9yQ2hhckFw
cGVuZEJ1ZmZlcihWZWN0b3I8Y2hhcj4mIGJ1ZmZlcikKKyAgICAgICAgOiBtX2J1ZmZlcihidWZm
ZXIpCisgICAgeworICAgIH0KKyAgICB2aXJ0dWFsIH5WZWN0b3JDaGFyQXBwZW5kQnVmZmVyKCkg
eyB9CisKKyAgICB2aXJ0dWFsIGNoYXIqIGFsbG9jYXRlKHVuc2lnbmVkIHNpemUpCisgICAgewor
ICAgICAgICB1bnNpZ25lZCBvbGRTaXplID0gbV9idWZmZXIuc2l6ZSgpOworICAgICAgICBtX2J1
ZmZlci5ncm93KG9sZFNpemUgKyBzaXplKTsKKyAgICAgICAgcmV0dXJuIG1fYnVmZmVyLmRhdGEo
KSArIG9sZFNpemU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNvcHkoY29uc3QgQ1N0cmlu
ZyYgc3JjKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgb2xkU2l6ZSA9IG1fYnVmZmVyLnNpemUo
KTsKKyAgICAgICAgbV9idWZmZXIuZ3JvdyhvbGRTaXplICsgc3JjLmxlbmd0aCgpKTsKKyAgICAg
ICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG9sZFNpemUsIHNyYy5kYXRhKCksIHNyYy5sZW5n
dGgoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIFZlY3RvcjxjaGFyPiYgbV9idWZmZXI7Cit9
OworI2VuZGlmCisKK3ZvaWQgaW50ZXJuYWxOb3JtYWxpemVMaW5lRW5kaW5nc1RvQ1JMRihjb25z
dCBDU3RyaW5nJiBmcm9tLCBPdXRwdXRCdWZmZXImIGJ1ZmZlcikKIHsKKyAgICAvLyBDb21wdXRl
IHRoZSBuZXcgbGVuZ3RoLgogICAgIHVuc2lnbmVkIG5ld0xlbiA9IDA7CiAgICAgY29uc3QgY2hh
ciogcCA9IGZyb20uZGF0YSgpOwogICAgIHdoaWxlIChjaGFyIGMgPSAqcCsrKSB7CkBAIC01Nywx
MyArMTE4LDE2IEBAIENTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0
cmluZyYgZnJvbSkKICAgICAgICAgICAgIG5ld0xlbiArPSAxOwogICAgICAgICB9CiAgICAgfQot
ICAgIGlmIChuZXdMZW4gPT0gZnJvbS5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIGZyb207CiAK
LSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLgorICAgIGlmIChuZXdMZW4gPT0gZnJv
bS5sZW5ndGgoKSkgeworICAgICAgICBidWZmZXIuY29weShmcm9tKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKwogICAgIHAgPSBmcm9tLmRhdGEoKTsKLSAgICBjaGFyKiBxOwotICAgIENTdHJp
bmcgcmVzdWx0ID0gQ1N0cmluZzo6bmV3VW5pbml0aWFsaXplZChuZXdMZW4sIHEpOworICAgIGNo
YXIqIHEgPSBidWZmZXIuYWxsb2NhdGUobmV3TGVuKTsKKworICAgIC8vIE1ha2UgYSBjb3B5IG9m
IHRoZSBzdHJpbmcuCiAgICAgd2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKICAgICAgICAgaWYgKGMg
PT0gJ1xyJykgewogICAgICAgICAgICAgLy8gU2FmZSB0byBsb29rIGFoZWFkIGJlY2F1c2Ugb2Yg
dHJhaWxpbmcgJ1wwJy4KQEAgLTgxLDEyICsxNDUsMTggQEAgQ1N0cmluZyBub3JtYWxpemVMaW5l
RW5kaW5nc1RvQ1JMRihjb25zdCBDU3RyaW5nJiBmcm9tKQogICAgICAgICAgICAgKnErKyA9IGM7
CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorfTsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCit2b2lkIG5vcm1hbGl6ZVRvQ1JPckxGKGNvbnN0IENTdHJpbmcmIGZy
b20sIFZlY3RvcjxjaGFyPiYgcmVzdWx0LCBib29sIHRvQ1IpOworCiAvLyBOb3JtYWxpemUgYWxs
IGxpbmUtZW5kaW5ncyB0byBDUiBvciBMRi4KLXN0YXRpYyBDU3RyaW5nIG5vcm1hbGl6ZVRvQ1JP
ckxGKGNvbnN0IENTdHJpbmcmIGZyb20sIGJvb2wgdG9DUikKK3ZvaWQgbm9ybWFsaXplVG9DUk9y
TEYoY29uc3QgQ1N0cmluZyYgZnJvbSwgVmVjdG9yPGNoYXI+JiByZXN1bHQsIGJvb2wgdG9DUikK
IHsKKyAgICAvLyBDb21wdXRlIHRoZSBuZXcgbGVuZ3RoLgogICAgIHVuc2lnbmVkIG5ld0xlbiA9
IDA7CiAgICAgYm9vbCBuZWVkRml4ID0gZmFsc2U7CiAgICAgY29uc3QgY2hhciogcCA9IGZyb20u
ZGF0YSgpOwpAQCAtMTAzLDEzICsxNzMsMjAgQEAgc3RhdGljIENTdHJpbmcgbm9ybWFsaXplVG9D
Uk9yTEYoY29uc3QgQ1N0cmluZyYgZnJvbSwgYm9vbCB0b0NSKQogICAgICAgICB9CiAgICAgICAg
IG5ld0xlbiArPSAxOwogICAgIH0KLSAgICBpZiAoIW5lZWRGaXgpCi0gICAgICAgIHJldHVybiBm
cm9tOwogCi0gICAgLy8gTWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZy4KKyAgICAvLyBHcm93IHRo
ZSByZXN1bHQgYnVmZmVyLgogICAgIHAgPSBmcm9tLmRhdGEoKTsKLSAgICBjaGFyKiBxOwotICAg
IENTdHJpbmcgcmVzdWx0ID0gQ1N0cmluZzo6bmV3VW5pbml0aWFsaXplZChuZXdMZW4sIHEpOwor
ICAgIHVuc2lnbmVkIG9sZFJlc3VsdFNpemUgPSByZXN1bHQuc2l6ZSgpOworICAgIHJlc3VsdC5n
cm93KG9sZFJlc3VsdFNpemUgKyBuZXdMZW4pOworICAgIGNoYXIqIHEgPSByZXN1bHQuZGF0YSgp
ICsgb2xkUmVzdWx0U2l6ZTsKKworICAgIC8vIElmIG5vIG5lZWQgdG8gZml4IHRoZSBzdHJpbmcs
IGp1c3QgY29weSB0aGUgc3RyaW5nIG92ZXIuCisgICAgaWYgKCFuZWVkRml4KSB7CisgICAgICAg
IG1lbWNweShxLCBwLCBmcm9tLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcuCiAgICAgd2hpbGUgKGNoYXIgYyA9ICpw
KyspIHsKICAgICAgICAgaWYgKGMgPT0gJ1xyJyAmJiAqcCA9PSAnXG4nKSB7CiAgICAgICAgICAg
ICAvLyBUdXJuIENSTEYgb3IgQ1IgaW50byBDUiBvciBMRi4KQEAgLTEyMywyNyArMjAwLDMzIEBA
IHN0YXRpYyBDU3RyaW5nIG5vcm1hbGl6ZVRvQ1JPckxGKGNvbnN0IENTdHJpbmcmIGZyb20sIGJv
b2wgdG9DUikKICAgICAgICAgICAgICpxKysgPSBjOwogICAgICAgICB9CiAgICAgfQotICAgIHJl
dHVybiByZXN1bHQ7CiB9CiAKLS8vIE5vcm1hbGl6ZSBhbGwgbGluZS1lbmRpbmdzIHRvIENSLgot
Q1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvQ1IoY29uc3QgQ1N0cmluZyYgZnJvbSkKK0NT
dHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0cmluZyYgZnJvbSkKK3sK
KyAgICBDU3RyaW5nIHJlc3VsdDsKKyAgICBDU3RyaW5nQnVmZmVyIGJ1ZmZlcihyZXN1bHQpOwor
ICAgIGludGVybmFsTm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoZnJvbSwgYnVmZmVyKTsKKyAg
ICByZXR1cm4gYnVmZmVyLmJ1ZmZlcigpOworfQorCit2b2lkIG5vcm1hbGl6ZUxpbmVFbmRpbmdz
VG9DUihjb25zdCBDU3RyaW5nJiBmcm9tLCBWZWN0b3I8Y2hhcj4mIHJlc3VsdCkKIHsKLSAgICBy
ZXR1cm4gbm9ybWFsaXplVG9DUk9yTEYoZnJvbSwgdHJ1ZSk7CisgICAgbm9ybWFsaXplVG9DUk9y
TEYoZnJvbSwgcmVzdWx0LCB0cnVlKTsKIH0KIAotLy8gTm9ybWFsaXplIGFsbCBsaW5lLWVuZGlu
Z3MgdG8gTEYuCi1DU3RyaW5nIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9MRihjb25zdCBDU3RyaW5n
JiBmcm9tKQordm9pZCBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoY29uc3QgQ1N0cmluZyYgZnJv
bSwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCiB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZVRvQ1JPckxG
KGZyb20sIGZhbHNlKTsKKyAgICBub3JtYWxpemVUb0NST3JMRihmcm9tLCByZXN1bHQsIGZhbHNl
KTsKIH0KIAotQ1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvTmF0aXZlKGNvbnN0IENTdHJp
bmcmIGZyb20pCit2b2lkIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9OYXRpdmUoY29uc3QgQ1N0cmlu
ZyYgZnJvbSwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCiB7CiAjaWYgT1MoV0lORE9XUykKLSAgICBy
ZXR1cm4gbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoZnJvbSk7CisgICAgVmVjdG9yQ2hhckFw
cGVuZEJ1ZmZlciBidWZmZXIocmVzdWx0KTsKKyAgICBpbnRlcm5hbE5vcm1hbGl6ZUxpbmVFbmRp
bmdzVG9DUkxGKGZyb20sIGJ1ZmZlcik7CiAjZWxzZQotICAgIHJldHVybiBub3JtYWxpemVMaW5l
RW5kaW5nc1RvTEYoZnJvbSk7CisgICAgbm9ybWFsaXplTGluZUVuZGluZ3NUb0xGKGZyb20sIHJl
c3VsdCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xp
bmVFbmRpbmcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9MaW5lRW5kaW5nLmgKaW5kZXggYWI4
ZDZlZS4uNDMwNmNlOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xpbmVFbmRp
bmcuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTGluZUVuZGluZy5oCkBAIC0zMywyNSAr
MzMsMjIgQEAKICNkZWZpbmUgTGluZUVuZGluZ19oCiAKICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5o
PgotCi1uYW1lc3BhY2UgV1RGIHsKLWNsYXNzIENTdHJpbmc7Ci19CisjaW5jbHVkZSA8d3RmL1Zl
Y3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIC8vIE5vcm1hbGl6ZSBhbGwgbGluZS1l
bmRpbmdzIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8gQ1JMRi4KLVdURjo6Q1N0cmluZyBub3JtYWxp
emVMaW5lRW5kaW5nc1RvQ1JMRihjb25zdCBXVEY6OkNTdHJpbmcmKTsKK0NTdHJpbmcgbm9ybWFs
aXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0cmluZyYgZnJvbSk7CiAKLS8vIE5vcm1hbGl6
ZSBhbGwgbGluZS1lbmRpbmdzIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8gQ1IuCi1XVEY6OkNTdHJp
bmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSKGNvbnN0IFdURjo6Q1N0cmluZyYpOworLy8gTm9y
bWFsaXplIGFsbCBsaW5lLWVuZGluZ3MgaW4gdGhlIGdpdmVuIHN0cmluZyB0byBDUiBhbmQgYXBw
ZW5kIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KK3ZvaWQgbm9ybWFsaXplTGluZUVu
ZGluZ3NUb0NSKGNvbnN0IENTdHJpbmcmIGZyb20sIFZlY3RvcjxjaGFyPiYgcmVzdWx0KTsKIAot
Ly8gTm9ybWFsaXplIGFsbCBsaW5lLWVuZGluZ3MgaW4gdGhlIGdpdmVuIHN0cmluZyB0byBMRi4K
LVdURjo6Q1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoY29uc3QgV1RGOjpDU3RyaW5n
Jik7CisvLyBOb3JtYWxpemUgYWxsIGxpbmUtZW5kaW5ncyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIHRv
IExGIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgZ2l2ZW4gYnVmZmVyLgordm9pZCBub3Jt
YWxpemVMaW5lRW5kaW5nc1RvTEYoY29uc3QgQ1N0cmluZyYgZnJvbSwgVmVjdG9yPGNoYXI+JiBy
ZXN1bHQpOwogCi0vLyBOb3JtYWxpemUgYWxsIGxpbmUtZW5kaW5ncyBpbiB0aGUgZ2l2ZW4gc3Ry
aW5nIHRvIHRoZSBuYXRpdmUgbGluZS1lbmRpbmdzLgorLy8gTm9ybWFsaXplIGFsbCBsaW5lLWVu
ZGluZ3MgaW4gdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgbmF0aXZlIGxpbmUtZW5kaW5ncyBhbmQg
YXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KIC8vIChOb3JtYWxpemUgdG8g
Q1JMRiBvbiBXaW5kb3dzIGFuZCBub3JtYWxpemUgdG8gTEYgb24gYWxsIG90aGVyIHBsYXRmb3Jt
cy4pCi1XVEY6OkNTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb05hdGl2ZShjb25zdCBXVEY6
OkNTdHJpbmcmKTsKK3ZvaWQgbm9ybWFsaXplTGluZUVuZGluZ3NUb05hdGl2ZShjb25zdCBDU3Ry
aW5nJiBmcm9tLCBWZWN0b3I8Y2hhcj4mIHJlc3VsdCk7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKIApkaWZmIC0tZ2l0IGEvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1dlYktpdC9jaHJv
bWl1bS9DaGFuZ2VMb2cKaW5kZXggNDE2Y2EzMS4uNGIyY2M2NyAxMDA2NDQKLS0tIGEvV2ViS2l0
L2Nocm9taXVtL0NoYW5nZUxvZworKysgYi9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0x
LDMgKzEsMjEgQEAKKzIwMTAtMDktMjQgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZpeCBwYXNz
aW5nIGJsb2IgZGF0YSB3aXRoIHN0cmluZyBkYXRhIGl0ZW0gYmV0d2VlbiB0aHJlYWRzLgorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDY1NDMKKworICAg
ICAgICBVcGRhdGUgV2ViQmxvYkRhdGEgdG8gYWRhcHQgdG8gdGhlIEJsb2JEYXRhIGNoYW5nZS4K
KworICAgICAgICAqIHB1YmxpYy9XZWJCbG9iRGF0YS5oOgorICAgICAgICAoV2ViS2l0OjpXZWJS
YXdEYXRhOjpXZWJSYXdEYXRhKToKKyAgICAgICAgKFdlYktpdDo6V2ViUmF3RGF0YTo6cmVzZXQp
OgorICAgICAgICAoV2ViS2l0OjpXZWJSYXdEYXRhOjphc3NpZ24pOgorICAgICAgICAoV2ViS2l0
OjpXZWJSYXdEYXRhOjppc0VtcHR5KToKKyAgICAgICAgKFdlYktpdDo6V2ViUmF3RGF0YTo6b3Bl
cmF0b3Igc3RkOjpzdHJpbmcpOgorICAgICAgICAqIHNyYy9XZWJCbG9iRGF0YS5jcHA6CisgICAg
ICAgIChXZWJLaXQ6OldlYkJsb2JEYXRhOjppdGVtQXQpOgorCiAyMDEwLTA5LTI0ICBUb255IENo
YW5nICA8dG9ueUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgZml4IGNocm9t
aXVtIGNvbXBpbGUgYWZ0ZXIgcjY4Mjc2IHdoaWNoIHJlbmFtZWQKZGlmZiAtLWdpdCBhL1dlYktp
dC9jaHJvbWl1bS9wdWJsaWMvV2ViQmxvYkRhdGEuaCBiL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMv
V2ViQmxvYkRhdGEuaAppbmRleCA4YzBlMWFhLi40ZjlkNzFmIDEwMDY0NAotLS0gYS9XZWJLaXQv
Y2hyb21pdW0vcHVibGljL1dlYkJsb2JEYXRhLmgKKysrIGIvV2ViS2l0L2Nocm9taXVtL3B1Ymxp
Yy9XZWJCbG9iRGF0YS5oCkBAIC0zMSw3ICszMSw3IEBACiAjaWZuZGVmIFdlYkJsb2JEYXRhX2gK
ICNkZWZpbmUgV2ViQmxvYkRhdGFfaAogCi0jaW5jbHVkZSAiV2ViQ1N0cmluZy5oIgorI2luY2x1
ZGUgIldlYkRhdGEuaCIKICNpbmNsdWRlICJXZWJTdHJpbmcuaCIKICNpbmNsdWRlICJXZWJVUkwu
aCIKIApAQCAtNDQsMTEgKzQ0LDQ3IEBAIG5hbWVzcGFjZSBXZWJLaXQgewogCiBjbGFzcyBXZWJC
bG9iRGF0YVByaXZhdGU7CiAKKy8vIFRoaXMgb25seSBhY3RzIGFzIGEgd3JhcHBlciBwb2ludGlu
ZyB0byB0aGUgb3JpZ2luYWwgZGF0YS4gV2Ugc2hvdWxkIGVuc3VyZSB0aGF0CisvLyB0aGUgb3Jp
Z2luYWwgZGF0YSByZW1haW5zIHZhbGlkIHdoZW4gdGhpcyB3cmFwcGVyIGlzIHVzZWQuCitjbGFz
cyBXZWJSYXdEYXRhIHsKK3B1YmxpYzoKKyAgICBXZWJSYXdEYXRhKCkKKyAgICAgICAgOiBtX2Rh
dGEoMCkKKyAgICAgICAgLCBtX2xlbmd0aCgwKQorICAgIHsKKyAgICB9CisKKyAgICBXRUJLSVRf
QVBJIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgbV9kYXRhID0gMDsKKyAgICAgICAgbV9s
ZW5ndGggPSAwOworICAgIH0KKworICAgIFdFQktJVF9BUEkgdm9pZCBhc3NpZ24oY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICB7CisgICAgICAgIG1fZGF0YSA9IGRhdGE7Cisg
ICAgICAgIG1fbGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKworICAgIGJvb2wgaXNFbXB0eSgpIGNv
bnN0IHsgcmV0dXJuICFtX2xlbmd0aDsgfQorCisjaWYgIVdFQktJVF9JTVBMRU1FTlRBVElPTgor
ICAgIG9wZXJhdG9yIHN0ZDo6c3RyaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X2xlbmd0aCA/IHN0ZDo6c3RyaW5nKG1fZGF0YSwgbV9sZW5ndGgpIDogc3RkOjpzdHJpbmcoKTsK
KyAgICB9CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBtX2RhdGE7CisgICAg
c2l6ZV90IG1fbGVuZ3RoOworfTsKKwogY2xhc3MgV2ViQmxvYkRhdGEgewogcHVibGljOgogICAg
IHN0cnVjdCBJdGVtIHsKICAgICAgICAgZW51bSB7IFR5cGVEYXRhLCBUeXBlRmlsZSwgVHlwZUJs
b2IgfSB0eXBlOwotICAgICAgICBXZWJDU3RyaW5nIGRhdGE7CisgICAgICAgIFdlYlJhd0RhdGEg
ZGF0YTsKICAgICAgICAgV2ViU3RyaW5nIGZpbGVQYXRoOwogICAgICAgICBXZWJVUkwgYmxvYlVS
TDsKICAgICAgICAgbG9uZyBsb25nIG9mZnNldDsKQEAgLTcyLDE3ICsxMDgsOSBAQCBwdWJsaWM6
CiAgICAgLy8gaW5kZXggaXMgb3V0IG9mIGJvdW5kcy4KICAgICBXRUJLSVRfQVBJIGJvb2wgaXRl
bUF0KHNpemVfdCBpbmRleCwgSXRlbSYgcmVzdWx0KSBjb25zdDsKIAotICAgIC8vIEFwcGVuZHMg
dG8gdGhlIGxpc3Qgb2YgaXRlbXMuCi0gICAgV0VCS0lUX0FQSSB2b2lkIGFwcGVuZERhdGEoY29u
c3QgV2ViQ1N0cmluZyYpOwotICAgIFdFQktJVF9BUEkgdm9pZCBhcHBlbmRGaWxlKGNvbnN0IFdl
YlN0cmluZyYgZmlsZVBhdGgpOwotICAgIFdFQktJVF9BUEkgdm9pZCBhcHBlbmRGaWxlKGNvbnN0
IFdlYlN0cmluZyYgZmlsZVBhdGgsIGxvbmcgbG9uZyBvZmZzZXQsIGxvbmcgbG9uZyBsZW5ndGgs
IGRvdWJsZSBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUpOwotICAgIFdFQktJVF9BUEkgdm9pZCBh
cHBlbmRCbG9iKGNvbnN0IFdlYlVSTCYgYmxvYlVSTCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBs
b25nIGxlbmd0aCk7Ci0KICAgICBXRUJLSVRfQVBJIFdlYlN0cmluZyBjb250ZW50VHlwZSgpIGNv
bnN0OwotICAgIFdFQktJVF9BUEkgdm9pZCBzZXRDb250ZW50VHlwZShjb25zdCBXZWJTdHJpbmcm
KTsKIAogICAgIFdFQktJVF9BUEkgV2ViU3RyaW5nIGNvbnRlbnREaXNwb3NpdGlvbigpIGNvbnN0
OwotICAgIFdFQktJVF9BUEkgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oY29uc3QgV2ViU3Ry
aW5nJik7CiAKICNpZiBXRUJLSVRfSU1QTEVNRU5UQVRJT04KICAgICBXZWJCbG9iRGF0YShjb25z
dCBXVEY6OlBhc3NPd25QdHI8V2ViQ29yZTo6QmxvYkRhdGE+Jik7CmRpZmYgLS1naXQgYS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYkJsb2JEYXRhLmNwcCBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
QmxvYkRhdGEuY3BwCmluZGV4IDRjZDFkNjcuLmNjYzJjMDkgMTAwNjQ0Ci0tLSBhL1dlYktpdC9j
aHJvbWl1bS9zcmMvV2ViQmxvYkRhdGEuY3BwCisrKyBiL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
QmxvYkRhdGEuY3BwCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiV2ViQmxvYkRhdGEuaCIK
IAogI2luY2x1ZGUgIkJsb2JEYXRhLmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KIAog
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAgLTc0LDcgKzc1LDcgQEAgYm9vbCBXZWJCbG9i
RGF0YTo6aXRlbUF0KHNpemVfdCBpbmRleCwgSXRlbSYgcmVzdWx0KSBjb25zdAogICAgIHN3aXRj
aCAoaXRlbS50eXBlKSB7CiAgICAgY2FzZSBCbG9iRGF0YUl0ZW06OkRhdGE6CiAgICAgICAgIHJl
c3VsdC50eXBlID0gSXRlbTo6VHlwZURhdGE7Ci0gICAgICAgIHJlc3VsdC5kYXRhID0gaXRlbS5k
YXRhOworICAgICAgICByZXN1bHQuZGF0YS5hc3NpZ24oaXRlbS5kYXRhLmRhdGEoKSwgaXRlbS5k
YXRhLmxlbmd0aCgpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgY2FzZSBCbG9iRGF0YUl0
ZW06OkZpbGU6CiAgICAgICAgIHJlc3VsdC50eXBlID0gSXRlbTo6VHlwZUZpbGU7CkBAIC04OSw1
NCArOTAsMTggQEAgYm9vbCBXZWJCbG9iRGF0YTo6aXRlbUF0KHNpemVfdCBpbmRleCwgSXRlbSYg
cmVzdWx0KSBjb25zdAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBXZWJCbG9iRGF0YTo6
YXBwZW5kRGF0YShjb25zdCBXZWJDU3RyaW5nJiBkYXRhKQotewotICAgIEFTU0VSVCghaXNOdWxs
KCkpOwotICAgIG1fcHJpdmF0ZS0+YXBwZW5kRGF0YShkYXRhKTsKLX0KLQotdm9pZCBXZWJCbG9i
RGF0YTo6YXBwZW5kRmlsZShjb25zdCBXZWJTdHJpbmcmIGZpbGVQYXRoKQotewotICAgIEFTU0VS
VCghaXNOdWxsKCkpOwotICAgIG1fcHJpdmF0ZS0+YXBwZW5kRmlsZShmaWxlUGF0aCk7Ci19Ci0K
LXZvaWQgV2ViQmxvYkRhdGE6OmFwcGVuZEZpbGUoY29uc3QgV2ViU3RyaW5nJiBmaWxlUGF0aCwg
bG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCwgZG91YmxlIGV4cGVjdGVkTW9kaWZp
Y2F0aW9uVGltZSkKLXsKLSAgICBBU1NFUlQoIWlzTnVsbCgpKTsKLSAgICBtX3ByaXZhdGUtPmFw
cGVuZEZpbGUoZmlsZVBhdGgsIG9mZnNldCwgbGVuZ3RoLCBleHBlY3RlZE1vZGlmaWNhdGlvblRp
bWUpOwotfQotCi12b2lkIFdlYkJsb2JEYXRhOjphcHBlbmRCbG9iKGNvbnN0IFdlYlVSTCYgYmxv
YlVSTCwgbG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkKLXsKLSAgICBBU1NFUlQo
IWlzTnVsbCgpKTsKLSAgICBtX3ByaXZhdGUtPmFwcGVuZEJsb2IoYmxvYlVSTCwgb2Zmc2V0LCBs
ZW5ndGgpOwotfQotCiBXZWJTdHJpbmcgV2ViQmxvYkRhdGE6OmNvbnRlbnRUeXBlKCkgY29uc3QK
IHsKICAgICBBU1NFUlQoIWlzTnVsbCgpKTsKICAgICByZXR1cm4gbV9wcml2YXRlLT5jb250ZW50
VHlwZSgpOwogfQogCi12b2lkIFdlYkJsb2JEYXRhOjpzZXRDb250ZW50VHlwZShjb25zdCBXZWJT
dHJpbmcmIGNvbnRlbnRUeXBlKQotewotICAgIEFTU0VSVCghaXNOdWxsKCkpOwotICAgIG1fcHJp
dmF0ZS0+c2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotfQotCiBXZWJTdHJpbmcgV2ViQmxv
YkRhdGE6OmNvbnRlbnREaXNwb3NpdGlvbigpIGNvbnN0CiB7CiAgICAgQVNTRVJUKCFpc051bGwo
KSk7CiAgICAgcmV0dXJuIG1fcHJpdmF0ZS0+Y29udGVudERpc3Bvc2l0aW9uKCk7CiB9CiAKLXZv
aWQgV2ViQmxvYkRhdGE6OnNldENvbnRlbnREaXNwb3NpdGlvbihjb25zdCBXZWJTdHJpbmcmIGNv
bnRlbnREaXNwb3NpdGlvbikKLXsKLSAgICBBU1NFUlQoIWlzTnVsbCgpKTsKLSAgICBtX3ByaXZh
dGUtPnNldENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24pOwotfQotCiBXZWJC
bG9iRGF0YTo6V2ViQmxvYkRhdGEoY29uc3QgUGFzc093blB0cjxCbG9iRGF0YT4mIGRhdGEpCiAg
ICAgOiBtX3ByaXZhdGUoMCkKIHsK
</data>
<flag name="review"
          id="58367"
          type_id="1"
          status="-"
          setter="levin"
    />
    <flag name="commit-queue"
          id="58368"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70179</attachid>
            <date>2010-10-07 17:42:34 -0700</date>
            <delta_ts>2010-10-08 00:34:50 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>46543_2</filename>
            <type>text/plain</type>
            <size>23447</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MGViODIwMS4uNDcxNTZkOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsNSArMSw2MCBAQAogMjAxMC0xMC0wNyAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CiAKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgRml4IHBhc3NpbmcgYmxvYiBkYXRhIHdpdGggc3RyaW5nIGRhdGEgaXRlbSBi
ZXR3ZWVuIHRocmVhZHMuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD00NjU0MworCisgICAgICAgIFRoZSBmaXggaXMgdG8gdXNlIGEgdGhyZWFkLXNhZmUg
cmVmLWNvdW50ZWQgVmVjdG9yPGNoYXI+IHRvIHN0b3JlIHRoZQorICAgICAgICBzdHJpbmcgZGF0
YS4gVGhpcyBhbHNvIG1ha2VzIHVzIGJlIGFibGUgdG8gc3RvcmUgYW55IGJpbmFyeSBkYXRhIGlu
IGl0LgorCisgICAgICAgIEkndmUgYWxzbyBmaXggQmxvYkJ1aWxkZXIgYW5kIEJsb2JSZWdpc3Ry
eUltcGwgdG8gYXZvaWQgc29tZSBhZGRpdGlvbmFsCisgICAgICAgIGNvcGllcyB0byBtYWtlIGJs
b2IgaGFuZGxpbmcgZmFzdGVyLgorCisgICAgICAgICogZmlsZWFwaS9CbG9iQnVpbGRlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpCbG9iQnVpbGRlcjo6YXBwZW5kKToKKyAgICAgICAgKiBmaWxl
YXBpL1RocmVhZGFibGVCbG9iUmVnaXN0cnkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QmxvYlJl
Z2lzdHJ5Q29udGV4dDo6QmxvYlJlZ2lzdHJ5Q29udGV4dCk6CisgICAgICAgICogcGxhdGZvcm0v
bmV0d29yay9CbG9iRGF0YS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0ZW06OlJh
d0RhdGE6OlJhd0RhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjpSYXdEYXRh
OjpkZXRhY2hGcm9tQ3VycmVudFRocmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0
ZW06OmRldGFjaEZyb21DdXJyZW50VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkJsb2JEYXRh
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGE6OmRldGFjaEZyb21DdXJyZW50
VGhyZWFkKToKKyAgICAgICAgKFdlYkNvcmU6OkJsb2JEYXRhOjphcHBlbmREYXRhKToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9uZXR3b3JrL0Jsb2JEYXRhLmg6CisgICAgICAgIChXZWJDb3JlOjpCbG9i
RGF0YUl0ZW06OlJhd0RhdGE6OmNyZWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0
ZW06OlJhd0RhdGE6OmRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjpSYXdE
YXRhOjpsZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6QmxvYkRhdGFJdGVtOjpSYXdEYXRhOjpt
dXRhYmxlRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpCbG9iRGF0YUl0ZW06OkJsb2JEYXRhSXRl
bSk6CisgICAgICAgICogcGxhdGZvcm0vbmV0d29yay9CbG9iUmVnaXN0cnlJbXBsLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkJsb2JSZWdpc3RyeUltcGw6OnJlZ2lzdGVyQmxvYlVSTCk6CisgICAg
ICAgICogcGxhdGZvcm0vbmV0d29yay9CbG9iUmVzb3VyY2VIYW5kbGUuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6QmxvYlJlc291cmNlSGFuZGxlOjpyZWFkRGF0YVN5bmMpOgorICAgICAgICAoV2Vi
Q29yZTo6QmxvYlJlc291cmNlSGFuZGxlOjpyZWFkRGF0YUFzeW5jKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6
OnNldEhUVFBCb2R5KToKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuY3BwOgor
ICAgICAgICAoT3V0cHV0QnVmZmVyOjpDU3RyaW5nQnVmZmVyOjpDU3RyaW5nQnVmZmVyKToKKyAg
ICAgICAgKE91dHB1dEJ1ZmZlcjo6Q1N0cmluZ0J1ZmZlcjo6fkNTdHJpbmdCdWZmZXIpOgorICAg
ICAgICAoT3V0cHV0QnVmZmVyOjpDU3RyaW5nQnVmZmVyOjphbGxvY2F0ZSk6CisgICAgICAgIChP
dXRwdXRCdWZmZXI6OkNTdHJpbmdCdWZmZXI6OmNvcHkpOgorICAgICAgICAoT3V0cHV0QnVmZmVy
OjpDU3RyaW5nQnVmZmVyOjpidWZmZXIpOgorICAgICAgICAoT3V0cHV0QnVmZmVyOjpWZWN0b3JD
aGFyQXBwZW5kQnVmZmVyOjpWZWN0b3JDaGFyQXBwZW5kQnVmZmVyKToKKyAgICAgICAgKE91dHB1
dEJ1ZmZlcjo6VmVjdG9yQ2hhckFwcGVuZEJ1ZmZlcjo6flZlY3RvckNoYXJBcHBlbmRCdWZmZXIp
OgorICAgICAgICAoT3V0cHV0QnVmZmVyOjpWZWN0b3JDaGFyQXBwZW5kQnVmZmVyOjphbGxvY2F0
ZSk6CisgICAgICAgIChPdXRwdXRCdWZmZXI6OlZlY3RvckNoYXJBcHBlbmRCdWZmZXI6OmNvcHkp
OgorICAgICAgICAoT3V0cHV0QnVmZmVyOjppbnRlcm5hbE5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9D
UkxGKToKKyAgICAgICAgKFdlYkNvcmU6Om5vcm1hbGl6ZVRvQ1JPckxGKToKKyAgICAgICAgKFdl
YkNvcmU6Om5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9DUkxGKToKKyAgICAgICAgKFdlYkNvcmU6Om5v
cm1hbGl6ZUxpbmVFbmRpbmdzVG9DUik6CisgICAgICAgIChXZWJDb3JlOjpub3JtYWxpemVMaW5l
RW5kaW5nc1RvTEYpOgorICAgICAgICAoV2ViQ29yZTo6bm9ybWFsaXplTGluZUVuZGluZ3NUb05h
dGl2ZSk6CisgICAgICAgICogcGxhdGZvcm0vdGV4dC9MaW5lRW5kaW5nLmg6CisKKzIwMTAtMTAt
MDcgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCiAgICAgICAgIFJldmlld2VkIGJ5
IEFkYW0gQmFydGguCiAKICAgICAgICAgU3VwcG9ydCBnZW5lcmF0aW5nIGEgRm9ybURhdGEgb2Jq
ZWN0IGJhc2VkIG9uIHRoZSBkYXRhIGluIGFuIGV4aXN0aW5nIDxmb3JtPi4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvZmlsZWFwaS9CbG9iQnVpbGRlci5jcHAgYi9XZWJDb3JlL2ZpbGVhcGkvQmxvYkJ1
aWxkZXIuY3BwCmluZGV4IDM0ODY0YTUuLjQyM2VlMjEgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvZmls
ZWFwaS9CbG9iQnVpbGRlci5jcHAKKysrIGIvV2ViQ29yZS9maWxlYXBpL0Jsb2JCdWlsZGVyLmNw
cApAQCAtNDEsMzYgKzQxLDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgQ1N0
cmluZyBjb252ZXJ0VG9DU3RyaW5nKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgU3RyaW5nJiBl
bmRpbmdUeXBlLCBFeGNlcHRpb25Db2RlJiBlYykKLXsKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KEF0b21pY1N0cmluZywgdHJhbnNwYXJlbnQsICgidHJhbnNwYXJlbnQiKSk7Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChBdG9taWNTdHJpbmcsIG5hdGl2ZSwgKCJuYXRpdmUiKSk7Ci0KLSAgICBl
YyA9IDA7Ci0KLSAgICBpZiAoZW5kaW5nVHlwZS5pc0VtcHR5KCkgfHwgZW5kaW5nVHlwZSA9PSB0
cmFuc3BhcmVudCkKLSAgICAgICAgcmV0dXJuIFVURjhFbmNvZGluZygpLmVuY29kZSh0ZXh0LmNo
YXJhY3RlcnMoKSwgdGV4dC5sZW5ndGgoKSwgRW50aXRpZXNGb3JVbmVuY29kYWJsZXMpOwotICAg
IGlmIChlbmRpbmdUeXBlID09IG5hdGl2ZSkKLSAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUxpbmVF
bmRpbmdzVG9OYXRpdmUoVVRGOEVuY29kaW5nKCkuZW5jb2RlKHRleHQuY2hhcmFjdGVycygpLCB0
ZXh0Lmxlbmd0aCgpLCBFbnRpdGllc0ZvclVuZW5jb2RhYmxlcykpOwotCi0gICAgZWMgPSBTWU5U
QVhfRVJSOwotICAgIHJldHVybiBDU3RyaW5nKCk7Ci19Ci0KLXN0YXRpYyBDU3RyaW5nIGNvbmNh
dGVuYXRlVHdvQ1N0cmluZ3MoY29uc3QgQ1N0cmluZyYgYSwgY29uc3QgQ1N0cmluZyYgYikKLXsK
LSAgICBpZiAoYS5pc051bGwoKSAmJiBiLmlzTnVsbCgpKQotICAgICAgICByZXR1cm4gQ1N0cmlu
ZygpOwotCi0gICAgY2hhciogcTsKLSAgICBDU3RyaW5nIHJlc3VsdCA9IENTdHJpbmc6Om5ld1Vu
aW5pdGlhbGl6ZWQoYS5sZW5ndGgoKSArIGIubGVuZ3RoKCksIHEpOwotICAgIGlmIChhLmxlbmd0
aCgpKQotICAgICAgICBtZW1jcHkocSwgYS5kYXRhKCksIGEubGVuZ3RoKCkpOwotICAgIGlmIChi
Lmxlbmd0aCgpKQotICAgICAgICBtZW1jcHkocSArIGEubGVuZ3RoKCksIGIuZGF0YSgpLCBiLmxl
bmd0aCgpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiBCbG9iQnVpbGRlcjo6QmxvYkJ1aWxk
ZXIoKQogICAgIDogbV9zaXplKDApCiB7CkBAIC03OCwxNyArNDgsMzAgQEAgQmxvYkJ1aWxkZXI6
OkJsb2JCdWlsZGVyKCkKIAogYm9vbCBCbG9iQnVpbGRlcjo6YXBwZW5kKGNvbnN0IFN0cmluZyYg
dGV4dCwgY29uc3QgU3RyaW5nJiBlbmRpbmdUeXBlLCBFeGNlcHRpb25Db2RlJiBlYykKIHsKLSAg
ICBDU3RyaW5nIGNzdHIgPSBjb252ZXJ0VG9DU3RyaW5nKHRleHQsIGVuZGluZ1R5cGUsIGVjKTsK
LSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBib29sIGlzRW5kaW5nVHlw
ZVRyYW5zcGFyZW50ID0gZW5kaW5nVHlwZSA9PSAidHJhbnNwYXJlbnQiOworICAgIGJvb2wgaXNF
bmRpbmdUeXBlTmF0aXZlID0gZW5kaW5nVHlwZSA9PSAibmF0aXZlIjsKKyAgICBpZiAoIWVuZGlu
Z1R5cGUuaXNFbXB0eSgpICYmICFpc0VuZGluZ1R5cGVUcmFuc3BhcmVudCAmJiAhaXNFbmRpbmdU
eXBlTmF0aXZlKSB7CisgICAgICAgIGVjID0gU1lOVEFYX0VSUjsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorCisgICAgQ1N0cmluZyB1dGY4VGV4dCA9IFVURjhFbmNvZGluZygpLmVuY29kZSh0
ZXh0LmNoYXJhY3RlcnMoKSwgdGV4dC5sZW5ndGgoKSwgRW50aXRpZXNGb3JVbmVuY29kYWJsZXMp
OwogCi0gICAgbV9zaXplICs9IGNzdHIubGVuZ3RoKCk7CisgICAgLy8gSWYgdGhlIGxhc3QgaXRl
bSBpcyBub3QgYSBkYXRhIGl0ZW0sIGNyZWF0ZSBvbmUuIE90aGVyd2lzZSwgd2Ugc2ltcGx5IGFw
cGVuZCB0aGUgbmV3IHN0cmluZyB0byB0aGUgbGFzdCBkYXRhIGl0ZW0uCisgICAgaWYgKG1faXRl
bXMuaXNFbXB0eSgpIHx8IG1faXRlbXNbbV9pdGVtcy5zaXplKCkgLSAxXS50eXBlICE9IEJsb2JE
YXRhSXRlbTo6RGF0YSkKKyAgICAgICAgbV9pdGVtcy5hcHBlbmQoQmxvYkRhdGFJdGVtKEJsb2JE
YXRhSXRlbTo6UmF3RGF0YTo6Y3JlYXRlKCkpKTsKKworICAgIGlmICghdXRmOFRleHQuaXNOdWxs
KCkpIHsKKyAgICAgICAgVmVjdG9yPGNoYXI+JiBidWZmZXIgPSAqbV9pdGVtc1ttX2l0ZW1zLnNp
emUoKSAtIDFdLmRhdGEtPm11dGFibGVEYXRhKCk7CisgICAgICAgIHVuc2lnbmVkIG9sZFNpemUg
PSBidWZmZXIuc2l6ZSgpOworCisgICAgICAgIGlmIChpc0VuZGluZ1R5cGVOYXRpdmUpCisgICAg
ICAgICAgICBub3JtYWxpemVMaW5lRW5kaW5nc1RvTmF0aXZlKHV0ZjhUZXh0LCBidWZmZXIpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHV0ZjhUZXh0LmRhdGEoKSwg
dXRmOFRleHQubGVuZ3RoKCkpOworICAgICAgICBtX3NpemUgKz0gYnVmZmVyLnNpemUoKSAtIG9s
ZFNpemU7CisgICAgfQogCi0gICAgLy8gSWYgdGhlIGxhc3QgaXRlbSBpcyBhIHN0cmluZywgY29u
Y2F0ZW5hdGUgaXQgd2l0aCBjdXJyZW50IHN0cmluZy4KLSAgICBpZiAoIW1faXRlbXMuaXNFbXB0
eSgpICYmIG1faXRlbXNbbV9pdGVtcy5zaXplKCkgLSAxXS50eXBlID09IEJsb2JEYXRhSXRlbTo6
RGF0YSkKLSAgICAgICAgbV9pdGVtc1ttX2l0ZW1zLnNpemUoKSAtIDFdLmRhdGEgPSBjb25jYXRl
bmF0ZVR3b0NTdHJpbmdzKG1faXRlbXNbbV9pdGVtcy5zaXplKCkgLSAxXS5kYXRhLCBjc3RyKTsK
LSAgICBlbHNlCi0gICAgICAgIG1faXRlbXMuYXBwZW5kKEJsb2JEYXRhSXRlbShjc3RyKSk7CiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvZmlsZWFwaS9UaHJlYWRh
YmxlQmxvYlJlZ2lzdHJ5LmNwcCBiL1dlYkNvcmUvZmlsZWFwaS9UaHJlYWRhYmxlQmxvYlJlZ2lz
dHJ5LmNwcAppbmRleCBmNzRjNjgwLi4yZWM0MjFiIDEwMDY0NAotLS0gYS9XZWJDb3JlL2ZpbGVh
cGkvVGhyZWFkYWJsZUJsb2JSZWdpc3RyeS5jcHAKKysrIGIvV2ViQ29yZS9maWxlYXBpL1RocmVh
ZGFibGVCbG9iUmVnaXN0cnkuY3BwCkBAIC00MSw4ICs0MSw5IEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIHN0cnVjdCBCbG9iUmVnaXN0cnlDb250ZXh0IHsKICAgICBCbG9iUmVnaXN0cnlDb250ZXh0
KGNvbnN0IEtVUkwmIHVybCwgUGFzc093blB0cjxCbG9iRGF0YT4gYmxvYkRhdGEpCiAgICAgICAg
IDogdXJsKHVybC5jb3B5KCkpCi0gICAgICAgICwgYmxvYkRhdGEoYmxvYkRhdGEtPmNvcHkoKSkK
KyAgICAgICAgLCBibG9iRGF0YShibG9iRGF0YSkKICAgICB7CisgICAgICAgIHRoaXMtPmJsb2JE
YXRhLT5kZXRhY2hGcm9tQ3VycmVudFRocmVhZCgpOwogICAgIH0KIAogICAgIEJsb2JSZWdpc3Ry
eUNvbnRleHQoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBzcmNVUkwpCmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvQmxvYkRhdGEuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL0Jsb2JEYXRhLmNwcAppbmRleCAyMWU4OTE3Li5lOGFmYjc0IDEwMDY0NAotLS0g
YS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvQmxvYkRhdGEuY3BwCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9CbG9iRGF0YS5jcHAKQEAgLTMxLDQwICszMSw0NiBAQAogI2luY2x1ZGUg
ImNvbmZpZy5oIgogI2luY2x1ZGUgIkJsb2JEYXRhLmgiCiAKKyNpbmNsdWRlIDx3dGYvT3duUHRy
Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0
ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY29uc3QgbG9uZyBsb25nIEJsb2JEYXRhSXRlbTo6dG9F
bmRPZkZpbGUgPSAtMTsKIGNvbnN0IGRvdWJsZSBCbG9iRGF0YUl0ZW06OmRvTm90Q2hlY2tGaWxl
Q2hhbmdlID0gMDsKIAotdm9pZCBCbG9iRGF0YUl0ZW06OmNvcHkoY29uc3QgQmxvYkRhdGFJdGVt
JiBpdGVtKQorQmxvYkRhdGFJdGVtOjpSYXdEYXRhOjpSYXdEYXRhKCkKIHsKLSAgICB0eXBlID0g
aXRlbS50eXBlOwotICAgIGRhdGEgPSBpdGVtLmRhdGE7IC8vIFRoaXMgaXMgT0sgYmVjYXVzZSB0
aGUgdW5kZXJseWluZyBzdG9yYWdlIGlzIFZlY3RvcjxjaGFyPi4KLSAgICBwYXRoID0gaXRlbS5w
YXRoLmNyb3NzVGhyZWFkU3RyaW5nKCk7Ci0gICAgdXJsID0gaXRlbS51cmwuY29weSgpOwotICAg
IG9mZnNldCA9IGl0ZW0ub2Zmc2V0OwotICAgIGxlbmd0aCA9IGl0ZW0ubGVuZ3RoOwotICAgIGV4
cGVjdGVkTW9kaWZpY2F0aW9uVGltZSA9IGl0ZW0uZXhwZWN0ZWRNb2RpZmljYXRpb25UaW1lOwog
fQogCi1QYXNzT3duUHRyPEJsb2JEYXRhPiBCbG9iRGF0YTo6Y29weSgpIGNvbnN0Cit2b2lkIEJs
b2JEYXRhSXRlbTo6UmF3RGF0YTo6ZGV0YWNoRnJvbUN1cnJlbnRUaHJlYWQoKQogewotICAgIE93
blB0cjxCbG9iRGF0YT4gYmxvYkRhdGEgPSBhZG9wdFB0cihuZXcgQmxvYkRhdGEoKSk7Ci0gICAg
YmxvYkRhdGEtPm1fY29udGVudFR5cGUgPSBtX2NvbnRlbnRUeXBlLmNyb3NzVGhyZWFkU3RyaW5n
KCk7Ci0gICAgYmxvYkRhdGEtPm1fY29udGVudERpc3Bvc2l0aW9uID0gbV9jb250ZW50RGlzcG9z
aXRpb24uY3Jvc3NUaHJlYWRTdHJpbmcoKTsKLSAgICBibG9iRGF0YS0+bV9pdGVtcy5yZXNpemUo
bV9pdGVtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9pdGVtcy5zaXpl
KCk7ICsraSkKLSAgICAgICAgYmxvYkRhdGEtPm1faXRlbXMuYXQoaSkuY29weShtX2l0ZW1zLmF0
KGkpKTsKK30KKwordm9pZCBCbG9iRGF0YUl0ZW06OmRldGFjaEZyb21DdXJyZW50VGhyZWFkKCkK
K3sKKyAgICBkYXRhLT5kZXRhY2hGcm9tQ3VycmVudFRocmVhZCgpOworICAgIHBhdGggPSBwYXRo
LmNyb3NzVGhyZWFkU3RyaW5nKCk7CisgICAgdXJsID0gdXJsLmNvcHkoKTsKK30KIAotICAgIHJl
dHVybiBibG9iRGF0YS5yZWxlYXNlKCk7CitQYXNzT3duUHRyPEJsb2JEYXRhPiBCbG9iRGF0YTo6
Y3JlYXRlKCkKK3sKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IEJsb2JEYXRhKCkpOwogfQogCi12
b2lkIEJsb2JEYXRhOjphcHBlbmREYXRhKGNvbnN0IENTdHJpbmcmIGRhdGEpCit2b2lkIEJsb2JE
YXRhOjpkZXRhY2hGcm9tQ3VycmVudFRocmVhZCgpCiB7Ci0gICAgbV9pdGVtcy5hcHBlbmQoQmxv
YkRhdGFJdGVtKGRhdGEpKTsKKyAgICBtX2NvbnRlbnRUeXBlID0gbV9jb250ZW50VHlwZS5jcm9z
c1RocmVhZFN0cmluZygpOworICAgIG1fY29udGVudERpc3Bvc2l0aW9uID0gbV9jb250ZW50RGlz
cG9zaXRpb24uY3Jvc3NUaHJlYWRTdHJpbmcoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IG1faXRlbXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1faXRlbXMuYXQoaSkuZGV0YWNoRnJvbUN1
cnJlbnRUaHJlYWQoKTsKIH0KIAotdm9pZCBCbG9iRGF0YTo6YXBwZW5kRGF0YShjb25zdCBDU3Ry
aW5nJiBkYXRhLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKQordm9pZCBCbG9i
RGF0YTo6YXBwZW5kRGF0YShQYXNzUmVmUHRyPEJsb2JEYXRhSXRlbTo6UmF3RGF0YT4gZGF0YSwg
bG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkKIHsKICAgICBtX2l0ZW1zLmFwcGVu
ZChCbG9iRGF0YUl0ZW0oZGF0YSwgb2Zmc2V0LCBsZW5ndGgpKTsKIH0KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iRGF0YS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL0Jsb2JEYXRhLmgKaW5kZXggMTNlM2I5Yy4uZjJkMjMxOSAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL0Jsb2JEYXRhLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL0Jsb2JEYXRhLmgKQEAgLTMzLDkgKzMzLDggQEAKIAogI2luY2x1ZGUgIktVUkwuaCIKICNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgotI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+Ci0j
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKyNp
bmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlU2hhcmVkLmg+
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNDMsNiArNDIsMjUgQEAgc3RydWN0IEJsb2JE
YXRhSXRlbSB7CiAgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyB0b0VuZE9mRmlsZTsKICAgICBz
dGF0aWMgY29uc3QgZG91YmxlIGRvTm90Q2hlY2tGaWxlQ2hhbmdlOwogCisgICAgY2xhc3MgUmF3
RGF0YSA6IHB1YmxpYyBUaHJlYWRTYWZlU2hhcmVkPFJhd0RhdGE+IHsKKyAgICBwdWJsaWM6Cisg
ICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJhd0RhdGE+IGNyZWF0ZSgpCisgICAgICAgIHsKKyAg
ICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgUmF3RGF0YSgpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIHZvaWQgZGV0YWNoRnJvbUN1cnJlbnRUaHJlYWQoKTsKKworICAgICAgICBjb25zdCBj
aGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLmRhdGEoKTsgfQorICAgICAgICBzaXpl
X3QgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLnNpemUoKTsgfQorICAgICAgICBWZWN0
b3I8Y2hhcj4qIG11dGFibGVEYXRhKCkgeyByZXR1cm4gJm1fZGF0YTsgfQorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgUmF3RGF0YSgpOworCisgICAgICAgIFZlY3RvcjxjaGFyPiBtX2RhdGE7Cisg
ICAgfTsKKwogICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgQmxvYkRhdGFJdGVtKCkK
ICAgICAgICAgOiB0eXBlKERhdGEpCkBAIC01Myw3ICs3MSw3IEBAIHN0cnVjdCBCbG9iRGF0YUl0
ZW0gewogICAgIH0KIAogICAgIC8vIENvbnN0cnVjdG9yIGZvciBTdHJpbmcgdHlwZSAoY29tcGxl
dGUgc3RyaW5nKS4KLSAgICBleHBsaWNpdCBCbG9iRGF0YUl0ZW0oY29uc3QgQ1N0cmluZyYgZGF0
YSkKKyAgICBleHBsaWNpdCBCbG9iRGF0YUl0ZW0oUGFzc1JlZlB0cjxCbG9iRGF0YUl0ZW06OlJh
d0RhdGE+IGRhdGEpCiAgICAgICAgIDogdHlwZShEYXRhKQogICAgICAgICAsIGRhdGEoZGF0YSkK
ICAgICAgICAgLCBvZmZzZXQoMCkKQEAgLTYyLDE2ICs4MCw2IEBAIHN0cnVjdCBCbG9iRGF0YUl0
ZW0gewogICAgIHsKICAgICB9CiAKLSAgICAvLyBDb25zdHJ1Y3RvciBmb3IgU3RyaW5nIHR5cGUg
KHBhcnRpYWwgc3RyaW5nKS4KLSAgICBCbG9iRGF0YUl0ZW0oY29uc3QgQ1N0cmluZyYgZGF0YSwg
bG9uZyBsb25nIG9mZnNldCwgbG9uZyBsb25nIGxlbmd0aCkKLSAgICAgICAgOiB0eXBlKERhdGEp
Ci0gICAgICAgICwgZGF0YShkYXRhKQotICAgICAgICAsIG9mZnNldChvZmZzZXQpCi0gICAgICAg
ICwgbGVuZ3RoKGxlbmd0aCkKLSAgICAgICAgLCBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWUoZG9O
b3RDaGVja0ZpbGVDaGFuZ2UpCi0gICAgewotICAgIH0KLQogICAgIC8vIENvbnN0cnVjdG9yIGZv
ciBGaWxlIHR5cGUgKGNvbXBsZXRlIGZpbGUpLgogICAgIGV4cGxpY2l0IEJsb2JEYXRhSXRlbShj
b25zdCBTdHJpbmcmIHBhdGgpCiAgICAgICAgIDogdHlwZShGaWxlKQpAQCAtMTAyLDEzICsxMTAs
MTMgQEAgc3RydWN0IEJsb2JEYXRhSXRlbSB7CiAgICAgewogICAgIH0KIAotICAgIC8vIEdldHMg
YSBjb3B5IG9mIHRoZSBkYXRhIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGFub3RoZXIgdGhyZWFk
LgotICAgIHZvaWQgY29weShjb25zdCBCbG9iRGF0YUl0ZW0mKTsKKyAgICAvLyBEZXRhY2hlcyBm
cm9tIGN1cnJlbnQgdGhyZWFkIHNvIHRoYXQgaXQgY2FuIGJlIHBhc3NlZCB0byBhbm90aGVyIHRo
cmVhZC4KKyAgICB2b2lkIGRldGFjaEZyb21DdXJyZW50VGhyZWFkKCk7CiAKICAgICBlbnVtIHsg
RGF0YSwgRmlsZSwgQmxvYiB9IHR5cGU7CiAgICAgCiAgICAgLy8gRm9yIERhdGEgdHlwZS4KLSAg
ICBDU3RyaW5nIGRhdGE7CisgICAgUmVmUHRyPFJhd0RhdGE+IGRhdGE7CiAKICAgICAvLyBGb3Ig
RmlsZSB0eXBlLgogICAgIFN0cmluZyBwYXRoOwpAQCAtMTE5LDE5ICsxMjcsMjkgQEAgc3RydWN0
IEJsb2JEYXRhSXRlbSB7CiAgICAgbG9uZyBsb25nIG9mZnNldDsKICAgICBsb25nIGxvbmcgbGVu
Z3RoOwogICAgIGRvdWJsZSBleHBlY3RlZE1vZGlmaWNhdGlvblRpbWU7CisKK3ByaXZhdGU6Cisg
ICAgZnJpZW5kIGNsYXNzIEJsb2JEYXRhOworCisgICAgLy8gQ29uc3RydWN0b3IgZm9yIFN0cmlu
ZyB0eXBlIChwYXJ0aWFsIHN0cmluZykuCisgICAgQmxvYkRhdGFJdGVtKFBhc3NSZWZQdHI8Qmxv
YkRhdGFJdGVtOjpSYXdEYXRhPiBkYXRhLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVu
Z3RoKQorICAgICAgICA6IHR5cGUoRGF0YSkKKyAgICAgICAgLCBkYXRhKGRhdGEpCisgICAgICAg
ICwgb2Zmc2V0KG9mZnNldCkKKyAgICAgICAgLCBsZW5ndGgobGVuZ3RoKQorICAgICAgICAsIGV4
cGVjdGVkTW9kaWZpY2F0aW9uVGltZShkb05vdENoZWNrRmlsZUNoYW5nZSkKKyAgICB7CisgICAg
fQogfTsKIAogdHlwZWRlZiBWZWN0b3I8QmxvYkRhdGFJdGVtPiBCbG9iRGF0YUl0ZW1MaXN0Owog
CiBjbGFzcyBCbG9iRGF0YSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBhc3NPd25QdHI8QmxvYkRh
dGE+IGNyZWF0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYWRvcHRQdHIobmV3IEJsb2JEYXRh
KCkpOwotICAgIH0KKyAgICBzdGF0aWMgUGFzc093blB0cjxCbG9iRGF0YT4gY3JlYXRlKCk7CiAK
LSAgICAvLyBHZXRzIGEgY29weSBvZiB0aGUgZGF0YSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBh
bm90aGVyIHRocmVhZC4KLSAgICBQYXNzT3duUHRyPEJsb2JEYXRhPiBjb3B5KCkgY29uc3Q7Cisg
ICAgLy8gRGV0YWNoZXMgZnJvbSBjdXJyZW50IHRocmVhZCBzbyB0aGF0IGl0IGNhbiBiZSBwYXNz
ZWQgdG8gYW5vdGhlciB0aHJlYWQuCisgICAgdm9pZCBkZXRhY2hGcm9tQ3VycmVudFRocmVhZCgp
OwogCiAgICAgY29uc3QgU3RyaW5nJiBjb250ZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGVudFR5cGU7IH0KICAgICB2b2lkIHNldENvbnRlbnRUeXBlKGNvbnN0IFN0cmluZyYgY29udGVu
dFR5cGUpIHsgbV9jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOyB9CkBAIC0xNDEsOCArMTU5LDgg
QEAgcHVibGljOgogCiAgICAgY29uc3QgQmxvYkRhdGFJdGVtTGlzdCYgaXRlbXMoKSBjb25zdCB7
IHJldHVybiBtX2l0ZW1zOyB9CiAgICAgdm9pZCBzd2FwSXRlbXMoQmxvYkRhdGFJdGVtTGlzdCYp
OwotICAgIAotICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBDU3RyaW5nJik7CisKKyAgICB2b2lk
IGFwcGVuZERhdGEoUGFzc1JlZlB0cjxCbG9iRGF0YUl0ZW06OlJhd0RhdGE+LCBsb25nIGxvbmcg
b2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKTsKICAgICB2b2lkIGFwcGVuZEZpbGUoY29uc3QgU3Ry
aW5nJiBwYXRoKTsKICAgICB2b2lkIGFwcGVuZEZpbGUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25n
IGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoLCBkb3VibGUgZXhwZWN0ZWRNb2RpZmljYXRp
b25UaW1lKTsKICAgICB2b2lkIGFwcGVuZEJsb2IoY29uc3QgS1VSTCYsIGxvbmcgbG9uZyBvZmZz
ZXQsIGxvbmcgbG9uZyBsZW5ndGgpOwpAQCAtMTU0LDcgKzE3Miw3IEBAIHByaXZhdGU6CiAgICAg
QmxvYkRhdGEoKSB7IH0KIAogICAgIC8vIFRoaXMgaXMgb25seSBleHBvc2VkIHRvIEJsb2JTdG9y
YWdlRGF0YS4KLSAgICB2b2lkIGFwcGVuZERhdGEoY29uc3QgQ1N0cmluZyYsIGxvbmcgbG9uZyBv
ZmZzZXQsIGxvbmcgbG9uZyBsZW5ndGgpOworICAgIHZvaWQgYXBwZW5kRGF0YShjb25zdCBCbG9i
RGF0YUl0ZW06OlJhd0RhdGEmLCBsb25nIGxvbmcgb2Zmc2V0LCBsb25nIGxvbmcgbGVuZ3RoKTsK
IAogICAgIFN0cmluZyBtX2NvbnRlbnRUeXBlOwogICAgIFN0cmluZyBtX2NvbnRlbnREaXNwb3Np
dGlvbjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iUmVnaXN0cnlJ
bXBsLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9CbG9iUmVnaXN0cnlJbXBsLmNwcApp
bmRleCBjNWJlYjY0Li4yYzRlOGZhIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsvQmxvYlJlZ2lzdHJ5SW1wbC5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0Js
b2JSZWdpc3RyeUltcGwuY3BwCkBAIC0xMzQsNyArMTM0LDcgQEAgdm9pZCBCbG9iUmVnaXN0cnlJ
bXBsOjpyZWdpc3RlckJsb2JVUkwoY29uc3QgS1VSTCYgdXJsLCBQYXNzT3duUHRyPEJsb2JEYXRh
PiBibG8KICAgICBmb3IgKEJsb2JEYXRhSXRlbUxpc3Q6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBi
bG9iRGF0YS0+aXRlbXMoKS5iZWdpbigpOyBpdGVyICE9IGJsb2JEYXRhLT5pdGVtcygpLmVuZCgp
OyArK2l0ZXIpIHsKICAgICAgICAgc3dpdGNoIChpdGVyLT50eXBlKSB7CiAgICAgICAgIGNhc2Ug
QmxvYkRhdGFJdGVtOjpEYXRhOgotICAgICAgICAgICAgYmxvYlN0b3JhZ2VEYXRhLT5tX2RhdGEu
YXBwZW5kRGF0YShpdGVyLT5kYXRhLCAwLCBpdGVyLT5kYXRhLmxlbmd0aCgpKTsKKyAgICAgICAg
ICAgIGJsb2JTdG9yYWdlRGF0YS0+bV9kYXRhLmFwcGVuZERhdGEoaXRlci0+ZGF0YSwgMCwgaXRl
ci0+ZGF0YS0+bGVuZ3RoKCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQmxv
YkRhdGFJdGVtOjpGaWxlOgogICAgICAgICAgICAgYmxvYlN0b3JhZ2VEYXRhLT5tX2RhdGEuYXBw
ZW5kRmlsZShpdGVyLT5wYXRoLCBpdGVyLT5vZmZzZXQsIGl0ZXItPmxlbmd0aCwgaXRlci0+ZXhw
ZWN0ZWRNb2RpZmljYXRpb25UaW1lKTsKQEAgLTE1OCwxMCArMTU4LDcgQEAgdm9pZCBCbG9iUmVn
aXN0cnlJbXBsOjpyZWdpc3RlckJsb2JVUkwoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBLVVJMJiBz
cmNVUkwpCiAgICAgaWYgKCFzcmMpCiAgICAgICAgIHJldHVybjsKIAotICAgIFJlZlB0cjxCbG9i
U3RvcmFnZURhdGE+IGJsb2JTdG9yYWdlRGF0YSA9IEJsb2JTdG9yYWdlRGF0YTo6Y3JlYXRlKHNy
Yy0+Y29udGVudFR5cGUoKSwgc3JjLT5jb250ZW50RGlzcG9zaXRpb24oKSk7Ci0gICAgYXBwZW5k
U3RvcmFnZUl0ZW1zKGJsb2JTdG9yYWdlRGF0YS5nZXQoKSwgc3JjLT5pdGVtcygpKTsKLSAgICAK
LSAgICBtX2Jsb2JzLnNldCh1cmwuc3RyaW5nKCksIGJsb2JTdG9yYWdlRGF0YSk7CisgICAgbV9i
bG9icy5zZXQodXJsLnN0cmluZygpLCBzcmMpOwogfQogCiB2b2lkIEJsb2JSZWdpc3RyeUltcGw6
OnVucmVnaXN0ZXJCbG9iVVJMKGNvbnN0IEtVUkwmIHVybCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vbmV0d29yay9CbG9iUmVzb3VyY2VIYW5kbGUuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9uZXR3b3JrL0Jsb2JSZXNvdXJjZUhhbmRsZS5jcHAKaW5kZXggNDhhYzJjMC4uNzUzMDUyYSAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0Jsb2JSZXNvdXJjZUhhbmRsZS5j
cHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0Jsb2JSZXNvdXJjZUhhbmRsZS5jcHAK
QEAgLTM1OSw3ICszNTksNyBAQCBpbnQgQmxvYlJlc291cmNlSGFuZGxlOjpyZWFkRGF0YVN5bmMo
Y29uc3QgQmxvYkRhdGFJdGVtJiBpdGVtLCBjaGFyKiBidWYsIGludCBsZQogICAgIGludCBieXRl
c1RvUmVhZCA9IChsZW5ndGggPiByZW1haW5pbmcpID8gc3RhdGljX2Nhc3Q8aW50PihyZW1haW5p
bmcpIDogbGVuZ3RoOwogICAgIGlmIChieXRlc1RvUmVhZCA+IG1fdG90YWxSZW1haW5pbmdTaXpl
KQogICAgICAgICBieXRlc1RvUmVhZCA9IHN0YXRpY19jYXN0PGludD4obV90b3RhbFJlbWFpbmlu
Z1NpemUpOwotICAgIG1lbWNweShidWYsIGl0ZW0uZGF0YS5kYXRhKCkgKyBpdGVtLm9mZnNldCAr
IG1fY3VycmVudEl0ZW1SZWFkU2l6ZSwgYnl0ZXNUb1JlYWQpOworICAgIG1lbWNweShidWYsIGl0
ZW0uZGF0YS0+ZGF0YSgpICsgaXRlbS5vZmZzZXQgKyBtX2N1cnJlbnRJdGVtUmVhZFNpemUsIGJ5
dGVzVG9SZWFkKTsKICAgICBtX3RvdGFsUmVtYWluaW5nU2l6ZSAtPSBieXRlc1RvUmVhZDsKIAog
ICAgIG1fY3VycmVudEl0ZW1SZWFkU2l6ZSArPSBieXRlc1RvUmVhZDsKQEAgLTQzNCw3ICs0MzQs
NyBAQCB2b2lkIEJsb2JSZXNvdXJjZUhhbmRsZTo6cmVhZERhdGFBc3luYyhjb25zdCBCbG9iRGF0
YUl0ZW0mIGl0ZW0pCiAgICAgbG9uZyBsb25nIGJ5dGVzVG9SZWFkID0gaXRlbS5sZW5ndGggLSBt
X2N1cnJlbnRJdGVtUmVhZFNpemU7CiAgICAgaWYgKGJ5dGVzVG9SZWFkID4gbV90b3RhbFJlbWFp
bmluZ1NpemUpCiAgICAgICAgIGJ5dGVzVG9SZWFkID0gbV90b3RhbFJlbWFpbmluZ1NpemU7Ci0g
ICAgY29uc3VtZURhdGEoaXRlbS5kYXRhLmRhdGEoKSArIGl0ZW0ub2Zmc2V0ICsgbV9jdXJyZW50
SXRlbVJlYWRTaXplLCBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzVG9SZWFkKSk7CisgICAgY29uc3Vt
ZURhdGEoaXRlbS5kYXRhLT5kYXRhKCkgKyBpdGVtLm9mZnNldCArIG1fY3VycmVudEl0ZW1SZWFk
U2l6ZSwgc3RhdGljX2Nhc3Q8aW50PihieXRlc1RvUmVhZCkpOwogICAgIG1fY3VycmVudEl0ZW1S
ZWFkU2l6ZSA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9t
YWMvRm9ybURhdGFTdHJlYW1NYWMubW0gYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvbWFjL0Zv
cm1EYXRhU3RyZWFtTWFjLm1tCmluZGV4IGVkOTgzNTYuLjliNTg4NGYgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9tYWMvRm9ybURhdGFTdHJlYW1NYWMubW0KKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL21hYy9Gb3JtRGF0YVN0cmVhbU1hYy5tbQpAQCAtNDI0LDcg
KzQyNCw3IEBAIHZvaWQgc2V0SFRUUEJvZHkoTlNNdXRhYmxlVVJMUmVxdWVzdCAqcmVxdWVzdCwg
UGFzc1JlZlB0cjxGb3JtRGF0YT4gZm9ybURhdGEpCiAgICAgICAgICAgICAgICAgICAgIGZvciAo
c2l6ZV90IGogPSAwOyBqIDwgYmxvYkRhdGEtPml0ZW1zKCkuc2l6ZSgpOyArK2opIHsKICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2JEYXRhSXRlbSYgYmxvYkl0ZW0gPSBibG9iRGF0
YS0+aXRlbXMoKVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9iSXRlbS50eXBl
ID09IEJsb2JEYXRhSXRlbTo6RGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5l
d0Zvcm1EYXRhLT5hcHBlbmREYXRhKGJsb2JJdGVtLmRhdGEuZGF0YSgpICsgc3RhdGljX2Nhc3Q8
aW50PihibG9iSXRlbS5vZmZzZXQpLCBzdGF0aWNfY2FzdDxpbnQ+KGJsb2JJdGVtLmxlbmd0aCkp
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm1EYXRhLT5hcHBlbmREYXRhKGJs
b2JJdGVtLmRhdGEtPmRhdGEoKSArIHN0YXRpY19jYXN0PGludD4oYmxvYkl0ZW0ub2Zmc2V0KSwg
c3RhdGljX2Nhc3Q8aW50PihibG9iSXRlbS5sZW5ndGgpKTsKICAgICAgICAgICAgICAgICAgICAg
ICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUKGJsb2JJdGVt
LnR5cGUgPT0gQmxvYkRhdGFJdGVtOjpGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBuZXdGb3JtRGF0YS0+YXBwZW5kRmlsZVJhbmdlKGJsb2JJdGVtLnBhdGgsIGJsb2JJdGVtLm9m
ZnNldCwgYmxvYkl0ZW0ubGVuZ3RoLCBibG9iSXRlbS5leHBlY3RlZE1vZGlmaWNhdGlvblRpbWUp
OwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuY3BwCmluZGV4IDE3YTk3ODYuLjQ3ZDIyMjEg
MTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9MaW5lRW5kaW5nLmNwcAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3RleHQvTGluZUVuZGluZy5jcHAKQEAgLTM1LDExICszNSw3MCBAQAog
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgogCi1uYW1lc3BhY2UgV2ViQ29yZSB7CituYW1lc3BhY2UgewogCi0vLyBOb3JtYWxpemUgYWxs
IGxpbmUtZW5kaW5ncyB0byBDUkxGLgotQ1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvQ1JM
Rihjb25zdCBDU3RyaW5nJiBmcm9tKQorY2xhc3MgT3V0cHV0QnVmZmVyIHsKK3B1YmxpYzoKKyAg
ICB2aXJ0dWFsIGNoYXIqIGFsbG9jYXRlKHNpemVfdCBzaXplKSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIGNvcHkoY29uc3QgQ1N0cmluZyYpID0gMDsKKyAgICB2aXJ0dWFsIH5PdXRwdXRCdWZmZXIo
KSB7IH0KK307CisKK2NsYXNzIENTdHJpbmdCdWZmZXIgOiBwdWJsaWMgT3V0cHV0QnVmZmVyIHsK
K3B1YmxpYzoKKyAgICBDU3RyaW5nQnVmZmVyKENTdHJpbmcmIGJ1ZmZlcikKKyAgICAgICAgOiBt
X2J1ZmZlcihidWZmZXIpCisgICAgeworICAgIH0KKyAgICB2aXJ0dWFsIH5DU3RyaW5nQnVmZmVy
KCkgeyB9CisKKyAgICB2aXJ0dWFsIGNoYXIqIGFsbG9jYXRlKHNpemVfdCBzaXplKQorICAgIHsK
KyAgICAgICAgY2hhciogcHRyOworICAgICAgICBtX2J1ZmZlciA9IENTdHJpbmc6Om5ld1VuaW5p
dGlhbGl6ZWQoc2l6ZSwgcHRyKTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgY29weShjb25zdCBDU3RyaW5nJiBzb3VyY2UpCisgICAgeworICAgICAgICBt
X2J1ZmZlciA9IHNvdXJjZTsKKyAgICB9CisKKyAgICBjb25zdCBDU3RyaW5nJiBidWZmZXIoKSBj
b25zdCB7IHJldHVybiBtX2J1ZmZlcjsgfQorCitwcml2YXRlOgorICAgIENTdHJpbmcgbV9idWZm
ZXI7Cit9OworCisjaWYgT1MoV0lORE9XUykKK2NsYXNzIFZlY3RvckNoYXJBcHBlbmRCdWZmZXIg
OiBwdWJsaWMgT3V0cHV0QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBWZWN0b3JDaGFyQXBwZW5kQnVm
ZmVyKFZlY3RvcjxjaGFyPiYgYnVmZmVyKQorICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZlcikKKyAg
ICB7CisgICAgfQorICAgIHZpcnR1YWwgflZlY3RvckNoYXJBcHBlbmRCdWZmZXIoKSB7IH0KKwor
ICAgIHZpcnR1YWwgY2hhciogYWxsb2NhdGUoc2l6ZV90IHNpemUpCisgICAgeworICAgICAgICBz
aXplX3Qgb2xkU2l6ZSA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICAgICAgbV9idWZmZXIuZ3Jvdyhv
bGRTaXplICsgc2l6ZSk7CisgICAgICAgIHJldHVybiBtX2J1ZmZlci5kYXRhKCkgKyBvbGRTaXpl
OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjb3B5KGNvbnN0IENTdHJpbmcmIHNvdXJjZSkK
KyAgICB7CisgICAgICAgIG1fYnVmZmVyLmFwcGVuZChzb3VyY2UuZGF0YSgpLCBzb3VyY2UubGVu
Z3RoKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8Y2hhcj4mIG1fYnVmZmVyOwor
fTsKKyNlbmRpZgorCit2b2lkIGludGVybmFsTm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29u
c3QgQ1N0cmluZyYgZnJvbSwgT3V0cHV0QnVmZmVyJiBidWZmZXIpCiB7CisgICAgLy8gQ29tcHV0
ZSB0aGUgbmV3IGxlbmd0aC4KICAgICBzaXplX3QgbmV3TGVuID0gMDsKICAgICBjb25zdCBjaGFy
KiBwID0gZnJvbS5kYXRhKCk7CiAgICAgd2hpbGUgKGNoYXIgYyA9ICpwKyspIHsKQEAgLTU3LDE1
ICsxMTYsMTggQEAgQ1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvQ1JMRihjb25zdCBDU3Ry
aW5nJiBmcm9tKQogICAgICAgICAgICAgbmV3TGVuICs9IDE7CiAgICAgICAgIH0KICAgICB9Ci0g
ICAgaWYgKG5ld0xlbiA9PSBmcm9tLmxlbmd0aCgpKQotICAgICAgICByZXR1cm4gZnJvbTsKICAg
ICBpZiAobmV3TGVuIDwgZnJvbS5sZW5ndGgoKSkKLSAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG5ld0xlbiA9PSBmcm9tLmxlbmd0aCgpKSB7Cisg
ICAgICAgIGJ1ZmZlci5jb3B5KGZyb20pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAg
Ly8gTWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZy4KICAgICBwID0gZnJvbS5kYXRhKCk7Ci0gICAg
Y2hhciogcTsKLSAgICBDU3RyaW5nIHJlc3VsdCA9IENTdHJpbmc6Om5ld1VuaW5pdGlhbGl6ZWQo
bmV3TGVuLCBxKTsKKyAgICBjaGFyKiBxID0gYnVmZmVyLmFsbG9jYXRlKG5ld0xlbik7CisKKyAg
ICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc3RyaW5nLgogICAgIHdoaWxlIChjaGFyIGMgPSAqcCsr
KSB7CiAgICAgICAgIGlmIChjID09ICdccicpIHsKICAgICAgICAgICAgIC8vIFNhZmUgdG8gbG9v
ayBhaGVhZCBiZWNhdXNlIG9mIHRyYWlsaW5nICdcMCcuCkBAIC04MywxMiArMTQ1LDE4IEBAIENT
dHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0cmluZyYgZnJvbSkKICAg
ICAgICAgICAgICpxKysgPSBjOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7
CiB9CiAKK307CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBub3JtYWxpemVUb0NST3JM
Rihjb25zdCBDU3RyaW5nJiBmcm9tLCBWZWN0b3I8Y2hhcj4mIHJlc3VsdCwgYm9vbCB0b0NSKTsK
KwogLy8gTm9ybWFsaXplIGFsbCBsaW5lLWVuZGluZ3MgdG8gQ1Igb3IgTEYuCi1zdGF0aWMgQ1N0
cmluZyBub3JtYWxpemVUb0NST3JMRihjb25zdCBDU3RyaW5nJiBmcm9tLCBib29sIHRvQ1IpCit2
b2lkIG5vcm1hbGl6ZVRvQ1JPckxGKGNvbnN0IENTdHJpbmcmIGZyb20sIFZlY3RvcjxjaGFyPiYg
cmVzdWx0LCBib29sIHRvQ1IpCiB7CisgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGxlbmd0aC4KICAg
ICBzaXplX3QgbmV3TGVuID0gMDsKICAgICBib29sIG5lZWRGaXggPSBmYWxzZTsKICAgICBjb25z
dCBjaGFyKiBwID0gZnJvbS5kYXRhKCk7CkBAIC0xMDUsMTMgKzE3MywyMCBAQCBzdGF0aWMgQ1N0
cmluZyBub3JtYWxpemVUb0NST3JMRihjb25zdCBDU3RyaW5nJiBmcm9tLCBib29sIHRvQ1IpCiAg
ICAgICAgIH0KICAgICAgICAgbmV3TGVuICs9IDE7CiAgICAgfQotICAgIGlmICghbmVlZEZpeCkK
LSAgICAgICAgcmV0dXJuIGZyb207CiAKLSAgICAvLyBNYWtlIGEgY29weSBvZiB0aGUgc3RyaW5n
LgorICAgIC8vIEdyb3cgdGhlIHJlc3VsdCBidWZmZXIuCiAgICAgcCA9IGZyb20uZGF0YSgpOwot
ICAgIGNoYXIqIHE7Ci0gICAgQ1N0cmluZyByZXN1bHQgPSBDU3RyaW5nOjpuZXdVbmluaXRpYWxp
emVkKG5ld0xlbiwgcSk7CisgICAgc2l6ZV90IG9sZFJlc3VsdFNpemUgPSByZXN1bHQuc2l6ZSgp
OworICAgIHJlc3VsdC5ncm93KG9sZFJlc3VsdFNpemUgKyBuZXdMZW4pOworICAgIGNoYXIqIHEg
PSByZXN1bHQuZGF0YSgpICsgb2xkUmVzdWx0U2l6ZTsKKworICAgIC8vIElmIG5vIG5lZWQgdG8g
Zml4IHRoZSBzdHJpbmcsIGp1c3QgY29weSB0aGUgc3RyaW5nIG92ZXIuCisgICAgaWYgKCFuZWVk
Rml4KSB7CisgICAgICAgIG1lbWNweShxLCBwLCBmcm9tLmxlbmd0aCgpKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIE1ha2UgYSBjb3B5IG9mIHRoZSBzdHJpbmcuCiAgICAgd2hp
bGUgKGNoYXIgYyA9ICpwKyspIHsKICAgICAgICAgaWYgKGMgPT0gJ1xyJyAmJiAqcCA9PSAnXG4n
KSB7CiAgICAgICAgICAgICAvLyBUdXJuIENSTEYgb3IgQ1IgaW50byBDUiBvciBMRi4KQEAgLTEy
NSwyNyArMjAwLDMzIEBAIHN0YXRpYyBDU3RyaW5nIG5vcm1hbGl6ZVRvQ1JPckxGKGNvbnN0IENT
dHJpbmcmIGZyb20sIGJvb2wgdG9DUikKICAgICAgICAgICAgICpxKysgPSBjOwogICAgICAgICB9
CiAgICAgfQotICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8vIE5vcm1hbGl6ZSBhbGwgbGluZS1l
bmRpbmdzIHRvIENSLgotQ1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvQ1IoY29uc3QgQ1N0
cmluZyYgZnJvbSkKK0NTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0
cmluZyYgZnJvbSkKK3sKKyAgICBDU3RyaW5nIHJlc3VsdDsKKyAgICBDU3RyaW5nQnVmZmVyIGJ1
ZmZlcihyZXN1bHQpOworICAgIGludGVybmFsTm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoZnJv
bSwgYnVmZmVyKTsKKyAgICByZXR1cm4gYnVmZmVyLmJ1ZmZlcigpOworfQorCit2b2lkIG5vcm1h
bGl6ZUxpbmVFbmRpbmdzVG9DUihjb25zdCBDU3RyaW5nJiBmcm9tLCBWZWN0b3I8Y2hhcj4mIHJl
c3VsdCkKIHsKLSAgICByZXR1cm4gbm9ybWFsaXplVG9DUk9yTEYoZnJvbSwgdHJ1ZSk7CisgICAg
bm9ybWFsaXplVG9DUk9yTEYoZnJvbSwgcmVzdWx0LCB0cnVlKTsKIH0KIAotLy8gTm9ybWFsaXpl
IGFsbCBsaW5lLWVuZGluZ3MgdG8gTEYuCi1DU3RyaW5nIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9M
Rihjb25zdCBDU3RyaW5nJiBmcm9tKQordm9pZCBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoY29u
c3QgQ1N0cmluZyYgZnJvbSwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCiB7Ci0gICAgcmV0dXJuIG5v
cm1hbGl6ZVRvQ1JPckxGKGZyb20sIGZhbHNlKTsKKyAgICBub3JtYWxpemVUb0NST3JMRihmcm9t
LCByZXN1bHQsIGZhbHNlKTsKIH0KIAotQ1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvTmF0
aXZlKGNvbnN0IENTdHJpbmcmIGZyb20pCit2b2lkIG5vcm1hbGl6ZUxpbmVFbmRpbmdzVG9OYXRp
dmUoY29uc3QgQ1N0cmluZyYgZnJvbSwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCiB7CiAjaWYgT1Mo
V0lORE9XUykKLSAgICByZXR1cm4gbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoZnJvbSk7Cisg
ICAgVmVjdG9yQ2hhckFwcGVuZEJ1ZmZlciBidWZmZXIocmVzdWx0KTsKKyAgICBpbnRlcm5hbE5v
cm1hbGl6ZUxpbmVFbmRpbmdzVG9DUkxGKGZyb20sIGJ1ZmZlcik7CiAjZWxzZQotICAgIHJldHVy
biBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoZnJvbSk7CisgICAgbm9ybWFsaXplTGluZUVuZGlu
Z3NUb0xGKGZyb20sIHJlc3VsdCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS90ZXh0L0xpbmVFbmRpbmcuaCBiL1dlYkNvcmUvcGxhdGZvcm0vdGV4dC9MaW5lRW5k
aW5nLmgKaW5kZXggYWI4ZDZlZS4uNDMwNmNlOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9y
bS90ZXh0L0xpbmVFbmRpbmcuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3RleHQvTGluZUVuZGlu
Zy5oCkBAIC0zMywyNSArMzMsMjIgQEAKICNkZWZpbmUgTGluZUVuZGluZ19oCiAKICNpbmNsdWRl
IDx3dGYvRm9yd2FyZC5oPgotCi1uYW1lc3BhY2UgV1RGIHsKLWNsYXNzIENTdHJpbmc7Ci19Cisj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIC8vIE5vcm1h
bGl6ZSBhbGwgbGluZS1lbmRpbmdzIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8gQ1JMRi4KLVdURjo6
Q1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvQ1JMRihjb25zdCBXVEY6OkNTdHJpbmcmKTsK
K0NTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSTEYoY29uc3QgQ1N0cmluZyYgZnJvbSk7
CiAKLS8vIE5vcm1hbGl6ZSBhbGwgbGluZS1lbmRpbmdzIGluIHRoZSBnaXZlbiBzdHJpbmcgdG8g
Q1IuCi1XVEY6OkNTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb0NSKGNvbnN0IFdURjo6Q1N0
cmluZyYpOworLy8gTm9ybWFsaXplIGFsbCBsaW5lLWVuZGluZ3MgaW4gdGhlIGdpdmVuIHN0cmlu
ZyB0byBDUiBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KK3ZvaWQg
bm9ybWFsaXplTGluZUVuZGluZ3NUb0NSKGNvbnN0IENTdHJpbmcmIGZyb20sIFZlY3RvcjxjaGFy
PiYgcmVzdWx0KTsKIAotLy8gTm9ybWFsaXplIGFsbCBsaW5lLWVuZGluZ3MgaW4gdGhlIGdpdmVu
IHN0cmluZyB0byBMRi4KLVdURjo6Q1N0cmluZyBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoY29u
c3QgV1RGOjpDU3RyaW5nJik7CisvLyBOb3JtYWxpemUgYWxsIGxpbmUtZW5kaW5ncyBpbiB0aGUg
Z2l2ZW4gc3RyaW5nIHRvIExGIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUgZ2l2ZW4gYnVm
ZmVyLgordm9pZCBub3JtYWxpemVMaW5lRW5kaW5nc1RvTEYoY29uc3QgQ1N0cmluZyYgZnJvbSwg
VmVjdG9yPGNoYXI+JiByZXN1bHQpOwogCi0vLyBOb3JtYWxpemUgYWxsIGxpbmUtZW5kaW5ncyBp
biB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoZSBuYXRpdmUgbGluZS1lbmRpbmdzLgorLy8gTm9ybWFs
aXplIGFsbCBsaW5lLWVuZGluZ3MgaW4gdGhlIGdpdmVuIHN0cmluZyB0byB0aGUgbmF0aXZlIGxp
bmUtZW5kaW5ncyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlIGdpdmVuIGJ1ZmZlci4KIC8v
IChOb3JtYWxpemUgdG8gQ1JMRiBvbiBXaW5kb3dzIGFuZCBub3JtYWxpemUgdG8gTEYgb24gYWxs
IG90aGVyIHBsYXRmb3Jtcy4pCi1XVEY6OkNTdHJpbmcgbm9ybWFsaXplTGluZUVuZGluZ3NUb05h
dGl2ZShjb25zdCBXVEY6OkNTdHJpbmcmKTsKK3ZvaWQgbm9ybWFsaXplTGluZUVuZGluZ3NUb05h
dGl2ZShjb25zdCBDU3RyaW5nJiBmcm9tLCBWZWN0b3I8Y2hhcj4mIHJlc3VsdCk7CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKIAo=
</data>
<flag name="review"
          id="59975"
          type_id="1"
          status="+"
          setter="levin"
    />
    <flag name="commit-queue"
          id="59976"
          type_id="3"
          status="-"
          setter="jianli"
    />
          </attachment>
      

    </bug>

</bugzilla>