<?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>31441</bug_id>
          
          <creation_ts>2009-11-12 15:01:57 -0800</creation_ts>
          <short_desc>Implement SocketStreamHandleCFNet</short_desc>
          <delta_ts>2009-12-04 11:17:34 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>163072</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-12 15:01:57 -0800</bug_when>
    <thetext>Adding a basic implementation of WebSockets for Mac and Windows Safari. Many parts still WIP.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163075</commentid>
    <comment_count>1</comment_count>
      <attachid>43105</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-12 15:14:14 -0800</bug_when>
    <thetext>Created attachment 43105
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163335</commentid>
    <comment_count>2</comment_count>
      <attachid>43105</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-11-13 09:09:03 -0800</bug_when>
    <thetext>Comment on attachment 43105
proposed patch

&gt; +        bool shouldUseSSL() const { return m_url.protocolIs(&quot;wss&quot;); }

I&apos;d like to see the &quot;ws&quot; and &quot;wss&quot; constants centralized in one place if possible.

&gt; +        enum ConnectionType {
&gt; +            Unknown,
&gt; +            Direct,
&gt; +            SOCKSProxy,
&gt; +            CONNECTProxy
&gt; +        };

Seems this would fit nicely on a single line.

&gt; +        m_url.setPort(m_url.protocolIs(&quot;wss&quot;) ? 443 : 80);

Could just call shouldUseSSL() here.

