LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCiAqIAogKiBDb250cmlidXRvcnM6CiAqICAgICBOYWNpIE0uIERhaSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKiAgICAgCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBFVEVSQVRJT04gQS5TLiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEV0ZXJhdGlvbiBCaWxpc2ltIEEuUy4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIGV0ZXJhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5ldGVyYXRpb24uY29tLz4uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5pbnRlcm5hbC54bWw7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuZ2VuZXJpYy5zZXJ2ZXJ0eXBlLmRlZmluaXRpb24uQXJjaGl2ZVR5cGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmdlbmVyaWMuc2VydmVydHlwZS5kZWZpbml0aW9uLlByb3BlcnR5OwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci5nZW5lcmljLnNlcnZlcnR5cGUuZGVmaW5pdGlvbi5TZXJ2ZXJSdW50aW1lOwoKCnB1YmxpYyBjbGFzcyBSZXNvbHZlciB7CgoKCglwcml2YXRlIE1hcCBmUHJvcGVydHlWYWx1ZXMgPSBuZXcgSGFzaE1hcCgpOwoJcHJpdmF0ZSBTZXJ2ZXJSdW50aW1lIHNlcnZlcjsKCgkvKioKCSAqIEBwYXJhbSBpbXBsCgkgKi8KCXB1YmxpYyBSZXNvbHZlcihTZXJ2ZXJSdW50aW1lIHJ1bnRpbWUpIHsKCQl0aGlzLnNlcnZlciA9IHJ1bnRpbWU7Cgl9CgkKCXB1YmxpYyBMaXN0IHJlc29sdmVDbGFzc3BhdGhQcm9wZXJ0aWVzKExpc3QgY3BMaXN0KQoJewoJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChjcExpc3Quc2l6ZSgpKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGNwTGlzdC5zaXplKCk7IGkrKykgewoJCQlBcmNoaXZlVHlwZSBpdGVtID0gKEFyY2hpdmVUeXBlKSBjcExpc3QuZ2V0KGkpOwoJCQlTdHJpbmcgY3BhdGggPSByZXNvbHZlUHJvcGVydGllcyhpdGVtLmdldFBhdGgoKSk7CgkJCWxpc3QuYWRkKGNwYXRoKTsKCQl9CgkJcmV0dXJuIGxpc3Q7Cgl9CQoJcHVibGljIFN0cmluZyByZXNvbHZlUHJvcGVydGllcyhTdHJpbmcgcHJvcHBlZFN0cmluZykgewoJCUhhc2hNYXAgY2FjaGUgPSBuZXcgSGFzaE1hcChnZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKCQlJdGVyYXRvciBpdHIgPSBnZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewoJCQlQcm9wZXJ0eSBlbGVtZW50ID0oUHJvcGVydHkpIGl0ci5uZXh0KCk7CgkJCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0RGVmYXVsdCgpOwoJCQlpZihmUHJvcGVydHlWYWx1ZXMgIT0gbnVsbCAmJiBmUHJvcGVydHlWYWx1ZXMuY29udGFpbnNLZXkoZWxlbWVudC5nZXRJZCgpKSkKCQkJICAgIHZhbHVlPShTdHJpbmcpZlByb3BlcnR5VmFsdWVzLmdldChlbGVtZW50LmdldElkKCkpOwoJCQlpZigiZGlyZWN0b3J5Ii5lcXVhbHMoZWxlbWVudC5nZXRUeXBlKCkpIHx8ICJmaWxlIi5lcXVhbHMoZWxlbWVudC5nZXRUeXBlKCkpKQoJCQkJdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXCcsJy8nKTsKCQkJIGNhY2hlLnB1dChlbGVtZW50LmdldElkKCksIHZhbHVlKTsKCQl9CgkJLy9TdHJpbmcgdm1QYXRoID0gaW5zdGFsbC5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRDYW5vbmljYWxQYXRoKCk7CgkJLy92bVBhdGggPSB2bVBhdGgucmVwbGFjZSgnXFwnLCAnLycpOwoJCWNhY2hlLnB1dCgianJlUGF0aCIsICJKUkUiKTsKCgkJU3RyaW5nIHN0ciA9IHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKHByb3BwZWRTdHJpbmcsIGNhY2hlKTsKCQlzdHIgPSBmaXhQYXNzdGhyb3VnaFByb3BlcnRpZXMoc3RyKTsKCQlyZXR1cm4gc3RyOwoJfQoKCS8qKgoJICogQHJldHVybgoJICovCglwcml2YXRlIExpc3QgZ2V0UHJvcGVydGllcygpIHsKCQlyZXR1cm4gdGhpcy5zZXJ2ZXIuZ2V0UHJvcGVydHkoKTsKCX0KCgkvKioKCSAqIEBwYXJhbSBzdHIKCSAqIEByZXR1cm4KCSAqLwoJcHJpdmF0ZSBTdHJpbmcgZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKFN0cmluZyBzdHIpIHsKCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBzdHI7CgkJaWYgKGlzUGFzc1Byb3BlcnR5TGVmdChyZXNvbHZlZFN0cmluZykpIHsKCQkJcmVzb2x2ZWRTdHJpbmcgPSBmaXhQYXJhbShyZXNvbHZlZFN0cmluZyk7CgkJCXJlc29sdmVkU3RyaW5nID0gZml4UGFzc3Rocm91Z2hQcm9wZXJ0aWVzKHJlc29sdmVkU3RyaW5nKTsKCQl9CgkJcmV0dXJuIHJlc29sdmVkU3RyaW5nOwoJfQoKCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0aWVzRnJvbUNhY2hlKAoJCVN0cmluZyBwcm9wcGVkU3RyaW5nLAoJCUhhc2hNYXAgY2FjaGUpIHsKCQlTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSBwcm9wcGVkU3RyaW5nOwoJCWludCBzdGFydCA9IHNraXBUb1Byb3BlcnR5KHJlc29sdmVkU3RyaW5nLGNhY2hlKTsKCQlpZiAoc3RhcnQgPj0gMCkgewoJCQlyZXNvbHZlZFN0cmluZyA9IHJlc29sdmVQcm9wZXJ0eShyZXNvbHZlZFN0cmluZywgc3RhcnQsIGNhY2hlKTsKCQkJcmVzb2x2ZWRTdHJpbmcgPSByZXNvbHZlUHJvcGVydGllc0Zyb21DYWNoZShyZXNvbHZlZFN0cmluZywgY2FjaGUpOwoJCX0KCQlyZXR1cm4gcmVzb2x2ZWRTdHJpbmc7Cgl9CgoJcHJpdmF0ZSBpbnQgc2tpcFRvUHJvcGVydHkoU3RyaW5nIHN0cixIYXNoTWFwIGNhY2hlKSB7CgkJaW50IHN0YXJ0ID0gLTE7IAoJCWludCBlbmQgPSAgMDsKCQlTdHJpbmcgdmFsdWUgPSBudWxsOwoJCWRvIHsKCQkJc3RhcnQgPSAgc3RyLmluZGV4T2YoIiR7IixlbmQpOwoJCQlpZiggc3RhcnQgPCAwKQoJCQkJcmV0dXJuIHN0YXJ0OwoJCQllbmQgPSBzdHIuaW5kZXhPZigifSIsIHN0YXJ0KTsKCQkJCgkJCVN0cmluZyBrZXkgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0ICsgMiwgZW5kKTsKCQkJdmFsdWUgPSAoU3RyaW5nKWNhY2hlLmdldChrZXkpOwoJCX0KCQl3aGlsZSh2YWx1ZSA9PSBudWxsKTsKCQlyZXR1cm4gc3RhcnQ7Cgl9CgkKCXByaXZhdGUgYm9vbGVhbiBpc1Bhc3NQcm9wZXJ0eUxlZnQoU3RyaW5nIHN0cikgewoJCXJldHVybiBzdHIuaW5kZXhPZigiJXsiKSA+PSAwOwoJfQoKCXByaXZhdGUgU3RyaW5nIHJlc29sdmVQcm9wZXJ0eShTdHJpbmcgcHJvcHBlZFN0cmluZywgaW50IHN0YXJ0LCBIYXNoTWFwIGNhY2hlKSB7CgkJU3RyaW5nIHN0ciA9IHByb3BwZWRTdHJpbmc7CgkJc3RhcnQgPSBzdHIuaW5kZXhPZigiJHsiKTsKCQlpbnQgZW5kID0gc3RyLmluZGV4T2YoIn0iLCBzdGFydCk7CgkJU3RyaW5nIGtleSA9IHN0ci5zdWJzdHJpbmcoc3RhcnQgKyAyLCBlbmQpOwoJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpY2FjaGUuZ2V0KGtleSk7CgkJaWYodmFsdWUgPT0gbnVsbCApCgkJCXJldHVybiBzdHI7CgkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgc3RhcnQpCgkJCSsgdmFsdWUKCQkJKyBzdHIuc3Vic3RyaW5nKGVuZCArIDEpOwoJfQoJCglwcml2YXRlIFN0cmluZyBmaXhQYXJhbShTdHJpbmcgcHJvcHBlZFN0cmluZykgewoJCVN0cmluZyBzdHIgPSBwcm9wcGVkU3RyaW5nOwoJCWludCBzdGFydCA9IHN0ci5pbmRleE9mKCIleyIpOwoJCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0KQoJCQkrICIkeyIKCQkJKyBzdHIuc3Vic3RyaW5nKHN0YXJ0KzIpOwoJfQoJCgkvKioKCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZlByb3BlcnR5VmFsdWVzLgoJICovCglwdWJsaWMgTWFwIGdldFByb3BlcnR5VmFsdWVzKCkgewoJCXJldHVybiBmUHJvcGVydHlWYWx1ZXM7Cgl9CgkvKioKCSAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyBUaGUgZlByb3BlcnR5VmFsdWVzIHRvIHNldC4KCSAqLwoJcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZXMoTWFwIHByb3BlcnR5VmFsdWVzKSB7CgkJZlByb3BlcnR5VmFsdWVzID0gcHJvcGVydHlWYWx1ZXM7Cgl9Cn0K