Return-Path: Delivered-To: apmail-activemq-dev-archive@www.apache.org Received: (qmail 35997 invoked from network); 13 Apr 2007 20:37:21 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 13 Apr 2007 20:37:21 -0000 Received: (qmail 91394 invoked by uid 500); 13 Apr 2007 20:37:27 -0000 Delivered-To: apmail-activemq-dev-archive@activemq.apache.org Received: (qmail 91266 invoked by uid 500); 13 Apr 2007 20:37:26 -0000 Mailing-List: contact dev-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list dev@activemq.apache.org Received: (qmail 91257 invoked by uid 99); 13 Apr 2007 20:37:26 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Apr 2007 13:37:26 -0700 X-ASF-Spam-Status: No, hits=2.6 required=10.0 tests=HTML_00_10,HTML_MESSAGE,SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (herse.apache.org: domain of mindeh@gmail.com designates 64.233.184.231 as permitted sender) Received: from [64.233.184.231] (HELO wr-out-0506.google.com) (64.233.184.231) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 13 Apr 2007 13:37:18 -0700 Received: by wr-out-0506.google.com with SMTP id 57so918559wri for ; Fri, 13 Apr 2007 13:36:57 -0700 (PDT) DKIM-Signature: a=rsa-sha1; c=relaxed/relaxed; d=gmail.com; s=beta; h=domainkey-signature:received:received:message-id:date:from:to:subject:mime-version:content-type; b=hBMI9pt6/Y6GLalN2l6e8CFpEOt1fKi9rRtZ0OI95z/6P3Uj9BWpWQZEUmXJhuyHZtf2cHhntfnabzM6nopYpwSOZZXPpjgQL9USyF4gn0nYxhVXhYDIdIrNNuHh2gCFx2uHsZUyujDFjpvYyo0B+3xfSe0XUeYbLvJiNOELJhk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:mime-version:content-type; b=fY9jr6huDrprU/eEXMqgdoWZ6e5S6hV7iDjCYbOxe+Du1WpahTr4CYgLfPivCE5ShfX+zFHg8AHTZf++iEnHpgSX1DVwjaHd+Z6t0T0hY9tl5X7TRMdh8esL211GhrMKPixeYtdE8fjQyw1UStPY5LtKROGcmvG6rUuykFeDPdo= Received: by 10.114.124.1 with SMTP id w1mr1097431wac.1176496616764; Fri, 13 Apr 2007 13:36:56 -0700 (PDT) Received: by 10.114.102.6 with HTTP; Fri, 13 Apr 2007 13:36:56 -0700 (PDT) Message-ID: <5dcac4260704131336j76238381y5a8b3af904c0ff2e@mail.gmail.com> Date: Fri, 13 Apr 2007 23:36:56 +0300 From: "=?ISO-8859-13?Q?Mindaugas_Janu=F0aitis?=" To: dev@activemq.apache.org Subject: Improved NIO support, Stomp enabled with NIO MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_13658_16743518.1176496616711" X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_13658_16743518.1176496616711 Content-Type: multipart/alternative; boundary="----=_Part_13659_20846970.1176496616711" ------=_Part_13659_20846970.1176496616711 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello developers, This is my first post :) So here goes the story... I have written in C Partial implementation of Stomp Broker and there was a need to interconnect it with apache-mq the performance was the bottleneck. When I took a quick look @ stable src, there was no clue of using Java NIO, but in SVN I found a stub or initial implementation, a few minutes I was Happy as long as I replaced 'StompTransportFactory extends TcpTransportFactory' with StompTransportFactory extends NIOTransportFactory' and was rewarded with Exception :) Further Investigation showed that This NIO implementation makes assumptions about it's user, and it looks like it assumes that the OpenWire Protocol uses it. by the way, I found that there is no Transport that uses the NIOTransportFactory at the moment. My implementation should be 'Drop in replacement' for TcpTransportFactory. I took universal approach and implemented: NIOBufferedInputStream && NIOBufferedOutputStream. Despite the fact that we still have Thread per client (with nio we should use selectors and less threads, but it would require full apache-mq rewrite :) ) the performance improvement is about 80%. Basically it fullfils my requirements. It would be nice to have this patch included. Any Comments && Questions are welcome... The patch is attached. ------=_Part_13659_20846970.1176496616711 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello developers,

This is my first post :)

So here goes the story... I have written in C Partial implementation of Stomp Broker
and there was a need to interconnect it with apache-mq the performance was the bottleneck.

When I took a quick look @ stable src, there was no clue of using Java NIO, but in SVN I found
a stub or initial implementation, a few minutes I was Happy as long as I replaced 'StompTransportFactory extends TcpTransportFactory'
with StompTransportFactory extends NIOTransportFactory' and  was rewarded with Exception :)

Further Investigation showed that This NIO implementation makes assumptions about it's user, and it looks like it assumes that the OpenWire Protocol uses it.
by the way, I found that there is no Transport that uses the NIOTransportFactory at the moment.

My implementation should be 'Drop in replacement' for TcpTransportFactory. I took universal approach and implemented: NIOBufferedInputStream && NIOBufferedOutputStream.   Despite the fact that we still have Thread per client (with nio we should use selectors and less threads, but it would require full apache-mq rewrite :) )  the performance improvement is about 80%. Basically it fullfils my requirements. It would be nice to have this patch included.

Any Comments && Questions are welcome...

The patch is attached.



