LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwovKioKICogUHJvdmlkZXMgY29tbW9uIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBlbGVtZW50cyB0aGF0IGFyZQogKiBtb2RpZmllZCB2aWEgd29ya2luZyBjb3BpZXMuIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIHRoZQogKiBnZXR0ZXJzOyB0aGUgc2V0dGVycyBhcmUgb24ge0BsaW5rIElFbGVtZW50V29ya2luZ0NvcHl9LgogKiA8cD4KICogW2lzc3VlOiBXaHkgYXJlIGF0dHJpYnV0ZXMgZXhwb3NlZD8gVGhlIGF0dHJpYnV0ZSBpZHMgYW5kCiAqIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMuIEhvd2V2ZXIsCiAqIHRoZXkgYXJlIG5vdCB1c2VmdWwgdW5sZXNzIHRoZXJlIGlzIGEgc3BlYydkIGNvcnJlbGF0aW9uCiAqIGJldHdlZW4gbWV0aG9kcyBsaWtlIGdldE5hbWUgYW5kIGFuIGF0dHJpYnV0ZSAibmFtZSIuIFRoZQogKiBjb25zdGFudHMgYXJlIGRlY2xhcmVkIG9uIEJhc2UsIHdoaWNoIGlzIGludGVybmFsLl0KICogPC9wPgogKiA8cD4KICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCiAqIDwvcD4KICogCiAqIEBzaW5jZSAxLjAKICovCnB1YmxpYyBpbnRlcmZhY2UgSUVsZW1lbnQgewoJLyoqCgkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBuYW1lIGZvciB0aGlzIGVsZW1lbnQuCgkgKiA8cD4KCSAqIE5vdGUgdGhhdCB0aGlzIG5hbWUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIGEgZGlzcGxheWFibGUgbmFtZQoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBpZCBvZiB0aGlzIGVsZW1lbnQuCgkgKiBFYWNoIGVsZW1lbnQgKG9mIGEgZ2l2ZW4gdHlwZSkgaGFzIGEgZGlzdGluY3QgaWQsIGZpeGVkIGZvcgoJICogaXRzIGxpZmV0aW1lLiBJZHMgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBhcyBrZXlzOwoJICogdGhleSBhcmUgbm90IGludGVuZGVkIHRvIGJlIHNob3duIHRvIGVuZCB1c2Vycy4KCSAqIAoJICogQHJldHVybiB0aGUgZWxlbWVudCBpZAoJICovCglwdWJsaWMgU3RyaW5nIGdldElkKCk7CgoJLyoqCgkgKiBEZWxldGVzIHRoZSBwZXJzaXN0ZW50IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZWxlbWVudC4KCSAqIDxwPgoJICogW2lzc3VlOiBUaGlzIG1ldGhvZCBpcyBvdXQgb2YgcGxhY2UuIEVsZW1lbnRzIGRvIG5vdAoJICogaGF2ZSBhIG5vdGlvbiBvZiBiZWluZyBjb25uZWN0ZWQgdG8gYW4gdW5kZXJseWluZyBmaWxlLl0KCSAqIDwvcD4KCSAqIAoJICogQHRocm93cyBDb3JlRXhjZXB0aW9uIFttaXNzaW5nXQoJICovCglwdWJsaWMgdm9pZCBkZWxldGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGVsZW1lbnQgaXMgbG9ja2VkLgoJICogV2hlbiBhbiBlbGVtZW50IGlzIGxvY2tlZCwgdGhlIHVzZXIgY2Fubm90IG1ha2UgY2hhbmdlcyB0byBpdC4KCSAqIDxwPgoJICogW2lzc3VlOiBJdCdzIG9kZCB0byBoYXZlIHRoaXMgYXQgdGhlIEFQSSBsZXZlbCBiZWNhdXNlCgkgKiBpdCBoYXMgbm8gZm9yY2UuIE9uY2Ugd291bGQgbW9kaWZ5IGEgbG9ja2VkIGVsZW1lbnQgYXMKCSAqIHJlYWRpbHkgYXMgYW4gdW5sb2NrZWQgb25lLCB2aWEgYSB3b3JraW5nIGNvcHkuCgkgKiBUaGlzIGZhY2lsaXR5LCB3aGljaCBpcyB1bnVzZWQsIG5lZWRzIHRvIGJlIG1vdGl2YXRlZAoJICogKG9yIHJlbW92ZWQpLl0KCSAqIDwvcD4KCSAqCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZWxlbWVudCBpcyBsb2NrZWQsCgkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQoJICovCglwdWJsaWMgYm9vbGVhbiBpc0xvY2tlZCgpOwoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBwcml2YXRlIChub3Qgc2hvd24gaW4gdGhlIFVJKS4KCSAqIAoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZSgpOwoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB3b3JraW5nIGNvcHkuCgkgKiAKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBsdWdpbiBjb250YWluaW5nIHRoZSBkZWxlZ2F0ZSBpcyBsb2FkZWQuCgkgKiAKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0RlbGVnYXRlUGx1Z2luQWN0aXZhdGVkKCk7CgkKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgYmVlbiBsb2FkZWQuCgkgKiAKCSAqIEByZXR1cm4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNEZWxlZ2F0ZUxvYWRlZCgpOwoKCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChPYmplY3QgY29udGV4dCk7CgkKCXB1YmxpYyBpbnQgZ2V0VGltZXN0YW1wKCk7Cn0=