From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31824 invoked by alias); 13 Dec 2002 21:26:08 -0000 Mailing-List: contact rhug-rhats-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Post: List-Help: , Sender: rhug-rhats-owner@sources.redhat.com Received: (qmail 31610 invoked from network); 13 Dec 2002 21:26:03 -0000 Received: from unknown (HELO smarthost2.mail.easynet.fr) (212.180.1.69) by sources.redhat.com with SMTP; 13 Dec 2002 21:26:03 -0000 Received: from [212.11.38.52] (helo=there) by smarthost2.mail.easynet.fr with smtp (Exim 3.35 #1 (Debian)) id 18MxJl-0005Kt-00 for ; Fri, 13 Dec 2002 22:25:57 +0100 From: Christophe Roux To: rhug-rhats@sources.redhat.com Subject: gcj minor bug Date: Fri, 13 Dec 2002 13:26:00 -0000 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="------------Boundary-00=_N303WU43F2XAO2ND7ZRX" Message-Id: X-SW-Source: 2002-12/txt/msg00011.txt.bz2 --------------Boundary-00=_N303WU43F2XAO2ND7ZRX Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Content-length: 1093 I use Rhug as a java user, so I am not very aware of usage for submitting bugs for GCJ. When trying to connect ot posgresql with pgsql-jdbc, I had a problem of database recognition with the Driver. In fact, I discovered a bug in gcj by the way : The class StringTokenizer, when returning all tokens ( also separators ), gives empty tokens for separators; in fact, the code "substring( pos, ++pos )" return an empty string; one's should have writen "substring( pos - 1, ++pos )" which return a single caracter for the separator. I corrected the class for me, and I thought it would be great to give it to the community. But I read the steps needed to contribute to gcj, and my reaction is : It is very complicated to contribute. So I ask, can someone tell me how to contribute with a small patch to GCJ whithout a lot of stuff. More over, may be some of you are used to do so and can relay my patch to GCJ. I join the class StringTokenizer after correction. More over, I give two other classes, patches to gcj for sockets and deserialisation of vectors. Thanks in advance Christophe Roux --------------Boundary-00=_N303WU43F2XAO2ND7ZRX Content-Type: text/x-c; charset="iso-8859-1"; name="StringTokenizer.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="StringTokenizer.java" Content-length: 11700 LyogamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcgogICBDb3B5cmlnaHQgKEMp IDE5OTgsIDE5OTksIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCgpUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ2xhc3NwYXRoLgoKR05V IENsYXNzcGF0aCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9u IDIsIG9yIChhdCB5b3VyIG9wdGlvbikKYW55IGxhdGVyIHZlcnNpb24uCgpH TlUgQ2xhc3NwYXRoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dApXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VCkdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggR05V IENsYXNzcGF0aDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdy aXRlIHRvIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5 IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCjAyMTExLTEz MDcgVVNBLgoKTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBk eW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMKbWFraW5nIGEgY29t YmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUg dGVybXMgYW5kCmNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZQpjb21iaW5hdGlvbi4KCkFzIGEg c3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0 aGlzIGxpYnJhcnkgZ2l2ZSB5b3UKcGVybWlzc2lvbiB0byBsaW5rIHRoaXMg bGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBh bgpleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1z IG9mIHRoZXNlIGluZGVwZW5kZW50Cm1vZHVsZXMsIGFuZCB0byBjb3B5IGFu ZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlcgp0 ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBt ZWV0LCBmb3IgZWFjaCBsaW5rZWQKaW5kZXBlbmRlbnQgbW9kdWxlLCB0aGUg dGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdApt b2R1bGUuICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hp Y2ggaXMgbm90IGRlcml2ZWQgZnJvbQpvciBiYXNlZCBvbiB0aGlzIGxpYnJh cnkuICBJZiB5b3UgbW9kaWZ5IHRoaXMgbGlicmFyeSwgeW91IG1heSBleHRl bmQKdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZSBsaWJy YXJ5LCBidXQgeW91IGFyZSBub3QKb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYg eW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcwpleGNlcHRp b24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLiAqLwoKCnBhY2thZ2Ug amF2YS51dGlsOwoKLyoqCiAqIFRoaXMgY2xhc3Mgc3BsaXRzIGEgc3RyaW5n IGludG8gdG9rZW5zLiAgVGhlIGNhbGxlciBjYW4gc2V0IG9uIHdoaWNoIAog KiBkZWxpbWl0ZXJzIHRoZSBzdHJpbmcgc2hvdWxkIGJlIHNwbGl0IGFuZCBp ZiB0aGUgZGVsaW1pdGVycyBzaG91bGQgYmUKICogcmV0dXJuZWQuCiAqCiAq IFlvdSBtYXkgY2hhbmdlIHRoZSBkZWxpbWl0ZXIgc2V0IG9uIHRoZSBmbHkg YnkgY2FsbGluZwogKiBuZXh0VG9rZW4oU3RyaW5nKS4gIEJ1dCB0aGUgc2Vt YW50aWMgaXMgcXVpdGUgZGlmZmljdWx0OyBpdCBldmVuCiAqIGRlcGVuZHMg b24gY2FsbGluZyA8Y29kZT5oYXNNb3JlVG9rZW5zKCk8L2NvZGU+LiAgWW91 IHNob3VsZCBjYWxsCiAqIDxjb2RlPmhhc01vcmVUb2tlbnMoKTwvY29kZT4g YmVmb3JlLCBvdGhlcndpc2UgdGhlIG9sZCBkZWxpbWl0ZXJzCiAqIGFmdGVy IHRoZSBsYXN0IHRva2VuIGFyZSByZXR1cm5lZC4KICoKICogSWYgeW91IHdh bnQgdG8gZ2V0IHRoZSBkZWxpbWl0ZXJzLCB5b3UgaGF2ZSB0byB1c2UgdGhl IHRocmVlIGFyZ3VtZW50CiAqIGNvbnN0cnVjdG9yLiAgVGhlIGRlbGltaXRl cnMgYXJlIHJldHVybmVkIGFzIHRva2VuIGNvbnNpc3Rpbmcgb2YgYQogKiBz aW5nbGUgY2hhcmFjdGVyLiAgCiAqCiAqIEBhdXRob3IgSm9jaGVuIEhvZW5p Y2tlCiAqIEBhdXRob3IgV2FycmVuIExldnkgPHdhcnJlbmxAY3lnbnVzLmNv bT4KICovCnB1YmxpYyBjbGFzcyBTdHJpbmdUb2tlbml6ZXIgaW1wbGVtZW50 cyBFbnVtZXJhdGlvbgp7CiAgLyoqCiAgICogVGhlIHBvc2l0aW9uIGluIHRo ZSBzdHIsIHdoZXJlIHdlIGN1cnJlbnRseSBhcmUuCiAgICovCiAgcHJpdmF0 ZSBpbnQgcG9zOwogIC8qKgogICAqIFRoZSBzdHJpbmcgdGhhdCBzaG91bGQg YmUgc3BsaXQgaW50byB0b2tlbnMuCiAgICovCiAgcHJpdmF0ZSBTdHJpbmcg c3RyOwogIC8qKgogICAqIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgZGVs aW1pdGVyIGNoYXJhY3RlcnMuCiAgICovCiAgcHJpdmF0ZSBTdHJpbmcgZGVs aW07CiAgLyoqCiAgICogVGVsbHMsIGlmIHdlIHNob3VsZCByZXR1cm4gdGhl IGRlbGltaXRlcnMuCiAgICovCiAgcHJpdmF0ZSBib29sZWFuIHJldERlbGlt czsKCiAgLyp7IAogICAgIGludmFyaWFudCB7CiAgICAgcG9zID49IDAgOjog InBvc2l0aW9uIGlzIG5lZ2F0aXZlIjsKICAgICBwb3MgPD0gc3RyLmxlbmd0 aCgpIDo6ICJwb3NpdGlvbiBpcyBvdXQgb2Ygc3RyaW5nIjsKICAgICBzdHIg IT0gbnVsbCA6OiAiU3RyaW5nIGlzIG51bGwiOwogICAgIGRlbGltICE9IG51 bGwgOjogIkRlbGltaXRlcnMgYXJlIG51bGwiOwogICAgIH0KICAgICB9ICov CgogIC8qKgogICAqIENyZWF0ZXMgYSBuZXcgU3RyaW5nVG9rZW5pemVyIGZv ciB0aGUgc3RyaW5nIDxjb2RlPnN0cjwvY29kZT4sCiAgICogdGhhdCBzaG91 bGQgc3BsaXQgb24gdGhlIGRlZmF1bHQgZGVsaW1pdGVyIHNldCAoc3BhY2Us IHRhcCwKICAgKiBuZXdsaW5lLCByZXR1cm4gYW5kIGZvcm1mZWVkKSwgYW5k IHdoaWNoIGRvZXNuJ3QgcmV0dXJuIHRoZQogICAqIGRlbGltaXRlcnMuCiAg ICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIHNwbGl0LgogICAqLwogIHB1 YmxpYyBTdHJpbmdUb2tlbml6ZXIoU3RyaW5nIHN0cikKICAgIC8qeyByZXF1 aXJlIHsgc3RyICE9IG51bGwgOjogInN0ciBtdXN0IG5vdCBiZSBudWxsIjsg fSB9ICovCiAgewogICAgdGhpcyhzdHIsICIgXHRcblxyXGYiLCBmYWxzZSk7 CiAgfQoKICAvKioKICAgKiBDcmVhdGUgYSBuZXcgU3RyaW5nVG9rZW5pemVy LCB0aGF0IHNwbGl0cyB0aGUgZ2l2ZW4gc3RyaW5nIG9uIAogICAqIHRoZSBn aXZlbiBkZWxpbWl0ZXIgY2hhcmFjdGVycy4gIEl0IGRvZXNuJ3QgcmV0dXJu IHRoZSBkZWxpbWl0ZXIKICAgKiBjaGFyYWN0ZXJzLgogICAqCiAgICogQHBh cmFtIHN0ciBUaGUgc3RyaW5nIHRvIHNwbGl0LgogICAqIEBwYXJhbSBkZWxp bSBBIHN0cmluZyBjb250YWluaW5nIGFsbCBkZWxpbWl0ZXIgY2hhcmFjdGVy cy4KICAgKi8KICBwdWJsaWMgU3RyaW5nVG9rZW5pemVyKFN0cmluZyBzdHIs IFN0cmluZyBkZWxpbSkKICAgIC8qeyByZXF1aXJlIHsgc3RyICE9IG51bGwg OjogInN0ciBtdXN0IG5vdCBiZSBudWxsIjsKICAgICAgIGRlbGltICE9IG51 bGwgOjogImRlbGltIG11c3Qgbm90IGJlIG51bGwiOyB9IH0gKi8KICB7CiAg ICB0aGlzKHN0ciwgZGVsaW0sIGZhbHNlKTsKICB9CgogIC8qKgogICAqIENy ZWF0ZSBhIG5ldyBTdHJpbmdUb2tlbml6ZXIsIHRoYXQgc3BsaXRzIHRoZSBn aXZlbiBzdHJpbmcgb24KICAgKiB0aGUgZ2l2ZW4gZGVsaW1pdGVyIGNoYXJh Y3RlcnMuICBJZiB5b3Ugc2V0CiAgICogPGNvZGU+cmV0dXJuRGVsaW1zPC9j b2RlPiB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGRlbGltaXRlcgogICAq IGNoYXJhY3RlcnMgYXJlIHJldHVybmVkIGFzIHRva2VucyBvZiB0aGVpciBv d24uICBUaGUgZGVsaW1pdGVyCiAgICogdG9rZW5zIGFsd2F5cyBjb25zaXN0 IG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4KICAgKgogICAqIEBwYXJhbSBzdHIg VGhlIHN0cmluZyB0byBzcGxpdC4KICAgKiBAcGFyYW0gZGVsaW0gQSBzdHJp bmcgY29udGFpbmluZyBhbGwgZGVsaW1pdGVyIGNoYXJhY3RlcnMuCiAgICog QHBhcmFtIHJldHVybkRlbGltcyBUZWxscywgaWYgeW91IHdhbnQgdG8gZ2V0 IHRoZSBkZWxpbWl0ZXJzLgogICAqLwogIHB1YmxpYyBTdHJpbmdUb2tlbml6 ZXIoU3RyaW5nIHN0ciwgU3RyaW5nIGRlbGltLCBib29sZWFuIHJldHVybkRl bGltcykKICAgIC8qeyByZXF1aXJlIHsgc3RyICE9IG51bGwgOjogInN0ciBt dXN0IG5vdCBiZSBudWxsIjsKICAgICAgIGRlbGltICE9IG51bGwgOjogImRl bGltIG11c3Qgbm90IGJlIG51bGwiOyB9IH0gKi8KICB7CiAgICB0aGlzLnN0 ciA9IHN0cjsKICAgIHRoaXMuZGVsaW0gPSBkZWxpbTsKICAgIHRoaXMucmV0 RGVsaW1zID0gcmV0dXJuRGVsaW1zOwogICAgdGhpcy5wb3MgPSAwOwogIH0K CiAgLyoqCiAgICogVGVsbHMgaWYgdGhlcmUgYXJlIG1vcmUgdG9rZW5zLgog ICAqIEByZXR1cm4gVHJ1ZSwgaWYgdGhlIG5leHQgY2FsbCBvZiBuZXh0VG9r ZW4oKSBzdWNjZWVkcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAqLwogIHB1Ymxp YyBib29sZWFuIGhhc01vcmVUb2tlbnMoKQogIHsKICAgIGlmICghcmV0RGVs aW1zKQogICAgICB7Cgl3aGlsZSAocG9zIDwgc3RyLmxlbmd0aCgpICYmIGRl bGltLmluZGV4T2Yoc3RyLmNoYXJBdChwb3MpKSA+IC0xKQoJICB7CgkgICAg cG9zKys7CgkgIH0KICAgICAgfQogICAgcmV0dXJuIHBvcyA8IHN0ci5sZW5n dGgoKTsKICB9CgogIC8qKgogICAqIFJldHVybnMgdGhlIG5leHRUb2tlbiwg Y2hhbmdpbmcgdGhlIGRlbGltaXRlciBzZXQgdG8gdGhlIGdpdmVuCiAgICog PGNvZGU+ZGVsaW08L2NvZGU+LiAgVGhlIGNoYW5nZSBvZiB0aGUgZGVsaW1p dGVyIHNldCBpcwogICAqIHBlcm1hbmVudCwgaWUuIHRoZSBuZXh0IGNhbGwg b2YgbmV4dFRva2VuKCksIHVzZXMgdGhlIHNhbWUKICAgKiBkZWxpbWl0ZXIg c2V0LgogICAqIEBwYXJhbSBkZWxpbSBhIHN0cmluZyBjb250YWluaW5nIHRo ZSBuZXcgZGVsaW1pdGVyIGNoYXJhY3RlcnMuCiAgICogQHJldHVybiB0aGUg bmV4dCB0b2tlbiB3aXRoIHJlc3BlY3QgdG8gdGhlIG5ldyBkZWxpbWl0ZXIg Y2hhcmFjdGVycy4KICAgKiBAZXhjZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNl cHRpb24gaWYgdGhlcmUgYXJlIG5vIG1vcmUgdG9rZW5zLgogICAqLwogIHB1 YmxpYyBTdHJpbmcgbmV4dFRva2VuKFN0cmluZyBkZWxpbSkgdGhyb3dzIE5v U3VjaEVsZW1lbnRFeGNlcHRpb24KICAgIC8qeyByZXF1aXJlIHsgaGFzTW9y ZVRva2VucygpIDo6ICJubyBtb3JlIFRva2VucyBhdmFpbGFibGUiOwogICAg ICAgZW5zdXJlIHsgJHJldHVybiAhPSBudWxsICYmICRyZXR1cm4ubGVuZ3Ro KCkgPiAwOyB9IH0gKi8KICB7CiAgICB0aGlzLmRlbGltID0gZGVsaW07CiAg ICByZXR1cm4gbmV4dFRva2VuKCk7CiAgfQoKICAvKioKICAgKiBSZXR1cm5z IHRoZSBuZXh0VG9rZW4gb2YgdGhlIHN0cmluZy4KICAgKiBAcGFyYW0gZGVs aW0gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmV3IGRlbGltaXRlciBjaGFy YWN0ZXJzLgogICAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4gd2l0aCByZXNw ZWN0IHRvIHRoZSBuZXcgZGVsaW1pdGVyIGNoYXJhY3RlcnMuCiAgICogQGV4 Y2VwdGlvbiBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBu byBtb3JlIHRva2Vucy4KICAgKi8KICBwdWJsaWMgU3RyaW5nIG5leHRUb2tl bigpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCiAgICAvKnsgcmVx dWlyZSB7IGhhc01vcmVUb2tlbnMoKSA6OiAibm8gbW9yZSBUb2tlbnMgYXZh aWxhYmxlIjsKICAgICAgIGVuc3VyZSB7ICRyZXR1cm4gIT0gbnVsbCAmJiAk cmV0dXJuLmxlbmd0aCgpID4gMDsgfSB9ICovCiAgewogICAgaWYgKHBvcyA8 IHN0ci5sZW5ndGgoKSAmJiBkZWxpbS5pbmRleE9mKHN0ci5jaGFyQXQocG9z KSkgPiAtMSkKICAgICAgewoJaWYgKHJldERlbGltcykKCSAgcmV0dXJuIHN0 ci5zdWJzdHJpbmcocG9zLTEsICsrcG9zKTsKCgl3aGlsZSAoKytwb3MgPCBz dHIubGVuZ3RoKCkgJiYgZGVsaW0uaW5kZXhPZihzdHIuY2hhckF0KHBvcykp ID4gLTEpCgkgIHsKCSAgICAvKiBlbXB0eSAqLwoJICB9CiAgICAgIH0KICAg IGlmIChwb3MgPCBzdHIubGVuZ3RoKCkpCiAgICAgIHsKCWludCBzdGFydCA9 IHBvczsKCXdoaWxlICgrK3BvcyA8IHN0ci5sZW5ndGgoKSAmJiBkZWxpbS5p bmRleE9mKHN0ci5jaGFyQXQocG9zKSkgPT0gLTEpCgkgIHsKCSAgICAvKiBl bXB0eSAqLwoJICB9CglyZXR1cm4gc3RyLnN1YnN0cmluZyhzdGFydCwgcG9z KTsKICAgICAgfQogICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRp b24oKTsKICB9CgogIC8qKgogICAqIFRoaXMgZG9lcyB0aGUgc2FtZSBhcyBo YXNNb3JlVG9rZW5zLiBUaGlzIGlzIHRoZQogICAqIDxjb2RlPkVudW1lcmF0 aW9uPC9jb2RlIGludGVyZmFjZSBtZXRob2QuCiAgICogQHJldHVybiBUcnVl LCBpZiB0aGUgbmV4dCBjYWxsIG9mIG5leHRFbGVtZW50KCkgc3VjY2VlZHMs IGZhbHNlCiAgICogb3RoZXJ3aXNlLiAgCiAgICogQHNlZSAjaGFzTW9yZVRv a2VucwogICAqLwogIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygp CiAgewogICAgcmV0dXJuIGhhc01vcmVUb2tlbnMoKTsKICB9CgogIC8qKgog ICAqIFRoaXMgZG9lcyB0aGUgc2FtZSBhcyBuZXh0VG9rZW5zLiBUaGlzIGlz IHRoZQogICAqIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlIGludGVyZmFjZSBt ZXRob2QuCiAgICogQHJldHVybiB0aGUgbmV4dCB0b2tlbiB3aXRoIHJlc3Bl Y3QgdG8gdGhlIG5ldyBkZWxpbWl0ZXIgY2hhcmFjdGVycy4KICAgKiBAZXhj ZXB0aW9uIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgYXJlIG5v IG1vcmUgdG9rZW5zLgogICAqIEBzZWUgI25leHRUb2tlbgogICAqLwogIHB1 YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVu dEV4Y2VwdGlvbgogIHsKICAgIHJldHVybiBuZXh0VG9rZW4oKTsKICB9Cgog IC8qKgogICAqIFRoaXMgY291bnRzIHRoZSBudW1iZXIgb2YgcmVtYWluaW5n IHRva2VucyBpbiB0aGUgc3RyaW5nLCB3aXRoCiAgICogcmVzcGVjdCB0byB0 aGUgY3VycmVudCBkZWxpbWl0ZXIgc2V0LgogICAqIEByZXR1cm4gdGhlIG51 bWJlciBvZiB0aW1lcyA8Y29kZT5uZXh0VG9rZW5zKCk8L2NvZGU+IHdpbGwK ICAgKiBzdWNjZWVkLiAgCiAgICogQHNlZSAjbmV4dFRva2VuCiAgICovCiAg cHVibGljIGludCBjb3VudFRva2VucygpCiAgewogICAgaW50IGNvdW50ID0g MDsKICAgIGludCBkZWxpbWl0ZXJDb3VudCA9IDA7CiAgICBib29sZWFuIHRv a2VuRm91bmQgPSBmYWxzZTsJCS8vIFNldCB3aGVuIGEgbm9uLWRlbGltaXRl ciBpcyBmb3VuZAogICAgaW50IHRtcFBvcyA9IHBvczsKCiAgICAvLyBOb3Rl IGZvciBlZmZpY2llbmN5LCB3ZSBjb3VudCB1cCB0aGUgZGVsaW1pdGVycyBy YXRoZXIgdGhhbiBjaGVjawogICAgLy8gcmV0RGVsaW1zIGV2ZXJ5IHRpbWUg d2UgZW5jb3VudGVyIG9uZS4gIFRoYXQgd2F5LCB3ZSBjYW4KICAgIC8vIGp1 c3QgZG8gdGhlIGNvbmRpdGlvbmFsIG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUg bWV0aG9kCiAgICB3aGlsZSAodG1wUG9zIDwgc3RyLmxlbmd0aCgpKQogICAg ICB7CglpZiAoZGVsaW0uaW5kZXhPZihzdHIuY2hhckF0KHRtcFBvcysrKSkg PiAtMSkKCSAgewoJICAgIGlmICh0b2tlbkZvdW5kKQoJICAgICAgewoJCS8v IEdvdCB0byB0aGUgZW5kIG9mIGEgdG9rZW4KCSAgICAgICAgY291bnQrKzsK CSAgICAgICAgdG9rZW5Gb3VuZCA9IGZhbHNlOwoJICAgICAgfQoKCSAgICBk ZWxpbWl0ZXJDb3VudCsrOwkJLy8gSW5jcmVtZW50IGZvciB0aGlzIGRlbGlt aXRlcgoJICB9CgllbHNlCgkgIHsKCSAgICB0b2tlbkZvdW5kID0gdHJ1ZTsK CgkgICAgLy8gR2V0IHRvIHRoZSBlbmQgb2YgdGhlIHRva2VuCgkgICAgd2hp bGUgKHRtcFBvcyA8IHN0ci5sZW5ndGgoKQoJCSAgICYmIGRlbGltLmluZGV4 T2Yoc3RyLmNoYXJBdCh0bXBQb3MpKSA9PSAtMSkKCSAgICAgICsrdG1wUG9z OwoJICB9CiAgICAgIH0KCiAgICAvLyBNYWtlIHN1cmUgdG8gY291bnQgdGhl IGxhc3QgdG9rZW4gCiAgICBpZiAodG9rZW5Gb3VuZCkKICAgICAgY291bnQr KzsKCiAgICAvLyBpZiBjb3VudGluZyBkZWxtaXRlcnMgYWRkIHRoZW0gaW50 byB0aGUgdG9rZW4gY291bnQKICAgIHJldHVybiByZXREZWxpbXMgPyBjb3Vu dCArIGRlbGltaXRlckNvdW50IDogY291bnQ7CiAgfQp9Cg== --------------Boundary-00=_N303WU43F2XAO2ND7ZRX Content-Type: text/x-java; charset="iso-8859-1"; name="Connection.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Connection.java" Content-length: 10476 Ly8gQ29ubmVjdGlvbi5qYXZhIC0gSW1wbGVtZW50YXRpb24gb2YgSHR0cFVS TENvbm5lY3Rpb24gZm9yIGh0dHAgcHJvdG9jb2wuCgovKiBDb3B5cmlnaHQg KEMpIDE5OTksIDIwMDAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgoKICAg VGhpcyBmaWxlIGlzIHBhcnQgb2YgbGliZ2NqLgoKVGhpcyBzb2Z0d2FyZSBp cyBjb3B5cmlnaHRlZCB3b3JrIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUKTGliZ2NqIExpY2Vuc2UuICBQbGVhc2UgY29uc3VsdCB0aGUgZmls ZSAiTElCR0NKX0xJQ0VOU0UiIGZvcgpkZXRhaWxzLiAgKi8KCnBhY2thZ2Ug Z251Lmdjai5wcm90b2NvbC5odHRwOwoKaW1wb3J0IGphdmEubmV0Lio7Cmlt cG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwppbXBv cnQgamF2YS51dGlsLkhhc2h0YWJsZTsKaW1wb3J0IGphdmEudXRpbC5FbnVt ZXJhdGlvbjsKCi8qKgogKiBAYXV0aG9yIFdhcnJlbiBMZXZ5IDx3YXJyZW5s QGN5Z251cy5jb20+CiAqIEBkYXRlIE1hcmNoIDI5LCAxOTk5LgogKi8KCi8q KgogKiBXcml0dGVuIHVzaW5nIG9uLWxpbmUgSmF2YSBQbGF0Zm9ybSAxLjIg QVBJIFNwZWNpZmljYXRpb24sIGFzIHdlbGwKICogYXMgIlRoZSBKYXZhIENs YXNzIExpYnJhcmllcyIsIDJuZCBlZGl0aW9uIChBZGRpc29uLVdlc2xleSwg MTk5OCkuCiAqIFN0YXR1czogIE1pbmltYWwgc3Vic2V0IG9mIGZ1bmN0aW9u YWxpdHkuICBQcm94aWVzIGFuZCBSZWRpcmVjdHMKICogICAgICBub3QgeWV0 IGhhbmRsZWQuICBGaWxlTmFtZU1hcCBoYW5kbGluZyBuZWVkcyB0byBiZSBj b25zaWRlcmVkLgogKiAgICAgIHVzZUNhY2hlcywgaWZNb2RpZmllZFNpbmNl LCBhbmQgYWxsb3dVc2VySW50ZXJhY3Rpb24gbmVlZAogKiAgICAgIGNvbnNp ZGVyYXRpb24gYXMgd2VsbCBhcyBkb0lucHV0IGFuZCBkb091dHB1dC4KICov CgpjbGFzcyBDb25uZWN0aW9uIGV4dGVuZHMgSHR0cFVSTENvbm5lY3Rpb24K ewogIHByb3RlY3RlZCBTb2NrZXQgc29jayA9IG51bGw7CiAgcHJpdmF0ZSBz dGF0aWMgSGFzaHRhYmxlIGRlZlJlcXVlc3RQcm9wZXJ0aWVzID0gbmV3IEhh c2h0YWJsZSgpOwogIHByaXZhdGUgSGFzaHRhYmxlIHJlcXVlc3RQcm9wZXJ0 aWVzOwogIHByaXZhdGUgSGFzaHRhYmxlIGhkckhhc2ggPSBuZXcgSGFzaHRh YmxlKCk7CiAgcHJpdmF0ZSBWZWN0b3IgaGRyVmVjID0gbmV3IFZlY3Rvcigp OwogIHByaXZhdGUgQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZmZXJlZEluOwog IHByaXZhdGUgYm9vbGVhbiBoZWFkZXJzID0gZmFsc2U7CgogIHB1YmxpYyBD b25uZWN0aW9uKFVSTCB1cmwpCiAgewogICAgc3VwZXIodXJsKTsKICAgIHJl cXVlc3RQcm9wZXJ0aWVzID0gKEhhc2h0YWJsZSkgZGVmUmVxdWVzdFByb3Bl cnRpZXMuY2xvbmUoKTsKICB9CgogIC8vIE92ZXJyaWRlIG1ldGhvZCBpbiBV UkxDb25uZWN0aW9uLgogIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZWZhdWx0 UmVxdWVzdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKICB7 CiAgICBkZWZSZXF1ZXN0UHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7CiAg fQoKICAvLyBPdmVycmlkZSBtZXRob2QgaW4gVVJMQ29ubmVjdGlvbi4KICBw dWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0UmVxdWVzdFByb3BlcnR5 KFN0cmluZyBrZXkpCiAgewogICAgcmV0dXJuIChTdHJpbmcpIGRlZlJlcXVl c3RQcm9wZXJ0aWVzLmdldChrZXkpOwogIH0KCiAgLy8gT3ZlcnJpZGUgbWV0 aG9kIGluIFVSTENvbm5lY3Rpb24uCiAgcHVibGljIHZvaWQgc2V0UmVxdWVz dFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKICB7CiAgICBp ZiAoY29ubmVjdGVkKQogICAgICB0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vy cm9yKCJDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQuIik7CgogICAg cmVxdWVzdFByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwogIH0KCiAgLy8g T3ZlcnJpZGUgbWV0aG9kIGluIFVSTENvbm5lY3Rpb24uCiAgcHVibGljIFN0 cmluZyBnZXRSZXF1ZXN0UHJvcGVydHkoU3RyaW5nIGtleSkKICB7CiAgICBp ZiAoY29ubmVjdGVkKQogICAgICB0aHJvdyBuZXcgSWxsZWdhbEFjY2Vzc0Vy cm9yKCJDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQuIik7CgogICAg cmV0dXJuIChTdHJpbmcpIHJlcXVlc3RQcm9wZXJ0aWVzLmdldChrZXkpOwog IH0KCiAgLy8gSW1wbGVtZW50YXRpb24gb2YgYWJzdHJhY3QgbWV0aG9kLgog IHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KICB7 CiAgICAvLyBDYWxsIGlzIGlnbm9yZWQgaWYgYWxyZWFkeSBjb25uZWN0ZWQu CiAgICBpZiAoY29ubmVjdGVkKQogICAgICByZXR1cm47CgogICAgLy8gR2V0 IGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyLgogICAgaW50IHBvcnQ7CiAgICBJ bmV0QWRkcmVzcyBkZXN0QWRkciA9IEluZXRBZGRyZXNzLmdldEJ5TmFtZSh1 cmwuZ2V0SG9zdCgpKTsKICAgIGlmICgocG9ydCA9IHVybC5nZXRQb3J0KCkp ID09IC0xKQogICAgICBwb3J0ID0gODA7CgogICAgLy8gT3BlbiBzb2NrZXQg YW5kIG91dHB1dCBzdHJlYW0uCiAgICBzb2NrID0gbmV3IFNvY2tldChkZXN0 QWRkciwgcG9ydCk7CgogICAgUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50 V3JpdGVyKHNvY2suZ2V0T3V0cHV0U3RyZWFtKCkpOwoKICAgIC8vIFNlbmQg cmVxdWVzdCBpbmNsdWRpbmcgYW55IHJlcXVlc3QgcHJvcGVydGllcyB0aGF0 IHdlcmUgc2V0LgogICAgb3V0LnByaW50KGdldFJlcXVlc3RNZXRob2QoKSAr ICIgIiArIHVybC5nZXRGaWxlKCkgKyAiIEhUVFAvMS4wXHJcbiIpOwogICAg b3V0LnByaW50KCJIb3N0OiAiICsgdXJsLmdldEhvc3QoKSArICI6IiArIHBv cnQgKyAiXHJcbiIpOwogICAgRW51bWVyYXRpb24gcmVxS2V5cyA9IHJlcXVl c3RQcm9wZXJ0aWVzLmtleXMoKTsKICAgIEVudW1lcmF0aW9uIHJlcVZhbHMg PSByZXF1ZXN0UHJvcGVydGllcy5lbGVtZW50cygpOwogICAgd2hpbGUgKHJl cUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCiAgICAgIG91dC5wcmludChyZXFL ZXlzLm5leHRFbGVtZW50KCkgKyAiOiAiICsgcmVxVmFscy5uZXh0RWxlbWVu dCgpICsgIlxyXG4iKTsKICAgIG91dC5wcmludCgiXHJcbiIpOwogICAgb3V0 LmZsdXNoKCk7ICAgIAogICAgY29ubmVjdGVkID0gdHJ1ZTsKICAgIGhlYWRl cnMgPSBmYWxzZTsKICB9CgogIC8vIEltcGxlbWVudGF0aW9uIG9mIGFic3Ry YWN0IG1ldGhvZC4KICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkKICB7CiAg ICBpZiAoc29jayAhPSBudWxsKQogICAgICB7CiAgICAgICAgdHJ5CiAgICAg ICAgICB7CiAgICAgICAgICAgIHNvY2suY2xvc2UoKTsKICAgICAgICAgIH0K ICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCiAgICAgICAgICB7CiAg ICAgICAgICAgIDsgLy8gSWdub3JlIGVycm9ycyBpbiBjbG9zaW5nIHNvY2tl dC4KICAgICAgICAgIH0KICAgICAgICBzb2NrID0gbnVsbDsKICAgICAgfQog IH0KCiAgLy8gVE9ETzogcHVibGljIGJvb2xlYW4gdXNpbmdQcm94eSgpCiAg cHVibGljIGJvb2xlYW4gdXNpbmdQcm94eSgpCiAgewogICAgdGhyb3cgbmV3 IEludGVybmFsRXJyb3IoIkh0dHBVUkxDb25uZWN0aW9uLnVzaW5nUHJveHkg bm90IGltcGxlbWVudGVkIik7CiAgfQoKICAvLyBPdmVycmlkZSBkZWZhdWx0 IG1ldGhvZCBpbiBVUkxDb25uZWN0aW9uLgogIHB1YmxpYyBJbnB1dFN0cmVh bSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbgogIHsKICAg IGlmICghY29ubmVjdGVkKQogICAgICBjb25uZWN0KCk7CgogICAgaWYgKCAh aGVhZGVycyApCiAgICAJZ2V0SHR0cEhlYWRlcnMoKTsKICAgIAogICAgaWYg KCFkb0lucHV0KQogICAgICB0aHJvdyBuZXcgUHJvdG9jb2xFeGNlcHRpb24o IkNhbid0IG9wZW4gSW5wdXRTdHJlYW0gaWYgZG9JbnB1dCBpcyBmYWxzZSIp OwogICAgcmV0dXJuIGJ1ZmZlcmVkSW47CiAgfQoKICAvLyBPdmVycmlkZSBk ZWZhdWx0IG1ldGhvZCBpbiBVUkxDb25uZWN0aW9uLgogIHB1YmxpYyBPdXRw dXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9u CiAgewogICAgaWYgKCFjb25uZWN0ZWQpCiAgICAgIGNvbm5lY3QoKTsKCiAg ICBpZiAoISBkb091dHB1dCkKICAgICAgdGhyb3cgbmV3CiAgICAgICAgUHJv dG9jb2xFeGNlcHRpb24oIkNhbid0IG9wZW4gT3V0cHV0U3RyZWFtIGlmIGRv T3V0cHV0IGlzIGZhbHNlIik7CiAgICByZXR1cm4gc29jay5nZXRPdXRwdXRT dHJlYW0oKTsKICB9CgogIC8vIE92ZXJyaWRlIGRlZmF1bHQgbWV0aG9kIGlu IFVSTENvbm5lY3Rpb24uCiAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVs ZChTdHJpbmcgbmFtZSkKICB7CiAgICBpZiAoIWNvbm5lY3RlZCkKICAgICAg dHJ5CiAgICAgICAgewogICAgICAgICAgY29ubmVjdCgpOwogICAgICAgIH0K ICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHgpCiAgICAgICAgewogICAgICAg ICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgIHJldHVybiAoU3RyaW5n KSBoZHJIYXNoLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOwogIH0KCiAgLy8g T3ZlcnJpZGUgZGVmYXVsdCBtZXRob2QgaW4gVVJMQ29ubmVjdGlvbi4KICBw dWJsaWMgU3RyaW5nIGdldEhlYWRlckZpZWxkKGludCBuKQogIHsKICAgIGlm ICghY29ubmVjdGVkKQogICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICBj b25uZWN0KCk7CiAgICAgICAgfQogICAgICBjYXRjaCAoSU9FeGNlcHRpb24g eCkKICAgICAgICB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9 CgogICAgaWYgKG4gPCBoZHJWZWMuc2l6ZSgpKQogICAgICByZXR1cm4gZ2V0 RmllbGQoKFN0cmluZykgaGRyVmVjLmVsZW1lbnRBdChuKSk7CiAgICByZXR1 cm4gbnVsbDsKICB9CgogIC8vIE92ZXJyaWRlIGRlZmF1bHQgbWV0aG9kIGlu IFVSTENvbm5lY3Rpb24uCiAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVs ZEtleShpbnQgbikKICB7CiAgICBpZiAoIWNvbm5lY3RlZCkKICAgICAgdHJ5 CiAgICAgICAgewogICAgICAgICAgY29ubmVjdCgpOwogICAgICAgIH0KICAg ICAgY2F0Y2ggKElPRXhjZXB0aW9uIHgpCiAgICAgICAgewogICAgICAgICAg cmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgIGlmIChuIDwgaGRyVmVjLnNp emUoKSkKICAgICAgcmV0dXJuIGdldEtleSgoU3RyaW5nKSBoZHJWZWMuZWxl bWVudEF0KG4pKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcHJpdmF0ZSBT dHJpbmcgZ2V0S2V5KFN0cmluZyBzdHIpCiAgewogICAgaWYgKHN0ciA9PSBu dWxsKQogICAgICByZXR1cm4gbnVsbDsKICAgIGludCBpbmRleCA9IHN0ci5p bmRleE9mKCc6Jyk7CiAgICBpZiAoaW5kZXggPj0gMCkKICAgICAgcmV0dXJu IHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgZWxzZQogICAgICByZXR1 cm4gbnVsbDsKICB9CgogIHByaXZhdGUgU3RyaW5nIGdldEZpZWxkKFN0cmlu ZyBzdHIpCiAgewogICAgaWYgKHN0ciA9PSBudWxsKQogICAgICByZXR1cm4g bnVsbDsKICAgIGludCBpbmRleCA9IHN0ci5pbmRleE9mKCc6Jyk7CiAgICBp ZiAoaW5kZXggPj0gMCkKICAgICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoaW5k ZXggKyAxKS50cmltKCk7CiAgICBlbHNlCiAgICAgIHJldHVybiBzdHI7CiAg fQoKICBwcml2YXRlIHZvaWQgZ2V0SHR0cEhlYWRlcnMoKSB0aHJvd3MgSU9F eGNlcHRpb24KICB7CiAgICAvLyBPcmlnaW5hbGx5IHRyaWVkIHVzaW5nIGEg QnVmZmVyZWRSZWFkZXIgaGVyZSB0byB0YWtlIGFkdmFudGFnZSBvZgogICAg Ly8gdGhlIHJlYWRMaW5lIG1ldGhvZCBhbmQgYXZvaWQgdGhlIGZvbGxvd2lu ZywgYnV0IHRoZSBidWZmZXIgcmVhZAogICAgLy8gcGFzdCB0aGUgZW5kIG9m IHRoZSBoZWFkZXJzIHNvIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb250ZW50 IHdhcyBsb3N0LgogICAgLy8gSXQgaXMgcHJvYmFibHkgbW9yZSByb2J1c3Qg dGhhbiBpdCBuZWVkcyB0byBiZSwgZS5nLiB0aGUgYnl0ZVtdCiAgICAvLyBp cyB1bmxpa2VseSB0byBvdmVyZmxvdyBhbmQgYSAnXHInIHNob3VsZCBhbHdh eXMgYmUgZm9sbG93ZWQgYnkgYSAnXG4nLAogICAgLy8gYnV0IGl0IGlzIGJl dHRlciB0byBiZSBzYWZlIGp1c3QgaW4gY2FzZS4KICAgIGJ1ZmZlcmVkSW4g PSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb2NrLmdldElucHV0U3RyZWFt KCkpOwoKICAgIGludCBidWZsZW4gPSAxMDA7CiAgICBieXRlW10gYnVmID0g bmV3IGJ5dGVbYnVmbGVuXTsKICAgIFN0cmluZyBsaW5lID0gIiI7CiAgICBi b29sZWFuIGdvdG5sID0gZmFsc2U7CiAgICBieXRlW10gY2ggPSBuZXcgYnl0 ZVsxXTsKICAgIGNoWzBdID0gKGJ5dGUpICdcbic7CgogICAgd2hpbGUgKHRy dWUpCiAgICAgIHsKICAgICAgICAvLyBDaGVjayBmb3IgbGVmdG92ZXIgYnl0 ZSBmcm9tIG5vbi0nXG4nIGFmdGVyIGEgJ1xyJy4KICAgICAgICBpZiAoY2hb MF0gIT0gJ1xuJykKICAgICAgICAgIGxpbmUgPSBsaW5lICsgJ1xyJyArIG5l dyBTdHJpbmcoY2gsIDAsIDEpOwoKICAgICAgICBpbnQgaTsKICAgICAgICAv LyBGSVhNRTogVGhpcyBpcyByYXRoZXIgaW5lZmZpY2llbnQuCiAgICAgICAg Zm9yIChpID0gMDsgaSA8IGJ1ZmxlbjsgaSsrKQogICAgICAgICAgewogICAg ICAgICAgICBidWZbaV0gPSAoYnl0ZSkgYnVmZmVyZWRJbi5yZWFkKCk7CiAg ICAgICAgICAgIGlmIChidWZbaV0gPT0gLTEpCiAgICAgICAgICAgICAgdGhy b3cgbmV3IElPRXhjZXB0aW9uKCJNYWxmb3JtZWQgSFRUUCBoZWFkZXIiKTsK ICAgICAgICAgICAgaWYgKGJ1ZltpXSA9PSAnXHInKQogICAgICAgICAgICAg IHsKICAgICAgICAgICAgICAgIGJ1ZmZlcmVkSW4ucmVhZChjaCwgMCwgMSk7 CiAgICAgICAgICAgICAgICBpZiAoY2hbMF0gPT0gJ1xuJykKICAgICAgICAg ICAgICAgICAgZ290bmwgPSB0cnVlOwogICAgICAgICAgICAgICAgYnJlYWs7 CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIGxpbmUgPSBs aW5lICsgbmV3IFN0cmluZyhidWYsIDAsIGkpOwoKICAgICAgICAvLyBBICdc cicgJ1xuJyBjb21ibyBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgaGVhZGVy IGVudHJ5LgogICAgICAgIC8vIElmIGl0IHdhc24ndCBmb3VuZCwgY3ljbGUg YmFjayB0aHJvdWdoIHRoZSBsb29wIGFuZCBhcHBlbmQKICAgICAgICAvLyB0 byAnbGluZScgdW50aWwgb25lIGlzIGZvdW5kLgogICAgICAgIGlmIChnb3Ru bCkKICAgICAgICAgIHsKICAgICAgICAgICAgLy8gQSB6ZXJvIGxlbmd0aCBl bnRyeSBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIGhlYWRlcnMuCiAgICAgICAg ICAgIGlmIChsaW5lLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgICAgYnJl YWs7CgogICAgICAgICAgICAvLyBTdG9yZSB0aGUgaGVhZGVyIGFuZCByZWlu aXRpYWxpemUgZm9yIG5leHQgY3ljbGUuCiAgICAgICAgICAgIGhkclZlYy5h ZGRFbGVtZW50KGxpbmUpOwogICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0 S2V5KGxpbmUpOwogICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpCiAgICAg ICAgICAgICAgaGRySGFzaC5wdXQoa2V5LnRvTG93ZXJDYXNlKCksIGdldEZp ZWxkKGxpbmUpKTsKICAgICAgICAgICAgbGluZSA9ICIiOwogICAgICAgICAg ICBjaFswXSA9IChieXRlKSAnXG4nOwogICAgICAgICAgICBnb3RubCA9IGZh bHNlOwogICAgICAgICAgfQogICAgICB9CiAgfQp9CgoK --------------Boundary-00=_N303WU43F2XAO2ND7ZRX Content-Type: text/x-c; charset="iso-8859-1"; name="ObjectInputStream.java" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="ObjectInputStream.java" Content-length: 59020 LyogT2JqZWN0SW5wdXRTdHJlYW0uamF2YSAtLSBDbGFzcyB1c2VkIHRvIHJl YWQgc2VyaWFsaXplZCBvYmplY3RzCiAgIENvcHlyaWdodCAoQykgMTk5OCwg MTk5OSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu Yy4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDbGFzc3BhdGguCgpHTlUg Q2xhc3NwYXRoIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli dXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkK dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g Miwgb3IgKGF0IHlvdXIgb3B0aW9uKQphbnkgbGF0ZXIgdmVyc2lvbi4KIApH TlUgQ2xhc3NwYXRoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsIGJ1dApXSVRIT1VUIEFOWSBXQVJSQU5UWTsg d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCk1FUkNIQU5U QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUgR05VCkdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg ZGV0YWlscy4KCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggR05V IENsYXNzcGF0aDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdy aXRlIHRvIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5 IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCjAyMTExLTEz MDcgVVNBLgoKTGlua2luZyB0aGlzIGxpYnJhcnkgc3RhdGljYWxseSBvciBk eW5hbWljYWxseSB3aXRoIG90aGVyIG1vZHVsZXMgaXMKbWFraW5nIGEgY29t YmluZWQgd29yayBiYXNlZCBvbiB0aGlzIGxpYnJhcnkuICBUaHVzLCB0aGUg dGVybXMgYW5kCmNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGNvdmVyIHRoZSB3aG9sZQpjb21iaW5hdGlvbi4KCkFzIGEg c3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0 aGlzIGxpYnJhcnkgZ2l2ZSB5b3UKcGVybWlzc2lvbiB0byBsaW5rIHRoaXMg bGlicmFyeSB3aXRoIGluZGVwZW5kZW50IG1vZHVsZXMgdG8gcHJvZHVjZSBh bgpleGVjdXRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZSBsaWNlbnNlIHRlcm1z IG9mIHRoZXNlIGluZGVwZW5kZW50Cm1vZHVsZXMsIGFuZCB0byBjb3B5IGFu ZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlcgp0 ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBt ZWV0LCBmb3IgZWFjaCBsaW5rZWQKaW5kZXBlbmRlbnQgbW9kdWxlLCB0aGUg dGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIGxpY2Vuc2Ugb2YgdGhhdApt b2R1bGUuICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hp Y2ggaXMgbm90IGRlcml2ZWQgZnJvbQpvciBiYXNlZCBvbiB0aGlzIGxpYnJh cnkuICBJZiB5b3UgbW9kaWZ5IHRoaXMgbGlicmFyeSwgeW91IG1heSBleHRl bmQKdGhpcyBleGNlcHRpb24gdG8geW91ciB2ZXJzaW9uIG9mIHRoZSBsaWJy YXJ5LCBidXQgeW91IGFyZSBub3QKb2JsaWdhdGVkIHRvIGRvIHNvLiAgSWYg eW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcwpleGNlcHRp b24gc3RhdGVtZW50IGZyb20geW91ciB2ZXJzaW9uLiAqLwoKCnBhY2thZ2Ug amF2YS5pbzsKCmltcG9ydCBnbnUuY2xhc3NwYXRoLkNvbmZpZ3VyYXRpb247 CgppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CmltcG9ydCBqYXZh LmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKaW1wb3J0IGphdmEudXRpbC5BcnJh eXM7CmltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwppbXBvcnQgamF2YS51 dGlsLlZlY3RvcjsKCmltcG9ydCBnbnUuamF2YS5pby5PYmplY3RJZGVudGl0 eVdyYXBwZXI7CmltcG9ydCBnbnUuamF2YS5sYW5nLnJlZmxlY3QuVHlwZVNp Z25hdHVyZTsKaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwppbXBv cnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwppbXBvcnQgamF2YS5sYW5n LnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKCgoKcHVibGlj IGNsYXNzIE9iamVjdElucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0K ICBpbXBsZW1lbnRzIE9iamVjdElucHV0LCBPYmplY3RTdHJlYW1Db25zdGFu dHMKewogIC8qKgogICAgIENyZWF0ZXMgYSBuZXcgPGNvZGU+T2JqZWN0SW5w dXRTdHJlYW08L2NvZGU+IHRoYXQgd2lsbCBkbyBhbGwgb2YKICAgICBpdHMg cmVhZGluZyBmcm9tIDxjb2RlPmluPC9jb2RlPi4gIFRoaXMgbWV0aG9kIGFs c28gY2hlY2tzCiAgICAgdGhlIHN0cmVhbSBieSByZWFkaW5nIHRoZSBoZWFk ZXIgaW5mb3JtYXRpb24gKHN0cmVhbSBtYWdpYyBudW1iZXIKICAgICBhbmQg c3RyZWFtIHZlcnNpb24pLgoKICAgICBAZXhjZXB0aW9uIElPRXhjZXB0aW9u IFJlYWRpbmcgc3RyZWFtIGhlYWRlciBmcm9tIHVuZGVybHlpbmcKICAgICBz dHJlYW0gY2Fubm90IGJlIGNvbXBsZXRlZC4KCiAgICAgQGV4Y2VwdGlvbiBT dHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gQW4gaW52YWxpZCBzdHJlYW0gbWFn aWMKICAgICBudW1iZXIgb3Igc3RyZWFtIHZlcnNpb24gd2FzIHJlYWQgZnJv bSB0aGUgc3RyZWFtLgoKICAgICBAc2VlIHJlYWRTdHJlYW1IZWFkZXIgKCkK ICAqLwogIHB1YmxpYyBPYmplY3RJbnB1dFN0cmVhbSAoSW5wdXRTdHJlYW0g aW4pCiAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFN0cmVhbUNvcnJ1cHRlZEV4 Y2VwdGlvbgogIHsKICAgIGlmIChDb25maWd1cmF0aW9uLkRFQlVHKQogICAg ICB7CglTdHJpbmcgdmFsID0gU3lzdGVtLmdldFByb3BlcnR5KCJnY2ouZHVt cG9iamVjdHMiKTsKCWlmIChkdW1wID09IGZhbHNlICYmIHZhbCAhPSBudWxs ICYmICF2YWwuZXF1YWxzKCIiKSkKCSAgewoJICAgIGR1bXAgPSB0cnVlOwoJ ICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIlNlcmlhbGl6YXRpb24gZGVidWdn aW5nIGVuYWJsZWQiKTsKCSAgfQoJZWxzZSBpZiAoZHVtcCA9PSB0cnVlICYm ICh2YWwgPT0gbnVsbCB8fCB2YWwuZXF1YWxzKCIiKSkpCgkgIHsKCSAgICBk dW1wID0gZmFsc2U7CgkgICAgU3lzdGVtLm91dC5wcmludGxuICgiU2VyaWFs aXphdGlvbiBkZWJ1Z2dpbmcgZGlzYWJsZWQiKTsKCSAgfQogICAgICB9Cgog ICAgdGhpcy5yZXNvbHZlRW5hYmxlZCA9IGZhbHNlOwogICAgdGhpcy5pc0Rl c2VyaWFsaXppbmcgPSBmYWxzZTsKICAgIHRoaXMuYmxvY2tEYXRhUG9zaXRp b24gPSAwOwogICAgdGhpcy5ibG9ja0RhdGFCeXRlcyA9IDA7CiAgICB0aGlz LmJsb2NrRGF0YSA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKICAgIHRoaXMu YmxvY2tEYXRhSW5wdXQgPSBuZXcgRGF0YUlucHV0U3RyZWFtICh0aGlzKTsK ICAgIHRoaXMucmVhbElucHV0U3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVh bSAoaW4pOwogICAgdGhpcy5uZXh0T0lEID0gYmFzZVdpcmVIYW5kbGU7CiAg ICB0aGlzLm9iamVjdExvb2t1cFRhYmxlID0gbmV3IEhhc2h0YWJsZSAoKTsK ICAgIHRoaXMudmFsaWRhdG9ycyA9IG5ldyBWZWN0b3IgKCk7CiAgICBzZXRC bG9ja0RhdGFNb2RlICh0cnVlKTsKICAgIHJlYWRTdHJlYW1IZWFkZXIgKCk7 CiAgfQoKCiAgLyoqCiAgICAgUmV0dXJucyB0aGUgbmV4dCBkZXNlcmlhbGl6 ZWQgb2JqZWN0IHJlYWQgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCgog ICAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZW4gYnkgYSBjbGFzcyBi eSBpbXBsZW1lbnRpbmcKICAgICA8Y29kZT5wcml2YXRlIHZvaWQgcmVhZE9i amVjdCAoT2JqZWN0SW5wdXRTdHJlYW0pPC9jb2RlPi4KCiAgICAgSWYgYW4g ZXhjZXB0aW9uIGlzIHRocm93biBmcm9tIHRoaXMgbWV0aG9kLCB0aGUgc3Ry ZWFtIGlzIGxlZnQgaW4KICAgICBhbiB1bmRlZmluZWQgc3RhdGUuCgogICAg IEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBUaGUgY2xhc3Mg dGhhdCBhbiBvYmplY3QgYmVpbmcKICAgICByZWFkIGluIGJlbG9uZ3MgdG8g Y2Fubm90IGJlIGZvdW5kLgoKICAgICBAZXhjZXB0aW9uIElPRXhjZXB0aW9u IEV4Y2VwdGlvbiBmcm9tIHVuZGVybHlpbmcKICAgICA8Y29kZT5JbnB1dFN0 cmVhbTwvY29kZT4uCiAgKi8KICBwdWJsaWMgZmluYWwgT2JqZWN0IHJlYWRP YmplY3QgKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhj ZXB0aW9uCiAgewogICAgaWYgKHRoaXMudXNlU3ViY2xhc3NNZXRob2QpCiAg ICAgIHJldHVybiByZWFkT2JqZWN0T3ZlcnJpZGUgKCk7CgogICAgYm9vbGVh biB3YXNfZGVzZXJpYWxpemluZzsKCiAgICBPYmplY3QgcmV0X3ZhbDsKICAg IHdhc19kZXNlcmlhbGl6aW5nID0gdGhpcy5pc0Rlc2VyaWFsaXppbmc7Cgog ICAgaWYgKCEgd2FzX2Rlc2VyaWFsaXppbmcpCiAgICAgIHNldEJsb2NrRGF0 YU1vZGUgKGZhbHNlKTsKCiAgICB0aGlzLmlzRGVzZXJpYWxpemluZyA9IHRy dWU7CgogICAgYnl0ZSBtYXJrZXIgPSB0aGlzLnJlYWxJbnB1dFN0cmVhbS5y ZWFkQnl0ZSAoKTsKICAgIGR1bXBFbGVtZW50ICgiTUFSS0VSOiAweCIgKyBJ bnRlZ2VyLnRvSGV4U3RyaW5nKG1hcmtlcikgKyAiICIpOwoKICAgIHN3aXRj aCAobWFya2VyKQogICAgewogICAgICBjYXNlIFRDX0JMT0NLREFUQToKICAg ICAgY2FzZSBUQ19CTE9DS0RBVEFMT05HOgoJaWYgKG1hcmtlciA9PSBUQ19C TE9DS0RBVEFMT05HKSAKCSAgZHVtcEVsZW1lbnRsbiAoIkJMT0NLREFUQUxP TkciKTsKCWVsc2UKCSAgZHVtcEVsZW1lbnRsbiAoIkJMT0NLREFUQSIpOwoJ cmVhZE5leHRCbG9jayAobWFya2VyKTsKCXRocm93IG5ldyBTdHJlYW1Db3Jy dXB0ZWRFeGNlcHRpb24gKCJVbmV4cGVjdGVkIGJsb2NrRGF0YSIpOwoKICAg ICAgY2FzZSBUQ19OVUxMOgoJZHVtcEVsZW1lbnRsbiAoIk5VTEwiKTsKCXJl dF92YWwgPSBudWxsOwoJYnJlYWs7CgogICAgICBjYXNlIFRDX1JFRkVSRU5D RToKICAgICAgewoJZHVtcEVsZW1lbnQgKCJSRUZFUkVOQ0UgIik7CglJbnRl Z2VyIG9pZCA9IG5ldyBJbnRlZ2VyICh0aGlzLnJlYWxJbnB1dFN0cmVhbS5y ZWFkSW50ICgpKTsKCWR1bXBFbGVtZW50bG4gKEludGVnZXIudG9IZXhTdHJp bmcob2lkLmludFZhbHVlKCkpKTsKCXJldF92YWwgPSAoKE9iamVjdElkZW50 aXR5V3JhcHBlcikKCQkgICB0aGlzLm9iamVjdExvb2t1cFRhYmxlLmdldCAo b2lkKSkub2JqZWN0OwoJYnJlYWs7CiAgICAgIH0KCiAgICAgIGNhc2UgVENf Q0xBU1M6CiAgICAgIHsKCWR1bXBFbGVtZW50bG4gKCJDTEFTUyIpOwoJT2Jq ZWN0U3RyZWFtQ2xhc3Mgb3NjID0gKE9iamVjdFN0cmVhbUNsYXNzKXJlYWRP YmplY3QgKCk7CglDbGFzcyBjbGF6eiA9IG9zYy5mb3JDbGFzcyAoKTsKCWFz c2lnbk5ld0hhbmRsZSAoY2xhenopOwoJcmV0X3ZhbCA9IGNsYXp6OwoJYnJl YWs7CiAgICAgIH0KCiAgICAgIGNhc2UgVENfQ0xBU1NERVNDOgogICAgICB7 CglkdW1wRWxlbWVudCAoIkNMQVNTREVTQyBOQU1FPSIpOwoJU3RyaW5nIG5h bWUgPSB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkVVRGICgpOwoJZHVtcEVs ZW1lbnQgKG5hbWUgKyAiOyBVSUQ9Iik7Cglsb25nIHVpZCA9IHRoaXMucmVh bElucHV0U3RyZWFtLnJlYWRMb25nICgpOwoJZHVtcEVsZW1lbnQgKExvbmcu dG9IZXhTdHJpbmcodWlkKSArICI7IEZMQUdTPSIpOwoJYnl0ZSBmbGFncyA9 IHRoaXMucmVhbElucHV0U3RyZWFtLnJlYWRCeXRlICgpOwoJZHVtcEVsZW1l bnQgKEludGVnZXIudG9IZXhTdHJpbmcoZmxhZ3MpICsgIjsgRklFTEQgQ09V TlQ9Iik7CglzaG9ydCBmaWVsZF9jb3VudCA9IHRoaXMucmVhbElucHV0U3Ry ZWFtLnJlYWRTaG9ydCAoKTsKCWR1bXBFbGVtZW50bG4gKFNob3J0LnRvU3Ry aW5nKGZpZWxkX2NvdW50KSk7CglPYmplY3RTdHJlYW1GaWVsZFtdIGZpZWxk cyA9IG5ldyBPYmplY3RTdHJlYW1GaWVsZFtmaWVsZF9jb3VudF07CgoJT2Jq ZWN0U3RyZWFtQ2xhc3Mgb3NjID0gbmV3IE9iamVjdFN0cmVhbUNsYXNzIChu YW1lLCB1aWQsCgkJCQkJCSAgICAgICBmbGFncywgZmllbGRzKTsKCWFzc2ln bk5ld0hhbmRsZSAob3NjKTsKCglmb3IgKGludCBpPTA7IGkgPCBmaWVsZF9j b3VudDsgaSsrKQoJewoJICBkdW1wRWxlbWVudCAoIiAgVFlQRSBDT0RFPSIp OwoJICBjaGFyIHR5cGVfY29kZSA9IChjaGFyKXRoaXMucmVhbElucHV0U3Ry ZWFtLnJlYWRCeXRlICgpOwoJICBkdW1wRWxlbWVudCAodHlwZV9jb2RlICsg IjsgRklFTEQgTkFNRT0iKTsKCSAgU3RyaW5nIGZpZWxkX25hbWUgPSB0aGlz LnJlYWxJbnB1dFN0cmVhbS5yZWFkVVRGICgpOwoJICBkdW1wRWxlbWVudGxu IChmaWVsZF9uYW1lKTsKCSAgU3RyaW5nIGNsYXNzX25hbWU7CgoJICBpZiAo dHlwZV9jb2RlID09ICdMJyB8fCB0eXBlX2NvZGUgPT0gJ1snKQoJICAgIGNs YXNzX25hbWUgPSAoU3RyaW5nKXJlYWRPYmplY3QgKCk7CgkgIGVsc2UKCSAg ICBjbGFzc19uYW1lID0gU3RyaW5nLnZhbHVlT2YgKHR5cGVfY29kZSk7CgoJ ICBmaWVsZHNbaV0gPQoJICAgIG5ldyBPYmplY3RTdHJlYW1GaWVsZCAoZmll bGRfbmFtZSwKCQkJCSAgIFR5cGVTaWduYXR1cmUuZ2V0Q2xhc3NGb3JFbmNv ZGluZwoJCQkJICAgKGNsYXNzX25hbWUpKTsKCX0KCglDbGFzcyBjbCA9IHJl c29sdmVDbGFzcyAob3NjKTsKCW9zYy5zZXRDbGFzcyAoY2wpOwoJc2V0Qmxv Y2tEYXRhTW9kZSAoZmFsc2UpOwoKCWlmICh0aGlzLnJlYWxJbnB1dFN0cmVh bS5yZWFkQnl0ZSAoKSAhPSBUQ19FTkRCTE9DS0RBVEEpCgkgIHRocm93IG5l dyBJT0V4Y2VwdGlvbiAoIkRhdGEgYW5ub3RhdGVkIHRvIGNsYXNzIHdhcyBu b3QgY29uc3VtZWQuIik7CglkdW1wRWxlbWVudGxuICgiRU5EQkxPQ0tEQVRB ICIpOwoKCW9zYy5zZXRTdXBlcmNsYXNzICgoT2JqZWN0U3RyZWFtQ2xhc3Mp cmVhZE9iamVjdCAoKSk7CglyZXRfdmFsID0gb3NjOwoJYnJlYWs7CiAgICAg IH0KCiAgICAgIGNhc2UgVENfU1RSSU5HOgogICAgICB7CglkdW1wRWxlbWVu dCAoIlNUUklORz0iKTsKCVN0cmluZyBzID0gdGhpcy5yZWFsSW5wdXRTdHJl YW0ucmVhZFVURiAoKTsKCWR1bXBFbGVtZW50bG4gKHMpOwoJcmV0X3ZhbCA9 IHByb2Nlc3NSZXNvbHV0aW9uIChzLCBhc3NpZ25OZXdIYW5kbGUgKHMpKTsK CWJyZWFrOwogICAgICB9CgogICAgICBjYXNlIFRDX0FSUkFZOgogICAgICB7 CglkdW1wRWxlbWVudGxuICgiQVJSQVkiKTsKCU9iamVjdFN0cmVhbUNsYXNz IG9zYyA9IChPYmplY3RTdHJlYW1DbGFzcylyZWFkT2JqZWN0ICgpOwoJQ2xh c3MgY29tcG9uZW50VHlwZSA9IG9zYy5mb3JDbGFzcyAoKS5nZXRDb21wb25l bnRUeXBlICgpOwoJZHVtcEVsZW1lbnQgKCJBUlJBWSBMRU5HVEg9Iik7Cglp bnQgbGVuZ3RoID0gdGhpcy5yZWFsSW5wdXRTdHJlYW0ucmVhZEludCAoKTsK CWR1bXBFbGVtZW50bG4gKGxlbmd0aCArICI7IENPTVBPTkVOVCBUWVBFPSIg KyBjb21wb25lbnRUeXBlKTsKCU9iamVjdCBhcnJheSA9IEFycmF5Lm5ld0lu c3RhbmNlIChjb21wb25lbnRUeXBlLCBsZW5ndGgpOwoJaW50IGhhbmRsZSA9 IGFzc2lnbk5ld0hhbmRsZSAoYXJyYXkpOwoJcmVhZEFycmF5RWxlbWVudHMg KGFycmF5LCBjb21wb25lbnRUeXBlKTsKCWZvciAoaW50IGk9MCwgbGVuPUFy cmF5LmdldExlbmd0aChhcnJheSk7IGkgPCBsZW47IGkrKykKCSAgaWYgKCBB cnJheS5nZXQoYXJyYXksaSkgPT0gbnVsbCApCgkgICAgZHVtcEVsZW1lbnRs biAoIiAgRUxFTUVOVFsiICsgaSArICJdPTxudWxsPiIpOwoJICBlbHNlCgkg ICAgZHVtcEVsZW1lbnRsbiAoIiAgRUxFTUVOVFsiICsgaSArICJdPSIgKyBB cnJheS5nZXQoYXJyYXksIGkpLnRvU3RyaW5nKCkpOwoJcmV0X3ZhbCA9IHBy b2Nlc3NSZXNvbHV0aW9uIChhcnJheSwgaGFuZGxlKTsKCWJyZWFrOwogICAg ICB9CgogICAgICBjYXNlIFRDX09CSkVDVDoKICAgICAgewoJZHVtcEVsZW1l bnRsbiAoIk9CSkVDVCIpOwoJT2JqZWN0U3RyZWFtQ2xhc3Mgb3NjID0gKE9i amVjdFN0cmVhbUNsYXNzKXJlYWRPYmplY3QgKCk7CglDbGFzcyBjbGF6eiA9 IG9zYy5mb3JDbGFzcyAoKTsKCglpZiAoIVNlcmlhbGl6YWJsZS5jbGFzcy5p c0Fzc2lnbmFibGVGcm9tIChjbGF6eikpCgkgIHRocm93IG5ldyBOb3RTZXJp YWxpemFibGVFeGNlcHRpb24gKGNsYXp6ICsgIiBpcyBub3QgU2VyaWFsaXph YmxlLCBhbmQgdGh1cyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkLiIpOwoKCWlm IChFeHRlcm5hbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tIChjbGF6 eikpCgl7CgkgIEV4dGVybmFsaXphYmxlIG9iaiA9IG51bGw7CgoJICB0cnkK CSAgewoJICAgIG9iaiA9IChFeHRlcm5hbGl6YWJsZSljbGF6ei5uZXdJbnN0 YW5jZSAoKTsKCSAgfQoJICBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlv biBlKQoJICB7CgkgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRp b24gKCJJbnN0YW5jZSBvZiAiICsgY2xhenoKCQkJCQkgICAgICArICIgY291 bGQgbm90IGJlIGNyZWF0ZWQiKTsKCSAgfQoJICBjYXRjaCAoSWxsZWdhbEFj Y2Vzc0V4Y2VwdGlvbiBlKQoJICB7CgkgICAgdGhyb3cgbmV3IENsYXNzTm90 Rm91bmRFeGNlcHRpb24gKCJJbnN0YW5jZSBvZiAiICsgY2xhenoKCQkJCQkg ICAgICArICIgY291bGQgbm90IGJlIGNyZWF0ZWQgYmVjYXVzZSBjbGFzcyBv ciB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yIGlzIG5vdCBhY2Nlc3NpYmxl Iik7CgkgIH0KCSAgY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGUpCgkgIHsK CSAgICB0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiAoIkluc3Rh bmNlIG9mICIgKyBjbGF6egoJCQkJCSAgICAgICsgIiBjb3VsZCBub3QgYmUg Y3JlYXRlZCBiZWNhdXNlIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IgaXMg bm90IGRlZmluZWQiKTsKCSAgfQoKCSAgaW50IGhhbmRsZSA9IGFzc2lnbk5l d0hhbmRsZSAob2JqKTsKCgkgIGJvb2xlYW4gcmVhZF9mcm9tX2Jsb2NrcyA9 ICgob3NjLmdldEZsYWdzICgpICYgU0NfQkxPQ0tfREFUQSkgIT0gMCk7CgoJ ICBpZiAocmVhZF9mcm9tX2Jsb2NrcykKCSAgICBzZXRCbG9ja0RhdGFNb2Rl ICh0cnVlKTsKCgkgIG9iai5yZWFkRXh0ZXJuYWwgKHRoaXMpOwoKCSAgaWYg KHJlYWRfZnJvbV9ibG9ja3MpCgkgICAgc2V0QmxvY2tEYXRhTW9kZSAoZmFs c2UpOwoKCSAgcmV0X3ZhbCA9IHByb2Nlc3NSZXNvbHV0aW9uIChvYmosIGhh bmRsZSk7CgkgIGJyZWFrOwoJfSAvLyBlbmQgaWYgKEV4dGVybmFsaXphYmxl LmNsYXNzLmlzQXNzaWduYWJsZUZyb20gKGNsYXp6KSkKCgkvLyBmaW5kIHRo ZSBmaXJzdCBub24tc2VyaWFsaXphYmxlLCBub24tYWJzdHJhY3QKCS8vIGNs YXNzIGluIGNsYXp6J3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5CglDbGFzcyBm aXJzdF9ub25zZXJpYWwgPSBjbGF6ei5nZXRTdXBlcmNsYXNzICgpOwoJd2hp bGUgKFNlcmlhbGl6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tIChmaXJz dF9ub25zZXJpYWwpCgkgICAgICAgfHwgTW9kaWZpZXIuaXNBYnN0cmFjdCAo Zmlyc3Rfbm9uc2VyaWFsLmdldE1vZGlmaWVycyAoKSkpCgkgIGZpcnN0X25v bnNlcmlhbCA9IGZpcnN0X25vbnNlcmlhbC5nZXRTdXBlcmNsYXNzICgpOwoK Ly8JREVCVUdsbiAoIlVzaW5nICIgKyBmaXJzdF9ub25zZXJpYWwKLy8JCSAr ICIgYXMgc3RhcnRpbmcgcG9pbnQgZm9yIGNvbnN0cnVjdGluZyAiICsgY2xh enopOwoKCU9iamVjdCBvYmogPSBudWxsOwoJb2JqID0gbmV3T2JqZWN0IChj bGF6eiwgZmlyc3Rfbm9uc2VyaWFsKTsKCglpZiAob2JqID09IG51bGwpCgkg IHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uICgiSW5zdGFuY2Ug b2YgIiArIGNsYXp6ICsKCQkJCQkgICAgIiBjb3VsZCBub3QgYmUgY3JlYXRl ZCIpOwoKCWludCBoYW5kbGUgPSBhc3NpZ25OZXdIYW5kbGUgKG9iaik7Cgl0 aGlzLmN1cnJlbnRPYmplY3QgPSBvYmo7CglPYmplY3RTdHJlYW1DbGFzc1td IGhpZXJhcmNoeSA9CgkgIE9iamVjdFN0cmVhbUNsYXNzLmdldE9iamVjdFN0 cmVhbUNsYXNzZXMgKGNsYXp6KTsKCi8vCURFQlVHbG4gKCJHb3QgY2xhc3Mg aGllcmFyY2h5IG9mIGRlcHRoICIgKyBoaWVyYXJjaHkubGVuZ3RoKTsKCgli b29sZWFuIGhhc19yZWFkOwoJZm9yIChpbnQgaT0wOyBpIDwgaGllcmFyY2h5 Lmxlbmd0aDsgaSsrKQoJewoJICB0aGlzLmN1cnJlbnRPYmplY3RTdHJlYW1D bGFzcyA9IGhpZXJhcmNoeVtpXTsKCgkgIGR1bXBFbGVtZW50bG4gKCJSZWFk aW5nIGZpZWxkcyBvZiAiCgkJICAgKyB0aGlzLmN1cnJlbnRPYmplY3RTdHJl YW1DbGFzcy5nZXROYW1lICgpKTsKCgkgIGhhc19yZWFkID0gdHJ1ZTsKCgkg IHRyeQoJICB7CgkgICAgdGhpcy5jdXJyZW50T2JqZWN0U3RyZWFtQ2xhc3Mu Zm9yQ2xhc3MgKCkuCgkgICAgICBnZXREZWNsYXJlZE1ldGhvZCAoInJlYWRP YmplY3QiLCByZWFkT2JqZWN0UGFyYW1zKTsKCSAgfQoJICBjYXRjaCAoTm9T dWNoTWV0aG9kRXhjZXB0aW9uIGUpCgkgIHsKCSAgICBoYXNfcmVhZCA9IGZh bHNlOwoJICB9CgoJICAvLyBYWFg6IHNob3VsZCBpbml0aWFsaXplIGZpZWxk cyBpbiBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkKCSAgLy8gdGhhdCBhcmVu J3QgaW4gdGhlIHN0cmVhbQoJICAvLyBzaG91bGQgc2tpcCBvdmVyIGNsYXNz ZXMgaW4gdGhlIHN0cmVhbSB0aGF0IGFyZW4ndCBpbiB0aGUKCSAgLy8gcmVh bCBjbGFzc2VzIGhpZXJhcmNoeQoJICByZWFkRmllbGRzIChvYmosIHRoaXMu Y3VycmVudE9iamVjdFN0cmVhbUNsYXNzLmZpZWxkcywKCQkgICAgICBoYXNf cmVhZCwgdGhpcy5jdXJyZW50T2JqZWN0U3RyZWFtQ2xhc3MpOwoKCSAgaWYg KGhhc19yZWFkKQoJICB7CgkgICAgZHVtcEVsZW1lbnQgKCJFTkRCTE9DS0RB VEE/ICIpOwoJICAgIHRyeQoJICAgICAgewoJCS8vIEZJWE1FOiBYWFg6IFRo aXMgdHJ5IGJsb2NrIGlzIHRvIGNhdGNoIEVPRiB3aGljaCBpcwoJCS8vIHRo cm93biBmb3Igc29tZSBvYmplY3RzLiAgVGhhdCBpbmRpY2F0ZXMgYSBidWcg aW4gdGhlIGxvZ2ljLgoJICAgICAgICBpZiAodGhpcy5yZWFsSW5wdXRTdHJl YW0ucmVhZEJ5dGUgKCkgIT0gVENfRU5EQkxPQ0tEQVRBKQoJCSAgdGhyb3cg bmV3IElPRXhjZXB0aW9uICgiTm8gZW5kIG9mIGJsb2NrIGRhdGEgc2VlbiBm b3IgY2xhc3Mgd2l0aCByZWFkT2JqZWN0IChPYmplY3RJbnB1dFN0cmVhbSkg bWV0aG9kLiIpOwoJICAgICAgICBkdW1wRWxlbWVudGxuICgieWVzIik7Cgkg ICAgICB9CgkgICAgY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKQoJICAgICAgewoJ ICAgICAgICBkdW1wRWxlbWVudGxuICgibm8sIGdvdCBFT0ZFeGNlcHRpb24i KTsKCSAgICAgIH0KCSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKCSAgICAg IHsKCSAgICAgICAgZHVtcEVsZW1lbnRsbiAoIm5vLCBnb3QgSU9FeGNlcHRp b24iKTsKCSAgICAgIH0KCSAgfQoJfQoKCXRoaXMuY3VycmVudE9iamVjdCA9 IG51bGw7Cgl0aGlzLmN1cnJlbnRPYmplY3RTdHJlYW1DbGFzcyA9IG51bGw7 CglyZXRfdmFsID0gcHJvY2Vzc1Jlc29sdXRpb24gKG9iaiwgaGFuZGxlKTsK CWJyZWFrOwogICAgICB9CgogICAgICBjYXNlIFRDX1JFU0VUOgoJZHVtcEVs ZW1lbnRsbiAoIlJFU0VUIik7CgljbGVhckhhbmRsZXMgKCk7CglyZXRfdmFs ID0gcmVhZE9iamVjdCAoKTsKCWJyZWFrOwoKICAgICAgY2FzZSBUQ19FWENF UFRJT046CiAgICAgIHsKCWR1bXBFbGVtZW50ICgiRVhDRVBUSU9OPSIpOwoJ RXhjZXB0aW9uIGUgPSAoRXhjZXB0aW9uKXJlYWRPYmplY3QgKCk7CglkdW1w RWxlbWVudGxuIChlLnRvU3RyaW5nKCkpOwoJY2xlYXJIYW5kbGVzICgpOwoJ dGhyb3cgbmV3IFdyaXRlQWJvcnRlZEV4Y2VwdGlvbiAoIkV4Y2VwdGlvbiB0 aHJvd24gZHVyaW5nIHdyaXRpbmcgb2Ygc3RyZWFtIiwgZSk7CiAgICAgIH0K CiAgICAgIGRlZmF1bHQ6Cgl0aHJvdyBuZXcgSU9FeGNlcHRpb24gKCJVbmtu b3duIG1hcmtlciBvbiBzdHJlYW0iKTsKICAgIH0KCiAgICB0aGlzLmlzRGVz ZXJpYWxpemluZyA9IHdhc19kZXNlcmlhbGl6aW5nOwoKICAgIGlmICghIHdh c19kZXNlcmlhbGl6aW5nKQogICAgewogICAgICBzZXRCbG9ja0RhdGFNb2Rl ICh0cnVlKTsKCiAgICAgIGlmICh2YWxpZGF0b3JzLnNpemUgKCkgPiAwKQoJ aW52b2tlVmFsaWRhdG9ycyAoKTsKICAgIH0KCiAgICByZXR1cm4gcmV0X3Zh bDsKICB9CgoKICAvKioKICAgICBSZWFkcyB0aGUgY3VycmVudCBvYmplY3Rz IG5vbi10cmFuc2llbnQsIG5vbi1zdGF0aWMgZmllbGRzIGZyb20KICAgICB0 aGUgY3VycmVudCBjbGFzcyBmcm9tIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBz dHJlYW0uCgogICAgIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNh bGxlZCBmcm9tIHdpdGhpbiBhIG9iamVjdCdzCiAgICAgPGNvZGU+cHJpdmF0 ZSB2b2lkIHJlYWRPYmplY3QgKE9iamVjdElucHV0U3RyZWFtKTwvY29kZT4K ICAgICBtZXRob2QuCgogICAgIEBleGNlcHRpb24gQ2xhc3NOb3RGb3VuZEV4 Y2VwdGlvbiBUaGUgY2xhc3MgdGhhdCBhbiBvYmplY3QgYmVpbmcKICAgICBy ZWFkIGluIGJlbG9uZ3MgdG8gY2Fubm90IGJlIGZvdW5kLgoKICAgICBAZXhj ZXB0aW9uIE5vdEFjdGl2ZUV4Y2VwdGlvbiBUaGlzIG1ldGhvZCB3YXMgY2Fs bGVkIGZyb20gYQogICAgIGNvbnRleHQgb3RoZXIgdGhhbiBmcm9tIHRoZSBj dXJyZW50IG9iamVjdCdzIGFuZCBjdXJyZW50IGNsYXNzJ3MKICAgICA8Y29k ZT5wcml2YXRlIHZvaWQgcmVhZE9iamVjdCAoT2JqZWN0SW5wdXRTdHJlYW0p PC9jb2RlPgogICAgIG1ldGhvZC4KCiAgICAgQGV4Y2VwdGlvbiBJT0V4Y2Vw dGlvbiBFeGNlcHRpb24gZnJvbSB1bmRlcmx5aW5nCiAgICAgPGNvZGU+T3V0 cHV0U3RyZWFtPC9jb2RlPi4KICAqLwogIHB1YmxpYyB2b2lkIGRlZmF1bHRS ZWFkT2JqZWN0ICgpCiAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlv biwgSU9FeGNlcHRpb24sIE5vdEFjdGl2ZUV4Y2VwdGlvbgogIHsKICAgIGlm ICh0aGlzLmN1cnJlbnRPYmplY3QgPT0gbnVsbCB8fCB0aGlzLmN1cnJlbnRP YmplY3RTdHJlYW1DbGFzcyA9PSBudWxsKQogICAgICB0aHJvdyBuZXcgTm90 QWN0aXZlRXhjZXB0aW9uICgiZGVmYXVsdFJlYWRPYmplY3QgY2FsbGVkIGJ5 IG5vbi1hY3RpdmUgY2xhc3MgYW5kL29yIG9iamVjdCIpOwoKICAgIGlmIChm aWVsZHNBbHJlYWR5UmVhZCkKICAgICAgdGhyb3cgbmV3IE5vdEFjdGl2ZUV4 Y2VwdGlvbiAoImRlZmF1bHRSZWFkT2JqZWN0IGNhbGxlZCBidXQgZmllbGRz IGFscmVhZHkgcmVhZCBmcm9tIHN0cmVhbSAoYnkgZGVmYXVsdFJlYWRPYmpl Y3Qgb3IgcmVhZEZpZWxkcykiKTsKCiAgICByZWFkRmllbGRzICh0aGlzLmN1 cnJlbnRPYmplY3QsCgkJdGhpcy5jdXJyZW50T2JqZWN0U3RyZWFtQ2xhc3Mu ZmllbGRzLAoJCWZhbHNlLCB0aGlzLmN1cnJlbnRPYmplY3RTdHJlYW1DbGFz cyk7CgogICAgZmllbGRzQWxyZWFkeVJlYWQgPSB0cnVlOwogIH0KCgogIC8q KgogICAgIFJlZ2lzdGVycyBhIDxjb2RlPk9iamVjdElucHV0VmFsaWRhdGlv bjwvY29kZT4gdG8gYmUgY2FycmllZCBvdXQKICAgICBvbiB0aGUgb2JqZWN0 IGdyYXBoIGN1cnJlbnRseSBiZWluZyBkZXNlcmlhbGl6ZWQgYmVmb3JlIGl0 IGlzCiAgICAgcmV0dXJuZWQgdG8gdGhlIG9yaWdpbmFsIGNhbGxlciBvZiA8 Y29kZT5yZWFkT2JqZWN0ICgpPC9jb2RlPi4KICAgICBUaGUgb3JkZXIgb2Yg dmFsaWRhdGlvbiBmb3IgbXVsdGlwbGUKICAgICA8Y29kZT5PYmplY3RJbnB1 dFZhbGlkYXRpb248L2NvZGU+cyBjYW4gYmUgY29udHJvbGVkIHVzaW5nCiAg ICAgPGNvZGU+cHJpb3JpdHk8L2NvZGU+LiAgVmFsaWRhdG9ycyB3aXRoIGhp Z2hlciBwcmlvcml0aWVzIGFyZQogICAgIGNhbGxlZCBmaXJzdC4KCiAgICAg QHNlZSBqYXZhLmlvLk9iamVjdElucHV0VmFsaWRhdGlvbgoKICAgICBAZXhj ZXB0aW9uIEludmFsaWRPYmplY3RFeGNlcHRpb24gPGNvZGU+dmFsaWRhdG9y PC9jb2RlPiBpcwogICAgIDxjb2RlPm51bGw8L2NvZGU+CgogICAgIEBleGNl cHRpb24gTm90QWN0aXZlRXhjZXB0aW9uIGFuIGF0dGVtcHQgd2FzIG1hZGUg dG8gYWRkIGEKICAgICB2YWxpZGF0b3Igb3V0c2lkZSBvZiB0aGUgPGNvZGU+ cmVhZE9iamVjdDwvY29kZT4gbWV0aG9kIG9mIHRoZQogICAgIG9iamVjdCBj dXJyZW50bHkgYmVpbmcgZGVzZXJpYWxpemVkCiAgKi8KICBwdWJsaWMgdm9p ZCByZWdpc3RlclZhbGlkYXRpb24gKE9iamVjdElucHV0VmFsaWRhdGlvbiB2 YWxpZGF0b3IsCgkJCQkgIGludCBwcmlvcml0eSkKICAgIHRocm93cyBJbnZh bGlkT2JqZWN0RXhjZXB0aW9uLCBOb3RBY3RpdmVFeGNlcHRpb24KICB7CiAg ICBpZiAodGhpcy5jdXJyZW50T2JqZWN0ID09IG51bGwgfHwgdGhpcy5jdXJy ZW50T2JqZWN0U3RyZWFtQ2xhc3MgPT0gbnVsbCkKICAgICAgdGhyb3cgbmV3 IE5vdEFjdGl2ZUV4Y2VwdGlvbiAoInJlZ2lzdGVyVmFsaWRhdGlvbiBjYWxs ZWQgYnkgbm9uLWFjdGl2ZSBjbGFzcyBhbmQvb3Igb2JqZWN0Iik7CgogICAg aWYgKHZhbGlkYXRvciA9PSBudWxsKQogICAgICB0aHJvdyBuZXcgSW52YWxp ZE9iamVjdEV4Y2VwdGlvbiAoImF0dGVtcHQgdG8gYWRkIGEgbnVsbCBPYmpl Y3RJbnB1dFZhbGlkYXRpb24gb2JqZWN0Iik7CgogICAgdGhpcy52YWxpZGF0 b3JzLmFkZEVsZW1lbnQgKG5ldyBWYWxpZGF0b3JBbmRQcmlvcml0eSAodmFs aWRhdG9yLAoJCQkJCQkJICBwcmlvcml0eSkpOwogIH0KCgogIC8qKgogICAg IENhbGxlZCB3aGVuIGEgY2xhc3MgaXMgYmVpbmcgZGVzZXJpYWxpemVkLiAg VGhpcyBpcyBhIGhvb2sgdG8KICAgICBhbGxvdyBzdWJjbGFzc2VzIHRvIHJl YWQgaW4gaW5mb3JtYXRpb24gd3JpdHRlbiBieSB0aGUKICAgICA8Y29kZT5h bm5vdGF0ZUNsYXNzIChDbGFzcyk8L2NvZGU+IG1ldGhvZCBvZiBhbgogICAg IDxjb2RlPk9iamVjdE91dHB1dFN0cmVhbTwvY29kZT4uCgogICAgIFRoaXMg aW1wbGVtZW50YXRpb24gbG9va3MgdXAgdGhlIGFjdGl2ZSBjYWxsIHN0YWNr IGZvciBhCiAgICAgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+OyBpZiBhIDxj b2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBpcyBmb3VuZCwKICAgICBpdCBpcyB1 c2VkIHRvIGxvYWQgdGhlIGNsYXNzIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5v c2M8L2NvZGU+LAogICAgIG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgc3lzdGVt IDxjb2RlPkNsYXNzTG9hZGVyPC9jb2RlPiBpcyB1c2VkLgoKICAgICBAZXhj ZXB0aW9uIElPRXhjZXB0aW9uIEV4Y2VwdGlvbiBmcm9tIHVuZGVybHlpbmcK ICAgICA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgoKICAgICBAc2VlIGph dmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtI2Fubm90YXRlQ2xhc3MgKGphdmEu bGFuZy5DbGFzcykKICAqLwogIHByb3RlY3RlZCBDbGFzcyByZXNvbHZlQ2xh c3MgKE9iamVjdFN0cmVhbUNsYXNzIG9zYykKICAgIHRocm93cyBDbGFzc05v dEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgogIHsKICAgIFNlY3VyaXR5 TWFuYWdlciBzbSA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIgKCk7Cgog ICAgLy8gRklYTUU6IGN1cnJlbnRDbGFzc0xvYWRlciBkb2Vzbid0IHlldCBk byBhbnl0aGluZyB1c2VmdWwuIFdlIG5lZWQKICAgIC8vIHRvIGNhbGwgZm9y TmFtZSgpIHdpdGggdGhlIGNsYXNzbG9hZGVyIG9mIHRoZSBjbGFzcyB3aGlj aCBjYWxsZWQgCiAgICAvLyByZWFkT2JqZWN0KCkuIFNlZSBTZWN1cml0eU1h bmFnZXIuZ2V0Q2xhc3NDb250ZXh0KCkuCiAgICBDbGFzc0xvYWRlciBjbCA9 IGN1cnJlbnRDbGFzc0xvYWRlciAoc20pOwoKICAgIHJldHVybiBDbGFzcy5m b3JOYW1lIChvc2MuZ2V0TmFtZSAoKSwgdHJ1ZSwgY2wpOwogIH0KCiAgLyoq CiAgICAgQWxsb3dzIHN1YmNsYXNzZXMgdG8gcmVzb2x2ZSBvYmplY3RzIHRo YXQgYXJlIHJlYWQgZnJvbSB0aGUKICAgICBzdHJlYW0gd2l0aCBvdGhlciBv YmplY3RzIHRvIGJlIHJldHVybmVkIGluIHRoZWlyIHBsYWNlLiAgVGhpcwog ICAgIG1ldGhvZCBpcyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUgZWFjaCBvYmpl Y3QgaXMgZW5jb3VudGVyZWQuCgogICAgIFRoaXMgbWV0aG9kIG11c3QgYmUg ZW5hYmxlZCBiZWZvcmUgaXQgd2lsbCBiZSBjYWxsZWQgaW4gdGhlCiAgICAg c2VyaWFsaXphdGlvbiBwcm9jZXNzLgoKICAgICBAZXhjZXB0aW9uIElPRXhj ZXB0aW9uIEV4Y2VwdGlvbiBmcm9tIHVuZGVybHlpbmcKICAgICA8Y29kZT5P dXRwdXRTdHJlYW08L2NvZGU+LgoKICAgICBAc2VlIGVuYWJsZVJlc29sdmVP YmplY3QgKGJvb2xlYW4pCiAgKi8KICBwcm90ZWN0ZWQgT2JqZWN0IHJlc29s dmVPYmplY3QgKE9iamVjdCBvYmopIHRocm93cyBJT0V4Y2VwdGlvbgogIHsK ICAgIHJldHVybiBvYmo7CiAgfQoKCiAgLyoqCiAgICAgSWYgPGNvZGU+ZW5h YmxlPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiBhbmQgdGhpcyBvYmpl Y3QgaXMKICAgICB0cnVzdGVkLCB0aGVuIDxjb2RlPnJlc29sdmVPYmplY3Qg KE9iamVjdCk8L2NvZGU+IHdpbGwgYmUgY2FsbGVkCiAgICAgaW4gc3Vic2Vx dWVudCBjYWxscyB0byA8Y29kZT5yZWFkT2JqZWN0IChPYmplY3QpPC9jb2Rl Pi4KICAgICBPdGhlcndpc2UsIDxjb2RlPnJlc29sdmVPYmplY3QgKE9iamVj dCk8L2NvZGU+IHdpbGwgbm90IGJlIGNhbGxlZC4KCiAgICAgQGV4Y2VwdGlv biBTZWN1cml0eUV4Y2VwdGlvbiBUaGlzIGNsYXNzIGlzIG5vdCB0cnVzdGVk LgogICovCiAgcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlUmVzb2x2ZU9iamVj dCAoYm9vbGVhbiBlbmFibGUpCiAgICB0aHJvd3MgU2VjdXJpdHlFeGNlcHRp b24KICB7CiAgICBpZiAoZW5hYmxlKQogICAgICB7CglTZWN1cml0eU1hbmFn ZXIgc20gPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyICgpOwoJaWYgKHNt ICE9IG51bGwpCgkgIHNtLmNoZWNrUGVybWlzc2lvbiAobmV3IFNlcmlhbGl6 YWJsZVBlcm1pc3Npb24gKCJlbmFibGVTdWJ0aXR1dGlvbiIpKTsKICAgICAg fQoKICAgIGJvb2xlYW4gb2xkX3ZhbCA9IHRoaXMucmVzb2x2ZUVuYWJsZWQ7 CiAgICB0aGlzLnJlc29sdmVFbmFibGVkID0gZW5hYmxlOwogICAgcmV0dXJu IG9sZF92YWw7CiAgfQoKCiAgLyoqCiAgICAgUmVhZHMgc3RyZWFtIG1hZ2lj IGFuZCBzdHJlYW0gdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQogICAg IHVuZGVybHlpbmcgc3RyZWFtLgoKICAgICBAZXhjZXB0aW9uIElPRXhjZXB0 aW9uIEV4Y2VwdGlvbiBmcm9tIHVuZGVybHlpbmcgc3RyZWFtLgoKICAgICBA ZXhjZXB0aW9uIFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbiBBbiBpbnZhbGlk IHN0cmVhbSBtYWdpYwogICAgIG51bWJlciBvciBzdHJlYW0gdmVyc2lvbiB3 YXMgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCiAgKi8KICBwcm90ZWN0ZWQgdm9p ZCByZWFkU3RyZWFtSGVhZGVyICgpCiAgICB0aHJvd3MgSU9FeGNlcHRpb24s IFN0cmVhbUNvcnJ1cHRlZEV4Y2VwdGlvbgogIHsKICAgIGR1bXBFbGVtZW50 ICgiU1RSRUFNIE1BR0lDICIpOwogICAgaWYgKHRoaXMucmVhbElucHV0U3Ry ZWFtLnJlYWRTaG9ydCAoKSAhPSBTVFJFQU1fTUFHSUMpCiAgICAgIHRocm93 IG5ldyBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24gKCJJbnZhbGlkIHN0cmVh bSBtYWdpYyBudW1iZXIiKTsKCiAgICBkdW1wRWxlbWVudGxuICgiU1RSRUFN IFZFUlNJT04gIik7CiAgICBpZiAodGhpcy5yZWFsSW5wdXRTdHJlYW0ucmVh ZFNob3J0ICgpICE9IFNUUkVBTV9WRVJTSU9OKQogICAgICB0aHJvdyBuZXcg U3RyZWFtQ29ycnVwdGVkRXhjZXB0aW9uICgiSW52YWxpZCBzdHJlYW0gdmVy c2lvbiBudW1iZXIiKTsKICB9CgoKICBwdWJsaWMgaW50IHJlYWQgKCkgdGhy b3dzIElPRXhjZXB0aW9uCiAgewogICAgaWYgKHRoaXMucmVhZERhdGFGcm9t QmxvY2spCiAgICB7CiAgICAgIGlmICh0aGlzLmJsb2NrRGF0YVBvc2l0aW9u ID49IHRoaXMuYmxvY2tEYXRhQnl0ZXMpCglyZWFkTmV4dEJsb2NrICgpOwog ICAgICByZXR1cm4gKHRoaXMuYmxvY2tEYXRhW3RoaXMuYmxvY2tEYXRhUG9z aXRpb24rK10gJiAweGZmKTsKICAgIH0KICAgIGVsc2UKICAgICAgcmV0dXJu IHRoaXMucmVhbElucHV0U3RyZWFtLnJlYWQgKCk7CiAgfQoKICBwdWJsaWMg aW50IHJlYWQgKGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3Ro KSB0aHJvd3MgSU9FeGNlcHRpb24KICB7CiAgICBpZiAodGhpcy5yZWFkRGF0 YUZyb21CbG9jaykKICAgIHsKICAgICAgaWYgKHRoaXMuYmxvY2tEYXRhUG9z aXRpb24gKyBsZW5ndGggPiB0aGlzLmJsb2NrRGF0YUJ5dGVzKQoJcmVhZE5l eHRCbG9jayAoKTsKCiAgICAgIFN5c3RlbS5hcnJheWNvcHkgKHRoaXMuYmxv Y2tEYXRhLCB0aGlzLmJsb2NrRGF0YVBvc2l0aW9uLAoJCQlkYXRhLCBvZmZz ZXQsIGxlbmd0aCk7CiAgICAgIGJsb2NrRGF0YVBvc2l0aW9uICs9IGxlbmd0 aDsJCgogICAgICByZXR1cm4gbGVuZ3RoOwogICAgfQogICAgZWxzZQogICAg ICByZXR1cm4gdGhpcy5yZWFsSW5wdXRTdHJlYW0ucmVhZCAoZGF0YSwgb2Zm c2V0LCBsZW5ndGgpOwogIH0KCiAgcHVibGljIGludCBhdmFpbGFibGUgKCkg dGhyb3dzIElPRXhjZXB0aW9uCiAgewogICAgaWYgKHRoaXMucmVhZERhdGFG cm9tQmxvY2spCiAgICB7CiAgICAgIGlmICh0aGlzLmJsb2NrRGF0YVBvc2l0 aW9uID49IHRoaXMuYmxvY2tEYXRhQnl0ZXMpCglyZWFkTmV4dEJsb2NrICgp OwoKICAgICAgcmV0dXJuIHRoaXMuYmxvY2tEYXRhQnl0ZXMgLSB0aGlzLmJs b2NrRGF0YVBvc2l0aW9uOwogICAgfQogICAgZWxzZQogICAgICByZXR1cm4g dGhpcy5yZWFsSW5wdXRTdHJlYW0uYXZhaWxhYmxlICgpOwogIH0KCiAgcHVi bGljIHZvaWQgY2xvc2UgKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgewogICAg dGhpcy5yZWFsSW5wdXRTdHJlYW0uY2xvc2UgKCk7CiAgfQoKICBwdWJsaWMg Ym9vbGVhbiByZWFkQm9vbGVhbiAoKSB0aHJvd3MgSU9FeGNlcHRpb24KICB7 CiAgICByZXR1cm4gdGhpcy5kYXRhSW5wdXRTdHJlYW0ucmVhZEJvb2xlYW4g KCk7CiAgfQoKICBwdWJsaWMgYnl0ZSByZWFkQnl0ZSAoKSB0aHJvd3MgSU9F eGNlcHRpb24KICB7CiAgICByZXR1cm4gdGhpcy5kYXRhSW5wdXRTdHJlYW0u cmVhZEJ5dGUgKCk7CiAgfQoKICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZEJ5 dGUgKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgewogICAgcmV0dXJuIHRoaXMu ZGF0YUlucHV0U3RyZWFtLnJlYWRVbnNpZ25lZEJ5dGUgKCk7CiAgfQoKICBw dWJsaWMgc2hvcnQgcmVhZFNob3J0ICgpIHRocm93cyBJT0V4Y2VwdGlvbgog IHsKICAgIHJldHVybiB0aGlzLmRhdGFJbnB1dFN0cmVhbS5yZWFkU2hvcnQg KCk7CiAgfQoKICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0ICgpIHRo cm93cyBJT0V4Y2VwdGlvbgogIHsKICAgIHJldHVybiB0aGlzLmRhdGFJbnB1 dFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCAoKTsKICB9CgogIHB1YmxpYyBj aGFyIHJlYWRDaGFyICgpIHRocm93cyBJT0V4Y2VwdGlvbgogIHsKICAgIHJl dHVybiB0aGlzLmRhdGFJbnB1dFN0cmVhbS5yZWFkQ2hhciAoKTsKICB9Cgog IHB1YmxpYyBpbnQgcmVhZEludCAoKSB0aHJvd3MgSU9FeGNlcHRpb24KICB7 CiAgICByZXR1cm4gdGhpcy5kYXRhSW5wdXRTdHJlYW0ucmVhZEludCAoKTsK ICB9CgogIHB1YmxpYyBsb25nIHJlYWRMb25nICgpIHRocm93cyBJT0V4Y2Vw dGlvbgogIHsKICAgIHJldHVybiB0aGlzLmRhdGFJbnB1dFN0cmVhbS5yZWFk TG9uZyAoKTsKICB9CgogIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQgKCkgdGhy b3dzIElPRXhjZXB0aW9uCiAgewogICAgcmV0dXJuIHRoaXMuZGF0YUlucHV0 U3RyZWFtLnJlYWRGbG9hdCAoKTsKICB9CgogIHB1YmxpYyBkb3VibGUgcmVh ZERvdWJsZSAoKSB0aHJvd3MgSU9FeGNlcHRpb24KICB7CiAgICByZXR1cm4g dGhpcy5kYXRhSW5wdXRTdHJlYW0ucmVhZERvdWJsZSAoKTsKICB9CgogIHB1 YmxpYyB2b2lkIHJlYWRGdWxseSAoYnl0ZSBkYXRhW10pIHRocm93cyBJT0V4 Y2VwdGlvbgogIHsKICAgIHRoaXMuZGF0YUlucHV0U3RyZWFtLnJlYWRGdWxs eSAoZGF0YSk7CiAgfQoKICBwdWJsaWMgdm9pZCByZWFkRnVsbHkgKGJ5dGUg ZGF0YVtdLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKICAgIHRocm93cyBJT0V4 Y2VwdGlvbgogIHsKICAgIHRoaXMuZGF0YUlucHV0U3RyZWFtLnJlYWRGdWxs eSAoZGF0YSwgb2Zmc2V0LCBzaXplKTsKICB9CgogIHB1YmxpYyBpbnQgc2tp cEJ5dGVzIChpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24KICB7CiAgICBy ZXR1cm4gdGhpcy5kYXRhSW5wdXRTdHJlYW0uc2tpcEJ5dGVzIChsZW4pOwog IH0KCiAgLyoqCiAgICAgQGRlcHJlY2F0ZWQKICAgICBAc2VlIGphdmEuaW8u RGF0YUlucHV0U3RyZWFtI3JlYWRMaW5lICgpCiAgKi8KICBwdWJsaWMgU3Ry aW5nIHJlYWRMaW5lICgpIHRocm93cyBJT0V4Y2VwdGlvbgogIHsKICAgIHJl dHVybiB0aGlzLmRhdGFJbnB1dFN0cmVhbS5yZWFkTGluZSAoKTsKICB9Cgog IHB1YmxpYyBTdHJpbmcgcmVhZFVURiAoKSB0aHJvd3MgSU9FeGNlcHRpb24K ICB7CiAgICByZXR1cm4gdGhpcy5kYXRhSW5wdXRTdHJlYW0ucmVhZFVURiAo KTsKICB9CgoKICAvKioKICAgICBUaGlzIGNsYXNzIGFsbG93cyBhIGNsYXNz IHRvIHNwZWNpZnkgZXhhY3RseSB3aGljaCBmaWVsZHMgc2hvdWxkCiAgICAg YmUgcmVhZCwgYW5kIHdoYXQgdmFsdWVzIHNob3VsZCBiZSByZWFkIGZvciB0 aGVzZSBmaWVsZHMuCgogICAgIFhYWDogZmluaXNoIHVwIGNvbW1lbnRzCiAg Ki8KICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEdldEZpZWxkCiAg ewogICAgcHVibGljIGFic3RyYWN0IE9iamVjdFN0cmVhbUNsYXNzIGdldE9i amVjdFN0cmVhbUNsYXNzICgpOwoKICAgIHB1YmxpYyBhYnN0cmFjdCBib29s ZWFuIGRlZmF1bHRlZCAoU3RyaW5nIG5hbWUpCiAgICAgIHRocm93cyBJT0V4 Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwoKICAgIHB1Ymxp YyBhYnN0cmFjdCBib29sZWFuIGdldCAoU3RyaW5nIG5hbWUsIGJvb2xlYW4g ZGVmdmFsdWUpCiAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFy Z3VtZW50RXhjZXB0aW9uOwoKICAgIHB1YmxpYyBhYnN0cmFjdCBjaGFyIGdl dCAoU3RyaW5nIG5hbWUsIGNoYXIgZGVmdmFsdWUpCiAgICAgIHRocm93cyBJ T0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwoKICAgIHB1 YmxpYyBhYnN0cmFjdCBieXRlIGdldCAoU3RyaW5nIG5hbWUsIGJ5dGUgZGVm dmFsdWUpCiAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3Vt ZW50RXhjZXB0aW9uOwoKICAgIHB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXQg KFN0cmluZyBuYW1lLCBzaG9ydCBkZWZ2YWx1ZSkKICAgICAgdGhyb3dzIElP RXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CgogICAgcHVi bGljIGFic3RyYWN0IGludCBnZXQgKFN0cmluZyBuYW1lLCBpbnQgZGVmdmFs dWUpCiAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50 RXhjZXB0aW9uOwoKICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldCAoU3Ry aW5nIG5hbWUsIGxvbmcgZGVmdmFsdWUpCiAgICAgIHRocm93cyBJT0V4Y2Vw dGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwoKICAgIHB1YmxpYyBh YnN0cmFjdCBmbG9hdCBnZXQgKFN0cmluZyBuYW1lLCBmbG9hdCBkZWZ2YWx1 ZSkKICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRF eGNlcHRpb247CgogICAgcHVibGljIGFic3RyYWN0IGRvdWJsZSBnZXQgKFN0 cmluZyBuYW1lLCBkb3VibGUgZGVmdmFsdWUpCiAgICAgIHRocm93cyBJT0V4 Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwoKICAgIHB1Ymxp YyBhYnN0cmFjdCBPYmplY3QgZ2V0IChTdHJpbmcgbmFtZSwgT2JqZWN0IGRl ZnZhbHVlKQogICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1 bWVudEV4Y2VwdGlvbjsKICB9CgogIHB1YmxpYyBHZXRGaWVsZCByZWFkRmll bGRzICgpCiAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRF eGNlcHRpb24sIE5vdEFjdGl2ZUV4Y2VwdGlvbgogIHsKICAgIGlmICh0aGlz LmN1cnJlbnRPYmplY3QgPT0gbnVsbCB8fCB0aGlzLmN1cnJlbnRPYmplY3RT dHJlYW1DbGFzcyA9PSBudWxsKQogICAgICB0aHJvdyBuZXcgTm90QWN0aXZl RXhjZXB0aW9uICgicmVhZEZpZWxkcyBjYWxsZWQgYnkgbm9uLWFjdGl2ZSBj bGFzcyBhbmQvb3Igb2JqZWN0Iik7CgogICAgaWYgKGZpZWxkc0FscmVhZHlS ZWFkKQogICAgICB0aHJvdyBuZXcgTm90QWN0aXZlRXhjZXB0aW9uICgicmVh ZEZpZWxkcyBjYWxsZWQgYnV0IGZpZWxkcyBhbHJlYWR5IHJlYWQgZnJvbSBz dHJlYW0gKGJ5IGRlZmF1bHRSZWFkT2JqZWN0IG9yIHJlYWRGaWVsZHMpIik7 CgogICAgZmluYWwgT2JqZWN0U3RyZWFtQ2xhc3MgY2xhenogPSB0aGlzLmN1 cnJlbnRPYmplY3RTdHJlYW1DbGFzczsKICAgIGZpbmFsIGJ5dGVbXSBwcmlt X2ZpZWxkX2RhdGEgPSBuZXcgYnl0ZVtjbGF6ei5wcmltRmllbGRTaXplXTsK ICAgIGZpbmFsIE9iamVjdFtdIG9ianMgPSBuZXcgT2JqZWN0W2NsYXp6Lm9i amVjdEZpZWxkQ291bnRdOwoKICAgIC8vIEFwcGFyZW50bHkgQmxvY2sgZGF0 YSBpcyBub3QgdXNlZCB3aXRoIEdldEZpZWxkIGFzIHBlcgogICAgLy8gZW1w aXJpY2FsIGV2aWRlbmNlIGFnYWluc3QgSkRLIDEuMi4gIEFsc28gc2VlIE1h dXZlIHRlc3QKICAgIC8vIGphdmEuaW8uT2JqZWN0SW5wdXRPdXRwdXQuVGVz dC5HZXRQdXRGaWVsZC4KICAgIHNldEJsb2NrRGF0YU1vZGUgKGZhbHNlKTsK ICAgIHJlYWRGdWxseSAocHJpbV9maWVsZF9kYXRhKTsKICAgIGZvciAoaW50 IGkgPSAwOyBpIDwgb2Jqcy5sZW5ndGg7ICsrIGkpCiAgICAgIG9ianNbaV0g PSByZWFkT2JqZWN0ICgpOwogICAgc2V0QmxvY2tEYXRhTW9kZSAodHJ1ZSk7 CgogICAgcmV0dXJuIG5ldyBHZXRGaWVsZCAoKQogICAgewogICAgICBwdWJs aWMgT2JqZWN0U3RyZWFtQ2xhc3MgZ2V0T2JqZWN0U3RyZWFtQ2xhc3MgKCkK ICAgICAgewoJcmV0dXJuIGNsYXp6OwogICAgICB9CgogICAgICBwdWJsaWMg Ym9vbGVhbiBkZWZhdWx0ZWQgKFN0cmluZyBuYW1lKQoJdGhyb3dzIElPRXhj ZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgewoJcmV0 dXJuIGNsYXp6LmdldEZpZWxkIChuYW1lKSA9PSBudWxsOwogICAgICB9Cgog ICAgICBwdWJsaWMgYm9vbGVhbiBnZXQgKFN0cmluZyBuYW1lLCBib29sZWFu IGRlZnZhbHVlKQoJdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1l bnRFeGNlcHRpb24KICAgICAgewoJT2JqZWN0U3RyZWFtRmllbGQgZmllbGQg PSBnZXRGaWVsZCAobmFtZSwgQm9vbGVhbi5UWVBFKTsKCglpZiAoZmllbGQg PT0gbnVsbCkKCSAgcmV0dXJuIGRlZnZhbHVlOwoKCXJldHVybiBwcmltX2Zp ZWxkX2RhdGFbZmllbGQuZ2V0T2Zmc2V0ICgpXSA9PSAwID8gZmFsc2UgOiB0 cnVlOwogICAgICB9CgogICAgICBwdWJsaWMgY2hhciBnZXQgKFN0cmluZyBu YW1lLCBjaGFyIGRlZnZhbHVlKQoJdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxl Z2FsQXJndW1lbnRFeGNlcHRpb24KICAgICAgewoJT2JqZWN0U3RyZWFtRmll bGQgZmllbGQgPSBnZXRGaWVsZCAobmFtZSwgQ2hhcmFjdGVyLlRZUEUpOwoK CWlmIChmaWVsZCA9PSBudWxsKQoJICByZXR1cm4gZGVmdmFsdWU7CgoJaW50 IG9mZiA9IGZpZWxkLmdldE9mZnNldCAoKTsKCglyZXR1cm4gKGNoYXIpKCgo cHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8IDgpCgkJICAgICAg fCAocHJpbV9maWVsZF9kYXRhW29mZl0gJiAweEZGKSk7CiAgICAgIH0KCiAg ICAgIHB1YmxpYyBieXRlIGdldCAoU3RyaW5nIG5hbWUsIGJ5dGUgZGVmdmFs dWUpCgl0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2Vw dGlvbgogICAgICB7CglPYmplY3RTdHJlYW1GaWVsZCBmaWVsZCA9IGdldEZp ZWxkIChuYW1lLCBCeXRlLlRZUEUpOwoKCWlmIChmaWVsZCA9PSBudWxsKQoJ ICByZXR1cm4gZGVmdmFsdWU7CgoJcmV0dXJuIHByaW1fZmllbGRfZGF0YVtm aWVsZC5nZXRPZmZzZXQgKCldOwogICAgICB9CgogICAgICBwdWJsaWMgc2hv cnQgZ2V0IChTdHJpbmcgbmFtZSwgc2hvcnQgZGVmdmFsdWUpCgl0aHJvd3Mg SU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICB7 CglPYmplY3RTdHJlYW1GaWVsZCBmaWVsZCA9IGdldEZpZWxkIChuYW1lLCBT aG9ydC5UWVBFKTsKCglpZiAoZmllbGQgPT0gbnVsbCkKCSAgcmV0dXJuIGRl ZnZhbHVlOwoKCWludCBvZmYgPSBmaWVsZC5nZXRPZmZzZXQgKCk7CgoJcmV0 dXJuIChzaG9ydCkoKChwcmltX2ZpZWxkX2RhdGFbb2ZmKytdICYgMHhGRikg PDwgOCkKCQkgICAgICAgfCAocHJpbV9maWVsZF9kYXRhW29mZl0gJiAweEZG KSk7CiAgICAgIH0KCiAgICAgIHB1YmxpYyBpbnQgZ2V0IChTdHJpbmcgbmFt ZSwgaW50IGRlZnZhbHVlKQoJdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2Fs QXJndW1lbnRFeGNlcHRpb24KICAgICAgewoJT2JqZWN0U3RyZWFtRmllbGQg ZmllbGQgPSBnZXRGaWVsZCAobmFtZSwgSW50ZWdlci5UWVBFKTsKCglpZiAo ZmllbGQgPT0gbnVsbCkKCSAgcmV0dXJuIGRlZnZhbHVlOwoKCWludCBvZmYg PSBmaWVsZC5nZXRPZmZzZXQgKCk7CgoJcmV0dXJuICgocHJpbV9maWVsZF9k YXRhW29mZisrXSAmIDB4RkYpIDw8IDI0KQoJICB8ICgocHJpbV9maWVsZF9k YXRhW29mZisrXSAmIDB4RkYpIDw8IDE2KQoJICB8ICgocHJpbV9maWVsZF9k YXRhW29mZisrXSAmIDB4RkYpIDw8IDgpCgkgIHwgKHByaW1fZmllbGRfZGF0 YVtvZmZdICYgMHhGRik7CiAgICAgIH0KCiAgICAgIHB1YmxpYyBsb25nIGdl dCAoU3RyaW5nIG5hbWUsIGxvbmcgZGVmdmFsdWUpCgl0aHJvd3MgSU9FeGNl cHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICB7CglPYmpl Y3RTdHJlYW1GaWVsZCBmaWVsZCA9IGdldEZpZWxkIChuYW1lLCBMb25nLlRZ UEUpOwoKCWlmIChmaWVsZCA9PSBudWxsKQoJICByZXR1cm4gZGVmdmFsdWU7 CgoJaW50IG9mZiA9IGZpZWxkLmdldE9mZnNldCAoKTsKCglyZXR1cm4gKGxv bmcpKCgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8IDU2KQoJ CSAgICAgIHwgKChwcmltX2ZpZWxkX2RhdGFbb2ZmKytdICYgMHhGRikgPDwg NDgpCgkJICAgICAgfCAoKHByaW1fZmllbGRfZGF0YVtvZmYrK10gJiAweEZG KSA8PCA0MCkKCQkgICAgICB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAm IDB4RkYpIDw8IDMyKQoJCSAgICAgIHwgKChwcmltX2ZpZWxkX2RhdGFbb2Zm KytdICYgMHhGRikgPDwgMjQpCgkJICAgICAgfCAoKHByaW1fZmllbGRfZGF0 YVtvZmYrK10gJiAweEZGKSA8PCAxNikKCQkgICAgICB8ICgocHJpbV9maWVs ZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8IDgpCgkJICAgICAgfCAocHJpbV9m aWVsZF9kYXRhW29mZl0gJiAweEZGKSk7CiAgICAgIH0KCiAgICAgIHB1Ymxp YyBmbG9hdCBnZXQgKFN0cmluZyBuYW1lLCBmbG9hdCBkZWZ2YWx1ZSkKCXRo cm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAg ICAgIHsKCU9iamVjdFN0cmVhbUZpZWxkIGZpZWxkID0gZ2V0RmllbGQgKG5h bWUsIEZsb2F0LlRZUEUpOwoKCWlmIChmaWVsZCA9PSBudWxsKQoJICByZXR1 cm4gZGVmdmFsdWU7CgoJaW50IG9mZiA9IGZpZWxkLmdldE9mZnNldCAoKTsK CglyZXR1cm4gRmxvYXQuaW50Qml0c1RvRmxvYXQgKCgocHJpbV9maWVsZF9k YXRhW29mZisrXSAmIDB4RkYpIDw8IDI0KQoJCQkJICAgIHwgKChwcmltX2Zp ZWxkX2RhdGFbb2ZmKytdICYgMHhGRikgPDwgMTYpCgkJCQkgICAgfCAoKHBy aW1fZmllbGRfZGF0YVtvZmYrK10gJiAweEZGKSA8PCA4KQoJCQkJICAgIHwg KHByaW1fZmllbGRfZGF0YVtvZmZdICYgMHhGRikpOwogICAgICB9CgogICAg ICBwdWJsaWMgZG91YmxlIGdldCAoU3RyaW5nIG5hbWUsIGRvdWJsZSBkZWZ2 YWx1ZSkKCXRocm93cyBJT0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhj ZXB0aW9uCiAgICAgIHsKCU9iamVjdFN0cmVhbUZpZWxkIGZpZWxkID0gZ2V0 RmllbGQgKG5hbWUsIERvdWJsZS5UWVBFKTsKCglpZiAoZmllbGQgPT0gbnVs bCkKCSAgcmV0dXJuIGRlZnZhbHVlOwoKCWludCBvZmYgPSBmaWVsZC5nZXRP ZmZzZXQgKCk7CgoJcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlICgK CSAgKGxvbmcpKCgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDU2KQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDQ4KQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDQwKQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDMyKQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDI0KQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDE2KQoJCSB8ICgocHJpbV9maWVsZF9kYXRhW29mZisrXSAmIDB4RkYpIDw8 IDgpCgkJIHwgKHByaW1fZmllbGRfZGF0YVtvZmZdICYgMHhGRikpKTsKICAg ICAgfQoKICAgICAgcHVibGljIE9iamVjdCBnZXQgKFN0cmluZyBuYW1lLCBP YmplY3QgZGVmdmFsdWUpCgl0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxB cmd1bWVudEV4Y2VwdGlvbgogICAgICB7CglPYmplY3RTdHJlYW1GaWVsZCBm aWVsZCA9CgkgIGdldEZpZWxkIChuYW1lLCBkZWZ2YWx1ZSA9PSBudWxsID8g bnVsbCA6IGRlZnZhbHVlLmdldENsYXNzICgpKTsKCglpZiAoZmllbGQgPT0g bnVsbCkKCSAgcmV0dXJuIGRlZnZhbHVlOwoKCXJldHVybiBvYmpzW2ZpZWxk LmdldE9mZnNldCAoKV07CiAgICAgIH0KCiAgICAgIHByaXZhdGUgT2JqZWN0 U3RyZWFtRmllbGQgZ2V0RmllbGQgKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBl KQoJdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogICAgICB7CglP YmplY3RTdHJlYW1GaWVsZCBmaWVsZCA9IGNsYXp6LmdldEZpZWxkIChuYW1l KTsKCglpZiAoZmllbGQgPT0gbnVsbCkKCSAgcmV0dXJuIG51bGw7CgoJQ2xh c3MgZmllbGRfdHlwZSA9IGZpZWxkLmdldFR5cGUgKCk7CgoJaWYgKHR5cGUg PT0gZmllbGRfdHlwZSB8fAoJICAgICh0eXBlID09IG51bGwgJiYgISBmaWVs ZF90eXBlLmlzUHJpbWl0aXZlICgpKSkKCSAgcmV0dXJuIGZpZWxkOwoKCXRo cm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gKCJGaWVsZCByZXF1 ZXN0ZWQgaXMgb2YgdHlwZSAiCgkJCQkJICAgICsgZmllbGRfdHlwZS5nZXRO YW1lICgpCgkJCQkJICAgICsgIiwgYnV0IHJlcXVlc3RlZCB0eXBlIHdhcyAi CgkJCQkJICAgICsgKHR5cGUgPT0gbnVsbCA/CgkJCQkJICAgICAgICJPYmpl Y3QiIDogdHlwZS5nZXROYW1lICgpKSk7CiAgICAgIH0KICAgIH07CgogIH0K CgogIC8qKgogICAgIFByb3RlY3RlZCBjb25zdHJ1Y3RvciB0aGF0IGFsbG93 cyBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlCiAgICAgZGVzZXJpYWxpemF0aW9u LiAgVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIGJ5IHN1YmNs YXNzZXMKICAgICB0aGF0IHdpc2ggdG8gb3ZlcnJpZGUgPGNvZGU+cmVhZE9i amVjdCAoT2JqZWN0KTwvY29kZT4uICBUaGlzCiAgICAgbWV0aG9kIGRvZXMg YSBzZWN1cml0eSBjaGVjayA8aT5OT1RFOiBjdXJyZW50bHkgbm90CiAgICAg aW1wbGVtZW50ZWQ8L2k+LCB0aGVuIHNldHMgYSBmbGFnIHRoYXQgaW5mb3Jt cwogICAgIDxjb2RlPnJlYWRPYmplY3QgKE9iamVjdCk8L2NvZGU+IHRvIGNh bGwgdGhlIHN1YmNsYXNzZXMKICAgICA8Y29kZT5yZWFkT2JqZWN0T3ZlcnJp ZGUgKE9iamVjdCk8L2NvZGU+IG1ldGhvZC4KCiAgICAgQHNlZSByZWFkT2Jq ZWN0T3ZlcnJpZGUgKE9iamVjdCkKICAqLwogIHByb3RlY3RlZCBPYmplY3RJ bnB1dFN0cmVhbSAoKQogICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZWN1cml0 eUV4Y2VwdGlvbgogIHsKICAgIFNlY3VyaXR5TWFuYWdlciBzZWNfbWFuID0g U3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlciAoKTsKICAgIGlmIChzZWNfbWFu ICE9IG51bGwpCiAgICAgIHNlY19tYW4uY2hlY2tQZXJtaXNzaW9uIChTVUJD TEFTU19JTVBMRU1FTlRBVElPTl9QRVJNSVNTSU9OKTsKICAgIHRoaXMudXNl U3ViY2xhc3NNZXRob2QgPSB0cnVlOwogIH0KCgogIC8qKgogICAgIFRoaXMg bWV0aG9kIGFsbG93cyBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoZSBkZWZh dWx0CiAgICAgZGUgc2VyaWFsaXphdGlvbiBtZWNoYW5pc20gcHJvdmlkZWQg YnkKICAgICA8Y29kZT5PYmplY3RJbnB1dFN0cmVhbTwvY29kZT4uICBUbyBt YWtlIHRoaXMgbWV0aG9kIGJlIHVzZWQgZm9yCiAgICAgd3JpdGluZyBvYmpl Y3RzLCBzdWJjbGFzc2VzIG11c3QgaW52b2tlIHRoZSAwLWFyZ3VtZW50CiAg ICAgY29uc3RydWN0b3Igb24gdGhpcyBjbGFzcyBmcm9tIHRoZXJlIGNvbnN0 cnVjdG9yLgoKICAgICBAc2VlIE9iamVjdElucHV0U3RyZWFtICgpCiAgKi8K ICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWRPYmplY3RPdmVycmlkZSAoKQogICAg dGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBP cHRpb25hbERhdGFFeGNlcHRpb24KICB7CiAgICB0aHJvdyBuZXcgSU9FeGNl cHRpb24gKCJTdWJjbGFzcyBvZiBPYmplY3RJbnB1dFN0cmVhbSBtdXN0IGlt cGxlbWVudCByZWFkT2JqZWN0T3ZlcnJpZGUiKTsKICB9CgoKICAvLyBhc3Np Z25zIHRoZSBuZXh0IGF2YWlsaWJsZSBoYW5kbGUgdG8gT0JKCiAgcHJpdmF0 ZSBpbnQgYXNzaWduTmV3SGFuZGxlIChPYmplY3Qgb2JqKQogIHsKICAgIHRo aXMub2JqZWN0TG9va3VwVGFibGUucHV0IChuZXcgSW50ZWdlciAodGhpcy5u ZXh0T0lEKSwKCQkJICAgICBuZXcgT2JqZWN0SWRlbnRpdHlXcmFwcGVyIChv YmopKTsKCi8vICAgIHRyeQovLyAgICB7Ci8vICAgICAgREVCVUcgKCJBc3Np Z25pbmcgaGFuZGxlICIgKyB0aGlzLm5leHRPSUQpOwovLyAgICAgIERFQlVH bG4gKCIgdG8gIiArIG9iaik7Ci8vICAgIH0KLy8gICAgY2F0Y2ggKFRocm93 YWJsZSB0KSB7fQoKICAgIHJldHVybiB0aGlzLm5leHRPSUQrKzsKICB9CgoK ICBwcml2YXRlIE9iamVjdCBwcm9jZXNzUmVzb2x1dGlvbiAoT2JqZWN0IG9i aiwgaW50IGhhbmRsZSkKICAgIHRocm93cyBJT0V4Y2VwdGlvbgogIHsKICAg IGlmIChvYmogaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpCiAgICAgIHsKICAg ICAgICBNZXRob2QgbSA9IG51bGw7IAoJdHJ5Cgl7CgkgIENsYXNzIGNsYXNz QXJnc1tdID0ge307CgkgIG0gPSBvYmouZ2V0Q2xhc3MgKCkuZ2V0RGVjbGFy ZWRNZXRob2QgKCJyZWFkUmVzb2x2ZSIsIGNsYXNzQXJncyk7CgkgIC8vIG0g Y2FuJ3QgYmUgbnVsbCBieSBkZWZpbml0aW9uIHNpbmNlIGFuIGV4Y2VwdGlv biB3b3VsZAoJICAvLyBoYXZlIGJlZW4gdGhyb3duIHNvIGEgY2hlY2sgZm9y IG51bGwgaXMgbm90IG5lZWRlZC4KCSAgb2JqID0gbS5pbnZva2UgKG9iaiwg bmV3IE9iamVjdFtdIHt9KTsJCgl9CgljYXRjaCAoTm9TdWNoTWV0aG9kRXhj ZXB0aW9uIGlnbm9yZSkKCXsKCX0KCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhj ZXB0aW9uIGlnbm9yZSkKCXsKCX0KCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0 RXhjZXB0aW9uIGlnbm9yZSkKCXsKCX0KICAgICAgfQoKICAgIGlmICh0aGlz LnJlc29sdmVFbmFibGVkKQogICAgICBvYmogPSByZXNvbHZlT2JqZWN0IChv YmopOwoKICAgIHRoaXMub2JqZWN0TG9va3VwVGFibGUucHV0IChuZXcgSW50 ZWdlciAoaGFuZGxlKSwKCQkJCW5ldyBPYmplY3RJZGVudGl0eVdyYXBwZXIg KG9iaikpOwoKICAgIHJldHVybiBvYmo7CiAgfQoKCiAgcHJpdmF0ZSB2b2lk IGNsZWFySGFuZGxlcyAoKQogIHsKICAgIHRoaXMub2JqZWN0TG9va3VwVGFi bGUuY2xlYXIgKCk7CiAgICB0aGlzLm5leHRPSUQgPSBiYXNlV2lyZUhhbmRs ZTsKICB9CgoKICBwcml2YXRlIHZvaWQgcmVhZE5leHRCbG9jayAoKSB0aHJv d3MgSU9FeGNlcHRpb24KICB7Ci8vICBERUJVR2xuICgiSW4gcmVhZE5leHRC bG9jayAiKTsKICAgIHJlYWROZXh0QmxvY2sgKHRoaXMucmVhbElucHV0U3Ry ZWFtLnJlYWRCeXRlICgpKTsKICB9CgoKICBwcml2YXRlIHZvaWQgcmVhZE5l eHRCbG9jayAoYnl0ZSBtYXJrZXIpIHRocm93cyBJT0V4Y2VwdGlvbgogIHsK ICAgIGlmIChtYXJrZXIgPT0gVENfQkxPQ0tEQVRBKQogICAgewogICAgICBk dW1wRWxlbWVudCAoIkJMT0NLIERBVEEgU0laRT0iKTsKICAgICAgdGhpcy5i bG9ja0RhdGFCeXRlcyA9IHRoaXMucmVhbElucHV0U3RyZWFtLnJlYWRVbnNp Z25lZEJ5dGUgKCk7CiAgICAgIGR1bXBFbGVtZW50bG4gKEludGVnZXIudG9T dHJpbmcodGhpcy5ibG9ja0RhdGFCeXRlcykpOwogICAgfQogICAgZWxzZSBp ZiAobWFya2VyID09IFRDX0JMT0NLREFUQUxPTkcpCiAgICB7CiAgICAgIGR1 bXBFbGVtZW50ICgiQkxPQ0sgREFUQSBMT05HIFNJWkU9Iik7CiAgICAgIHRo aXMuYmxvY2tEYXRhQnl0ZXMgPSB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFk SW50ICgpOwogICAgICBkdW1wRWxlbWVudGxuIChJbnRlZ2VyLnRvU3RyaW5n KHRoaXMuYmxvY2tEYXRhQnl0ZXMpKTsKICAgIH0KICAgIGVsc2UKICAgIHsK ICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbiAoIkF0dGVtcHQgdG8gcmVh ZCBwcmltaXRpdmUgZGF0YSwgYnV0IG5vIGRhdGEgYmxvY2sgaXMgYWN0aXZl LiIpOwogICAgfQoKICAgIGlmICh0aGlzLmJsb2NrRGF0YS5sZW5ndGggPCB0 aGlzLmJsb2NrRGF0YUJ5dGVzKQogICAgICB0aGlzLmJsb2NrRGF0YSA9IG5l dyBieXRlW3RoaXMuYmxvY2tEYXRhQnl0ZXNdOwoKICAgIHRoaXMucmVhbElu cHV0U3RyZWFtLnJlYWRGdWxseSAodGhpcy5ibG9ja0RhdGEsIDAsIHRoaXMu YmxvY2tEYXRhQnl0ZXMpOwogICAgdGhpcy5ibG9ja0RhdGFQb3NpdGlvbiA9 IDA7CiAgfQoKCiAgcHJpdmF0ZSB2b2lkIHJlYWRBcnJheUVsZW1lbnRzIChP YmplY3QgYXJyYXksIENsYXNzIGNsYXp6KQogICAgdGhyb3dzIENsYXNzTm90 Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgewogICAgaWYgKGNsYXp6 LmlzUHJpbWl0aXZlICgpKQogICAgewogICAgICBpZiAoY2xhenogPT0gQm9v bGVhbi5UWVBFKQogICAgICB7Cglib29sZWFuW10gY2FzdF9hcnJheSA9IChi b29sZWFuW10pYXJyYXk7Cglmb3IgKGludCBpPTA7IGkgPCBjYXN0X2FycmF5 Lmxlbmd0aDsgaSsrKQoJICBjYXN0X2FycmF5W2ldID0gdGhpcy5yZWFsSW5w dXRTdHJlYW0ucmVhZEJvb2xlYW4gKCk7CglyZXR1cm47CiAgICAgIH0KICAg ICAgaWYgKGNsYXp6ID09IEJ5dGUuVFlQRSkKICAgICAgewoJYnl0ZVtdIGNh c3RfYXJyYXkgPSAoYnl0ZVtdKWFycmF5OwoJZm9yIChpbnQgaT0wOyBpIDwg Y2FzdF9hcnJheS5sZW5ndGg7IGkrKykKCSAgY2FzdF9hcnJheVtpXSA9IHRo aXMucmVhbElucHV0U3RyZWFtLnJlYWRCeXRlICgpOwoJcmV0dXJuOwogICAg ICB9CiAgICAgIGlmIChjbGF6eiA9PSBDaGFyYWN0ZXIuVFlQRSkKICAgICAg ewoJY2hhcltdIGNhc3RfYXJyYXkgPSAoY2hhcltdKWFycmF5OwoJZm9yIChp bnQgaT0wOyBpIDwgY2FzdF9hcnJheS5sZW5ndGg7IGkrKykKCSAgY2FzdF9h cnJheVtpXSA9IHRoaXMucmVhbElucHV0U3RyZWFtLnJlYWRDaGFyICgpOwoJ cmV0dXJuOwogICAgICB9CiAgICAgIGlmIChjbGF6eiA9PSBEb3VibGUuVFlQ RSkKICAgICAgewoJZG91YmxlW10gY2FzdF9hcnJheSA9IChkb3VibGVbXSlh cnJheTsKCWZvciAoaW50IGk9MDsgaSA8IGNhc3RfYXJyYXkubGVuZ3RoOyBp KyspCgkgIGNhc3RfYXJyYXlbaV0gPSB0aGlzLnJlYWxJbnB1dFN0cmVhbS5y ZWFkRG91YmxlICgpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChjbGF6 eiA9PSBGbG9hdC5UWVBFKQogICAgICB7CglmbG9hdFtdIGNhc3RfYXJyYXkg PSAoZmxvYXRbXSlhcnJheTsKCWZvciAoaW50IGk9MDsgaSA8IGNhc3RfYXJy YXkubGVuZ3RoOyBpKyspCgkgIGNhc3RfYXJyYXlbaV0gPSB0aGlzLnJlYWxJ bnB1dFN0cmVhbS5yZWFkRmxvYXQgKCk7CglyZXR1cm47CiAgICAgIH0KICAg ICAgaWYgKGNsYXp6ID09IEludGVnZXIuVFlQRSkKICAgICAgewoJaW50W10g Y2FzdF9hcnJheSA9IChpbnRbXSlhcnJheTsKCWZvciAoaW50IGk9MDsgaSA8 IGNhc3RfYXJyYXkubGVuZ3RoOyBpKyspCgkgIGNhc3RfYXJyYXlbaV0gPSB0 aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkSW50ICgpOwoJcmV0dXJuOwogICAg ICB9CiAgICAgIGlmIChjbGF6eiA9PSBMb25nLlRZUEUpCiAgICAgIHsKCWxv bmdbXSBjYXN0X2FycmF5ID0gKGxvbmdbXSlhcnJheTsKCWZvciAoaW50IGk9 MDsgaSA8IGNhc3RfYXJyYXkubGVuZ3RoOyBpKyspCgkgIGNhc3RfYXJyYXlb aV0gPSB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkTG9uZyAoKTsKCXJldHVy bjsKICAgICAgfQogICAgICBpZiAoY2xhenogPT0gU2hvcnQuVFlQRSkKICAg ICAgewoJc2hvcnRbXSBjYXN0X2FycmF5ID0gKHNob3J0W10pYXJyYXk7Cglm b3IgKGludCBpPTA7IGkgPCBjYXN0X2FycmF5Lmxlbmd0aDsgaSsrKQoJICBj YXN0X2FycmF5W2ldID0gdGhpcy5yZWFsSW5wdXRTdHJlYW0ucmVhZFNob3J0 ICgpOwoJcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAg ICAgIE9iamVjdFtdIGNhc3RfYXJyYXkgPSAoT2JqZWN0W10pYXJyYXk7CiAg ICAgIGZvciAoaW50IGk9MDsgaSA8IGNhc3RfYXJyYXkubGVuZ3RoOyBpKysp CiAJICBjYXN0X2FycmF5W2ldID0gcmVhZE9iamVjdCAoKTsKICAgIH0KICB9 CgoKICBwcml2YXRlIHZvaWQgcmVhZEZpZWxkcyAoT2JqZWN0IG9iaiwgT2Jq ZWN0U3RyZWFtRmllbGRbXSBzdHJlYW1fZmllbGRzLAoJCQkgICBib29sZWFu IGNhbGxfcmVhZF9tZXRob2QsCgkJCSAgIE9iamVjdFN0cmVhbUNsYXNzIHN0 cmVhbV9vc2MpCiAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwg SU9FeGNlcHRpb24KICB7Ci8vICBERUJVR2xuICgiSW4gcmVhZEZpZWxkcyIp OwogICAgaWYgKGNhbGxfcmVhZF9tZXRob2QpCiAgICB7Ci8vICAgIERFQlVH bG4gKCIgIGNhbGxfcmVhZF9tZXRob2QgaXMgdHJ1ZSIpOwogICAgICBmaWVs ZHNBbHJlYWR5UmVhZCA9IGZhbHNlOwogICAgICBzZXRCbG9ja0RhdGFNb2Rl ICh0cnVlKTsKICAgICAgY2FsbFJlYWRNZXRob2QgKG9iaiwgc3RyZWFtX29z Yy5mb3JDbGFzcyAoKSk7CiAgICAgIHNldEJsb2NrRGF0YU1vZGUgKGZhbHNl KTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIE9iamVjdFN0cmVhbUZpZWxk W10gcmVhbF9maWVsZHMgPQogICAgICBPYmplY3RTdHJlYW1DbGFzcy5sb29r dXAgKHN0cmVhbV9vc2MuZm9yQ2xhc3MgKCkpLmZpZWxkczsKCiAgICBib29s ZWFuIGRlZmF1bHRfaW5pdGlhbGl6ZSwgc2V0X3ZhbHVlOwogICAgU3RyaW5n IGZpZWxkX25hbWUgPSBudWxsOwogICAgQ2xhc3MgdHlwZSA9IG51bGw7CiAg ICBPYmplY3RTdHJlYW1GaWVsZCBzdHJlYW1fZmllbGQgPSBudWxsOwogICAg T2JqZWN0U3RyZWFtRmllbGQgcmVhbF9maWVsZCA9IG51bGw7CiAgICBpbnQg c3RyZWFtX2lkeCA9IDA7CiAgICBpbnQgcmVhbF9pZHggPSAwOwoKICAgIHdo aWxlIChzdHJlYW1faWR4IDwgc3RyZWFtX2ZpZWxkcy5sZW5ndGgKCSAgICYm IHJlYWxfaWR4IDwgcmVhbF9maWVsZHMubGVuZ3RoKQogICAgewogICAgICBk ZWZhdWx0X2luaXRpYWxpemUgPSBmYWxzZTsKICAgICAgc2V0X3ZhbHVlID0g dHJ1ZTsKCiAgICAgIGlmIChzdHJlYW1faWR4ID09IHN0cmVhbV9maWVsZHMu bGVuZ3RoKQoJZGVmYXVsdF9pbml0aWFsaXplID0gdHJ1ZTsKICAgICAgZWxz ZQogICAgICB7CglzdHJlYW1fZmllbGQgPSBzdHJlYW1fZmllbGRzW3N0cmVh bV9pZHhdOwoJdHlwZSA9IHN0cmVhbV9maWVsZC5nZXRUeXBlICgpOwogICAg ICB9CgogICAgICBpZiAocmVhbF9pZHggPT0gcmVhbF9maWVsZHMubGVuZ3Ro KQoJc2V0X3ZhbHVlID0gZmFsc2U7CiAgICAgIGVsc2UKICAgICAgewoJcmVh bF9maWVsZCA9IHJlYWxfZmllbGRzW3JlYWxfaWR4XTsKCXR5cGUgPSByZWFs X2ZpZWxkLmdldFR5cGUgKCk7CglmaWVsZF9uYW1lID0gcmVhbF9maWVsZC5n ZXROYW1lICgpOwogICAgICB9CgogICAgICBpZiAoc2V0X3ZhbHVlICYmICFk ZWZhdWx0X2luaXRpYWxpemUpCiAgICAgIHsKCWludCBjb21wX3ZhbCA9Cgkg IHJlYWxfZmllbGQuY29tcGFyZVRvIChzdHJlYW1fZmllbGQpOwoKCWlmIChj b21wX3ZhbCA8IDApCgl7CgkgIGRlZmF1bHRfaW5pdGlhbGl6ZSA9IHRydWU7 CgkgIHJlYWxfaWR4Kys7Cgl9CgllbHNlIGlmIChjb21wX3ZhbCA+IDApCgl7 CgkgIHNldF92YWx1ZSA9IGZhbHNlOwoJICBzdHJlYW1faWR4Kys7Cgl9Cgll bHNlCgl7CgkgIHJlYWxfaWR4Kys7CgkgIHN0cmVhbV9pZHgrKzsKCX0KICAg ICAgfQoKICAgICAgaWYgKHR5cGUgPT0gQm9vbGVhbi5UWVBFKQogICAgICB7 Cglib29sZWFuIHZhbHVlID0KCSAgZGVmYXVsdF9pbml0aWFsaXplID8gZmFs c2UgOiB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkQm9vbGVhbiAoKTsKCWlm ICghZGVmYXVsdF9pbml0aWFsaXplICYmIHNldF92YWx1ZSkKCSAgZHVtcEVs ZW1lbnRsbiAoIiAgIiArIGZpZWxkX25hbWUgKyAiOiAiICsgdmFsdWUpOwoJ aWYgKHNldF92YWx1ZSkKCSAgc2V0Qm9vbGVhbkZpZWxkIChvYmosIGZpZWxk X25hbWUsIHZhbHVlKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09 IEJ5dGUuVFlQRSkKICAgICAgewoJYnl0ZSB2YWx1ZSA9CgkgIGRlZmF1bHRf aW5pdGlhbGl6ZSA/IDAgOiB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkQnl0 ZSAoKTsKCWlmICghZGVmYXVsdF9pbml0aWFsaXplICYmIHNldF92YWx1ZSkK CSAgZHVtcEVsZW1lbnRsbiAoIiAgIiArIGZpZWxkX25hbWUgKyAiOiAiICsg dmFsdWUpOwoJaWYgKHNldF92YWx1ZSkKCSAgc2V0Qnl0ZUZpZWxkIChvYmos IGZpZWxkX25hbWUsIHZhbHVlKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0 eXBlID09IENoYXJhY3Rlci5UWVBFKQogICAgICB7CgljaGFyIHZhbHVlID0K CSAgZGVmYXVsdF9pbml0aWFsaXplID8gKGNoYXIpMCA6IHRoaXMucmVhbElu cHV0U3RyZWFtLnJlYWRDaGFyICgpOwoJaWYgKCFkZWZhdWx0X2luaXRpYWxp emUgJiYgc2V0X3ZhbHVlKQoJICBkdW1wRWxlbWVudGxuICgiICAiICsgZmll bGRfbmFtZSArICI6ICIgKyB2YWx1ZSk7CglpZiAoc2V0X3ZhbHVlKQoJICBz ZXRDaGFyRmllbGQgKG9iaiwgZmllbGRfbmFtZSwgdmFsdWUpOwogICAgICB9 CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRG91YmxlLlRZUEUpCiAgICAgIHsK CWRvdWJsZSB2YWx1ZSA9CgkgIGRlZmF1bHRfaW5pdGlhbGl6ZSA/IDAgOiB0 aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkRG91YmxlICgpOwoJaWYgKCFkZWZh dWx0X2luaXRpYWxpemUgJiYgc2V0X3ZhbHVlKQoJICBkdW1wRWxlbWVudGxu ICgiICAiICsgZmllbGRfbmFtZSArICI6ICIgKyB2YWx1ZSk7CglpZiAoc2V0 X3ZhbHVlKQoJICBzZXREb3VibGVGaWVsZCAob2JqLCBmaWVsZF9uYW1lLCB2 YWx1ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAodHlwZSA9PSBGbG9hdC5U WVBFKQogICAgICB7CglmbG9hdCB2YWx1ZSA9CgkgIGRlZmF1bHRfaW5pdGlh bGl6ZSA/IDAgOiB0aGlzLnJlYWxJbnB1dFN0cmVhbS5yZWFkRmxvYXQgKCk7 CglpZiAoIWRlZmF1bHRfaW5pdGlhbGl6ZSAmJiBzZXRfdmFsdWUpCgkgIGR1 bXBFbGVtZW50bG4gKCIgICIgKyBmaWVsZF9uYW1lICsgIjogIiArIHZhbHVl KTsKCWlmIChzZXRfdmFsdWUpCgkgIHNldEZsb2F0RmllbGQgKG9iaiwgZmll bGRfbmFtZSwgdmFsdWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKHR5cGUg PT0gSW50ZWdlci5UWVBFKQogICAgICB7CglpbnQgdmFsdWUgPQoJICBkZWZh dWx0X2luaXRpYWxpemUgPyAwIDogdGhpcy5yZWFsSW5wdXRTdHJlYW0ucmVh ZEludCAoKTsKCWlmICghZGVmYXVsdF9pbml0aWFsaXplICYmIHNldF92YWx1 ZSkKCSAgZHVtcEVsZW1lbnRsbiAoIiAgIiArIGZpZWxkX25hbWUgKyAiOiAi ICsgdmFsdWUpOwoJaWYgKHNldF92YWx1ZSkKCSAgc2V0SW50RmllbGQgKG9i aiwgZmllbGRfbmFtZSwgdmFsdWUpOwogICAgICB9CiAgICAgIGVsc2UgaWYg KHR5cGUgPT0gTG9uZy5UWVBFKQogICAgICB7Cglsb25nIHZhbHVlID0KCSAg ZGVmYXVsdF9pbml0aWFsaXplID8gMCA6IHRoaXMucmVhbElucHV0U3RyZWFt LnJlYWRMb25nICgpOwoJaWYgKCFkZWZhdWx0X2luaXRpYWxpemUgJiYgc2V0 X3ZhbHVlKQoJICBkdW1wRWxlbWVudGxuICgiICAiICsgZmllbGRfbmFtZSAr ICI6ICIgKyB2YWx1ZSk7CglpZiAoc2V0X3ZhbHVlKQoJICBzZXRMb25nRmll bGQgKG9iaiwgZmllbGRfbmFtZSwgdmFsdWUpOwogICAgICB9CiAgICAgIGVs c2UgaWYgKHR5cGUgPT0gU2hvcnQuVFlQRSkKICAgICAgewoJc2hvcnQgdmFs dWUgPQoJICBkZWZhdWx0X2luaXRpYWxpemUgPyAoc2hvcnQpMCA6IHRoaXMu cmVhbElucHV0U3RyZWFtLnJlYWRTaG9ydCAoKTsKCWlmICghZGVmYXVsdF9p bml0aWFsaXplICYmIHNldF92YWx1ZSkKCSAgZHVtcEVsZW1lbnRsbiAoIiAg IiArIGZpZWxkX25hbWUgKyAiOiAiICsgdmFsdWUpOwoJaWYgKHNldF92YWx1 ZSkKCSAgc2V0U2hvcnRGaWVsZCAob2JqLCBmaWVsZF9uYW1lLCB2YWx1ZSk7 CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CglPYmplY3QgdmFsdWUgPQoJ ICBkZWZhdWx0X2luaXRpYWxpemUgPyBudWxsIDogcmVhZE9iamVjdCAoKTsK CWlmIChzZXRfdmFsdWUpCgkgIHNldE9iamVjdEZpZWxkIChvYmosIGZpZWxk X25hbWUsCgkJCSAgcmVhbF9maWVsZC5nZXRUeXBlU3RyaW5nICgpLCB2YWx1 ZSk7CiAgICAgIH0KICAgIH0KICB9CgoKICAvLyBUb2dnbGVzIHdyaXRpbmcg cHJpbWl0aXZlIGRhdGEgdG8gYmxvY2stZGF0YSBidWZmZXIuCiAgcHJpdmF0 ZSB2b2lkIHNldEJsb2NrRGF0YU1vZGUgKGJvb2xlYW4gb24pCiAgewovLyAg ICBERUJVR2xuICgiU2V0dGluZyBibG9jayBkYXRhIG1vZGUgdG8gIiArIG9u KTsKCiAgICB0aGlzLnJlYWREYXRhRnJvbUJsb2NrID0gb247CgogICAgaWYg KG9uKQogICAgICB0aGlzLmRhdGFJbnB1dFN0cmVhbSA9IHRoaXMuYmxvY2tE YXRhSW5wdXQ7CiAgICBlbHNlCiAgICAgIHRoaXMuZGF0YUlucHV0U3RyZWFt ID0gdGhpcy5yZWFsSW5wdXRTdHJlYW07CiAgfQoKCiAgLy8gcmV0dXJucyBh IG5ldyBpbnN0YW5jZSBvZiBSRUFMX0NMQVNTIHRoYXQgaGFzIGJlZW4gY29u c3RydWN0ZWQKICAvLyBvbmx5IHRvIHRoZSBsZXZlbCBvZiBDT05TVFJVQ1RP Ul9DTEFTUyAoYSBzdXBlciBjbGFzcyBvZiBSRUFMX0NMQVNTKQogIHByaXZh dGUgT2JqZWN0IG5ld09iamVjdCAoQ2xhc3MgcmVhbF9jbGFzcywgQ2xhc3Mg Y29uc3RydWN0b3JfY2xhc3MpCiAgewogICAgdHJ5CiAgICB7CiAgICAgIE9i amVjdCBvYmogPSBhbGxvY2F0ZU9iamVjdCAocmVhbF9jbGFzcyk7CiAgICAg IGNhbGxDb25zdHJ1Y3RvciAoY29uc3RydWN0b3JfY2xhc3MsIG9iaik7CiAg ICAgIHJldHVybiBvYmo7CiAgICB9CiAgICBjYXRjaCAoSW5zdGFudGlhdGlv bkV4Y2VwdGlvbiBlKQogICAgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0K ICB9CgoKICAvLyBydW5zIGFsbCByZWdpc3RlcmVkIE9iamVjdElucHV0VmFs aWRhdGlvbnMgaW4gcHJpb3JpdGl6ZWQgb3JkZXIKICAvLyBvbiBPQkoKICBw cml2YXRlIHZvaWQgaW52b2tlVmFsaWRhdG9ycyAoKSB0aHJvd3MgSW52YWxp ZE9iamVjdEV4Y2VwdGlvbgogIHsKICAgIE9iamVjdFtdIHZhbGlkYXRvcnMg PSBuZXcgT2JqZWN0W3RoaXMudmFsaWRhdG9ycy5zaXplICgpXTsKICAgIHRo aXMudmFsaWRhdG9ycy5jb3B5SW50byAodmFsaWRhdG9ycyk7CiAgICBBcnJh eXMuc29ydCAodmFsaWRhdG9ycyk7CgogICAgdHJ5CiAgICB7CiAgICAgIGZv ciAoaW50IGk9MDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspCgkoKE9i amVjdElucHV0VmFsaWRhdGlvbil2YWxpZGF0b3JzW2ldKS52YWxpZGF0ZU9i amVjdCAoKTsKICAgIH0KICAgIGZpbmFsbHkKICAgIHsKICAgICAgdGhpcy52 YWxpZGF0b3JzLnJlbW92ZUFsbEVsZW1lbnRzICgpOwogICAgfQogIH0KCgog IC8vIHRoaXMgbmF0aXZlIG1ldGhvZCBpcyB1c2VkIHRvIGdldCBhY2Nlc3Mg dG8gdGhlIHByb3RlY3RlZCBtZXRob2QKICAvLyBvZiB0aGUgc2FtZSBuYW1l IGluIFNlY3VyaXR5TWFuZ2VyCiAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2Fk ZXIgY3VycmVudENsYXNzTG9hZGVyIChTZWN1cml0eU1hbmFnZXIgc20pCiAg ewogICAgLy8gRklYTUU6IFRoaXMgaXMgdG9vIHNpbXBsZS4KICAgIHJldHVy biBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlciAoKTsKICB9Cgog IHByaXZhdGUgc3RhdGljIG5hdGl2ZSBGaWVsZCBnZXRGaWVsZCAoQ2xhc3Mg a2xhc3MsIFN0cmluZyBuYW1lKQogICAgdGhyb3dzIGphdmEubGFuZy5Ob1N1 Y2hGaWVsZEV4Y2VwdGlvbjsKCiAgcHJpdmF0ZSBzdGF0aWMgbmF0aXZlIE1l dGhvZCBnZXRNZXRob2QgKENsYXNzIGtsYXNzLCBTdHJpbmcgbmFtZSwgQ2xh c3MgYXJnc1tdKQogICAgdGhyb3dzIGphdmEubGFuZy5Ob1N1Y2hNZXRob2RF eGNlcHRpb247CgogIHByaXZhdGUgdm9pZCBjYWxsUmVhZE1ldGhvZCAoT2Jq ZWN0IG9iaiwgQ2xhc3Mga2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbgogIHsK ICAgIHRyeQogICAgICB7CglDbGFzcyBjbGFzc0FyZ3NbXSA9IHtPYmplY3RJ bnB1dFN0cmVhbS5jbGFzc307CglNZXRob2QgbSA9IGdldE1ldGhvZCAoa2xh c3MsICJyZWFkT2JqZWN0IiwgY2xhc3NBcmdzKTsKCWlmIChtID09IG51bGwp CgkgIHJldHVybjsKCU9iamVjdCBhcmdzW10gPSB7dGhpc307CgltLmludm9r ZSAob2JqLCBhcmdzKTsKICAgICAgfQogICAgY2F0Y2ggKEludm9jYXRpb25U YXJnZXRFeGNlcHRpb24geCkKICAgICAgewogICAgICAgIC8qIFJldGhyb3cg aWYgcG9zc2libGUuICovCglUaHJvd2FibGUgZXhjZXB0aW9uID0geC5nZXRU YXJnZXRFeGNlcHRpb24oKTsKCWlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBS dW50aW1lRXhjZXB0aW9uKQoJICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikg ZXhjZXB0aW9uOwoJaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0 aW9uKQoJICB0aHJvdyAoSU9FeGNlcHRpb24pIGV4Y2VwdGlvbjsKCgl0aHJv dyBuZXcgSU9FeGNlcHRpb24gKCJFeGNlcHRpb24gdGhyb3duIGZyb20gcmVh ZE9iamVjdCgpIG9uICIgKwoJCQkgICAgICAga2xhc3MgKyAiOiAiICsgZXhj ZXB0aW9uLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgfQogICAgY2F0 Y2ggKEV4Y2VwdGlvbiB4KQogICAgICB7Cgl0aHJvdyBuZXcgSU9FeGNlcHRp b24gKCJGYWlsdXJlIGludm9raW5nIHJlYWRPYmplY3QoKSBvbiAiICsKCQkJ ICAgICAgIGtsYXNzICsgIjogIiArIHguZ2V0Q2xhc3MoKS5nZXROYW1lKCkp OwogICAgICB9CiAgfQogICAgCiAgcHJpdmF0ZSBuYXRpdmUgT2JqZWN0IGFs bG9jYXRlT2JqZWN0IChDbGFzcyBjbGF6eikKICAgIHRocm93cyBJbnN0YW50 aWF0aW9uRXhjZXB0aW9uOwoKICBwcml2YXRlIG5hdGl2ZSB2b2lkIGNhbGxD b25zdHJ1Y3RvciAoQ2xhc3MgY2xhenosIE9iamVjdCBvYmopOwoKICBwcml2 YXRlIHZvaWQgc2V0Qm9vbGVhbkZpZWxkIChPYmplY3Qgb2JqLCBTdHJpbmcg ZmllbGRfbmFtZSwKCQkJCWJvb2xlYW4gdmFsKQogIHsKICAgIHRyeQogICAg ICB7CglDbGFzcyBrbGFzcyA9IG9iai5nZXRDbGFzcyAoKTsKCUZpZWxkIGYg PSBnZXRGaWVsZCAoa2xhc3MsIGZpZWxkX25hbWUpOwoJZi5zZXRCb29sZWFu IChvYmosIHZhbCk7CiAgICAgIH0KICAgIGNhdGNoIChFeGNlcHRpb24gXykK ICAgICAgewogICAgICB9ICAgIAogIH0KCiAgcHJpdmF0ZSB2b2lkIHNldEJ5 dGVGaWVsZCAoT2JqZWN0IG9iaiwgU3RyaW5nIGZpZWxkX25hbWUsCgkJCQli eXRlIHZhbCkKICB7CiAgICB0cnkKICAgICAgewoJQ2xhc3Mga2xhc3MgPSBv YmouZ2V0Q2xhc3MgKCk7CglGaWVsZCBmID0gZ2V0RmllbGQgKGtsYXNzLCBm aWVsZF9uYW1lKTsKCWYuc2V0Qnl0ZSAob2JqLCB2YWwpOwogICAgICB9CiAg ICBjYXRjaCAoRXhjZXB0aW9uIF8pCiAgICAgIHsKICAgICAgfSAgICAKICB9 CgogIHByaXZhdGUgdm9pZCBzZXRDaGFyRmllbGQgKE9iamVjdCBvYmosIFN0 cmluZyBmaWVsZF9uYW1lLAoJCQkgICAgIGNoYXIgdmFsKQogIHsKICAgIHRy eQogICAgICB7CglDbGFzcyBrbGFzcyA9IG9iai5nZXRDbGFzcyAoKTsKCUZp ZWxkIGYgPSBnZXRGaWVsZCAoa2xhc3MsIGZpZWxkX25hbWUpOwoJZi5zZXRD aGFyIChvYmosIHZhbCk7CiAgICAgIH0KICAgIGNhdGNoIChFeGNlcHRpb24g XykKICAgICAgewogICAgICB9ICAgIAogIH0KCiAgcHJpdmF0ZSB2b2lkIHNl dERvdWJsZUZpZWxkIChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGRfbmFtZSwK CQkJICAgICAgIGRvdWJsZSB2YWwpCiAgewogICAgdHJ5CiAgICAgIHsKCUNs YXNzIGtsYXNzID0gb2JqLmdldENsYXNzICgpOwoJRmllbGQgZiA9IGdldEZp ZWxkIChrbGFzcywgZmllbGRfbmFtZSk7CglmLnNldERvdWJsZSAob2JqLCB2 YWwpOwogICAgICB9CiAgICBjYXRjaCAoRXhjZXB0aW9uIF8pCiAgICAgIHsK ICAgICAgfSAgICAKICB9CgogIHByaXZhdGUgdm9pZCBzZXRGbG9hdEZpZWxk IChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGRfbmFtZSwKCQkJICAgICAgZmxv YXQgdmFsKQogIHsKICAgIHRyeQogICAgICB7CglDbGFzcyBrbGFzcyA9IG9i ai5nZXRDbGFzcyAoKTsKCUZpZWxkIGYgPSBnZXRGaWVsZCAoa2xhc3MsIGZp ZWxkX25hbWUpOwoJZi5zZXRGbG9hdCAob2JqLCB2YWwpOwogICAgICB9CiAg ICBjYXRjaCAoRXhjZXB0aW9uIF8pCiAgICAgIHsKICAgICAgfSAgICAKICB9 CgogIHByaXZhdGUgdm9pZCBzZXRJbnRGaWVsZCAoT2JqZWN0IG9iaiwgU3Ry aW5nIGZpZWxkX25hbWUsCgkJCSAgICAgIGludCB2YWwpCiAgewogICAgdHJ5 CiAgICAgIHsKCUNsYXNzIGtsYXNzID0gb2JqLmdldENsYXNzICgpOwoJRmll bGQgZiA9IGdldEZpZWxkIChrbGFzcywgZmllbGRfbmFtZSk7CglmLnNldElu dCAob2JqLCB2YWwpOwogICAgICB9CiAgICBjYXRjaCAoRXhjZXB0aW9uIF8p CiAgICAgIHsKICAgICAgfSAgICAKICB9CgoKICBwcml2YXRlIHZvaWQgc2V0 TG9uZ0ZpZWxkIChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGRfbmFtZSwKCQkJ ICAgICAgbG9uZyB2YWwpCiAgewogICAgdHJ5CiAgICAgIHsKCUNsYXNzIGts YXNzID0gb2JqLmdldENsYXNzICgpOwoJRmllbGQgZiA9IGdldEZpZWxkIChr bGFzcywgZmllbGRfbmFtZSk7CglmLnNldExvbmcgKG9iaiwgdmFsKTsKICAg ICAgfQogICAgY2F0Y2ggKEV4Y2VwdGlvbiBfKQogICAgICB7CiAgICAgIH0g ICAgCiAgfQoKCiAgcHJpdmF0ZSB2b2lkIHNldFNob3J0RmllbGQgKE9iamVj dCBvYmosIFN0cmluZyBmaWVsZF9uYW1lLAoJCQkgICAgICBzaG9ydCB2YWwp CiAgewogICAgdHJ5CiAgICAgIHsKCUNsYXNzIGtsYXNzID0gb2JqLmdldENs YXNzICgpOwoJRmllbGQgZiA9IGdldEZpZWxkIChrbGFzcywgZmllbGRfbmFt ZSk7CglmLnNldFNob3J0IChvYmosIHZhbCk7CiAgICAgIH0KICAgIGNhdGNo IChFeGNlcHRpb24gXykKICAgICAgewogICAgICB9ICAgIAogIH0KCgogIHBy aXZhdGUgdm9pZCBzZXRPYmplY3RGaWVsZCAoT2JqZWN0IG9iaiwgU3RyaW5n IGZpZWxkX25hbWUsIFN0cmluZyB0eXBlX2NvZGUsCgkJCSAgICAgICBPYmpl Y3QgdmFsKQogIHsKICAgIHRyeQogICAgICB7CglDbGFzcyBrbGFzcyA9IG9i ai5nZXRDbGFzcyAoKTsKCUZpZWxkIGYgPSBnZXRGaWVsZCAoa2xhc3MsIGZp ZWxkX25hbWUpOwoJLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgdHlw ZV9jb2RlIGhlcmUKCWYuc2V0IChvYmosIHZhbCk7CiAgICAgIH0KICAgIGNh dGNoIChFeGNlcHRpb24gXykKICAgICAgewogICAgICB9ICAgIAogIH0KCiAg cHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTAyNDsK ICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIHJlYWRPYmplY3RQYXJh bXMgPSB7IE9iamVjdElucHV0U3RyZWFtLmNsYXNzIH07CgogIHByaXZhdGUg RGF0YUlucHV0U3RyZWFtIHJlYWxJbnB1dFN0cmVhbTsKICBwcml2YXRlIERh dGFJbnB1dFN0cmVhbSBkYXRhSW5wdXRTdHJlYW07CiAgcHJpdmF0ZSBEYXRh SW5wdXRTdHJlYW0gYmxvY2tEYXRhSW5wdXQ7CiAgcHJpdmF0ZSBpbnQgYmxv Y2tEYXRhUG9zaXRpb247CiAgcHJpdmF0ZSBpbnQgYmxvY2tEYXRhQnl0ZXM7 CiAgcHJpdmF0ZSBieXRlW10gYmxvY2tEYXRhOwogIHByaXZhdGUgYm9vbGVh biB1c2VTdWJjbGFzc01ldGhvZDsKICBwcml2YXRlIGludCBuZXh0T0lEOwog IHByaXZhdGUgYm9vbGVhbiByZXNvbHZlRW5hYmxlZDsKICBwcml2YXRlIEhh c2h0YWJsZSBvYmplY3RMb29rdXBUYWJsZTsKICBwcml2YXRlIE9iamVjdCBj dXJyZW50T2JqZWN0OwogIHByaXZhdGUgT2JqZWN0U3RyZWFtQ2xhc3MgY3Vy cmVudE9iamVjdFN0cmVhbUNsYXNzOwogIHByaXZhdGUgYm9vbGVhbiByZWFk RGF0YUZyb21CbG9jazsKICBwcml2YXRlIGJvb2xlYW4gaXNEZXNlcmlhbGl6 aW5nOwogIHByaXZhdGUgYm9vbGVhbiBmaWVsZHNBbHJlYWR5UmVhZDsKICBw cml2YXRlIFZlY3RvciB2YWxpZGF0b3JzOwoKICBwcml2YXRlIHN0YXRpYyBi b29sZWFuIGR1bXA7ICAKCiAgcHJpdmF0ZSB2b2lkIGR1bXBFbGVtZW50IChT dHJpbmcgbXNnKQogIHsKICAgIGlmIChDb25maWd1cmF0aW9uLkRFQlVHICYm IGR1bXApICAKICAgICAgU3lzdGVtLm91dC5wcmludChtc2cpOwogIH0KICAK ICBwcml2YXRlIHZvaWQgZHVtcEVsZW1lbnRsbiAoU3RyaW5nIG1zZykKICB7 CiAgICBpZiAoQ29uZmlndXJhdGlvbi5ERUJVRyAmJiBkdW1wKQogICAgICBT eXN0ZW0ub3V0LnByaW50bG4obXNnKTsKICB9Cn0KCgovLyB1c2VkIHRvIGtl ZXAgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9iamVjdCB2YWxpZGF0b3JzCmNs YXNzIFZhbGlkYXRvckFuZFByaW9yaXR5IGltcGxlbWVudHMgQ29tcGFyYWJs ZQp7CiAgaW50IHByaW9yaXR5OwogIE9iamVjdElucHV0VmFsaWRhdGlvbiB2 YWxpZGF0b3I7CgogIFZhbGlkYXRvckFuZFByaW9yaXR5IChPYmplY3RJbnB1 dFZhbGlkYXRpb24gdmFsaWRhdG9yLCBpbnQgcHJpb3JpdHkpCiAgewogICAg dGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwogICAgdGhpcy52YWxpZGF0b3Ig PSB2YWxpZGF0b3I7CiAgfQoKICBwdWJsaWMgaW50IGNvbXBhcmVUbyAoT2Jq ZWN0IG8pCiAgewogICAgVmFsaWRhdG9yQW5kUHJpb3JpdHkgdmFwID0gKFZh bGlkYXRvckFuZFByaW9yaXR5KW87CiAgICByZXR1cm4gdGhpcy5wcmlvcml0 eSAtIHZhcC5wcmlvcml0eTsKICB9Cn0K --------------Boundary-00=_N303WU43F2XAO2ND7ZRX--