------=_Part_13659_20846970.1176496616711-- ------=_Part_13658_16743518.1176496616711 Content-Type: text/x-patch; name=nio_and_stomp.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f0h1iinc Content-Disposition: attachment; filename="nio_and_stomp.patch" SW5kZXg6IC9ob21lL21pbmRlaC9hY3RpdmUtbXEtc3ZuLXdvcmtzcGFjZS9hY3RpdmVtcS1jb3Jl L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9hY3RpdmVtcS90cmFuc3BvcnQvc3RvbXAvU3RvbXBX aXJlRm9ybWF0LmphdmEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gL2hvbWUvbWluZGVoL2FjdGl2ZS1tcS1zdm4t d29ya3NwYWNlL2FjdGl2ZW1xLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FjdGl2ZW1x L3RyYW5zcG9ydC9zdG9tcC9TdG9tcFdpcmVGb3JtYXQuamF2YQkocmV2aXNpb24gNTI2NTQ5KQor KysgL2hvbWUvbWluZGVoL2FjdGl2ZS1tcS1zdm4td29ya3NwYWNlL2FjdGl2ZW1xLWNvcmUvc3Jj L21haW4vamF2YS9vcmcvYXBhY2hlL2FjdGl2ZW1xL3RyYW5zcG9ydC9zdG9tcC9TdG9tcFdpcmVG b3JtYXQuamF2YQkod29ya2luZyBjb3B5KQpAQCAtMjIsNiArMjIsOSBAQAogaW1wb3J0IGphdmEu aW8uRGF0YU91dHB1dDsKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07CiBpbXBvcnQg amF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdF eGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CitpbXBv cnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9y dCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTMyLDM1ICsz NSw0MCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuYWN0aXZlbXEud2lyZWZvcm1hdC5XaXJlRm9ybWF0 OwogCiAvKioKLSAqIEltcGxlbWVudHMgbWFyc2hhbGxpbmcgYW5kIHVubWFyc2FsbGluZyB0aGUg PGEgaHJlZj0iaHR0cDovL3N0b21wLmNvZGVoYXVzLm9yZy8iPlN0b21wPC9hPiBwcm90b2NvbC4K KyAqIEltcGxlbWVudHMgbWFyc2hhbGxpbmcgYW5kIHVubWFyc2FsbGluZyB0aGUgPGEKKyAqIGhy ZWY9Imh0dHA6Ly9zdG9tcC5jb2RlaGF1cy5vcmcvIj5TdG9tcDwvYT4gcHJvdG9jb2wuCiAgKi8K IHB1YmxpYyBjbGFzcyBTdG9tcFdpcmVGb3JtYXQgaW1wbGVtZW50cyBXaXJlRm9ybWF0IHsKIAot ICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBOT19EQVRBID0gbmV3IGJ5dGVbXXt9Owot CXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTkRfT0ZfRlJBTUUgPSBuZXcgYnl0ZVtdezAs J1xuJ307Ci0JCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE5PX0RBVEEgPSBuZXcgYnl0 ZVtdIHt9OworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEVORF9PRl9GUkFNRSA9IG5l dyBieXRlW10geyAwLCAnXG4nIH07CisKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NP TU1BTkRfTEVOR1RIID0gMTAyNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0hFQURF Ul9MRU5HVEggPSAxMDI0KjEwOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9IRUFE RVJfTEVOR1RIID0gMTAyNCAqIDEwOworCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9I RUFERVJTID0gMTAwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfTEVOR1RI ID0gMTAyNCoxMDI0KjEwMDsKLSAgICAKLQlwcml2YXRlIGludCB2ZXJzaW9uPTE7CiAKKwlwcml2 YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RBVEFfTEVOR1RIID0gMTAyNCAqIDEwMjQgKiAxMDA7 CisKKwlwcml2YXRlIGludCB2ZXJzaW9uID0gMTsKKwogCXB1YmxpYyBCeXRlU2VxdWVuY2UgbWFy c2hhbChPYmplY3QgY29tbWFuZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnl0ZUFy cmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAg ICAgIERhdGFPdXRwdXRTdHJlYW0gZG9zID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYmFvcyk7Ci0g ICAgICAgIG1hcnNoYWwoY29tbWFuZCwgZG9zKTsKLSAgICAgICAgZG9zLmNsb3NlKCk7Ci0gICAg ICAgIHJldHVybiBiYW9zLnRvQnl0ZVNlcXVlbmNlKCk7Ci0gICAgfQorCQlCeXRlQXJyYXlPdXRw dXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJRGF0YU91dHB1 dFN0cmVhbSBkb3MgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiYW9zKTsKKwkJbWFyc2hhbChjb21t YW5kLCBkb3MpOworCQlkb3MuY2xvc2UoKTsKKwkJcmV0dXJuIGJhb3MudG9CeXRlU2VxdWVuY2Uo KTsKKwl9CiAKLSAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChCeXRlU2VxdWVuY2UgcGFja2V0 KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBzdHJl YW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFja2V0KTsKLSAgICAgICAgRGF0YUlucHV0 U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgcmV0dXJu IHVubWFyc2hhbChkaXMpOwotICAgIH0KKwlwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChCeXRlU2Vx dWVuY2UgcGFja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlCeXRlQXJyYXlJbnB1dFN0cmVh bSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFja2V0KTsKKwkJRGF0YUlucHV0 U3RyZWFtIGRpcyA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oc3RyZWFtKTsKKwkJcmV0dXJuIHVubWFy c2hhbChkaXMpOworCX0KIAotICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IGNvbW1hbmQs IERhdGFPdXRwdXQgb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgbWFyc2hh bChPYmplY3QgY29tbWFuZCwgRGF0YU91dHB1dCBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJ U3RvbXBGcmFtZSBzdG9tcCA9IChvcmcuYXBhY2hlLmFjdGl2ZW1xLnRyYW5zcG9ydC5zdG9tcC5T dG9tcEZyYW1lKSBjb21tYW5kOwogCiAJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5n QnVmZmVyKCk7CkBAIC02OCw3ICs3Niw4IEBACiAJCWJ1ZmZlci5hcHBlbmQoU3RvbXAuTkVXTElO RSk7CiAKIAkJLy8gT3V0cHV0IHRoZSBoZWFkZXJzLgotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBz dG9tcC5nZXRIZWFkZXJzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsp IHsKKwkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RvbXAuZ2V0SGVhZGVycygpLmVudHJ5U2V0KCku aXRlcmF0b3IoKTsgaXRlcgorCQkJCS5oYXNOZXh0KCk7KSB7CiAJCQlNYXAuRW50cnkgZW50cnkg PSAoTWFwLkVudHJ5KSBpdGVyLm5leHQoKTsKIAkJCWJ1ZmZlci5hcHBlbmQoZW50cnkuZ2V0S2V5 KCkpOwogCQkJYnVmZmVyLmFwcGVuZChTdG9tcC5IZWFkZXJzLlNFUEVSQVRPUik7CkBAIC04Mywx MjIgKzkyLDE1NiBAQAogCQlvcy53cml0ZShzdG9tcC5nZXRDb250ZW50KCkpOwogCQlvcy53cml0 ZShFTkRfT0ZfRlJBTUUpOwogCX0KLSAgICAKIAotICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFs KERhdGFJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgCQotICAgICAgICB0 cnkgewotCQkJU3RyaW5nIGFjdGlvbiA9IG51bGw7Ci0JCQkKLQkJCS8vIHNraXAgd2hpdGUgc3Bh Y2UgdG8gbmV4dCByZWFsIGFjdGlvbiBsaW5lCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWFjdGlv biA9IHJlYWRMaW5lKGluLCBNQVhfQ09NTUFORF9MRU5HVEgsICJUaGUgbWF4aW11bSBjb21tYW5k IGxlbmd0aCB3YXMgZXhjZWVkZWQiKTsKLQkJCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCQkJ dGhyb3cgbmV3IElPRXhjZXB0aW9uKCJjb25uZWN0aW9uIHdhcyBjbG9zZWQiKTsKLQkJCQl9IGVs c2UgewotCQkJCQlhY3Rpb24gPSBhY3Rpb24udHJpbSgpOwotCQkJCQlpZiAoYWN0aW9uLmxlbmd0 aCgpID4gMCkgewotCQkJCQkJYnJlYWs7CisJcHVibGljIE9iamVjdCB1bm1hcnNoYWwoRGF0YUlu cHV0IGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBi YW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMDI0KTsKKwkJU3RyaW5nIGFjdGlvbiA9 IG51bGw7CisJCUhhc2hNYXAgaGVhZGVycyA9IG5ldyBIYXNoTWFwKDI1KTsKKwkJYnl0ZVtdIGRh dGEgPSBOT19EQVRBOworCQlpbnQgY29udGVudExlbmd0aCA9IC0xOworCQlTdHJpbmcga2V5ID0g bnVsbDsKKwkJU3RyaW5nIHZhbHVlID0gbnVsbDsKKwkJYnl0ZSBiID0gMDsKKwkJaW50IGkgPSAw OworCQlpbnQgaGVhZGVyc0NvdW50ID0gMDsKKworCQl0cnkgeworCQkJLyoKKwkJCSAqIFJlYWRp bmcgQ29tbWFuZAorCQkJICovCisKKwkJCWJhb3MucmVzZXQoKTsKKworCQkJZm9yIChpID0gMDsg KCgoKGIgPSBpbi5yZWFkQnl0ZSgpKSAhPSAnXG4nKSAmJiAoaSA8IE1BWF9DT01NQU5EX0xFTkdU SCkpIHx8IChiYW9zLnNpemUoKSA9PSAwKSApOyArK2kpCisJCQl7ICAKKwkJCQlpZiAoYiA9PSAn XG4nICYmIGJhb3Muc2l6ZSgpID09IDApCisJCQkJeworCQkJCQljb250aW51ZTsKKwkJCQl9IGVs c2UKKwkJCQkJYmFvcy53cml0ZShiKTsKKwkJCX0KKworCQkJaWYgKGkgPT0gTUFYX0NPTU1BTkRf TEVOR1RIKQorCQkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCSJUaGUgbWF4 aW11bSBudW1iZXIgb2YgY29tbWFuZCBsZW5ndGggd2FzIGV4ZWVkZWQiLAorCQkJCQkJdHJ1ZSk7 CisKKwkJCWFjdGlvbiA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsK KworCQkJLyoKKwkJCSAqIFJlYWRpbmcgSGVhZGVycworCQkJICovCisKKwkJCWZvciAoaGVhZGVy c0NvdW50ID0gMDsgaGVhZGVyc0NvdW50IDwgTUFYX0hFQURFUlM7ICsraGVhZGVyc0NvdW50KSB7 CisJCQkJLyoKKwkJCQkgKiBSZWFkaW5nIEtleQorCQkJCSAqLworCisJCQkJYmFvcy5yZXNldCgp OworCisJCQkJZm9yIChpID0gMDsgKCgoYiA9IGluLnJlYWRCeXRlKCkpICE9ICdcbicpICYmIChi ICE9ICc6JykpCisJCQkJCQkmJiAoaSA8IE1BWF9IRUFERVJfTEVOR1RIKTsgKytpKQorCQkJCQli YW9zLndyaXRlKGIpOworCisJCQkJaWYgKGkgPT0gTUFYX0hFQURFUl9MRU5HVEgpCisJCQkJCXRo cm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQkiVGhlIG1heGltdW0gaGVhZGVyIGxl bmd0aCB3YXMgZXhjZWVkZWQiLCB0cnVlKTsKKworCQkJCWlmIChiID09ICc6JykgeworCQkJCQlr ZXkgPSBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04Iik7CisJCQkJfSBlbHNl IGlmIChiID09ICdcbicpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBS ZWFkaW5nIFZhbHVlCisJCQkJICovCisKKwkJCQliYW9zLnJlc2V0KCk7CisKKwkJCQlmb3IgKGkg PSAwOyAoKGIgPSBpbi5yZWFkQnl0ZSgpKSAhPSAnXG4nKQorCQkJCQkJJiYgKGkgPCBNQVhfSEVB REVSX0xFTkdUSCk7ICsraSkKKwkJCQkJYmFvcy53cml0ZShiKTsKKworCQkJCWlmIChpID09IE1B WF9IRUFERVJfTEVOR1RIKQorCQkJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJ CQkJIlRoZSBtYXhpbXVtIGhlYWRlciBsZW5ndGggd2FzIGV4Y2VlZGVkIiwgdHJ1ZSk7CisKKwkJ CQl2YWx1ZSA9IG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsKKworCQkJ CWlmIChrZXkuZXF1YWxzKCJjb250ZW50LWxlbmd0aCIpKSB7CisKKwkJCQkJdHJ5IHsKKwkJCQkJ CWNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKwkJCQkJfSBjYXRjaCAo TnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQkJCXRocm93IG5ldyBQcm90b2NvbEV4Y2Vw dGlvbigKKwkJCQkJCQkJIlVuYWJsZSB0byBwYXJzZSBjb250ZW50LWxlbmd0aCIsIHRydWUpOwog CQkJCQl9CisKKwkJCQkJaWYgKGNvbnRlbnRMZW5ndGggPCAwKSB7CisJCQkJCQl0aHJvdyBuZXcg UHJvdG9jb2xFeGNlcHRpb24oIk5lZ2F0aXZlIGNvbnRlbnQtbGVuZ3RoIiwKKwkJCQkJCQkJdHJ1 ZSk7CisJCQkJCX0KKworCQkJCQlpZiAoY29udGVudExlbmd0aCA+IE1BWF9EQVRBX0xFTkdUSCkg eworCQkJCQkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCQkiY29udGVudC1s ZW5ndGggaXMgbW9yZSB0aGFuIG1heGltdW0gZGF0YSBsZW5ndGgiLAorCQkJCQkJCQl0cnVlKTsK KwkJCQkJfQogCQkJCX0KKworCQkJCWhlYWRlcnMucHV0KGtleSwgdmFsdWUpOwogCQkJfQotCQkJ Ci0JCQkvLyBQYXJzZSB0aGUgaGVhZGVycwotCQkJSGFzaE1hcCBoZWFkZXJzID0gbmV3IEhhc2hN YXAoMjUpOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCSAgICBTdHJpbmcgbGluZSA9IHJlYWRMaW5l KGluLCBNQVhfSEVBREVSX0xFTkdUSCwgIlRoZSBtYXhpbXVtIGhlYWRlciBsZW5ndGggd2FzIGV4 Y2VlZGVkIik7Ci0JCQkgICAgaWYgKGxpbmUgIT0gbnVsbCAmJiBsaW5lLnRyaW0oKS5sZW5ndGgo KSA+IDApIHsKLQkJCSAgICAJCi0JCQkgICAgCWlmKCBoZWFkZXJzLnNpemUoKSA+IE1BWF9IRUFE RVJTICkKLQkJCSAgICAJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigiVGhlIG1heGltdW0g bnVtYmVyIG9mIGhlYWRlcnMgd2FzIGV4Y2VlZGVkIiwgdHJ1ZSk7Ci0JCQkgICAgCQotCQkJICAg ICAgICB0cnkgewotCQkJICAgICAgICAgICAgaW50IHNlcGVyYXRvcl9pbmRleCA9IGxpbmUuaW5k ZXhPZihTdG9tcC5IZWFkZXJzLlNFUEVSQVRPUik7Ci0JCQkgICAgICAgICAgICBTdHJpbmcgbmFt ZSA9IGxpbmUuc3Vic3RyaW5nKDAsIHNlcGVyYXRvcl9pbmRleCkudHJpbSgpOwotCQkJICAgICAg ICAgICAgU3RyaW5nIHZhbHVlID0gbGluZS5zdWJzdHJpbmcoc2VwZXJhdG9yX2luZGV4ICsgMSwg bGluZS5sZW5ndGgoKSkudHJpbSgpOwotCQkJICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwg dmFsdWUpOwotCQkJICAgICAgICB9Ci0JCQkgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewot CQkJICAgICAgICAgICAgdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJVbmFibGUgdG8gcGFy c2VyIGhlYWRlciBsaW5lIFsiICsgbGluZSArICJdIiwgdHJ1ZSk7Ci0JCQkgICAgICAgIH0KLQkJ CSAgICB9Ci0JCQkgICAgZWxzZSB7Ci0JCQkgICAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0K LQkJCQotCQkJLy8gUmVhZCBpbiB0aGUgZGF0YSBwYXJ0LgotCQkJYnl0ZVtdIGRhdGEgPSBOT19E QVRBOwotCQkJU3RyaW5nIGNvbnRlbnRMZW5ndGggPSAoU3RyaW5nKWhlYWRlcnMuZ2V0KFN0b21w LkhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpOwotCQkJaWYgKGNvbnRlbnRMZW5ndGghPW51bGwpIHsK LQkJCSAgICAKLQkJCQkvLyBCbGVzcyB0aGUgY2xpZW50LCBoZSdzIHRlbGxpbmcgdXMgaG93IG11 Y2ggZGF0YSB0byByZWFkIGluLiAgICAgICAgCQotCQkJCWludCBsZW5ndGg7Ci0JCQkJdHJ5IHsK LQkJCQkJbGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChjb250ZW50TGVuZ3RoLnRyaW0oKSk7Ci0J CQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IFBy b3RvY29sRXhjZXB0aW9uKCJTcGVjaWZpZWQgY29udGVudC1sZW5ndGggaXMgbm90IGEgdmFsaWQg aW50ZWdlciIsIHRydWUpOwotCQkJCX0KIAotCQkJCWlmKCBsZW5ndGggPiBNQVhfREFUQV9MRU5H VEggKQotCQkJCQl0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24oIlRoZSBtYXhpbXVtIGRhdGEg bGVuZ3RoIHdhcyBleGNlZWRlZCIsIHRydWUpOwotCQkJCQotCQkJICAgIGRhdGEgPSBuZXcgYnl0 ZVtsZW5ndGhdOwotCQkJICAgIGluLnJlYWRGdWxseShkYXRhKTsKLQkJCSAgICAKLQkJCSAgICBp ZiAoaW4ucmVhZEJ5dGUoKSAhPSAwKSB7Ci0JCQkgICAgICAgIHRocm93IG5ldyBQcm90b2NvbEV4 Y2VwdGlvbihTdG9tcC5IZWFkZXJzLkNPTlRFTlRfTEVOR1RIKyIgYnl0ZXMgd2VyZSByZWFkIGFu ZCAiICsgInRoZXJlIHdhcyBubyB0cmFpbGluZyBudWxsIGJ5dGUiLCB0cnVlKTsKLQkJCSAgICB9 Ci0JCQkKKwkJCWlmIChoZWFkZXJzQ291bnQgPj0gTUFYX0hFQURFUlMpCisJCQkJdGhyb3cgbmV3 IFByb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJIlRoZSBtYXhpbXVtIG51bWJlciBvZiBoZWFkZXJz IHdhcyBleGNlZWRlZCIsIHRydWUpOworCisJCQkvKgorCQkJICogUmVhZGluZyBCb2R5CisJCQkg Ki8KKworCQkJaWYgKGNvbnRlbnRMZW5ndGggPiAwKSB7CisKKwkJCQliYW9zLnJlc2V0KCk7CisK KwkJCQl3aGlsZSAoKGNvbnRlbnRMZW5ndGgtLSkgPiAwKQorCQkJCQliYW9zLndyaXRlKGluLnJl YWRCeXRlKCkpOworCQkJCQkKKwkJCQlpZiAoaW4ucmVhZEJ5dGUoKSA9PSAwKSB7CisJCQkJCWRh dGEgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisJCQkJfSBlbHNlCisJCQkJCXRocm93IG5ldyBQcm90 b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQkiQm9keSB3YXMgbm90IG51bGwgdGVybWluYXRlZCBhcyBl eHBlY3RlZCIsIHRydWUpOworCiAJCQl9IGVsc2UgewogCi0JCQkJLy8gV2UgZG9uJ3Qga25vdyBo b3cgbXVjaCB0byByZWFkLi4gZGF0YSBlbmRzIHdoZW4gd2UgaGl0IGEgMAotCQkJICAgIGJ5dGUg YjsKLQkJCSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcz1udWxsOwotCQkJICAgIHdoaWxl ICgoYiA9IGluLnJlYWRCeXRlKCkpICE9IDApIHsKLQkJCQkJCi0JCQkJCWlmKCBiYW9zID09IG51 bGwgKSB7Ci0JCQkgICAgCQliYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJ ICAgIAl9IGVsc2UgaWYoIGJhb3Muc2l6ZSgpID4gTUFYX0RBVEFfTEVOR1RIICkgewotCQkJICAg IAkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKCJUaGUgbWF4aW11bSBkYXRhIGxlbmd0aCB3 YXMgZXhjZWVkZWQiLCB0cnVlKTsKLQkJCSAgICAJfQotCQkJICAgIAotCQkJICAgICAgICBiYW9z LndyaXRlKGIpOwotCQkJICAgIH0KLQkJCSAgICAKLQkJCSAgICBpZiggYmFvcyE9bnVsbCApIHsK LQkJCSAgICAgICAgYmFvcy5jbG9zZSgpOwotCQkJICAgICAgICBkYXRhID0gYmFvcy50b0J5dGVB cnJheSgpOwotCQkJICAgIH0KLQkJCSAgICAKKwkJCQliYW9zLnJlc2V0KCk7CisKKwkJCQlmb3Ig KGkgPSAwOyAoKGIgPSBpbi5yZWFkQnl0ZSgpKSAhPSAwKSAmJiAoaSA8IE1BWF9EQVRBX0xFTkdU SCk7ICsraSkKKwkJCQkJYmFvcy53cml0ZShiKTsKKworCQkJCWlmIChpID09IE1BWF9EQVRBX0xF TkdUSCkKKwkJCQkJdGhyb3cgbmV3IFByb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCSJjb250ZW50 IGV4ZWVkZWQgbWF4aW11bSBkYXRhIGxlbmd0aCIsIHRydWUpOworCisJCQkJZGF0YSA9IGJhb3Mu dG9CeXRlQXJyYXkoKTsKIAkJCX0KLQkJCQorCiAJCQlyZXR1cm4gbmV3IFN0b21wRnJhbWUoYWN0 aW9uLCBoZWFkZXJzLCBkYXRhKTsKLQkJCQorCiAJCX0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9u IGUpIHsKIAkJCXJldHVybiBuZXcgU3RvbXBGcmFtZUVycm9yKGUpOwotCQl9IAorCQl9CiAKLSAg ICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkTGluZShEYXRhSW5wdXQgaW4sIGludCBtYXhM ZW5ndGgsIFN0cmluZyBlcnJvck1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAg IGJ5dGUgYjsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3M9bmV3IEJ5dGVBcnJh eU91dHB1dFN0cmVhbShtYXhMZW5ndGgpOwotICAgICAgICB3aGlsZSAoKGIgPSBpbi5yZWFkQnl0 ZSgpKSAhPSAnXG4nKSB7Ci0gICAgICAgIAlpZiggYmFvcy5zaXplKCkgPiBtYXhMZW5ndGggKQot ICAgICAgICAJCXRocm93IG5ldyBQcm90b2NvbEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIHRydWUp OwotICAgICAgICAgICAgYmFvcy53cml0ZShiKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlU2Vx dWVuY2Ugc2VxdWVuY2UgPSBiYW9zLnRvQnl0ZVNlcXVlbmNlKCk7Ci0JCXJldHVybiBuZXcgU3Ry aW5nKHNlcXVlbmNlLmdldERhdGEoKSxzZXF1ZW5jZS5nZXRPZmZzZXQoKSxzZXF1ZW5jZS5nZXRM ZW5ndGgoKSwiVVRGLTgiKTsKIAl9CiAKIAlwdWJsaWMgaW50IGdldFZlcnNpb24oKSB7Ci0gICAg ICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KKwkJcmV0dXJuIHZlcnNpb247CisJfQogCi0gICAg cHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNp b24gPSB2ZXJzaW9uOwotICAgIH0KLQorCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNp b24pIHsKKwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKwl9CiB9CkluZGV4OiAvaG9tZS9taW5k ZWgvYWN0aXZlLW1xLXN2bi13b3Jrc3BhY2UvYWN0aXZlbXEtY29yZS9zcmMvbWFpbi9qYXZhL29y Zy9hcGFjaGUvYWN0aXZlbXEvdHJhbnNwb3J0L3N0b21wL1N0b21wVHJhbnNwb3J0RmFjdG9yeS5q YXZhCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIC9ob21lL21pbmRlaC9hY3RpdmUtbXEtc3ZuLXdvcmtzcGFjZS9h Y3RpdmVtcS1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9hY3RpdmVtcS90cmFuc3BvcnQv c3RvbXAvU3RvbXBUcmFuc3BvcnRGYWN0b3J5LmphdmEJKHJldmlzaW9uIDUyNjU0OSkKKysrIC9o b21lL21pbmRlaC9hY3RpdmUtbXEtc3ZuLXdvcmtzcGFjZS9hY3RpdmVtcS1jb3JlL3NyYy9tYWlu L2phdmEvb3JnL2FwYWNoZS9hY3RpdmVtcS90cmFuc3BvcnQvc3RvbXAvU3RvbXBUcmFuc3BvcnRG YWN0b3J5LmphdmEJKHdvcmtpbmcgY29weSkKQEAgLTIwLDcgKzIwLDggQEAKIGltcG9ydCBqYXZh LnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5hY3RpdmVtcS50cmFuc3BvcnQuVHJhbnNw b3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuYWN0aXZlbXEudHJhbnNwb3J0LnRjcC5UY3BUcmFuc3Bv cnRGYWN0b3J5OworLy9pbXBvcnQgb3JnLmFwYWNoZS5hY3RpdmVtcS50cmFuc3BvcnQudGNwLlRj cFRyYW5zcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5hY3RpdmVtcS50cmFuc3BvcnQu bmlvLk5JT1RyYW5zcG9ydEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5hY3RpdmVtcS51dGls LkludHJvc3BlY3Rpb25TdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuYWN0aXZlbXEud2lyZWZv cm1hdC5XaXJlRm9ybWF0OwogCkBAIC0yOSw3ICszMCw3IEBACiAgKgogICogQHZlcnNpb24gJFJl dmlzaW9uOiAxLjEuMS4xICQKICAqLwotcHVibGljIGNsYXNzIFN0b21wVHJhbnNwb3J0RmFjdG9y eSBleHRlbmRzIFRjcFRyYW5zcG9ydEZhY3RvcnkgeworcHVibGljIGNsYXNzIFN0b21wVHJhbnNw b3J0RmFjdG9yeSBleHRlbmRzIE5JT1RyYW5zcG9ydEZhY3RvcnkgIC8qVGNwVHJhbnNwb3J0RmFj dG9yeSovIHsKIAogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFdpcmVGb3JtYXRUeXBl KCkgewogICAgICAgICByZXR1cm4gInN0b21wIjsKQEAgLTM4LDYgKzM5LDcgQEAKICAgICBwdWJs aWMgVHJhbnNwb3J0IGNvbXBvc2l0ZUNvbmZpZ3VyZShUcmFuc3BvcnQgdHJhbnNwb3J0LCBXaXJl Rm9ybWF0IGZvcm1hdCwgTWFwIG9wdGlvbnMpIHsKICAgICAJdHJhbnNwb3J0ID0gbmV3IFN0b21w VHJhbnNwb3J0RmlsdGVyKHRyYW5zcG9ydCwgbmV3IExlZ2FjeUZyYW1lVHJhbnNsYXRvcigpKTsK ICAgICAJSW50cm9zcGVjdGlvblN1cHBvcnQuc2V0UHJvcGVydGllcyh0cmFuc3BvcnQsIG9wdGlv bnMpOworICAgIAkKICAgICAJcmV0dXJuIHN1cGVyLmNvbXBvc2l0ZUNvbmZpZ3VyZSh0cmFuc3Bv cnQsIGZvcm1hdCwgb3B0aW9ucyk7CiAgICAgfQogCkluZGV4OiAvaG9tZS9taW5kZWgvYWN0aXZl LW1xLXN2bi13b3Jrc3BhY2UvYWN0aXZlbXEtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUv YWN0aXZlbXEvdHJhbnNwb3J0L25pby9OSU9UcmFuc3BvcnQuamF2YQo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSAv aG9tZS9taW5kZWgvYWN0aXZlLW1xLXN2bi13b3Jrc3BhY2UvYWN0aXZlbXEtY29yZS9zcmMvbWFp bi9qYXZhL29yZy9hcGFjaGUvYWN0aXZlbXEvdHJhbnNwb3J0L25pby9OSU9UcmFuc3BvcnQuamF2 YQkocmV2aXNpb24gNTI2NTQ5KQorKysgL2hvbWUvbWluZGVoL2FjdGl2ZS1tcS1zdm4td29ya3Nw YWNlL2FjdGl2ZW1xLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2FjdGl2ZW1xL3RyYW5z cG9ydC9uaW8vTklPVHJhbnNwb3J0LmphdmEJKHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDgg QEAKIGltcG9ydCBvcmcuYXBhY2hlLmFjdGl2ZW1xLndpcmVmb3JtYXQuV2lyZUZvcm1hdDsKIGlt cG9ydCBvcmcuYXBhY2hlLmFjdGl2ZW1xLmNvbW1hbmQuQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBh Y2hlLmFjdGl2ZW1xLnRyYW5zcG9ydC5UcmFuc3BvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5hY3Rp dmVtcS50cmFuc3BvcnQudGNwLlRjcEJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFw YWNoZS5hY3RpdmVtcS50cmFuc3BvcnQudGNwLlRjcEJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1w b3J0IG9yZy5hcGFjaGUuYWN0aXZlbXEudHJhbnNwb3J0LnRjcC5UY3BUcmFuc3BvcnQ7CiBpbXBv cnQgb3JnLmFwYWNoZS5hY3RpdmVtcS51dGlsLklPRXhjZXB0aW9uU3VwcG9ydDsKIGltcG9ydCBv cmcuYXBhY2hlLmFjdGl2ZW1xLnV0aWwuU2VydmljZVN0b3BwZXI7CkBAIC00MiwxNSArNDQsMTAg QEAKICAqIAogICogQHZlcnNpb24gJFJldmlzaW9uJAogICovCi1wdWJsaWMgY2xhc3MgTklPVHJh bnNwb3J0IGV4dGVuZHMgVGNwVHJhbnNwb3J0IHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwg TG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE5JT1RyYW5zcG9ydC5jbGFzcyk7Ci0JcHJpdmF0 ZSBTb2NrZXRDaGFubmVsIGNoYW5uZWw7Ci0JcHJpdmF0ZSBTZWxlY3RvclNlbGVjdGlvbiBzZWxl Y3Rpb247Ci0JcHJpdmF0ZSBCeXRlQnVmZmVyIGlucHV0QnVmZmVyOwotCXByaXZhdGUgQnl0ZUJ1 ZmZlciBjdXJyZW50QnVmZmVyOwotCXByaXZhdGUgaW50IG5leHRGcmFtZVNpemU7Ci0KK3B1Ymxp YyBjbGFzcyBOSU9UcmFuc3BvcnQgZXh0ZW5kcyBUY3BUcmFuc3BvcnQgCit7CisJU29ja2V0Q2hh bm5lbCBzYyA9IG51bGw7CisJCiAJcHVibGljIE5JT1RyYW5zcG9ydChXaXJlRm9ybWF0IHdpcmVG b3JtYXQsIFNvY2tldEZhY3Rvcnkgc29ja2V0RmFjdG9yeSwgVVJJIHJlbW90ZUxvY2F0aW9uLCBV UkkgbG9jYWxMb2NhdGlvbikgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uLCBJT0V4Y2VwdGlv biB7CiAJCXN1cGVyKHdpcmVGb3JtYXQsIHNvY2tldEZhY3RvcnksIHJlbW90ZUxvY2F0aW9uLCBs b2NhbExvY2F0aW9uKTsKIAl9CkBAIC02MCw5NyArNTcsMTEgQEAKIAl9CiAKIAlwcm90ZWN0ZWQg dm9pZCBpbml0aWFsaXplU3RyZWFtcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoYW5uZWwg PSBzb2NrZXQuZ2V0Q2hhbm5lbCgpOwkJCi0JCWNoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFs c2UpOworCQlzYyA9IHNvY2tldC5nZXRDaGFubmVsKCk7IAogCQkKLQkJLy8gbGlzdGVuIGZvciBl dmVudHMgdGVsbGluZyB1cyB3aGVuIHRoZSBzb2NrZXQgaXMgcmVhZGFibGUuCi0JCXNlbGVjdGlv biA9IFNlbGVjdG9yTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyKGNoYW5uZWwsCi0JCQkJ bmV3IFNlbGVjdG9yTWFuYWdlci5MaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgb25TZWxl Y3QoU2VsZWN0b3JTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJCQlzZXJ2aWNlUmVhZCgpOwot CQkJCQl9Ci0JCQkJCXB1YmxpYyB2b2lkIG9uRXJyb3IoU2VsZWN0b3JTZWxlY3Rpb24gc2VsZWN0 aW9uLCBUaHJvd2FibGUgZXJyb3IpIHsKLQkJCQkJCWlmKCBlcnJvciBpbnN0YW5jZW9mIElPRXhj ZXB0aW9uICkgewotCQkJCQkJCW9uRXhjZXB0aW9uKChJT0V4Y2VwdGlvbikgZXJyb3IpOwkJCQkJ CQkKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJb25FeGNlcHRpb24oSU9FeGNlcHRpb25TdXBwb3J0 LmNyZWF0ZShlcnJvcikpOwkJCQkJCQkKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOworCQlzYy5j b25maWd1cmVCbG9ja2luZyhmYWxzZSk7CQkKIAkJCi0JCS8vIFNlbmQgdGhlIGRhdGEgdmlhIHRo ZSBjaGFubmVsCi0vLyAgICAgICAgaW5wdXRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGly ZWN0KDgqMTAyNCk7Ci0gICAgICAgIGlucHV0QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSg4 KjEwMjQpOwotICAgICAgICBjdXJyZW50QnVmZmVyID0gaW5wdXRCdWZmZXI7Ci0gICAgICAgIG5l eHRGcmFtZVNpemU9LTE7Ci0gICAgICAgIGN1cnJlbnRCdWZmZXIubGltaXQoNCk7Ci0gICAgICAg IHRoaXMuZGF0YU91dCA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKG5ldyBOSU9PdXRwdXRTdHJlYW0o Y2hhbm5lbCwgMTYqMTAyNCkpOwotICAgICAgICAKKwkJdGhpcy5kYXRhSW4gID0gbmV3IERhdGFJ bnB1dFN0cmVhbShuZXcgTklPQnVmZmVyZWRJbnB1dFN0cmVhbShzYykpOworCQl0aGlzLmRhdGFP dXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShuZXcgTklPQnVmZmVyZWRPdXRwdXRTdHJlYW0oc2Mp KTsKIAl9Ci0JCi0gICAgcHJpdmF0ZSB2b2lkIHNlcnZpY2VSZWFkKCkgewotICAgICAgICB0cnkg ewotICAgICAgICAgICAgd2hpbGUoIHRydWUgKSB7Ci0gICAgICAgICAgICAJCi0JCi0JICAgICAg ICAgICAgaW50IHJlYWRTaXplID0gY2hhbm5lbC5yZWFkKGN1cnJlbnRCdWZmZXIpOwotCSAgICAg ICAgICAgIGlmKCByZWFkU2l6ZSA9PSAtMSApIHsKLQkJCQkJb25FeGNlcHRpb24obmV3IEVPRkV4 Y2VwdGlvbigpKTsKLQkgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmNsb3NlKCk7Ci0JICAgICAg ICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiggcmVhZFNp emU9PTAgKSB7Ci0JICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICAgICAgICAgIH0KLQkgICAg ICAgICAgICAKLSAgICAgICAgICAgIAlpZiggY3VycmVudEJ1ZmZlci5oYXNSZW1haW5pbmcoKSAp Ci0gICAgICAgICAgICAJCWNvbnRpbnVlOwotCi0JICAgICAgICAgICAgLy8gQXJlIHdlIHRyeWlu ZyB0byBmaWd1cmUgb3V0IHRoZSBzaXplIG9mIHRoZSBuZXh0IGZyYW1lPwotCSAgICAgICAgICAg IGlmKCBuZXh0RnJhbWVTaXplPT0tMSApIHsKLQkgICAgICAgICAgICAJYXNzZXJ0IGlucHV0QnVm ZmVyID09IGN1cnJlbnRCdWZmZXI7Ci0KLQkgICAgICAgICAgICAJLy8gSWYgdGhlIGZyYW1lIGlz IHRvbyBiaWcgdG8gZml0IGluIG91ciBkaXJlY3QgYnl0ZSBidWZmZXIsCi0JICAgICAgICAgICAg CS8vIFRoZW4gYWxsb2NhdGUgYSBub24gZGlyZWN0IGJ5dGUgYnVmZmVyIG9mIHRoZSByaWdodCBz aXplIGZvciBpdC4KLQkgICAgICAgICAgICAJaW5wdXRCdWZmZXIuZmxpcCgpOwotCSAgICAgICAg ICAgIAluZXh0RnJhbWVTaXplID0gaW5wdXRCdWZmZXIuZ2V0SW50KCkrNDsKLQkgICAgICAgICAg ICAJaWYoIG5leHRGcmFtZVNpemUgPiBpbnB1dEJ1ZmZlci5jYXBhY2l0eSgpICkgewotCSAgICAg ICAgICAgIAkJY3VycmVudEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobmV4dEZyYW1lU2l6 ZSk7Ci0JICAgICAgICAgICAgCQljdXJyZW50QnVmZmVyLnB1dEludChuZXh0RnJhbWVTaXplKTsK LQkgICAgICAgICAgICAJfSBlbHNlIHsKLQkgICAgICAgICAgICAJCWlucHV0QnVmZmVyLmxpbWl0 KG5leHRGcmFtZVNpemUpOwkgICAgICAgICAgICAJCQotCSAgICAgICAgICAgIAl9Ci0JICAgICAg ICAgICAgCQotICAgICAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgICAgICAJCWN1cnJlbnRCdWZm ZXIuZmxpcCgpOwotICAgIAkJCQkKLSAgICAgICAgICAgIAkJT2JqZWN0IGNvbW1hbmQgPSB3aXJl Rm9ybWF0LnVubWFyc2hhbChuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBOSU9JbnB1dFN0cmVhbShj dXJyZW50QnVmZmVyKSkpOwotICAgICAgICAgICAgCQlkb0NvbnN1bWUoKENvbW1hbmQpIGNvbW1h bmQpOwotICAgICAgICAgICAgCQkKLSAgICAgICAgICAgIAkJbmV4dEZyYW1lU2l6ZT0tMTsKLSAg ICAJCQkJaW5wdXRCdWZmZXIuY2xlYXIoKTsKLSAgICAJCQkJaW5wdXRCdWZmZXIubGltaXQoNCk7 Ci0gICAgCQkJCWN1cnJlbnRCdWZmZXIgPSBpbnB1dEJ1ZmZlcjsKLSAgICAgICAgICAgIAl9Ci0J ICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgfSBjYXRj aCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgb25FeGNlcHRpb24oZSk7Ci0gICAgICAg IH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIAlvbkV4Y2VwdGlvbihJT0V4Y2VwdGlv blN1cHBvcnQuY3JlYXRlKGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0JcHJvdGVjdGVkIHZv aWQgZG9TdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb25uZWN0KCk7Ci0gICAg ICAgIHNlbGVjdGlvbi5zZXRJbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7Ci0gICAg ICAgIHNlbGVjdGlvbi5lbmFibGUoKTsKLSAgICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1N0b3Ao U2VydmljZVN0b3BwZXIgc3RvcHBlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNlbGVjdGlvbi5k aXNhYmxlKCk7Ci0JCXN1cGVyLmRvU3RvcChzdG9wcGVyKTsJCQotCX0KIH0KSW5kZXg6IC9ob21l L21pbmRlaC9hY3RpdmUtbXEtc3ZuLXdvcmtzcGFjZS9hY3RpdmVtcS1jb3JlL3NyYy9tYWluL2ph dmEvb3JnL2FwYWNoZS9hY3RpdmVtcS90cmFuc3BvcnQvbmlvL05JT0J1ZmZlcmVkSW5wdXRTdHJl YW0uamF2YQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09Ci0tLSAvaG9tZS9taW5kZWgvYWN0aXZlLW1xLXN2bi13b3Jrc3Bh Y2UvYWN0aXZlbXEtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWN0aXZlbXEvdHJhbnNw b3J0L25pby9OSU9CdWZmZXJlZElucHV0U3RyZWFtLmphdmEJKHJldmlzaW9uIDApCisrKyAvaG9t ZS9taW5kZWgvYWN0aXZlLW1xLXN2bi13b3Jrc3BhY2UvYWN0aXZlbXEtY29yZS9zcmMvbWFpbi9q YXZhL29yZy9hcGFjaGUvYWN0aXZlbXEvdHJhbnNwb3J0L25pby9OSU9CdWZmZXJlZElucHV0U3Ry ZWFtLmphdmEJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTk4IEBACisvKioKKyAqCisgKiBMaWNl bnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9y IG1vcmUKKyAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNF IGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9y bWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogVGhlIEFTRiBsaWNlbnNl cyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAK KyAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4g Y29tcGxpYW5jZSB3aXRoCisgKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBv ZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9M SUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBh Z3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBM aWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdB UlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1w bGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVy bmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgor ICovCitwYWNrYWdlIG9yZy5hcGFjaGUuYWN0aXZlbXEudHJhbnNwb3J0Lm5pbzsKKworaW1wb3J0 IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9y dCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWw7 CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9y dCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlv LmNoYW5uZWxzLlNlbGVjdGlvbktleTsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rv cjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Tb2NrZXRDaGFubmVsOworCisvKioKKyAqIEBh dXRob3IgTWluZGF1Z2FzIEphbnXFoWFpdGlzIDxtaW5kZWhAZ21haWwuY29tPgorICogCisgKiBJ bXBsZW1lbnRhdGlvbiBvZiBJbnB1dFN0cmVhbSB1c2luZyBKYXZhIE5JTyBjaGFubmVsLGRpcmVj dCBidWZmZXIgYW5kIFNlbGVjdG9yIAorICovCitwdWJsaWMgY2xhc3MgTklPQnVmZmVyZWRJbnB1 dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKKworCXByaXZhdGUgZmluYWwgc3RhdGljIGlu dCBCVUZGRVJfU0laRSA9IDgxOTI7CisKKwlwcml2YXRlIFNvY2tldENoYW5uZWwgc2MgPSBudWxs OworCisJcHJpdmF0ZSBCeXRlQnVmZmVyIGJiID0gbnVsbDsKKworCXByaXZhdGUgU2VsZWN0b3Ig cnMgPSBudWxsOworCisJLyoqCisJICogCisJICovCisJcHVibGljIE5JT0J1ZmZlcmVkSW5wdXRT dHJlYW0oUmVhZGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsLCBpbnQgc2l6ZSkKKwkJCXRocm93cyBD bG9zZWRDaGFubmVsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJaWYgKHNpemUgPD0gMCkg eworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIHNpemUgPD0g MCIpOworCQl9CisKKwkJdGhpcy5iYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qoc2l6ZSk7 CisJCXRoaXMuc2MgPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDsKKworCQl0aGlzLnNjLmNvbmZp Z3VyZUJsb2NraW5nKGZhbHNlKTsKKworCQl0aGlzLnJzID0gU2VsZWN0b3Iub3BlbigpOworCisJ CXNjLnJlZ2lzdGVyKHJzLCBTZWxlY3Rpb25LZXkuT1BfUkVBRCk7CisKKwkJYmIucG9zaXRpb24o MCk7CisJCWJiLmxpbWl0KDApOworCX0KKworCS8qKgorCSAqIAorCSAqLworCXB1YmxpYyBOSU9C dWZmZXJlZElucHV0U3RyZWFtKFJlYWRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCkKKwkJCXRocm93 cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoY2hhbm5lbCwg QlVGRkVSX1NJWkUpOworCX0KKworCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhj ZXB0aW9uIHsKKwkJaWYgKCFycy5pc09wZW4oKSkKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigi SW5wdXQgU3RyZWFtIENsb3NlZCIpOworCisJCXJldHVybiBiYi5yZW1haW5pbmcoKTsKKwl9CisK KwlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChycy5pc09w ZW4oKSkgeworCQkJcnMuY2xvc2UoKTsKKworCQkJaWYgKHNjLmlzT3BlbigpKQorCQkJeworCQkJ CXNjLnNvY2tldCgpLnNodXRkb3duSW5wdXQoKTsKKwkJCQlzYy5zb2NrZXQoKS5jbG9zZSgpOwor CQkJfQorCisJCQliYiA9IG51bGw7CisJCQlzYyA9IG51bGw7CisJCX0KKwl9CisKKwlwdWJsaWMg aW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoIXJzLmlzT3BlbigpKQorCQkJ dGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbnB1dCBTdHJlYW0gQ2xvc2VkIik7CisKKwkJaWYgKCFi Yi5oYXNSZW1haW5pbmcoKSkgeworCQkJdHJ5IHsKKwkJCQlmaWxsKDEpOworCQkJfSBjYXRjaCAo Q2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBlKSB7CisJCQkJY2xvc2UoKTsKKwkJCQlyZXR1cm4gLTE7 CisJCQl9CisJCX0KKworCQlyZXR1cm4gKGJiLmdldCgpICYgMHhGRik7CisJfQorCisJcHVibGlj IGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24g eworCQlpbnQgYnl0ZXNDb3BpZWQgPSAtMTsKKwkJCisJCWlmICghcnMuaXNPcGVuKCkpCisJCQl0 aHJvdyBuZXcgSU9FeGNlcHRpb24oIklucHV0IFN0cmVhbSBDbG9zZWQiKTsKKworCQl3aGlsZSAo Ynl0ZXNDb3BpZWQgPT0gLTEpCisJCXsKKwkJCWlmIChiYi5oYXNSZW1haW5pbmcoKSkKKwkJCXsK KwkJCQlieXRlc0NvcGllZCA9IChsZW4gPCBiYi5yZW1haW5pbmcoKSA/IGxlbiA6IGJiLnJlbWFp bmluZygpKTsKKwkJCQliYi5nZXQoYiwgb2ZmLCBieXRlc0NvcGllZCk7CisJCQl9IGVsc2Ugewor CQkJCXRyeSB7CisJCQkJCWZpbGwoMSk7CisJCQkJfSBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2Vw dGlvbiBlKSB7CisJCQkJCWNsb3NlKCk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCSAgICB9 CisJCX0KKwkJCisJCXJldHVybiBieXRlc0NvcGllZDsKKwl9CisKKwlwdWJsaWMgbG9uZyBza2lw KGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJbG9uZyBza2lwZWQgPSAwOworCQkKKwkJ CisJCWlmICghcnMuaXNPcGVuKCkpCisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIklucHV0IFN0 cmVhbSBDbG9zZWQiKTsKKworCQl3aGlsZSAobiA+IDApCisJCXsKKwkJCWlmIChuIDw9IGJiLnJl bWFpbmluZygpKQorCQkJeworCQkJCXNraXBlZCArPSBuOworCQkJCWJiLnBvc2l0aW9uKGJiLnBv c2l0aW9uKCkrKGludCluKTsKKwkJCQluID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc2tpcGVkICs9 IGJiLnJlbWFpbmluZygpOworCQkJCW4gICAgICAtPSBiYi5yZW1haW5pbmcoKTsKKwkJCQkJCisJ CQkJYmIucG9zaXRpb24oYmIubGltaXQoKSk7CisJCQkJCisJCQkJdHJ5IHsKKwkJCQkJZmlsbCgo aW50KW4pOworCQkJCX0gY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkgeworCQkJCQlj bG9zZSgpOworCQkJCQlyZXR1cm4gc2tpcGVkOworCQkJCX0KKwkJCX0KKwkJfQorCQkJCisJCXJl dHVybiBza2lwZWQ7CisJfQorCisJcHJpdmF0ZSB2b2lkIGZpbGwoaW50IG4pIHRocm93cyBJT0V4 Y2VwdGlvbiwgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiB7CisJCWludCBieXRlc1JlYWQgPSAtMTsK KworCQlpZiAoKG4gPD0gMCkgfHwgKG4gPD0gYmIucmVtYWluaW5nKCkpKQorCQkJcmV0dXJuOwor CisJCWJiLmNvbXBhY3QoKTsKKworCQluID0gKGJiLnJlbWFpbmluZygpIDwgbiA/IGJiLnJlbWFp bmluZygpIDogbik7CisKKwkJZm9yICg7OykgeworCQkJYnl0ZXNSZWFkID0gc2MucmVhZChiYik7 CisKKwkJCWlmIChieXRlc1JlYWQgPT0gLTEpCisJCQkJdGhyb3cgbmV3IENsb3NlZENoYW5uZWxF eGNlcHRpb24oKTsKKworCQkJbiAtPSBieXRlc1JlYWQ7CisKKwkJCWlmIChuIDw9IDApCisJCQkJ YnJlYWs7CisKKwkJCXJzLnNlbGVjdCgwKTsKKwkJCXJzLnNlbGVjdGVkS2V5cygpLmNsZWFyKCk7 CisJCX0KKworCQliYi5mbGlwKCk7CisJfQorfQpJbmRleDogL2hvbWUvbWluZGVoL2FjdGl2ZS1t cS1zdm4td29ya3NwYWNlL2FjdGl2ZW1xLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2Fj dGl2ZW1xL3RyYW5zcG9ydC9uaW8vTklPQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSAvaG9tZS9taW5kZWgvYWN0aXZlLW1xLXN2bi13b3Jrc3BhY2UvYWN0aXZlbXEtY29y ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvYWN0aXZlbXEvdHJhbnNwb3J0L25pby9OSU9CdWZm ZXJlZE91dHB1dFN0cmVhbS5qYXZhCShyZXZpc2lvbiAwKQorKysgL2hvbWUvbWluZGVoL2FjdGl2 ZS1tcS1zdm4td29ya3NwYWNlL2FjdGl2ZW1xLWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hl L2FjdGl2ZW1xL3RyYW5zcG9ydC9uaW8vTklPQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQkocmV2 aXNpb24gMCkKQEAgLTAsMCArMSwxMzcgQEAKKy8qKgorICoKKyAqIExpY2Vuc2VkIHRvIHRoZSBB cGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogY29u dHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmli dXRlZCB3aXRoCisgKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJk aW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0 byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogKHRoZSAiTGlj ZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdp dGgKKyAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNl IGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisg KgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3 cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlz dHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBD T05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2Vl IHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Np b25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ug b3JnLmFwYWNoZS5hY3RpdmVtcS50cmFuc3BvcnQubmlvOworCitpbXBvcnQgamF2YS5pby5JT0V4 Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5C eXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRp b247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9y dCBqYXZhLm5pby5jaGFubmVscy5TZWxlY3Rpb25LZXk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5l bHMuU2VsZWN0b3I7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbDsKK2lt cG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0YWJsZUJ5dGVDaGFubmVsOworCitwdWJsaWMgY2xh c3MgTklPQnVmZmVyZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisJcHJp dmF0ZSBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFID0gODE5MjsKKworCXByaXZhdGUgU29j a2V0Q2hhbm5lbCBzYyA9IG51bGw7CisKKwlwcml2YXRlIEJ5dGVCdWZmZXIgYmIgPSBudWxsOwor CisJcHJpdmF0ZSBTZWxlY3RvciB3cyA9IG51bGw7CisKKwkvKioKKwkgKiBAYXV0aG9yIE1pbmRh dWdhcyBKYW51xaFhaXRpcyA8bWluZGVoQGdtYWlsLmNvbT4KKwkgKiAKKwkgKiBJbXBsZW1lbnRh dGlvbiBvZiBPdXB1dFN0cmVhbSB1c2luZyBKYXZhIE5JTyBjaGFubmVsLGRpcmVjdCBidWZmZXIg YW5kIFNlbGVjdG9yCisJICovCisKKwlwdWJsaWMgTklPQnVmZmVyZWRPdXRwdXRTdHJlYW0oV3Jp dGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsLCBpbnQgc2l6ZSkKKwkJCXRocm93cyBDbG9zZWRDaGFu bmVsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKwkJaWYgKHNpemUgPD0gMCkgeworCQkJdGhy b3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIHNpemUgPD0gMCIpOworCQl9 CisKKwkJdGhpcy5iYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qoc2l6ZSk7CisJCXRoaXMu c2MgPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDsKKworCQl0aGlzLnNjLmNvbmZpZ3VyZUJsb2Nr aW5nKGZhbHNlKTsKKworCQl0aGlzLndzID0gU2VsZWN0b3Iub3BlbigpOworCisJCXNjLnJlZ2lz dGVyKHdzLCBTZWxlY3Rpb25LZXkuT1BfV1JJVEUpOworCisJCWJiLnBvc2l0aW9uKDApOworCQli Yi5saW1pdChiYi5jYXBhY2l0eSgpKTsKKwl9CisKKwkvKioKKwkgKiAKKwkgKi8KKwlwdWJsaWMg TklPQnVmZmVyZWRPdXRwdXRTdHJlYW0oV3JpdGFibGVCeXRlQ2hhbm5lbCBjaGFubmVsKQorCQkJ dGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJdGhpcyhjaGFu bmVsLCBCVUZGRVJfU0laRSk7CisJfQorCisJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9F eGNlcHRpb24geworCQlpZiAod3MuaXNPcGVuKCkpIHsKKwkJCXdzLmNsb3NlKCk7CisKKwkJCWlm IChzYy5pc09wZW4oKSkgeworCQkJCXNjLnNvY2tldCgpLnNodXRkb3duT3V0cHV0KCk7CisJCQkJ c2Muc29ja2V0KCkuY2xvc2UoKTsKKwkJCX0KKworCQkJYmIgPSBudWxsOworCQkJc2MgPSBudWxs OworCQl9CisJfQorCisJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewor CisJCWJiLmZsaXAoKTsKKworCQlpZiAoIWJiLmhhc1JlbWFpbmluZygpKSB7CisJCQliYi5wb3Np dGlvbigwKTsKKwkJCWJiLmxpbWl0KGJiLmNhcGFjaXR5KCkpOworCisJCQlyZXR1cm47CisJCX0K KworCQlmb3IgKDs7KSB7CisJCQlzYy53cml0ZShiYik7CisKKwkJCWlmICghYmIuaGFzUmVtYWlu aW5nKCkpIHsKKwkJCQliYi5wb3NpdGlvbigwKTsKKwkJCQliYi5saW1pdChiYi5jYXBhY2l0eSgp KTsKKworCQkJCXJldHVybjsKKwkJCX0KKworCQkJd3Muc2VsZWN0KDApOworCQkJd3Muc2VsZWN0 ZWRLZXlzKCkuY2xlYXIoKTsKKwkJfQorCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0 aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoIWJiLmhhc1JlbWFpbmluZygpKQorCQkJZmx1c2go KTsKKworCQliYi5wdXQoKGJ5dGUpIGIpOworCX0KKworCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVb XSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisJCWludCBieXRl c1dyaXR0ZW4gPSAwOworCisJCXdoaWxlIChsZW4gPiAwKSB7CisJCQlpZiAoIWJiLmhhc1JlbWFp bmluZygpKQorCQkJCWZsdXNoKCk7CisKKwkJCWJ5dGVzV3JpdHRlbiA9IChsZW4gPCBiYi5yZW1h aW5pbmcoKSA/IGxlbiA6IGJiLnJlbWFpbmluZygpKTsKKworCQkJYmIucHV0KGIsIG9mZiwgYnl0 ZXNXcml0dGVuKTsKKworCQkJb2ZmICs9IGJ5dGVzV3JpdHRlbjsKKwkJCWxlbiAtPSBieXRlc1dy aXR0ZW47CisJCX0KKwl9Cit9Cg== ------=_Part_13658_16743518.1176496616711--