Return-Path: Delivered-To: apmail-activemq-users-archive@www.apache.org Received: (qmail 25618 invoked from network); 3 Mar 2011 12:35:32 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 3 Mar 2011 12:35:32 -0000 Received: (qmail 52869 invoked by uid 500); 3 Mar 2011 12:35:31 -0000 Delivered-To: apmail-activemq-users-archive@activemq.apache.org Received: (qmail 52821 invoked by uid 500); 3 Mar 2011 12:35:31 -0000 Mailing-List: contact users-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: users@activemq.apache.org Delivered-To: mailing list users@activemq.apache.org Received: (qmail 52813 invoked by uid 99); 3 Mar 2011 12:35:31 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Mar 2011 12:35:31 +0000 X-ASF-Spam-Status: No, hits=0.0 required=5.0 tests= X-Spam-Check-By: apache.org Received-SPF: neutral (athena.apache.org: local policy) Received: from [209.85.214.171] (HELO mail-iw0-f171.google.com) (209.85.214.171) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 03 Mar 2011 12:35:31 +0000 Received: by iwr19 with SMTP id 19so1132324iwr.2 for ; Thu, 03 Mar 2011 04:35:09 -0800 (PST) Received: by 10.231.150.145 with SMTP id y17mr926722ibv.48.1299155709513; Thu, 03 Mar 2011 04:35:09 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.14.4 with HTTP; Thu, 3 Mar 2011 04:34:25 -0800 (PST) From: Jeff Rose Date: Thu, 3 Mar 2011 13:34:25 +0100 Message-ID: Subject: FIX: messages larger than 802 bytes take 60 seconds on Linux (AMQ 5.4.2) with Stomp PHP To: users Content-Type: multipart/mixed; boundary=0050450169f592d1e7049d9342ac --0050450169f592d1e7049d9342ac Content-Type: multipart/alternative; boundary=0050450169f592d1e3049d9342aa --0050450169f592d1e3049d9342aa Content-Type: text/plain; charset=ISO-8859-1 It seems there is some kind of TCP buffering issue (only on linux?) which causes loooong delays when sending certain size messages over ActiveMQ. This was discussed and supposedly fixed in the past (e.g. here: https://issues.apache.org/jira/browse/AMQ-1156) but at least with the PHP Stomp library the problem still persists. Sending messages of 800 bytes or 20 kB works fine and fast, but sending a message of 805 bytes or a couple kB gets delayed and takes 60 seconds. (This is with default Stomp configuration for ActiveMQ on Ubuntu Maverick with a 2.6.35-23-generic kernel.) The messages arrive on ActiveMQ according to the console, but somehow they don't get sent to the waiting client until a 60 second delay expires. I modified the Stomp library to use socket_create style sockets rather than fsockopen, and then I added support for the URL argument to turn off the TCP delay, which I supposed was the issue. (e.g. example.com:61613?tcpNoDelay=true as is supported by openwire) With this patch the bug is gone and I now have full speed messaging with all message sizes. Oddly enough, I've found that it doesn't matter whether the tcpNoDelay option is set or not. Somehow moving to the socket_create style sockets fixes the issue, so maybe using fsockopen, fread and fwrite uses a different underlying sub-system or different default options for buffering or something? Attached is the modified Stomp.php file from the stomp library downloaded here: http://stomp.fusesource.org/documentation/php/book.html I think the maintainers of the library are probably on this list. I tried logging in to post a bug on the Stomp issue tracker but I don't have a login, so instead I'll leave it here for others to find and hopefully a maintainer to pickup. Note that some hosting parties don't allow socket_create because they don't want to let you listen on a socket. This might have been why fsockopen was used in the first place... Cheers, Jeff --0050450169f592d1e3049d9342aa Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable It seems there is some kind of TCP buffering issue (only on linux?) which c= auses loooong delays when sending certain size messages over ActiveMQ. =A0T= his was discussed and supposedly fixed in the past (e.g. here:=A0https://= issues.apache.org/jira/browse/AMQ-1156) but at least with the PHP Stomp= library the problem still persists. =A0Sending messages of 800 bytes or 20= kB works fine and fast, but sending a message of 805 bytes or a couple kB = gets delayed and takes 60 seconds. =A0(This is with default Stomp configura= tion for ActiveMQ on Ubuntu Maverick with a 2.6.35-23-generic kernel.)

The messages arrive on ActiveMQ according to the console, bu= t somehow they don't get sent to the waiting client until a 60 second d= elay expires.

I modified the Stomp library to use = socket_create style sockets rather than fsockopen, and then I added support= for the URL argument to turn off the TCP delay, which I supposed was the i= ssue. =A0(e.g. examp= le.com:61613?tcpNoDelay=3Dtrue as is supported by openwire) =A0With thi= s patch the bug is gone and I now have full speed messaging with all messag= e sizes. =A0Oddly enough, I've found that it doesn't matter whether= the tcpNoDelay option is set or not. =A0Somehow moving to the socket_creat= e style sockets fixes the issue, so maybe using fsockopen, fread and fwrite= uses a different underlying sub-system or different default options for bu= ffering or something?

Attached is the modified Stomp.php file from the stomp = library downloaded here:


I think the maintainers of the library are probably on = this list. =A0I tried logging in to post a bug on the Stomp issue tracker b= ut I don't have a login, so instead I'll leave it here for others t= o find and hopefully a maintainer to pickup.

Note that some hosting parties don't allow socket_c= reate because they don't want to let you listen on a socket. =A0This mi= ght have been why fsockopen was used in the first place...

Cheers,
Jeff
--0050450169f592d1e3049d9342aa-- --0050450169f592d1e7049d9342ac Content-Type: application/x-httpd-php; name="Stomp.class.php" Content-Disposition: attachment; filename="Stomp.class.php" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gktne3061 PD9waHAKCi8qKgogKgogKiBDb3B5cmlnaHQgMjAwNS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUg Rm91bmRhdGlvbgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNp b24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNl cHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNv cHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2Vz L0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExp Y2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJS QU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxp ZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmlu ZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoK LyogdmltOiBzZXQgZXhwYW5kdGFiIHRhYnN0b3A9MyBzaGlmdHdpZHRoPTM6ICovCgpyZXF1aXJl X29uY2UgJ1N0b21wL0ZyYW1lLnBocCc7CnJlcXVpcmVfb25jZSAnU3RvbXAvRXhjZXB0aW9uLnBo cCc7CgovKioKICogQSBTdG9tcCBDb25uZWN0aW9uCiAqCiAqCiAqIEBwYWNrYWdlIFN0b21wCiAq IEBhdXRob3IgSGlyYW0gQ2hpcmlubyA8aGlyYW1AaGlyYW1jaGlyaW5vLmNvbT4KICogQGF1dGhv ciBEZWphbiBCb3NhbmFjIDxkZWphbkBuaWdodHRhbGUubmV0PiAKICogQGF1dGhvciBNaWNoYWVs IENhcGxhbiA8bWNhcGxhbkBsYWJuZXQubmV0PgogKiBAdmVyc2lvbiAkUmV2aXNpb246IDQzICQK ICovCmNsYXNzIFN0b21wCnsKICAgIC8qKgogICAgICogUGVyZm9ybSByZXF1ZXN0IHN5bmNocm9u b3VzbHkKICAgICAqCiAgICAgKiBAdmFyIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljICRzeW5j ID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBEZWZhdWx0IHByZWZldGNoIHNpemUKICAgICAqCiAg ICAgKiBAdmFyIGludAogICAgICovCglwdWJsaWMgJHByZWZldGNoU2l6ZSA9IDE7CiAgICAKCS8q KgogICAgICogQ2xpZW50IGlkIHVzZWQgZm9yIGR1cmFibGUgc3Vic2NyaXB0aW9ucwogICAgICoK ICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KCXB1YmxpYyAkY2xpZW50SWQgPSBudWxsOwogICAg CiAgICBwcm90ZWN0ZWQgJF9icm9rZXJVcmkgPSBudWxsOwogICAgcHJvdGVjdGVkICRfc29ja2V0 ID0gbnVsbDsKICAgIHByb3RlY3RlZCAkX2hvc3RzID0gYXJyYXkoKTsKICAgIHByb3RlY3RlZCAk X3BhcmFtcyA9IGFycmF5KCk7CiAgICBwcm90ZWN0ZWQgJF9zdWJzY3JpcHRpb25zID0gYXJyYXko KTsKICAgIHByb3RlY3RlZCAkX2RlZmF1bHRQb3J0ID0gNjE2MTM7CiAgICBwcm90ZWN0ZWQgJF9j dXJyZW50SG9zdCA9IC0gMTsKICAgIHByb3RlY3RlZCAkX2F0dGVtcHRzID0gMjsKICAgIHByb3Rl Y3RlZCAkX3VzZXJuYW1lID0gJyc7CiAgICBwcm90ZWN0ZWQgJF9wYXNzd29yZCA9ICcnOwogICAg cHJvdGVjdGVkICRfc2Vzc2lvbklkOwogICAgcHJvdGVjdGVkICRfcmVhZF90aW1lb3V0X3NlY29u ZHMgPSAxOwogICAgcHJvdGVjdGVkICRfcmVhZF90aW1lb3V0X21pbGxpc2Vjb25kcyA9IDA7CiAg ICBwcm90ZWN0ZWQgJF9jb25uZWN0X3RpbWVvdXRfc2Vjb25kcyA9IDE7CiAgICAKICAgIC8qKgog ICAgICogQ29uc3RydWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRicm9rZXJVcmkg QnJva2VyIFVSTAogICAgICogQHRocm93cyBTdG9tcEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJs aWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QgKCRicm9rZXJVcmkpCiAgICB7CiAgICAgICAgJHRoaXMt Pl9icm9rZXJVcmkgPSAkYnJva2VyVXJpOwogICAgICAgICR0aGlzLT5faW5pdCgpOwogICAgfQog ICAgLyoqCiAgICAgKiBJbml0aWFsaXplIGNvbm5lY3Rpb24KICAgICAqCiAgICAgKiBAdGhyb3dz IFN0b21wRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfaW5pdCAoKQog ICAgewogICAgICAgICRwYXR0ZXJuID0gInxeKChbYS16QS1aXSspOi8vKStcKCooW2EtekEtWjAt OVwuOi9pLC1dKylcKSpcPz8oW2EtekEtWjAtOT1dKikkfGkiOwogICAgICAgIGlmIChwcmVnX21h dGNoKCRwYXR0ZXJuLCAkdGhpcy0+X2Jyb2tlclVyaSwgJHJlZ3MpKSB7CiAgICAgICAgICAgICRz Y2hlbWUgPSAkcmVnc1syXTsKICAgICAgICAgICAgJGhvc3RzID0gJHJlZ3NbM107CiAgICAgICAg ICAgICRwYXJhbXMgPSAkcmVnc1s0XTsKICAgICAgICAgICAgaWYgKCRzY2hlbWUgIT0gImZhaWxv dmVyIikgewogICAgICAgICAgICAgICAgJHRoaXMtPl9wcm9jZXNzVXJsKCR0aGlzLT5fYnJva2Vy VXJpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR1cmxzID0gZXhwbG9k ZSgiLCIsICRob3N0cyk7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdXJscyBhcyAkdXJsKSB7 CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPl9wcm9jZXNzVXJsKCR1cmwpOwogICAgICAgICAg ICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcGFyYW1zICE9IG51bGwpIHsK ICAgICAgICAgICAgICAgIHBhcnNlX3N0cigkcGFyYW1zLCAkdGhpcy0+X3BhcmFtcyk7CiAgICAg ICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXF1aXJlX29uY2UgJ1N0b21w L0V4Y2VwdGlvbi5waHAnOwogICAgICAgICAgICB0aHJvdyBuZXcgU3RvbXBFeGNlcHRpb24oIkJh ZCBCcm9rZXIgVVJMIHskdGhpcy0+X2Jyb2tlclVyaX0iKTsKICAgICAgICB9CiAgICB9CiAgICAv KioKICAgICAqIFByb2Nlc3MgYnJva2VyIFVSTAogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcg JHVybCBCcm9rZXIgVVJMCiAgICAgKiBAdGhyb3dzIFN0b21wRXhjZXB0aW9uCiAgICAgKiBAcmV0 dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIF9wcm9jZXNzVXJsICgk dXJsKQogICAgewogICAgICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJHVybCk7CiAgICAgICAgaWYg KCRwYXJzZWQpIHsKICAgICAgICAgICAgYXJyYXlfcHVzaCgkdGhpcy0+X2hvc3RzLCBhcnJheSgk cGFyc2VkWydob3N0J10gLCAkcGFyc2VkWydwb3J0J10gLCAkcGFyc2VkWydzY2hlbWUnXSkpOwog ICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSAnU3RvbXAvRXhjZXB0aW9u LnBocCc7CiAgICAgICAgICAgIHRocm93IG5ldyBTdG9tcEV4Y2VwdGlvbigiQmFkIEJyb2tlciBV UkwgJHVybCIpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTWFrZSBzb2NrZXQgY29u bmVjdGlvbiB0byB0aGUgc2VydmVyCiAgICAgKgogICAgICogQHRocm93cyBTdG9tcEV4Y2VwdGlv bgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gX21ha2VDb25uZWN0aW9uICgpCiAgICB7 CiAgICAgICAgaWYgKGNvdW50KCR0aGlzLT5faG9zdHMpID09IDApIHsKICAgICAgICAgICAgcmVx dWlyZV9vbmNlICdTdG9tcC9FeGNlcHRpb24ucGhwJzsKICAgICAgICAgICAgdGhyb3cgbmV3IFN0 b21wRXhjZXB0aW9uKCJObyBicm9rZXIgZGVmaW5lZCIpOwogICAgICAgIH0KICAgICAgICAKICAg ICAgICAvLyBmb3JjZSBkaXNjb25uZWN0LCBpZiBwcmV2aW91cyBlc3RhYmxpc2hlZCBjb25uZWN0 aW9uIGV4aXN0cwogICAgICAgICR0aGlzLT5kaXNjb25uZWN0KCk7CiAgICAgICAgCiAgICAgICAg JGkgPSAkdGhpcy0+X2N1cnJlbnRIb3N0OwogICAgICAgICRhdHQgPSAwOwogICAgICAgICRjb25u ZWN0ZWQgPSBmYWxzZTsKICAgICAgICAkY29ubmVjdF9lcnJubyA9IG51bGw7CiAgICAgICAgJGNv bm5lY3RfZXJyc3RyID0gbnVsbDsKICAgICAgICAKICAgICAgICB3aGlsZSAoISAkY29ubmVjdGVk ICYmICRhdHQgKysgPCAkdGhpcy0+X2F0dGVtcHRzKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgk dGhpcy0+X3BhcmFtc1sncmFuZG9taXplJ10pICYmICR0aGlzLT5fcGFyYW1zWydyYW5kb21pemUn XSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgICRpID0gcmFuZCgwLCBjb3VudCgkdGhpcy0+ X2hvc3RzKSAtIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGkgPSAo JGkgKyAxKSAlIGNvdW50KCR0aGlzLT5faG9zdHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAg ICRicm9rZXIgPSAkdGhpcy0+X2hvc3RzWyRpXTsKICAgICAgICAgICAgJGhvc3QgPSAkYnJva2Vy WzBdOwogICAgICAgICAgICAkcG9ydCA9ICRicm9rZXJbMV07CiAgICAgICAgICAgICRzY2hlbWUg PSAkYnJva2VyWzJdOwogICAgICAgICAgICBpZiAoJHBvcnQgPT0gbnVsbCkgewogICAgICAgICAg ICAgICAgJHBvcnQgPSAkdGhpcy0+X2RlZmF1bHRQb3J0OwogICAgICAgICAgICB9CiAgICAgICAg ICAgIGlmICgkdGhpcy0+X3NvY2tldCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBzb2NrZXRf Y2xvc2UoJHRoaXMtPl9zb2NrZXQpOwogICAgICAgICAgICAgICAgJHRoaXMtPl9zb2NrZXQgPSBu dWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+X3NvY2tldCA9IHNvY2tldF9j cmVhdGUoQUZfSU5FVCwgU09DS19TVFJFQU0sIFNPTF9UQ1ApOwogICAgICAgICAgICBpZiAoaXNz ZXQoJHRoaXMtPl9wYXJhbXNbJ3RjcE5vRGVsYXknXSkgJiYgJHRoaXMtPl9wYXJhbXNbJ3RjcE5v RGVsYXknXSA9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAkdGNwID0gZ2V0cHJvdG9ieW5hbWUo J3RjcCcpOwogICAgICAgICAgICAgIHNvY2tldF9zZXRfb3B0aW9uKCR0aGlzLT5fc29ja2V0LCAk dGNwLCBUQ1BfTk9ERUxBWSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29ja2V0X2Nv bm5lY3QoJHRoaXMtPl9zb2NrZXQsICRob3N0LCAkcG9ydCk7CgogICAgICAgICAgICBpZiAoIWlz X3Jlc291cmNlKCR0aGlzLT5fc29ja2V0KSAmJiAkYXR0ID49ICR0aGlzLT5fYXR0ZW1wdHMgJiYg IWFycmF5X2tleV9leGlzdHMoJGkgKyAxLCAkdGhpcy0+X2hvc3RzKSkgewogICAgICAgICAgICAg ICAgcmVxdWlyZV9vbmNlICdTdG9tcC9FeGNlcHRpb24ucGhwJzsKICAgICAgICAgICAgICAgIHRo cm93IG5ldyBTdG9tcEV4Y2VwdGlvbigiQ291bGQgbm90IGNvbm5lY3QgdG8gJGhvc3Q6JHBvcnQg KCRhdHQveyR0aGlzLT5fYXR0ZW1wdHN9KSIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGlzX3Jl c291cmNlKCR0aGlzLT5fc29ja2V0KSkgewogICAgICAgICAgICAgICAgJGNvbm5lY3RlZCA9IHRy dWU7CiAgICAgICAgICAgICAgICAkdGhpcy0+X2N1cnJlbnRIb3N0ID0gJGk7CiAgICAgICAgICAg ICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISAkY29ubmVj dGVkKSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSAnU3RvbXAvRXhjZXB0aW9uLnBocCc7CiAg ICAgICAgICAgIHRocm93IG5ldyBTdG9tcEV4Y2VwdGlvbigiQ291bGQgbm90IGNvbm5lY3QgdG8g YSBicm9rZXIiKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbm5lY3QgdG8gc2Vy dmVyCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkdXNlcm5hbWUKICAgICAqIEBwYXJhbSBz dHJpbmcgJHBhc3N3b3JkCiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqIEB0aHJvd3MgU3Rv bXBFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbm5lY3QgKCR1c2VybmFt ZSA9ICcnLCAkcGFzc3dvcmQgPSAnJykKICAgIHsKICAgICAgICAkdGhpcy0+X21ha2VDb25uZWN0 aW9uKCk7CiAgICAgICAgaWYgKCR1c2VybmFtZSAhPSAnJykgewogICAgICAgICAgICAkdGhpcy0+ X3VzZXJuYW1lID0gJHVzZXJuYW1lOwogICAgICAgIH0KICAgICAgICBpZiAoJHBhc3N3b3JkICE9 ICcnKSB7CiAgICAgICAgICAgICR0aGlzLT5fcGFzc3dvcmQgPSAkcGFzc3dvcmQ7CiAgICAgICAg fQoJCSRoZWFkZXJzID0gYXJyYXkoJ2xvZ2luJyA9PiAkdGhpcy0+X3VzZXJuYW1lICwgJ3Bhc3Nj b2RlJyA9PiAkdGhpcy0+X3Bhc3N3b3JkKTsKCQlpZiAoJHRoaXMtPmNsaWVudElkICE9IG51bGwp IHsKCQkJJGhlYWRlcnNbImNsaWVudC1pZCJdID0gJHRoaXMtPmNsaWVudElkOwoJCX0KCQkkZnJh bWUgPSBuZXcgU3RvbXBGcmFtZSgiQ09OTkVDVCIsICRoZWFkZXJzKTsKICAgICAgICAkdGhpcy0+ X3dyaXRlRnJhbWUoJGZyYW1lKTsKICAgICAgICAkZnJhbWUgPSAkdGhpcy0+cmVhZEZyYW1lKCk7 CiAgICAgICAgaWYgKCRmcmFtZSBpbnN0YW5jZW9mIFN0b21wRnJhbWUgJiYgJGZyYW1lLT5jb21t YW5kID09ICdDT05ORUNURUQnKSB7CiAgICAgICAgICAgICR0aGlzLT5fc2Vzc2lvbklkID0gJGZy YW1lLT5oZWFkZXJzWyJzZXNzaW9uIl07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAg IH0gZWxzZSB7CiAgICAgICAgICAgIHJlcXVpcmVfb25jZSAnU3RvbXAvRXhjZXB0aW9uLnBocCc7 CiAgICAgICAgICAgIGlmICgkZnJhbWUgaW5zdGFuY2VvZiBTdG9tcEZyYW1lKSB7CiAgICAgICAg ICAgICAgICB0aHJvdyBuZXcgU3RvbXBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY29tbWFuZDogeyRm cmFtZS0+Y29tbWFuZH0iLCAwLCAkZnJhbWUtPmJvZHkpOwogICAgICAgICAgICB9IGVsc2Ugewog ICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b21wRXhjZXB0aW9uKCJDb25uZWN0aW9uIG5vdCBh Y2tub3dsZWRnZWQiKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoq CiAgICAgKiBDaGVjayBpZiBjbGllbnQgc2Vzc2lvbiBoYXMgYmVuIGVzdGFibGlzaGVkCiAgICAg KgogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0Nv bm5lY3RlZCAoKQogICAgewogICAgICAgIHJldHVybiAhZW1wdHkoJHRoaXMtPl9zZXNzaW9uSWQp ICYmIGlzX3Jlc291cmNlKCR0aGlzLT5fc29ja2V0KTsKICAgIH0KICAgIC8qKgogICAgICogQ3Vy cmVudCBzdG9tcCBzZXNzaW9uIElECiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAq LwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlc3Npb25JZCgpCiAgICB7CiAgICAgICAgcmV0dXJu ICR0aGlzLT5fc2Vzc2lvbklkOwogICAgfQogICAgLyoqCiAgICAgKiBTZW5kIGEgbWVzc2FnZSB0 byBhIGRlc3RpbmF0aW9uIGluIHRoZSBtZXNzYWdpbmcgc3lzdGVtIAogICAgICoKICAgICAqIEBw YXJhbSBzdHJpbmcgJGRlc3RpbmF0aW9uIERlc3RpbmF0aW9uIHF1ZXVlCiAgICAgKiBAcGFyYW0g c3RyaW5nfFN0b21wRnJhbWUgJG1zZyBNZXNzYWdlCiAgICAgKiBAcGFyYW0gYXJyYXkgJHByb3Bl cnRpZXMKICAgICAqIEBwYXJhbSBib29sZWFuICRzeW5jIFBlcmZvcm0gcmVxdWVzdCBzeW5jaHJv bm91c2x5CiAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9u IHNlbmQgKCRkZXN0aW5hdGlvbiwgJG1zZywgJHByb3BlcnRpZXMgPSBhcnJheSgpLCAkc3luYyA9 IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRtc2cgaW5zdGFuY2VvZiBTdG9tcEZyYW1lKSB7CiAg ICAgICAgICAgICRtc2ctPmhlYWRlcnNbJ2Rlc3RpbmF0aW9uJ10gPSAkZGVzdGluYXRpb247CiAg ICAgICAgICAgIGlmIChpc19hcnJheSgkcHJvcGVydGllcykpICRtc2ctPmhlYWRlcnMgPSBhcnJh eV9tZXJnZSgkbXNnLT5oZWFkZXJzLCAkcHJvcGVydGllcyk7CiAgICAgICAgICAgICRmcmFtZSA9 ICRtc2c7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGhlYWRlcnMgPSAkcHJvcGVydGll czsKICAgICAgICAgICAgJGhlYWRlcnNbJ2Rlc3RpbmF0aW9uJ10gPSAkZGVzdGluYXRpb247CiAg ICAgICAgICAgICRmcmFtZSA9IG5ldyBTdG9tcEZyYW1lKCdTRU5EJywgJGhlYWRlcnMsICRtc2cp OwogICAgICAgIH0KICAgICAgICAkdGhpcy0+X3ByZXBhcmVSZWNlaXB0KCRmcmFtZSwgJHN5bmMp OwogICAgICAgICR0aGlzLT5fd3JpdGVGcmFtZSgkZnJhbWUpOwogICAgICAgIHJldHVybiAkdGhp cy0+X3dhaXRGb3JSZWNlaXB0KCRmcmFtZSwgJHN5bmMpOwogICAgfQogICAgLyoqCiAgICAgKiBQ cmVwYWlyIGZyYW1lIHJlY2VpcHQKICAgICAqCiAgICAgKiBAcGFyYW0gU3RvbXBGcmFtZSAkZnJh bWUKICAgICAqIEBwYXJhbSBib29sZWFuICRzeW5jCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5j dGlvbiBfcHJlcGFyZVJlY2VpcHQgKFN0b21wRnJhbWUgJGZyYW1lLCAkc3luYykKICAgIHsKICAg ICAgICAkcmVjZWl2ZSA9ICR0aGlzLT5zeW5jOwogICAgICAgIGlmICgkc3luYyAhPT0gbnVsbCkg ewogICAgICAgICAgICAkcmVjZWl2ZSA9ICRzeW5jOwogICAgICAgIH0KICAgICAgICBpZiAoJHJl Y2VpdmUgPT0gdHJ1ZSkgewogICAgICAgICAgICAkZnJhbWUtPmhlYWRlcnNbJ3JlY2VpcHQnXSA9 IG1kNShtaWNyb3RpbWUoKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXYWl0IGZv ciByZWNlaXB0CiAgICAgKgogICAgICogQHBhcmFtIFN0b21wRnJhbWUgJGZyYW1lCiAgICAgKiBA cGFyYW0gYm9vbGVhbiAkc3luYwogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAdGhyb3dz IFN0b21wRXhjZXB0aW9uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfd2FpdEZvclJl Y2VpcHQgKFN0b21wRnJhbWUgJGZyYW1lLCAkc3luYykKICAgIHsKCiAgICAgICAgJHJlY2VpdmUg PSAkdGhpcy0+c3luYzsKICAgICAgICBpZiAoJHN5bmMgIT09IG51bGwpIHsKICAgICAgICAgICAg JHJlY2VpdmUgPSAkc3luYzsKICAgICAgICB9CiAgICAgICAgaWYgKCRyZWNlaXZlID09IHRydWUp IHsKICAgICAgICAgICAgJGlkID0gKGlzc2V0KCRmcmFtZS0+aGVhZGVyc1sncmVjZWlwdCddKSkg PyAkZnJhbWUtPmhlYWRlcnNbJ3JlY2VpcHQnXSA6IG51bGw7CiAgICAgICAgICAgIGlmICgkaWQg PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAg ICAgICAgICAgJGZyYW1lID0gJHRoaXMtPnJlYWRGcmFtZSgpOwogICAgICAgICAgICBpZiAoJGZy YW1lIGluc3RhbmNlb2YgU3RvbXBGcmFtZSAmJiAkZnJhbWUtPmNvbW1hbmQgPT0gJ1JFQ0VJUFQn KSB7CiAgICAgICAgICAgICAgICBpZiAoJGZyYW1lLT5oZWFkZXJzWydyZWNlaXB0LWlkJ10gPT0g JGlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9 IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfb25jZSAnU3RvbXAvRXhjZXB0aW9u LnBocCc7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN0b21wRXhjZXB0aW9uKCJVbmV4 cGVjdGVkIHJlY2VpcHQgaWQgeyRmcmFtZS0+aGVhZGVyc1sncmVjZWlwdC1pZCddfSIsIDAsICRm cmFtZS0+Ym9keSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAg ICAgICAgICAgICByZXF1aXJlX29uY2UgJ1N0b21wL0V4Y2VwdGlvbi5waHAnOwogICAgICAgICAg ICAgICAgaWYgKCRmcmFtZSBpbnN0YW5jZW9mIFN0b21wRnJhbWUpIHsKICAgICAgICAgICAgICAg ICAgICB0aHJvdyBuZXcgU3RvbXBFeGNlcHRpb24oIlVuZXhwZWN0ZWQgY29tbWFuZCB7JGZyYW1l LT5jb21tYW5kfSIsIDAsICRmcmFtZS0+Ym9keSk7CiAgICAgICAgICAgICAgICB9IGVsc2Ugewog ICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTdG9tcEV4Y2VwdGlvbigiUmVjZWlwdCBub3Qg cmVjZWl2ZWQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAg ICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8qKgogICAgICogUmVnaXN0ZXIgdG8gbGlzdGVu IHRvIGEgZ2l2ZW4gZGVzdGluYXRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRkZXN0 aW5hdGlvbiBEZXN0aW5hdGlvbiBxdWV1ZQogICAgICogQHBhcmFtIGFycmF5ICRwcm9wZXJ0aWVz CiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc3luYyBQZXJmb3JtIHJlcXVlc3Qgc3luY2hyb25vdXNs eQogICAgICogQHJldHVybiBib29sZWFuCiAgICAgKiBAdGhyb3dzIFN0b21wRXhjZXB0aW9uCiAg ICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzY3JpYmUgKCRkZXN0aW5hdGlvbiwgJHByb3Bl cnRpZXMgPSBudWxsLCAkc3luYyA9IG51bGwpCiAgICB7CiAgICAgICAgJGhlYWRlcnMgPSBhcnJh eSgnYWNrJyA9PiAnY2xpZW50Jyk7CgkJJGhlYWRlcnNbJ2FjdGl2ZW1xLnByZWZldGNoU2l6ZSdd ID0gJHRoaXMtPnByZWZldGNoU2l6ZTsKCQlpZiAoJHRoaXMtPmNsaWVudElkICE9IG51bGwpIHsK CQkJJGhlYWRlcnNbImFjdGl2ZW1xLnN1YmNyaXB0aW9uTmFtZSJdID0gJHRoaXMtPmNsaWVudElk OwoJCX0KICAgICAgICBpZiAoaXNzZXQoJHByb3BlcnRpZXMpKSB7CiAgICAgICAgICAgIGZvcmVh Y2ggKCRwcm9wZXJ0aWVzIGFzICRuYW1lID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgJGhl YWRlcnNbJG5hbWVdID0gJHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRo ZWFkZXJzWydkZXN0aW5hdGlvbiddID0gJGRlc3RpbmF0aW9uOwogICAgICAgICRmcmFtZSA9IG5l dyBTdG9tcEZyYW1lKCdTVUJTQ1JJQkUnLCAkaGVhZGVycyk7CiAgICAgICAgJHRoaXMtPl9wcmVw YXJlUmVjZWlwdCgkZnJhbWUsICRzeW5jKTsKICAgICAgICAkdGhpcy0+X3dyaXRlRnJhbWUoJGZy YW1lKTsKICAgICAgICBpZiAoJHRoaXMtPl93YWl0Rm9yUmVjZWlwdCgkZnJhbWUsICRzeW5jKSA9 PSB0cnVlKSB7CiAgICAgICAgICAgICR0aGlzLT5fc3Vic2NyaXB0aW9uc1skZGVzdGluYXRpb25d ID0gJHByb3BlcnRpZXM7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0gZWxzZSB7 CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAq IFJlbW92ZSBhbiBleGlzdGluZyBzdWJzY3JpcHRpb24KICAgICAqCiAgICAgKiBAcGFyYW0gc3Ry aW5nICRkZXN0aW5hdGlvbgogICAgICogQHBhcmFtIGFycmF5ICRwcm9wZXJ0aWVzCiAgICAgKiBA cGFyYW0gYm9vbGVhbiAkc3luYyBQZXJmb3JtIHJlcXVlc3Qgc3luY2hyb25vdXNseQogICAgICog QHJldHVybiBib29sZWFuCiAgICAgKiBAdGhyb3dzIFN0b21wRXhjZXB0aW9uCiAgICAgKi8KICAg IHB1YmxpYyBmdW5jdGlvbiB1bnN1YnNjcmliZSAoJGRlc3RpbmF0aW9uLCAkcHJvcGVydGllcyA9 IG51bGwsICRzeW5jID0gbnVsbCkKICAgIHsKICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CiAg ICAgICAgaWYgKGlzc2V0KCRwcm9wZXJ0aWVzKSkgewogICAgICAgICAgICBmb3JlYWNoICgkcHJv cGVydGllcyBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICRoZWFkZXJzWyRu YW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkaGVhZGVyc1sn ZGVzdGluYXRpb24nXSA9ICRkZXN0aW5hdGlvbjsKICAgICAgICAkZnJhbWUgPSBuZXcgU3RvbXBG cmFtZSgnVU5TVUJTQ1JJQkUnLCAkaGVhZGVycyk7CiAgICAgICAgJHRoaXMtPl9wcmVwYXJlUmVj ZWlwdCgkZnJhbWUsICRzeW5jKTsKICAgICAgICAkdGhpcy0+X3dyaXRlRnJhbWUoJGZyYW1lKTsK ICAgICAgICBpZiAoJHRoaXMtPl93YWl0Rm9yUmVjZWlwdCgkZnJhbWUsICRzeW5jKSA9PSB0cnVl KSB7CiAgICAgICAgICAgIHVuc2V0KCR0aGlzLT5fc3Vic2NyaXB0aW9uc1skZGVzdGluYXRpb25d KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAg cmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3RhcnQgYSB0cmFu c2FjdGlvbgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRyYW5zYWN0aW9uSWQKICAgICAq IEBwYXJhbSBib29sZWFuICRzeW5jIFBlcmZvcm0gcmVxdWVzdCBzeW5jaHJvbm91c2x5CiAgICAg KiBAcmV0dXJuIGJvb2xlYW4KICAgICAqIEB0aHJvd3MgU3RvbXBFeGNlcHRpb24KICAgICAqLwog ICAgcHVibGljIGZ1bmN0aW9uIGJlZ2luICgkdHJhbnNhY3Rpb25JZCA9IG51bGwsICRzeW5jID0g bnVsbCkKICAgIHsKICAgICAgICAkaGVhZGVycyA9IGFycmF5KCk7CiAgICAgICAgaWYgKGlzc2V0 KCR0cmFuc2FjdGlvbklkKSkgewogICAgICAgICAgICAkaGVhZGVyc1sndHJhbnNhY3Rpb24nXSA9 ICR0cmFuc2FjdGlvbklkOwogICAgICAgIH0KICAgICAgICAkZnJhbWUgPSBuZXcgU3RvbXBGcmFt ZSgnQkVHSU4nLCAkaGVhZGVycyk7CiAgICAgICAgJHRoaXMtPl9wcmVwYXJlUmVjZWlwdCgkZnJh bWUsICRzeW5jKTsKICAgICAgICAkdGhpcy0+X3dyaXRlRnJhbWUoJGZyYW1lKTsKICAgICAgICBy ZXR1cm4gJHRoaXMtPl93YWl0Rm9yUmVjZWlwdCgkZnJhbWUsICRzeW5jKTsKICAgIH0KICAgIC8q KgogICAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MKICAgICAqCiAgICAgKiBA cGFyYW0gc3RyaW5nICR0cmFuc2FjdGlvbklkCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc3luYyBQ ZXJmb3JtIHJlcXVlc3Qgc3luY2hyb25vdXNseQogICAgICogQHJldHVybiBib29sZWFuCiAgICAg KiBAdGhyb3dzIFN0b21wRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21t aXQgKCR0cmFuc2FjdGlvbklkID0gbnVsbCwgJHN5bmMgPSBudWxsKQogICAgewogICAgICAgICRo ZWFkZXJzID0gYXJyYXkoKTsKICAgICAgICBpZiAoaXNzZXQoJHRyYW5zYWN0aW9uSWQpKSB7CiAg ICAgICAgICAgICRoZWFkZXJzWyd0cmFuc2FjdGlvbiddID0gJHRyYW5zYWN0aW9uSWQ7CiAgICAg ICAgfQogICAgICAgICRmcmFtZSA9IG5ldyBTdG9tcEZyYW1lKCdDT01NSVQnLCAkaGVhZGVycyk7 CiAgICAgICAgJHRoaXMtPl9wcmVwYXJlUmVjZWlwdCgkZnJhbWUsICRzeW5jKTsKICAgICAgICAk dGhpcy0+X3dyaXRlRnJhbWUoJGZyYW1lKTsKICAgICAgICByZXR1cm4gJHRoaXMtPl93YWl0Rm9y UmVjZWlwdCgkZnJhbWUsICRzeW5jKTsKICAgIH0KICAgIC8qKgogICAgICogUm9sbCBiYWNrIGEg dHJhbnNhY3Rpb24gaW4gcHJvZ3Jlc3MKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR0cmFu c2FjdGlvbklkCiAgICAgKiBAcGFyYW0gYm9vbGVhbiAkc3luYyBQZXJmb3JtIHJlcXVlc3Qgc3lu Y2hyb25vdXNseQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWJvcnQgKCR0cmFuc2FjdGlv bklkID0gbnVsbCwgJHN5bmMgPSBudWxsKQogICAgewogICAgICAgICRoZWFkZXJzID0gYXJyYXko KTsKICAgICAgICBpZiAoaXNzZXQoJHRyYW5zYWN0aW9uSWQpKSB7CiAgICAgICAgICAgICRoZWFk ZXJzWyd0cmFuc2FjdGlvbiddID0gJHRyYW5zYWN0aW9uSWQ7CiAgICAgICAgfQogICAgICAgICRm cmFtZSA9IG5ldyBTdG9tcEZyYW1lKCdBQk9SVCcsICRoZWFkZXJzKTsKICAgICAgICAkdGhpcy0+ X3ByZXBhcmVSZWNlaXB0KCRmcmFtZSwgJHN5bmMpOwogICAgICAgICR0aGlzLT5fd3JpdGVGcmFt ZSgkZnJhbWUpOwogICAgICAgIHJldHVybiAkdGhpcy0+X3dhaXRGb3JSZWNlaXB0KCRmcmFtZSwg JHN5bmMpOwogICAgfQogICAgLyoqCiAgICAgKiBBY2tub3dsZWRnZSBjb25zdW1wdGlvbiBvZiBh IG1lc3NhZ2UgZnJvbSBhIHN1YnNjcmlwdGlvbgoJICogTm90ZTogVGhpcyBvcGVyYXRpb24gaXMg YWx3YXlzIGFzeW5jaHJvbm91cwogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8U3RvbXBGcmFt ZSAkbWVzc2FnZU1lc3NhZ2UgSUQKICAgICAqIEBwYXJhbSBzdHJpbmcgJHRyYW5zYWN0aW9uSWQK ICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICogQHRocm93cyBTdG9tcEV4Y2VwdGlvbgogICAg ICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNrICgkbWVzc2FnZSwgJHRyYW5zYWN0aW9uSWQgPSBu dWxsKQogICAgewogICAgICAgIGlmICgkbWVzc2FnZSBpbnN0YW5jZW9mIFN0b21wRnJhbWUpIHsK ICAgICAgICAgICAgJGhlYWRlcnMgPSAkbWVzc2FnZS0+aGVhZGVyczsKICAgICAgICAgICAgaWYg KGlzc2V0KCR0cmFuc2FjdGlvbklkKSkgewogICAgICAgICAgICAgICAgJGhlYWRlcnNbJ3RyYW5z YWN0aW9uJ10gPSAkdHJhbnNhY3Rpb25JZDsKICAgICAgICAgICAgfQkJCQogICAgICAgICAgICAk ZnJhbWUgPSBuZXcgU3RvbXBGcmFtZSgnQUNLJywgJGhlYWRlcnMpOwogICAgICAgICAgICAkdGhp cy0+X3dyaXRlRnJhbWUoJGZyYW1lKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAg fSBlbHNlIHsKICAgICAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOwogICAgICAgICAgICBpZiAo aXNzZXQoJHRyYW5zYWN0aW9uSWQpKSB7CiAgICAgICAgICAgICAgICAkaGVhZGVyc1sndHJhbnNh Y3Rpb24nXSA9ICR0cmFuc2FjdGlvbklkOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRoZWFk ZXJzWydtZXNzYWdlLWlkJ10gPSAkbWVzc2FnZTsKICAgICAgICAgICAgJGZyYW1lID0gbmV3IFN0 b21wRnJhbWUoJ0FDSycsICRoZWFkZXJzKTsKICAgICAgICAgICAgJHRoaXMtPl93cml0ZUZyYW1l KCRmcmFtZSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8q KgogICAgICogR3JhY2VmdWwgZGlzY29ubmVjdCBmcm9tIHRoZSBzZXJ2ZXIKICAgICAqCiAgICAg Ki8KICAgIHB1YmxpYyBmdW5jdGlvbiBkaXNjb25uZWN0ICgpCiAgICB7CgkJJGhlYWRlcnMgPSBh cnJheSgpOwoKCQlpZiAoJHRoaXMtPmNsaWVudElkICE9IG51bGwpIHsKCQkJJGhlYWRlcnNbImNs aWVudC1pZCJdID0gJHRoaXMtPmNsaWVudElkOwoJCX0KCiAgICAgICAgaWYgKGlzX3Jlc291cmNl KCR0aGlzLT5fc29ja2V0KSkgewogICAgICAgICAgICAkdGhpcy0+X3dyaXRlRnJhbWUobmV3IFN0 b21wRnJhbWUoJ0RJU0NPTk5FQ1QnLCAkaGVhZGVycykpOwogICAgICAgICAgICBzb2NrZXRfY2xv c2UoJHRoaXMtPl9zb2NrZXQpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+X3NvY2tldCA9IG51 bGw7CiAgICAgICAgJHRoaXMtPl9zZXNzaW9uSWQgPSBudWxsOwogICAgICAgICR0aGlzLT5fY3Vy cmVudEhvc3QgPSAtMTsKICAgICAgICAkdGhpcy0+X3N1YnNjcmlwdGlvbnMgPSBhcnJheSgpOwog ICAgICAgICR0aGlzLT5fdXNlcm5hbWUgPSAnJzsKICAgICAgICAkdGhpcy0+X3Bhc3N3b3JkID0g Jyc7CiAgICB9CiAgICAvKioKICAgICAqIFdyaXRlIGZyYW1lIHRvIHNlcnZlcgogICAgICoKICAg ICAqIEBwYXJhbSBTdG9tcEZyYW1lICRzdG9tcEZyYW1lCiAgICAgKi8KICAgIHByb3RlY3RlZCBm dW5jdGlvbiBfd3JpdGVGcmFtZSAoU3RvbXBGcmFtZSAkc3RvbXBGcmFtZSkKICAgIHsKICAgICAg ICBpZiAoIWlzX3Jlc291cmNlKCR0aGlzLT5fc29ja2V0KSkgewogICAgICAgICAgICByZXF1aXJl X29uY2UgJ1N0b21wL0V4Y2VwdGlvbi5waHAnOwogICAgICAgICAgICB0aHJvdyBuZXcgU3RvbXBF eGNlcHRpb24oJ1NvY2tldCBjb25uZWN0aW9uIGhhc25cJ3QgYmVlbiBlc3RhYmxpc2hlZCcpOwog ICAgICAgIH0KCiAgICAgICAgJGRhdGEgPSAkc3RvbXBGcmFtZS0+X190b1N0cmluZygpOwoKICAg ICAgICAkciA9IHNvY2tldF93cml0ZSgkdGhpcy0+X3NvY2tldCwgJGRhdGEsIHN0cmxlbigkZGF0 YSkpOwogICAgICAgIGlmICgkciA9PT0gZmFsc2UgfHwgJHIgPT0gMCkgewogICAgICAgICAgICAk dGhpcy0+X3JlY29ubmVjdCgpOwogICAgICAgICAgICAkdGhpcy0+X3dyaXRlRnJhbWUoJHN0b21w RnJhbWUpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgLyoqCiAgICAgKiBTZXQgdGltZW91dCB0 byB3YWl0IGZvciBjb250ZW50IHRvIHJlYWQKICAgICAqCiAgICAgKiBAcGFyYW0gaW50ICRzZWNv bmRzX3RvX3dhaXQgIFNlY29uZHMgdG8gd2FpdCBmb3IgYSBmcmFtZQogICAgICogQHBhcmFtIGlu dCAkbWlsbGlzZWNvbmRzIE1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBhIGZyYW1lCiAgICAgKi8K ICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkVGltZW91dCgkc2Vjb25kcywgJG1pbGxpc2Vjb25k cyA9IDApIAogICAgewogICAgICAgICR0aGlzLT5fcmVhZF90aW1lb3V0X3NlY29uZHMgPSAkc2Vj b25kczsKICAgICAgICAkdGhpcy0+X3JlYWRfdGltZW91dF9taWxsaXNlY29uZHMgPSAkbWlsbGlz ZWNvbmRzOwogICAgfQogICAgCiAgICAvKioKICAgICAqIFJlYWQgcmVzcG9uc2UgZnJhbWUgZnJv bSBzZXJ2ZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIFN0b21wRnJhbWUgRmFsc2Ugd2hlbiBubyBm cmFtZSB0byByZWFkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkRnJhbWUoKQogICAg ewogICAgICAgIGlmICghJHRoaXMtPmhhc0ZyYW1lVG9SZWFkKCkpIHsKICAgICAgICAgICAgcmV0 dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAkcmIgPSAxMDI0OwogICAgICAg ICRkYXRhID0gJyc7CiAgICAgICAgJGVuZCA9IGZhbHNlOwogICAgICAgIAogICAgICAgIGRvIHsK ICAgICAgICAgICAgJHJlYWQgPSBzb2NrZXRfcmVhZCgkdGhpcy0+X3NvY2tldCwgJHJiKTsKICAg ICAgICAgICAgaWYgKCRyZWFkID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPl9y ZWNvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmVhZEZyYW1lKCk7CiAg ICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGEgLj0gJHJlYWQ7CiAgICAgICAgICAgIGlmIChz dHJwb3MoJGRhdGEsICJceDAwIikgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkZW5kID0g dHJ1ZTsKICAgICAgICAgICAgICAgICRkYXRhID0gcnRyaW0oJGRhdGEsICJcbiIpOwogICAgICAg ICAgICB9CiAgICAgICAgICAgICRsZW4gPSBzdHJsZW4oJGRhdGEpOwogICAgICAgIH0gd2hpbGUg KCRsZW4gPCAyIHx8ICRlbmQgPT0gZmFsc2UpOwogICAgICAgIAogICAgICAgIGxpc3QgKCRoZWFk ZXIsICRib2R5KSA9IGV4cGxvZGUoIlxuXG4iLCAkZGF0YSwgMik7CiAgICAgICAgJGhlYWRlciA9 IGV4cGxvZGUoIlxuIiwgJGhlYWRlcik7CiAgICAgICAgJGhlYWRlcnMgPSBhcnJheSgpOwogICAg ICAgICRjb21tYW5kID0gbnVsbDsKICAgICAgICBmb3JlYWNoICgkaGVhZGVyIGFzICR2KSB7CiAg ICAgICAgICAgIGlmIChpc3NldCgkY29tbWFuZCkpIHsKICAgICAgICAgICAgICAgIGxpc3QgKCRu YW1lLCAkdmFsdWUpID0gZXhwbG9kZSgnOicsICR2LCAyKTsKICAgICAgICAgICAgICAgICRoZWFk ZXJzWyRuYW1lXSA9ICR2YWx1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg ICRjb21tYW5kID0gJHY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZyYW1lID0g bmV3IFN0b21wRnJhbWUoJGNvbW1hbmQsICRoZWFkZXJzLCB0cmltKCRib2R5KSk7CiAgICAgICAg aWYgKGlzc2V0KCRmcmFtZS0+aGVhZGVyc1sndHJhbnNmb3JtYXRpb24nXSkgJiYgJGZyYW1lLT5o ZWFkZXJzWyd0cmFuc2Zvcm1hdGlvbiddID09ICdqbXMtbWFwLWpzb24nKSB7CiAgICAgICAgICAg IHJlcXVpcmVfb25jZSAnU3RvbXAvTWVzc2FnZS9NYXAucGhwJzsKICAgICAgICAgICAgcmV0dXJu IG5ldyBTdG9tcE1lc3NhZ2VNYXAoJGZyYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg ICByZXR1cm4gJGZyYW1lOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGZyYW1lOwogICAgfQog ICAgCiAgICAvKioKICAgICAqIENoZWNrIGlmIHRoZXJlIGlzIGEgZnJhbWUgdG8gcmVhZAogICAg ICoKICAgICAqIEByZXR1cm4gYm9vbGVhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFz RnJhbWVUb1JlYWQoKQogICAgewogICAgICAgICRyZWFkID0gYXJyYXkoJHRoaXMtPl9zb2NrZXQp OwogICAgICAgICR3cml0ZSA9IG51bGw7CiAgICAgICAgJGV4Y2VwdCA9IG51bGw7CiAgICAgICAg CiAgICAgICAgJGhhc19mcmFtZV90b19yZWFkID0gQHNvY2tldF9zZWxlY3QoJHJlYWQsICR3cml0 ZSwgJGV4Y2VwdCwgJHRoaXMtPl9yZWFkX3RpbWVvdXRfc2Vjb25kcywgJHRoaXMtPl9yZWFkX3Rp bWVvdXRfbWlsbGlzZWNvbmRzKTsKCiAgICAgICAgaWYgKCRoYXNfZnJhbWVfdG9fcmVhZCAhPT0g ZmFsc2UpCiAgICAgICAgICAgICRoYXNfZnJhbWVfdG9fcmVhZCA9IGNvdW50KCRyZWFkKTsKCiAg ICAgICAgaWYgKCRoYXNfZnJhbWVfdG9fcmVhZCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhy b3cgbmV3IFN0b21wRXhjZXB0aW9uKCdDaGVjayBmYWlsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBz b2NrZXQgaXMgcmVhZGFibGUnKTsKICAgICAgICB9IGVsc2UgaWYgKCRoYXNfZnJhbWVfdG9fcmVh ZCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgICAgcmV0dXJuIGZhbHNlOyAKICAgICAgICB9CiAgICB9CiAgICAKICAgIC8qKgogICAgICog UmVjb25uZWN0cyBhbmQgcmVuZXdzIHN1YnNjcmlwdGlvbnMgKGlmIHRoZXJlIHdlcmUgYW55KQog ICAgICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdSBkZXRlY3QgY29ubmVjdGlvbiBwcm9ibGVt cyAgICAgCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfcmVjb25uZWN0ICgpCiAgICB7 CiAgICAgICAgJHN1YnNjcmlwdGlvbnMgPSAkdGhpcy0+X3N1YnNjcmlwdGlvbnM7CiAgICAgICAg CiAgICAgICAgJHRoaXMtPmNvbm5lY3QoJHRoaXMtPl91c2VybmFtZSwgJHRoaXMtPl9wYXNzd29y ZCk7CiAgICAgICAgZm9yZWFjaCAoJHN1YnNjcmlwdGlvbnMgYXMgJGRlc3QgPT4gJHByb3BlcnRp ZXMpIHsKICAgICAgICAgICAgJHRoaXMtPnN1YnNjcmliZSgkZGVzdCwgJHByb3BlcnRpZXMpOwog ICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR3JhY2VmdWwgb2JqZWN0IGRlc3J1Y3Rpb24K ICAgICAqCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKICAgIHsKICAg ICAgICAkdGhpcy0+ZGlzY29ubmVjdCgpOwogICAgfQp9Cj8+Cg== --0050450169f592d1e7049d9342ac--