&gt; +    KURL httpURL(KURL(), (m_url.protocolIs(&quot;wss&quot;) ? &quot;https://&quot; : &quot;http://&quot;) + m_url.host());

And here.

&gt; +    ASSERT(!m_readStream == !m_writeStream);

I suppose you could put this assertion a few other places too, like at the start of SocketStreamHandle::platformClose.

Or you could put an assertion where the failure would be easier to interpret like this:

    if (!m_readStream) {
        ASSERT(!m_writeStream);
        return;
    }
    ASSERT(m_writeStream);

&gt; +    CFReadStreamRef readStream = 0;
&gt; +    CFWriteStreamRef writeStream = 0;

It seems these are defined too early. I&apos;d define them just before the CFStreamCreatePairWithSocketToHost call; in fact they are really scoped to just that call and then the adoptCF calls just below it.

&gt; +    SocketStreamHandle* obj = static_cast&lt;SocketStreamHandle*&gt;(info);

How about &quot;handle&quot; for this local variable instead?

&gt; +    RetainPtr&lt;CFStringRef&gt; url(AdoptCF, obj-&gt;m_url.string().createCFString());
&gt; +    return CFStringCreateWithFormat(0, 0, CFSTR(&quot;WebKit socket stream, %@&quot;), url.get());

You could use WebCore::String appending rather than the CFString format operation here.

&gt; +        CFIndex len;

How about &quot;length&quot; for this local variable instead? Or &quot;bufferLength&quot;?

&gt; +        const UInt8* ptr = CFReadStreamGetBuffer(m_readStream.get(), 0, &amp;len);
&gt; +        if (!ptr) {
&gt; +            ASSERT(isMainThread());
&gt; +            static UInt8 buf[1024];
&gt; +            len = CFReadStreamRead(m_readStream.get(), buf, 1024);
&gt; +            ptr = buf;
&gt; +        }
&gt; +
&gt; +        m_client-&gt;didReceiveData(this, reinterpret_cast&lt;const char*&gt;(ptr), len);

I don&apos;t understand why a global-variable buffer is needed here. Could we use a stack buffer instead?


r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>163476</commentid>
    <comment_count>3</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2009-11-13 13:38:15 -0800</bug_when>
    <thetext>Committed &lt;http://trac.webkit.org/changeset/50951&gt;.

&gt; I don&apos;t understand why a global-variable buffer is needed here. Could we use a
&gt; stack buffer instead?

Tried to save some stack space, but I don&apos;t think I had a a good reason.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>43105</attachid>
            <date>2009-11-12 15:14:14 -0800</date>
            <delta_ts>2009-11-13 09:09:03 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>WebSocket.txt</filename>
            <type>text/plain</type>
            <size>16655</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1MDkwNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzIgQEAKKzIwMDktMTEtMTIgIEFsZXhleSBQcm9za3VyeWFrb3YgIDxhcEBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMxNDQxCisgICAgICAgIElt
cGxlbWVudCBTb2NrZXRTdHJlYW1DRk5ldAorCisgICAgICAgIEV4aXN0aW5nIFdlYlNvY2tldCB0
ZXN0cyBub3cgcGFzcyBvbiBNYWMuIE5vIHByb3h5IHN1cHBvcnQgeWV0LgorCisgICAgICAgICog
cGxhdGZvcm0vbmV0d29yay9Tb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZS5oOgorICAgICAgICAoV2ViQ29y
ZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpzaG91bGRVc2VTU0wpOgorICAgICAgICAoV2ViQ29yZTo6
U29ja2V0U3RyZWFtSGFuZGxlOjpyZWZBdXRoZW50aWNhdGlvbkNsaWVudCk6CisgICAgICAgIChX
ZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmRlcmVmQXV0aGVudGljYXRpb25DbGllbnQpOgor
ICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjopOgorICAgICAgICAqIHBsYXRm
b3JtL25ldHdvcmsvY2YvU29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpTb2NrZXRTdHJlYW1IYW5kbGUpOgorICAgICAgICAo
V2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpjaG9vc2VQcm94eSk6CisgICAgICAgIChXZWJD
b3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OmNyZWF0ZVN0cmVhbXMpOgorICAgICAgICAoV2ViQ29y
ZTo6U29ja2V0U3RyZWFtSGFuZGxlOjpjb3B5Q0ZTdHJlYW1EZXNjcmlwdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnJlYWRTdHJlYW1DYWxsYmFjayk6CisgICAg
ICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OndyaXRlU3RyZWFtQ2FsbGJhY2spOgor
ICAgICAgICAoV2ViQ29yZTo6U29ja2V0U3RyZWFtSGFuZGxlOjp+U29ja2V0U3RyZWFtSGFuZGxl
KToKKyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1TZW5kKToK
KyAgICAgICAgKFdlYkNvcmU6OlNvY2tldFN0cmVhbUhhbmRsZTo6cGxhdGZvcm1DbG9zZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnJlY2VpdmVkQ3JlZGVudGlhbCk6
CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJlYW1IYW5kbGU6OnJlY2VpdmVkUmVxdWVzdFRv
Q29udGludWVXaXRob3V0Q3JlZGVudGlhbCk6CisgICAgICAgIChXZWJDb3JlOjpTb2NrZXRTdHJl
YW1IYW5kbGU6OnJlY2VpdmVkQ2FuY2VsbGF0aW9uKToKKwogMjAwOS0xMS0xMiAgQWRhbSBSb2Jl
biAgPGFyb2JlbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmVwbGFjZSB3b3JsZElEcyB3aXRoIHdv
cmxkIG9iamVjdHMKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9Tb2NrZXRTdHJlYW1I
YW5kbGVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvU29j
a2V0U3RyZWFtSGFuZGxlQ2xpZW50LmgJKHJldmlzaW9uIDUwODg0KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL1NvY2tldFN0cmVhbUhhbmRsZUNsaWVudC5oCSh3b3JraW5nIGNvcHkpCkBA
IC00OSw2ICs0OSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgICAgICB2aXJ0dWFsIHZv
aWQgZGlkRmFpbChTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25zdCBTb2NrZXRTdHJlYW1FcnJvciYp
IHsgfQogCisgICAgICAgIC8vIE5vIGF1dGhlbnRpY2F0aW9uIGZvciBzdHJlYW1zIHBlciBzZSwg
YnV0IHByb3h5IG1heSBhc2sgZm9yIGNyZWRlbnRpYWxzLgogICAgICAgICB2aXJ0dWFsIHZvaWQg
ZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlKFNvY2tldFN0cmVhbUhhbmRsZSosIGNv
bnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJikgeyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBk
aWRDYW5jZWxBdXRoZW50aWNhdGlvbkNoYWxsZW5nZShTb2NrZXRTdHJlYW1IYW5kbGUqLCBjb25z
dCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpIHsgfQogICAgIH07CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvY2YvU29ja2V0U3RyZWFtSGFuZGxlLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9uZXR3b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZS5oCShyZXZpc2lvbiA1
MDg4NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5kbGUu
aAkod29ya2luZyBjb3B5KQpAQCAtMzIsMTAgKzMyLDkgQEAKICNpZm5kZWYgU29ja2V0U3RyZWFt
SGFuZGxlX2gKICNkZWZpbmUgU29ja2V0U3RyZWFtSGFuZGxlX2gKIAorI2luY2x1ZGUgIkF1dGhl
bnRpY2F0aW9uQ2xpZW50LmgiCiAjaW5jbHVkZSAiU29ja2V0U3RyZWFtSGFuZGxlQmFzZS5oIgot
Ci0jaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KLSNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5o
PgorI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBA
IC00MywyNCArNDIsNTggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIGNsYXNzIENyZWRlbnRp
YWw7CiAgICAgY2xhc3MgU29ja2V0U3RyZWFtSGFuZGxlQ2xpZW50OwogCi0gICAgY2xhc3MgU29j
a2V0U3RyZWFtSGFuZGxlIDogcHVibGljIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPiwg
cHVibGljIFNvY2tldFN0cmVhbUhhbmRsZUJhc2UgeworICAgIGNsYXNzIFNvY2tldFN0cmVhbUhh
bmRsZSA6IHB1YmxpYyBSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT4sIHB1YmxpYyBTb2Nr
ZXRTdHJlYW1IYW5kbGVCYXNlLCBwdWJsaWMgQXV0aGVudGljYXRpb25DbGllbnQgewogICAgIHB1
YmxpYzoKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8U29ja2V0U3RyZWFtSGFuZGxlPiBjcmVh
dGUoY29uc3QgS1VSTCYgdXJsLCBTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqIGNsaWVudCkgeyBy
ZXR1cm4gYWRvcHRSZWYobmV3IFNvY2tldFN0cmVhbUhhbmRsZSh1cmwsIGNsaWVudCkpOyB9CiAK
ICAgICAgICAgdmlydHVhbCB+U29ja2V0U3RyZWFtSGFuZGxlKCk7CiAKLSAgICBwcm90ZWN0ZWQ6
CisgICAgICAgIHVzaW5nIFJlZkNvdW50ZWQ8U29ja2V0U3RyZWFtSGFuZGxlPjo6cmVmOworICAg
ICAgICB1c2luZyBSZWZDb3VudGVkPFNvY2tldFN0cmVhbUhhbmRsZT46OmRlcmVmOworCisgICAg
cHJpdmF0ZToKICAgICAgICAgdmlydHVhbCBpbnQgcGxhdGZvcm1TZW5kKGNvbnN0IGNoYXIqIGRh
dGEsIGludCBsZW5ndGgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgcGxhdGZvcm1DbG9zZSgpOwog
Ci0gICAgcHJpdmF0ZToKICAgICAgICAgU29ja2V0U3RyZWFtSGFuZGxlKGNvbnN0IEtVUkwmLCBT
b2NrZXRTdHJlYW1IYW5kbGVDbGllbnQqKTsKKyAgICAgICAgdm9pZCBjcmVhdGVTdHJlYW1zKCk7
CisgICAgICAgIHZvaWQgY2hvb3NlUHJveHkoKTsKKworICAgICAgICBib29sIHNob3VsZFVzZVNT
TCgpIGNvbnN0IHsgcmV0dXJuIG1fdXJsLnByb3RvY29sSXMoIndzcyIpOyB9CisKKyAgICAgICAg
c3RhdGljIENGU3RyaW5nUmVmIGNvcHlDRlN0cmVhbURlc2NyaXB0aW9uKHZvaWQqIHN0cmVhbUlu
Zm8pOworICAgICAgICBzdGF0aWMgdm9pZCByZWFkU3RyZWFtQ2FsbGJhY2soQ0ZSZWFkU3RyZWFt
UmVmLCBDRlN0cmVhbUV2ZW50VHlwZSwgdm9pZCogY2xpZW50Q2FsbEJhY2tJbmZvKTsKKyAgICAg
ICAgc3RhdGljIHZvaWQgd3JpdGVTdHJlYW1DYWxsYmFjayhDRldyaXRlU3RyZWFtUmVmLCBDRlN0
cmVhbUV2ZW50VHlwZSwgdm9pZCogY2xpZW50Q2FsbEJhY2tJbmZvKTsKKworICAgICAgICB2b2lk
IHJlYWRTdHJlYW1DYWxsYmFjayhDRlN0cmVhbUV2ZW50VHlwZSk7CisgICAgICAgIHZvaWQgd3Jp
dGVTdHJlYW1DYWxsYmFjayhDRlN0cmVhbUV2ZW50VHlwZSk7CiAKICAgICAgICAgLy8gTm8gYXV0
aGVudGljYXRpb24gZm9yIHN0cmVhbXMgcGVyIHNlLCBidXQgcHJveHkgbWF5IGFzayBmb3IgY3Jl
ZGVudGlhbHMuCi0gICAgICAgIHZvaWQgZGlkUmVjZWl2ZUF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdl
KGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7Ci0gICAgICAgIHZvaWQgcmVjZWl2ZWRD
cmVkZW50aWFsKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJiwgY29uc3QgQ3JlZGVudGlh
bCYpOwotICAgICAgICB2b2lkIHJlY2VpdmVkUmVxdWVzdFRvQ29udGludWVXaXRob3V0Q3JlZGVu
dGlhbChjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpOwotICAgICAgICB2b2lkIHJlY2Vp
dmVkQ2FuY2VsbGF0aW9uKGNvbnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisgICAgICAg
IHZpcnR1YWwgdm9pZCByZWNlaXZlZENyZWRlbnRpYWwoY29uc3QgQXV0aGVudGljYXRpb25DaGFs
bGVuZ2UmLCBjb25zdCBDcmVkZW50aWFsJik7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWNlaXZl
ZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwoY29uc3QgQXV0aGVudGljYXRpb25D
aGFsbGVuZ2UmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlY2VpdmVkQ2FuY2VsbGF0aW9uKGNv
bnN0IEF1dGhlbnRpY2F0aW9uQ2hhbGxlbmdlJik7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHJl
ZkF1dGhlbnRpY2F0aW9uQ2xpZW50KCkgeyByZWYoKTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQg
ZGVyZWZBdXRoZW50aWNhdGlvbkNsaWVudCgpIHsgZGVyZWYoKTsgfQorCisgICAgICAgIGVudW0g
Q29ubmVjdGluZ1N1YnN0YXRlIHsgTmV3LCBGZXRjaGluZ1Byb3h5QXV0b0NvbmZpZ3VyYXRpb25G
aWxlLCBXYWl0aW5nRm9yQ3JlZGVudGlhbHMsIFdhaXRpbmdGb3JDb25uZWN0LCBDb25uZWN0ZWQg
fTsKKyAgICAgICAgQ29ubmVjdGluZ1N1YnN0YXRlIG1fY29ubmVjdGluZ1N1YnN0YXRlOworCisg
ICAgICAgIGVudW0gQ29ubmVjdGlvblR5cGUgeworICAgICAgICAgICAgVW5rbm93biwKKyAgICAg
ICAgICAgIERpcmVjdCwKKyAgICAgICAgICAgIFNPQ0tTUHJveHksCisgICAgICAgICAgICBDT05O
RUNUUHJveHkKKyAgICAgICAgfTsKKyAgICAgICAgQ29ubmVjdGlvblR5cGUgbV9jb25uZWN0aW9u
VHlwZTsKKyAgICAgICAgUmV0YWluUHRyPENGU3RyaW5nUmVmPiBtX3Byb3h5SG9zdDsKKyAgICAg
ICAgUmV0YWluUHRyPENGTnVtYmVyUmVmPiBtX3Byb3h5UG9ydDsKKworICAgICAgICBSZXRhaW5Q
dHI8Q0ZIVFRQTWVzc2FnZVJlZj4gbV9wcm94eVJlc3BvbnNlTWVzc2FnZTsKKyAgICAgICAgUmV0
YWluUHRyPENGUmVhZFN0cmVhbVJlZj4gbV9yZWFkU3RyZWFtOworICAgICAgICBSZXRhaW5QdHI8
Q0ZXcml0ZVN0cmVhbVJlZj4gbV93cml0ZVN0cmVhbTsKKworICAgICAgICBSZXRhaW5QdHI8Q0ZV
UkxSZWY+IG1faHR0cFVSTDsgLy8gd3Mocyk6IHJlcGxhY2VkIHdpdGggaHR0cChzKToKICAgICB9
OwogCiB9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3
b3JrL2NmL1NvY2tldFN0cmVhbUhhbmRsZUNGTmV0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvY2YvU29ja2V0U3RyZWFtSGFuZGxlQ0ZOZXQuY3BwCShyZXZpc2lv
biA1MDg4NCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jZi9Tb2NrZXRTdHJlYW1IYW5k
bGVDRk5ldC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNCArMSw1IEBACiAvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmln
aHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CkBAIC0zMSw1OCArMzIsMjM3IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVk
ZSAiU29ja2V0U3RyZWFtSGFuZGxlLmgiCiAKLSNpbmNsdWRlICJLVVJMLmgiCiAjaW5jbHVkZSAi
TG9nZ2luZy5oIgotI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiU29ja2V0
U3RyZWFtRXJyb3IuaCIKICNpbmNsdWRlICJTb2NrZXRTdHJlYW1IYW5kbGVDbGllbnQuaCIKIAog
bmFtZXNwYWNlIFdlYkNvcmUgewogCiBTb2NrZXRTdHJlYW1IYW5kbGU6OlNvY2tldFN0cmVhbUhh
bmRsZShjb25zdCBLVVJMJiB1cmwsIFNvY2tldFN0cmVhbUhhbmRsZUNsaWVudCogY2xpZW50KQog
ICAgIDogU29ja2V0U3RyZWFtSGFuZGxlQmFzZSh1cmwsIGNsaWVudCkKKyAgICAsIG1fY29ubmVj
dGluZ1N1YnN0YXRlKE5ldykKKyAgICAsIG1fY29ubmVjdGlvblR5cGUoVW5rbm93bikKIHsKICAg
ICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhhbmRsZSAlcCBuZXcgY2xpZW50ICVwIiwgdGhp
cywgbV9jbGllbnQpOwotICAgIG5vdEltcGxlbWVudGVkKCk7CisKKyAgICBBU1NFUlQodXJsLnBy
b3RvY29sSXMoIndzIikgfHwgdXJsLnByb3RvY29sSXMoIndzcyIpKTsKKworICAgIGlmICghbV91
cmwucG9ydCgpKQorICAgICAgICBtX3VybC5zZXRQb3J0KG1fdXJsLnByb3RvY29sSXMoIndzcyIp
ID8gNDQzIDogODApOworCisgICAgS1VSTCBodHRwVVJMKEtVUkwoKSwgKG1fdXJsLnByb3RvY29s
SXMoIndzcyIpID8gImh0dHBzOi8vIiA6ICJodHRwOi8vIikgKyBtX3VybC5ob3N0KCkpOworICAg
IG1faHR0cFVSTC5hZG9wdENGKGh0dHBVUkwuY3JlYXRlQ0ZVUkwoKSk7CisKKyAgICBjcmVhdGVT
dHJlYW1zKCk7CisgICAgQVNTRVJUKCFtX3JlYWRTdHJlYW0gPT0gIW1fd3JpdGVTdHJlYW0pOwor
ICAgIGlmICghbV9yZWFkU3RyZWFtKSAvLyBEb2luZyBhc3luY2hyb25vdXMgUEFDIGZpbGUgcHJv
Y2Vzc2luZywgc3RyZWFtcyB3aWxsIGJlIGNyZWF0ZWQgbGF0ZXIuCisgICAgICAgIHJldHVybjsK
KworICAgIENGU3RyZWFtQ2xpZW50Q29udGV4dCBjbGllbnRDb250ZXh0ID0geyAwLCB0aGlzLCAw
LCAwLCBjb3B5Q0ZTdHJlYW1EZXNjcmlwdGlvbiB9OworICAgIC8vIEZJWE1FOiBQYXNzIHNwZWNp
ZmljIGV2ZW50cyB3ZSdyZSBpbnRlcmVzdGVkIGluIGluc3RlYWQgb2YgLTEuCisgICAgQ0ZSZWFk
U3RyZWFtU2V0Q2xpZW50KG1fcmVhZFN0cmVhbS5nZXQoKSwgLTEsIHJlYWRTdHJlYW1DYWxsYmFj
aywgJmNsaWVudENvbnRleHQpOworICAgIENGV3JpdGVTdHJlYW1TZXRDbGllbnQobV93cml0ZVN0
cmVhbS5nZXQoKSwgLTEsIHdyaXRlU3RyZWFtQ2FsbGJhY2ssICZjbGllbnRDb250ZXh0KTsKKwor
ICAgIENGUmVhZFN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AobV9yZWFkU3RyZWFtLmdldCgpLCBD
RlJ1bkxvb3BHZXRDdXJyZW50KCksIGtDRlJ1bkxvb3BDb21tb25Nb2Rlcyk7CisgICAgQ0ZXcml0
ZVN0cmVhbVNjaGVkdWxlV2l0aFJ1bkxvb3AobV93cml0ZVN0cmVhbS5nZXQoKSwgQ0ZSdW5Mb29w
R2V0Q3VycmVudCgpLCBrQ0ZSdW5Mb29wQ29tbW9uTW9kZXMpOworICAgIAorICAgIENGUmVhZFN0
cmVhbU9wZW4obV9yZWFkU3RyZWFtLmdldCgpKTsKKyAgICBDRldyaXRlU3RyZWFtT3BlbihtX3dy
aXRlU3RyZWFtLmdldCgpKTsKKworICAgIG1fY29ubmVjdGluZ1N1YnN0YXRlID0gV2FpdGluZ0Zv
ckNvbm5lY3Q7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpjaG9vc2VQcm94eSgpCit7
CisgICAgLy8gRklYTUU6IFJldHJpZXZlIHByb3h5IGluZm9ybWF0aW9uLgorICAgIG1fY29ubmVj
dGlvblR5cGUgPSBEaXJlY3Q7Cit9CisKK3ZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpjcmVhdGVT
dHJlYW1zKCkKK3sKKyAgICBDRlJlYWRTdHJlYW1SZWYgcmVhZFN0cmVhbSA9IDA7CisgICAgQ0ZX
cml0ZVN0cmVhbVJlZiB3cml0ZVN0cmVhbSA9IDA7CisKKyAgICBpZiAobV9jb25uZWN0aW9uVHlw
ZSA9PSBVbmtub3duKQorICAgICAgICBjaG9vc2VQcm94eSgpOworCisgICAgLy8gSWYgaXQncyBz
dGlsbCB1bmtub3duLCB0aGVuIHdlJ3JlIHJlc29sdmluZyBhIFBBQyBmaWxlIGFzeW5jaHJvbm91
c2x5LgorICAgIGlmIChtX2Nvbm5lY3Rpb25UeXBlID09IFVua25vd24pCisgICAgICAgIHJldHVy
bjsKKworICAgIFJldGFpblB0cjxDRlN0cmluZ1JlZj4gaG9zdChBZG9wdENGLCBtX3VybC5ob3N0
KCkuY3JlYXRlQ0ZTdHJpbmcoKSk7CisKKyAgICAvLyBDcmVhdGluZyBzdHJlYW1zIHRvIGZpbmFs
IGRlc3RpbmF0aW9uLCBub3QgdG8gcHJveHkuCisgICAgQ0ZTdHJlYW1DcmVhdGVQYWlyV2l0aFNv
Y2tldFRvSG9zdCgwLCBob3N0LmdldCgpLCBtX3VybC5wb3J0KCksICZyZWFkU3RyZWFtLCAmd3Jp
dGVTdHJlYW0pOworCisgICAgbV9yZWFkU3RyZWFtLmFkb3B0Q0YocmVhZFN0cmVhbSk7CisgICAg
bV93cml0ZVN0cmVhbS5hZG9wdENGKHdyaXRlU3RyZWFtKTsKKworICAgIC8vIEZJWE1FOiBBcHBs
eSBwcm94eSBpbmZvcm1hdGlvbiB0byBzdHJlYW1zLgorCisgICAgaWYgKHNob3VsZFVzZVNTTCgp
KSB7CisgICAgICAgIGNvbnN0IHZvaWQqIGtleXNbXSA9IHsga0NGU3RyZWFtU1NMUGVlck5hbWUs
IGtDRlN0cmVhbVNTTExldmVsIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1tdID0geyBo
b3N0LmdldCgpLCBrQ0ZTdHJlYW1Tb2NrZXRTZWN1cml0eUxldmVsTmVnb3RpYXRlZFNTTCB9Owor
ICAgICAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPiBzZXR0aW5ncyhBZG9wdENGLCBDRkRp
Y3Rpb25hcnlDcmVhdGUoMCwga2V5cywgdmFsdWVzLCBzaXplb2Yoa2V5cykgLyBzaXplb2YoKmtl
eXMpLCAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZh
bHVlQ2FsbEJhY2tzKSk7CisgICAgICAgIENGUmVhZFN0cmVhbVNldFByb3BlcnR5KG1fcmVhZFN0
cmVhbS5nZXQoKSwga0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywgc2V0dGluZ3MuZ2V0KCkp
OworICAgICAgICBDRldyaXRlU3RyZWFtU2V0UHJvcGVydHkobV93cml0ZVN0cmVhbS5nZXQoKSwg
a0NGU3RyZWFtUHJvcGVydHlTU0xTZXR0aW5ncywgc2V0dGluZ3MuZ2V0KCkpOworICAgIH0KK30K
KworQ0ZTdHJpbmdSZWYgU29ja2V0U3RyZWFtSGFuZGxlOjpjb3B5Q0ZTdHJlYW1EZXNjcmlwdGlv
bih2b2lkKiBpbmZvKQoreworICAgIFNvY2tldFN0cmVhbUhhbmRsZSogb2JqID0gc3RhdGljX2Nh
c3Q8U29ja2V0U3RyZWFtSGFuZGxlKj4oaW5mbyk7CisgICAgUmV0YWluUHRyPENGU3RyaW5nUmVm
PiB1cmwoQWRvcHRDRiwgb2JqLT5tX3VybC5zdHJpbmcoKS5jcmVhdGVDRlN0cmluZygpKTsKKyAg
ICByZXR1cm4gQ0ZTdHJpbmdDcmVhdGVXaXRoRm9ybWF0KDAsIDAsIENGU1RSKCJXZWJLaXQgc29j
a2V0IHN0cmVhbSwgJUAiKSwgdXJsLmdldCgpKTsKK30KKwordm9pZCBTb2NrZXRTdHJlYW1IYW5k
bGU6OnJlYWRTdHJlYW1DYWxsYmFjayhDRlJlYWRTdHJlYW1SZWYgc3RyZWFtLCBDRlN0cmVhbUV2
ZW50VHlwZSB0eXBlLCB2b2lkKiBjbGllbnRDYWxsQmFja0luZm8pCit7CisgICAgU29ja2V0U3Ry
ZWFtSGFuZGxlKiBvYmogPSBzdGF0aWNfY2FzdDxTb2NrZXRTdHJlYW1IYW5kbGUqPihjbGllbnRD
YWxsQmFja0luZm8pOworICAgIEFTU0VSVChzdHJlYW0gPT0gb2JqLT5tX3JlYWRTdHJlYW0uZ2V0
KCkpOworICAgIG9iai0+cmVhZFN0cmVhbUNhbGxiYWNrKHR5cGUpOworfQorCit2b2lkIFNvY2tl
dFN0cmVhbUhhbmRsZTo6d3JpdGVTdHJlYW1DYWxsYmFjayhDRldyaXRlU3RyZWFtUmVmIHN0cmVh
bSwgQ0ZTdHJlYW1FdmVudFR5cGUgdHlwZSwgdm9pZCogY2xpZW50Q2FsbEJhY2tJbmZvKQorewor
ICAgIFNvY2tldFN0cmVhbUhhbmRsZSogb2JqID0gc3RhdGljX2Nhc3Q8U29ja2V0U3RyZWFtSGFu
ZGxlKj4oY2xpZW50Q2FsbEJhY2tJbmZvKTsKKyAgICBBU1NFUlQoc3RyZWFtID09IG9iai0+bV93
cml0ZVN0cmVhbS5nZXQoKSk7CisgICAgb2JqLT53cml0ZVN0cmVhbUNhbGxiYWNrKHR5cGUpOwor
fQorCit2b2lkIFNvY2tldFN0cmVhbUhhbmRsZTo6cmVhZFN0cmVhbUNhbGxiYWNrKENGU3RyZWFt
RXZlbnRUeXBlIHR5cGUpCit7CisgICAgc3dpdGNoKHR5cGUpIHsKKyAgICBjYXNlIGtDRlN0cmVh
bUV2ZW50Tm9uZToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudE9wZW5D
b21wbGV0ZWQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRIYXNCeXRl
c0F2YWlsYWJsZTogeworICAgICAgICBpZiAobV9jb25uZWN0aW5nU3Vic3RhdGUgPT0gV2FpdGlu
Z0ZvckNvbm5lY3QpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBIYW5kbGUgQ09OTkVDVCBwcm94
eSBjcmVkZW50aWFscyBoZXJlLgorICAgICAgICB9IGVsc2UgaWYgKG1fY29ubmVjdGluZ1N1YnN0
YXRlID09IFdhaXRpbmdGb3JDcmVkZW50aWFscykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgIGlmIChtX2Nvbm5lY3RpbmdTdWJzdGF0ZSA9PSBXYWl0aW5nRm9yQ29ubmVjdCkgeworICAg
ICAgICAgICAgbV9jb25uZWN0aW5nU3Vic3RhdGUgPSBDb25uZWN0ZWQ7CisgICAgICAgICAgICBt
X3N0YXRlID0gT3BlbjsKKyAgICAgICAgICAgIG1fY2xpZW50LT5kaWRPcGVuKHRoaXMpOworICAg
ICAgICAgICAgLy8gRmFsbCB0aHJvdWdoLgorICAgICAgICB9IGVsc2UgaWYgKG1fc3RhdGUgPT0g
Q2xvc2VkKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0g
T3Blbik7CisgICAgICAgIEFTU0VSVChtX2Nvbm5lY3RpbmdTdWJzdGF0ZSA9PSBDb25uZWN0ZWQp
OworCisgICAgICAgIENGSW5kZXggbGVuOworICAgICAgICBjb25zdCBVSW50OCogcHRyID0gQ0ZS
ZWFkU3RyZWFtR2V0QnVmZmVyKG1fcmVhZFN0cmVhbS5nZXQoKSwgMCwgJmxlbik7CisgICAgICAg
IGlmICghcHRyKSB7CisgICAgICAgICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgICAg
ICAgICAgc3RhdGljIFVJbnQ4IGJ1ZlsxMDI0XTsKKyAgICAgICAgICAgIGxlbiA9IENGUmVhZFN0
cmVhbVJlYWQobV9yZWFkU3RyZWFtLmdldCgpLCBidWYsIDEwMjQpOworICAgICAgICAgICAgcHRy
ID0gYnVmOworICAgICAgICB9CisKKyAgICAgICAgbV9jbGllbnQtPmRpZFJlY2VpdmVEYXRhKHRo
aXMsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHB0ciksIGxlbik7CisKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIGNhc2Uga0NGU3RyZWFtRXZlbnRDYW5BY2NlcHRCeXRlczoKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0NG
U3RyZWFtRXZlbnRFcnJvck9jY3VycmVkOiB7CisgICAgICAgIENGU3RyZWFtRXJyb3IgZXJyb3Ig
PSBDRlJlYWRTdHJlYW1HZXRFcnJvcihtX3JlYWRTdHJlYW0uZ2V0KCkpOworICAgICAgICBtX2Ns
aWVudC0+ZGlkRmFpbCh0aGlzLCBTb2NrZXRTdHJlYW1FcnJvcihlcnJvci5lcnJvcikpOyAvLyBG
SVhNRTogUHJvdmlkZSBhIHNlbnNpYmxlIGVycm9yLgorICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgICAgICBtX2NsaWVudC0+
ZGlkQ2xvc2UodGhpcyk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBTb2NrZXRT
dHJlYW1IYW5kbGU6OndyaXRlU3RyZWFtQ2FsbGJhY2soQ0ZTdHJlYW1FdmVudFR5cGUgdHlwZSkK
K3sKKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2Uga0NGU3RyZWFtRXZlbnROb25lOgorICAg
ICAgICBicmVhazsKKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50T3BlbkNvbXBsZXRlZDoKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZTdHJlYW1FdmVudEhhc0J5dGVzQXZhaWxhYmxlOgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0ZT
dHJlYW1FdmVudENhbkFjY2VwdEJ5dGVzOiB7CisgICAgICAgIC8vIFBvc3NpYmx5LCBhIHNwdXJp
b3VzIGV2ZW50IGZyb20gQ09OTkVDVCBoYW5kc2hha2UuCisgICAgICAgIGlmICghQ0ZXcml0ZVN0
cmVhbUNhbkFjY2VwdEJ5dGVzKG1fd3JpdGVTdHJlYW0uZ2V0KCkpKQorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIGlmIChtX2Nvbm5lY3RpbmdTdWJzdGF0ZSA9PSBXYWl0aW5nRm9yQ3Jl
ZGVudGlhbHMpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAobV9jb25uZWN0aW5n
U3Vic3RhdGUgPT0gV2FpdGluZ0ZvckNvbm5lY3QpIHsKKyAgICAgICAgICAgIG1fY29ubmVjdGlu
Z1N1YnN0YXRlID0gQ29ubmVjdGVkOworICAgICAgICAgICAgbV9zdGF0ZSA9IE9wZW47CisgICAg
ICAgICAgICBtX2NsaWVudC0+ZGlkT3Blbih0aGlzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisKKyAgICAgICAgQVNTRVJUKG1fc3RhdGUgPSBPcGVuKTsKKyAgICAgICAgQVNTRVJU
KG1fY29ubmVjdGluZ1N1YnN0YXRlID09IENvbm5lY3RlZCk7CisKKyAgICAgICAgc2VuZFBlbmRp
bmdEYXRhKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtDRlN0cmVhbUV2ZW50
RXJyb3JPY2N1cnJlZDogeworICAgICAgICBDRlN0cmVhbUVycm9yIGVycm9yID0gQ0ZXcml0ZVN0
cmVhbUdldEVycm9yKG1fd3JpdGVTdHJlYW0uZ2V0KCkpOworICAgICAgICBtX2NsaWVudC0+ZGlk
RmFpbCh0aGlzLCBTb2NrZXRTdHJlYW1FcnJvcihlcnJvci5lcnJvcikpOyAvLyBGSVhNRTogUHJv
dmlkZSBhIHNlbnNpYmxlIGVycm9yLgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBr
Q0ZTdHJlYW1FdmVudEVuZEVuY291bnRlcmVkOgorICAgICAgICAvLyBGSVhNRTogQ3VycmVudGx5
LCB3ZSBjYWxsIGRpZENsb3NlIGZyb20gcmVhZCBjYWxsYmFjaywgYnV0IHRoZXNlIGNhbiBjb21l
IGluZGVwZW5kZW50bHkgKGUuZy4gYSBzZXJ2ZXIgY2FuIHN0b3AgbGlzdGVuaW5nLCBidXQga2Vl
cCBzZW5kaW5nIGRhdGEpLgorICAgICAgICBicmVhazsKKyAgICB9CiB9CiAKIFNvY2tldFN0cmVh
bUhhbmRsZTo6flNvY2tldFN0cmVhbUhhbmRsZSgpCiB7Ci0gICAgTE9HKE5ldHdvcmssICJTb2Nr
ZXRTdHJlYW1IYW5kbGUgJXAgZGVsZXRlIiwgdGhpcyk7Ci0gICAgc2V0Q2xpZW50KDApOwotICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgTE9HKE5ldHdvcmssICJTb2NrZXRTdHJlYW1IYW5kbGUg
JXAgZHRvciIsIHRoaXMpOwogfQogCi1pbnQgU29ja2V0U3RyZWFtSGFuZGxlOjpwbGF0Zm9ybVNl
bmQoY29uc3QgY2hhciosIGludCkKK2ludCBTb2NrZXRTdHJlYW1IYW5kbGU6OnBsYXRmb3JtU2Vu
ZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQogewotICAgIExPRyhOZXR3b3JrLCAiU29j
a2V0U3RyZWFtSGFuZGxlICVwIHBsYXRmb3JtU2VuZCIsIHRoaXMpOwotICAgIG5vdEltcGxlbWVu
dGVkKCk7Ci0gICAgcmV0dXJuIDA7CisgICAgaWYgKCFDRldyaXRlU3RyZWFtQ2FuQWNjZXB0Qnl0
ZXMobV93cml0ZVN0cmVhbS5nZXQoKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJu
IENGV3JpdGVTdHJlYW1Xcml0ZShtX3dyaXRlU3RyZWFtLmdldCgpLCByZWludGVycHJldF9jYXN0
PGNvbnN0IFVJbnQ4Kj4oZGF0YSksIGxlbmd0aCk7CiB9CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFu
ZGxlOjpwbGF0Zm9ybUNsb3NlKCkKIHsKICAgICBMT0coTmV0d29yaywgIlNvY2tldFN0cmVhbUhh
bmRsZSAlcCBwbGF0Zm9ybUNsb3NlIiwgdGhpcyk7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKLX0K
IAotdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OmRpZFJlY2VpdmVBdXRoZW50aWNhdGlvbkNoYWxs
ZW5nZShjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYpCi17Ci0gICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICBpZiAoIW1fcmVhZFN0cmVhbSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQ0ZS
ZWFkU3RyZWFtVW5zY2hlZHVsZUZyb21SdW5Mb29wKG1fcmVhZFN0cmVhbS5nZXQoKSwgQ0ZSdW5M
b29wR2V0Q3VycmVudCgpLCBrQ0ZSdW5Mb29wQ29tbW9uTW9kZXMpOworICAgIENGV3JpdGVTdHJl
YW1VbnNjaGVkdWxlRnJvbVJ1bkxvb3AobV93cml0ZVN0cmVhbS5nZXQoKSwgQ0ZSdW5Mb29wR2V0
Q3VycmVudCgpLCBrQ0ZSdW5Mb29wQ29tbW9uTW9kZXMpOworCisgICAgQ0ZSZWFkU3RyZWFtQ2xv
c2UobV9yZWFkU3RyZWFtLmdldCgpKTsKKyAgICBDRldyaXRlU3RyZWFtQ2xvc2UobV93cml0ZVN0
cmVhbS5nZXQoKSk7CisgICAgCisgICAgbV9yZWFkU3RyZWFtID0gMDsKKyAgICBtX3dyaXRlU3Ry
ZWFtID0gMDsKIH0KIAogdm9pZCBTb2NrZXRTdHJlYW1IYW5kbGU6OnJlY2VpdmVkQ3JlZGVudGlh
bChjb25zdCBBdXRoZW50aWNhdGlvbkNoYWxsZW5nZSYsIGNvbnN0IENyZWRlbnRpYWwmKQogewot
ICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgU29ja2V0U3RyZWFtSGFuZGxlOjpyZWNl
aXZlZFJlcXVlc3RUb0NvbnRpbnVlV2l0aG91dENyZWRlbnRpYWwoY29uc3QgQXV0aGVudGljYXRp
b25DaGFsbGVuZ2UmKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7CiB9CiAKIHZvaWQgU29ja2V0
U3RyZWFtSGFuZGxlOjpyZWNlaXZlZENhbmNlbGxhdGlvbihjb25zdCBBdXRoZW50aWNhdGlvbkNo
YWxsZW5nZSYpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNl
IFdlYkNvcmUKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDUwOTA3KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTQgQEAKKzIwMDktMTEtMTIgIEFsZXhleSBQ
cm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTMxNDQxCisgICAgICAgIEltcGxlbWVudCBTb2NrZXRTdHJlYW1DRk5ldAorCisgICAgICAg
ICogcGxhdGZvcm0vbWFjL1NraXBwZWQ6CisgICAgICAgICogcGxhdGZvcm0vd2luL1NraXBwZWQ6
CisgICAgICAgIEVuYWJsZXMgdGVzdHMgaW4gd2Vic29ja2V0IGRpcmVjdG9yeS4KKwogMjAwOS0x
MS0xMiAgTWFyayBSb3dlICA8bXJvd2VAYXBwbGUuY29tPgogCiAgICAgICAgIFNraXAgYW4gYWNj
ZXNzaWJpbGl0eSB0ZXN0IHRoYXQgY292ZXJzIGZ1bmN0aW9uYWxpdHkgbm90IGF2YWlsYWJsZSBv
biBUaWdlciBvciBMZW9wYXJkLgpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBw
ZWQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBwZWQJKHJldmlz
aW9uIDUwODg0KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vbWFjL1NraXBwZWQJKHdvcmtpbmcg
Y29weSkKQEAgLTk1LDYgKzk1LDMgQEAgbWVkaWEvdmlkZW8tZW1wdHktc291cmNlLmh0bWwKIAog
IyBSdWJ5IGxheW91dCB0ZXN0cyBzb21laG93IGNhdXNlIGh0dHAvdGVzdHMvc2VjdXJpdHkvbWl4
ZWRDb250ZW50L2Fib3V0LWJsYW5rLWlmcmFtZS1pbi1tYWluLWZyYW1lLmh0bWwgdG8gZmFpbAog
ZmFzdC9ydWJ5Ci0KLSMgTWlzc2luZyBTb2NrZXRTdHJlYW1IYW5kbGUgaW1wbGVtZW50YXRpb24K
LXdlYnNvY2tldC90ZXN0cwpJbmRleDogTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQJKHJldmlzaW9u
IDUwODg0KQorKysgTGF5b3V0VGVzdHMvcGxhdGZvcm0vd2luL1NraXBwZWQJKHdvcmtpbmcgY29w
eSkKQEAgLTY4MSw4ICs2ODEsNSBAQCBmYXN0L3J1YnkKICMgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTMxMzE1CiBmYXN0L2RvbS9IVE1MT2JqZWN0RWxlbWVudC9jaGls
ZHJlbi1jaGFuZ2VkLmh0bWwKIAotIyBNaXNzaW5nIFNvY2tldFN0cmVhbUhhbmRsZSBpbXBsZW1l
bnRhdGlvbgotd2Vic29ja2V0L3Rlc3RzCi0KICMgTmVlZCByZWJhc2VsaW5lOiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY4MzAKIGZhc3QvbXVsdGljb2wvc2luZ2xl
LWxpbmUuaHRtbAo=
</data>
<flag name="review"
          id="24769"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>