LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwovKioKICogVGhlIG1haW4gc2VydmVyIHRvb2xpbmcgcGx1Z2luIGNsYXNzLgogKi8KcHVibGljIGNsYXNzIEphdmFTZXJ2ZXJQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewoJLy8gc2VydmVyIGphdmEgcGx1Z2luIGlkCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnNlcnZlci5jb3JlIjsKCgkvLyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcwoJcHJpdmF0ZSBzdGF0aWMgSmF2YVNlcnZlclBsdWdpbiBzaW5nbGV0b247CgoJLyoqCgkgKiBDcmVhdGUgdGhlIEphdmFTZXJ2ZXJQbHVnaW4uCgkgKi8KCXB1YmxpYyBKYXZhU2VydmVyUGx1Z2luKCkgewoJCXN1cGVyKCk7CgkJc2luZ2xldG9uID0gdGhpczsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIHBsdWdpbi4KCSAqCgkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuSmF2YVNlcnZlclBsdWdpbgoJICovCglwdWJsaWMgc3RhdGljIEphdmFTZXJ2ZXJQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7CgkJcmV0dXJuIHNpbmdsZXRvbjsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgU3RyaW5nIGZvdW5kIHdpdGggdGhlIGdpdmVuIGtleS4KCSAqCgkgKiBAcGFyYW0ga2V5IGphdmEubGFuZy5TdHJpbmcKCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShTdHJpbmcga2V5KSB7CgkJdHJ5IHsKCQkJcmV0dXJuIFBsYXRmb3JtLmdldFJlc291cmNlU3RyaW5nKGdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCksIGtleSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJcmV0dXJuIGtleTsKCQl9Cgl9CgkvKioKCSAqIFJldHVybnMgdGhlIHRyYW5zbGF0ZWQgU3RyaW5nIGZvdW5kIHdpdGggdGhlIGdpdmVuIGtleSwKCSAqIGFuZCBmb3JtYXR0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIHVzaW5nIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LgoJICoKCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwoJICogQHBhcmFtIGFyZ3VtZW50cyBqYXZhLmxhbmcuT2JqZWN0W10KCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwoJICovCglwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIHsKCQl0cnkgewoJCQlTdHJpbmcgdGV4dCA9IGdldFJlc291cmNlKGtleSk7CgkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBhcmd1bWVudHMpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCXJldHVybiBrZXk7CgkJfQoJfQoKCS8qKgoJICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nLgoJICoKCSAqIEBwYXJhbSBzdGF0dXMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMKCSAqLwoJcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewoJCWdldEluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Cgl9Cn0=