LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlldy50cmVlOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5TZXJ2ZXJJbWFnZVJlc291cmNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbC5TZXJ2ZXJVSVBsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7CmltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwppbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgVGV4dFJlc291cmNlQWRhcHRlciBpbXBsZW1lbnRzIElBZGFwdGFibGUsIElXb3JrYmVuY2hBZGFwdGVyLCBJU2VydmVyRWxlbWVudFRhZyB7Cglwcm90ZWN0ZWQgT2JqZWN0IHBhcmVudDsKCXByb3RlY3RlZCBieXRlIHRoaXNTdHlsZTsKCQoJcHVibGljIHN0YXRpYyBPYmplY3QgZGVsZXRlZDsKCQoJcHVibGljIGZpbmFsIHN0YXRpYyBieXRlIFNUWUxFX1NFUlZFUlMgPSAwOwoJcHVibGljIGZpbmFsIHN0YXRpYyBieXRlIFNUWUxFX05PX01PRFVMRVMgPSA0OwoJcHVibGljIGZpbmFsIHN0YXRpYyBieXRlIFNUWUxFX05PX1NFUlZFUlMgPSA1OwoKCXB1YmxpYyBUZXh0UmVzb3VyY2VBZGFwdGVyKE9iamVjdCBwYXJlbnQsIGJ5dGUgdGhpc1N0eWxlKSB7CgkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CgkJdGhpcy50aGlzU3R5bGUgPSB0aGlzU3R5bGU7Cgl9CgkKCXB1YmxpYyBieXRlIGdldFN0eWxlKCkgewoJCXJldHVybiB0aGlzU3R5bGU7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldFN0eWxlKGJ5dGUgYikgewoJCXRoaXNTdHlsZSA9IGI7Cgl9CgoJLyoKCSAqIEBzZWUgSUFkYXB0YWJsZSNnZXRBZGFwdGVyKENsYXNzKQoJICovCglwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewoJCWlmIChhZGFwdGVyLmVxdWFscyhJQWRhcHRhYmxlLmNsYXNzKSkKCQkJcmV0dXJuIHRoaXM7CgkJZWxzZSBpZiAoYWRhcHRlci5lcXVhbHMoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MpKQoJCQlyZXR1cm4gdGhpczsKCQllbHNlCgkJCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Cgl9CgoJLyoKCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQoJICovCglwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKCQlpZiAodGhpc1N0eWxlID09IFNUWUxFX05PX01PRFVMRVMgfHwgdGhpc1N0eWxlID09IFNUWUxFX05PX1NFUlZFUlMpCgkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwoJCS8qZWxzZSBpZiAodGhpc1N0eWxlID09IFNUWUxFX1NFUlZFUlNfQU5EX0NPTkZJR1VSQVRJT05TKSAKCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7CgkJCQluZXcgVGV4dFJlc291cmNlQWRhcHRlcih0aGlzLCBTVFlMRV9TRVJWRVJTKSwKCQkJCW5ldyBUZXh0UmVzb3VyY2VBZGFwdGVyKHRoaXMsIFNUWUxFX0NPTkZJR1VSQVRJT05TKQoJCQl9OyovCgoJCU9iamVjdFtdIGVsZW1lbnRzID0gbnVsbDsKCQlpZiAodGhpc1N0eWxlID09IFNUWUxFX1NFUlZFUlMpCgkJCWVsZW1lbnRzID0gU2VydmVyQ29yZS5nZXRTZXJ2ZXJzKCk7CgoJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IGVsZW1lbnRzLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCWlmIChlbGVtZW50c1tpXSAhPSBkZWxldGVkKQoJCQkJCWxpc3QuYWRkKG5ldyBTZXJ2ZXJFbGVtZW50QWRhcHRlcih0aGlzLCBlbGVtZW50c1tpXSkpOwoJCQl9CgkJfQoJCXJldHVybiBsaXN0LnRvQXJyYXkoKTsKCX0KCgkvKgoJICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoT2JqZWN0KQoJICovCglwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7CgkJaWYgKHRoaXNTdHlsZSA9PSBTVFlMRV9TRVJWRVJTKQoJCQlyZXR1cm4gU2VydmVySW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoU2VydmVySW1hZ2VSZXNvdXJjZS5JTUdfU0VSVkVSX0ZPTERFUik7CgkJLy9lbHNlIGlmICh0aGlzU3R5bGUgPT0gU1RZTEVfU0VSVkVSU19BTkRfQ09ORklHVVJBVElPTlMpCgkJLy8JcmV0dXJuIFNlcnZlckltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNlcnZlckltYWdlUmVzb3VyY2UuSU1HX1NFUlZFUl9QUk9KRUNUKTsKCQkvL2Vsc2UgaWYgKHRoaXNTdHlsZSA9PSBTVFlMRV9OT19DT05GSUdVUkFUSU9OKQoJCS8vCXJldHVybiBTZXJ2ZXJJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihTZXJ2ZXJJbWFnZVJlc291cmNlLklNR19TRVJWRVJfQ09ORklHVVJBVElPTl9OT05FKTsKCQllbHNlIGlmICh0aGlzU3R5bGUgPT0gU1RZTEVfTk9fTU9EVUxFUykgewoJCQlJU2hhcmVkSW1hZ2VzIHNoYXJlZEltYWdlcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCk7CgkJCXJldHVybiBzaGFyZWRJbWFnZXMuZ2V0SW1hZ2VEZXNjcmlwdG9yKElERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUKTsKCQl9CgkJZWxzZSBpZiAodGhpc1N0eWxlID09IFNUWUxFX05PX1NFUlZFUlMpCgkJCXJldHVybiBTZXJ2ZXJJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihTZXJ2ZXJJbWFnZVJlc291cmNlLklNR19TRVJWRVJfQ09ORklHVVJBVElPTl9NSVNTSU5HKTsKCQllbHNlCgkJCXJldHVybiBudWxsOwoJfQoKCS8qCgkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldExhYmVsKE9iamVjdCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewoJCWlmICh0aGlzU3R5bGUgPT0gU1RZTEVfU0VSVkVSUykKCQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIldmlld1NlcnZlcnMiKTsKCQkvL2Vsc2UgaWYgKHRoaXNTdHlsZSA9PSBTVFlMRV9TRVJWRVJTX0FORF9DT05GSUdVUkFUSU9OUykKCQkvLwlyZXR1cm4gIlNlcnZlciBJbmZvIjsKCQkvL2Vsc2UgaWYgKHRoaXNTdHlsZSA9PSBTVFlMRV9OT19DT05GSUdVUkFUSU9OKQoJCS8vCXJldHVybiAiTm8gY29uZmlndXJhdGlvbiI7CgkJZWxzZSBpZiAodGhpc1N0eWxlID09IFNUWUxFX05PX01PRFVMRVMpCgkJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXZpZXdOb01vZHVsZXMiKTsKCQllbHNlIGlmICh0aGlzU3R5bGUgPT0gU1RZTEVfTk9fU0VSVkVSUykKCQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIldmlld0NvbmZpZ3VyYXRpb25VbnVzZWQiKTsKCQllbHNlCgkJCXJldHVybiAibi9hIjsKCX0KCgkvKgoJICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRQYXJlbnQoT2JqZWN0KQoJICovCglwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewoJCXJldHVybiBwYXJlbnQ7Cgl9CgkKCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJaWYgKCEob2JqIGluc3RhbmNlb2YgVGV4dFJlc291cmNlQWRhcHRlcikpCQoJCQlyZXR1cm4gZmFsc2U7CgkJCgkJVGV4dFJlc291cmNlQWRhcHRlciBhZGFwdGVyID0gKFRleHRSZXNvdXJjZUFkYXB0ZXIpIG9iajsKCQlyZXR1cm4gKGFkYXB0ZXIuZ2V0U3R5bGUoKSA9PSB0aGlzU3R5bGUpOwoJfQoJCglwdWJsaWMgaW50IGhhc2hDb2RlKCkgewoJCXJldHVybiB0aGlzU3R5bGU7Cgl9Cn0=