LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLyoqCiAqIEhlbHBlciBjbGFzcyB0aGF0IHN0b3JlcyBwcmVmZXJlbmNlIGluZm9ybWF0aW9uIGZvciBzZXJ2ZXIgdG9vbHMuCiAqLwpwdWJsaWMgY2xhc3MgU2VydmVyUHJlZmVyZW5jZXMgewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19SRVNUQVJUID0gImF1dG8tcmVzdGFydCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0ggPSAiYXV0by1wdWJsaXNoIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0NSRUFURV9JTl9XT1JLU1BBQ0UgPSAiY3JlYXRlLXdvcmtzcGFjZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TVEFSVFVQX1RJTUVPVVQgPSAic3RhcnQtdGltZW91dCI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9SRVNUQVJUX01PRFVMRV9USU1FT1VUID0gInJlc3RhcnQtbW9kdWxlLXRpbWVvdXQiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfTU9EVUxFX1NUQVJUX1RJTUVPVVQgPSAibW9kdWxlLXN0YXJ0LXRpbWVvdXQiOwoJCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUwgPSAiYXV0by1wdWJsaXNoLWxvY2FsIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUFVCTElTSF9MT0NBTF9USU1FID0gImF1dG8tcHVibGlzaC1sb2NhbC10aW1lIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUgPSAiYXV0by1wdWJsaXNoLXJlbW90ZSI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFX1RJTUUgPSAiYXV0by1wdWJsaXNoLXJlbW90ZS10aW1lIjsKCglwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzOwoKCXByb3RlY3RlZCBzdGF0aWMgU2VydmVyUHJlZmVyZW5jZXMgaW5zdGFuY2U7CgoJLyoqCgkgKiBTZXJ2ZXJQcmVmZXJlbmNlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXByaXZhdGUgU2VydmVyUHJlZmVyZW5jZXMoKSB7CgkJc3VwZXIoKTsKCQlwcmVmZXJlbmNlcyA9IFNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJcHVibGljIHN0YXRpYyBTZXJ2ZXJQcmVmZXJlbmNlcyBnZXRJbnN0YW5jZSgpIHsKCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKCQkJaW5zdGFuY2UgPSBuZXcgU2VydmVyUHJlZmVyZW5jZXMoKTsKCQlyZXR1cm4gaW5zdGFuY2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KCSAqIHJlcXVpcmVkLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0F1dG9SZXN0YXJ0aW5nKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19SRVNUQVJUKTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBzZXJ2ZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgd2hlbgoJICogcmVxdWlyZWQuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9SZXN0YXJ0aW5nKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCgkgKiBzZXJ2ZXIuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQXV0b1B1Ymxpc2hpbmcoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9BVVRPX1BVQkxJU0gpOwoJfQoJCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBvY2N1ciBiZWZvcmUgc3RhcnRpbmcgdGhlCgkgKiBzZXJ2ZXIuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkgewoJCXJldHVybiB0cnVlOwoJfQoJCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBzZXJ2ZXJzIGFuZCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUKCSAqIHdvcmtzcGFjZSAoYXMgb3Bwb3NlZCB0byBpbiBtZXRhZGF0YSkuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzQ3JlYXRlUmVzb3VyY2VzSW5Xb3Jrc3BhY2UoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9DUkVBVEVfSU5fV09SS1NQQUNFKTsKCX0KCgkvKioKCSAqIFJldHVybnMgd2hldGhlciBzZXJ2ZXJzIGFuZCBjb25maWd1cmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCBpbiB0aGUKCSAqIHdvcmtzcGFjZSAoYXMgb3Bwb3NlZCB0byBpbiBtZXRhZGF0YSkgYnkgZGVmYXVsdC4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Q3JlYXRlUmVzb3VyY2VzSW5Xb3Jrc3BhY2UoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgc2VydmVycyBhbmQgY29uZmlndXJhdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlCgkgKiB3b3Jrc3BhY2UgKGFzIG9wcG9zZWQgdG8gaW4gbWV0YWRhdGEpLgoJICoKCSAqIEBwYXJhbSBiCgkgKi8KCXB1YmxpYyB2b2lkIHNldENyZWF0ZVJlc291cmNlc0luV29ya3NwYWNlKGJvb2xlYW4gYikgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQ1JFQVRFX0lOX1dPUktTUEFDRSwgYik7CgkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hldGhlciBzZXJ2ZXJzIHdpbGwgYmUgYXV0b21hdGljYWxseSByZXN0YXJ0ZWQgd2hlbgoJICogdGhleSBuZWVkIGEgcmVzdGFydC4KCSAqCgkgKiBAcGFyYW0gdmFsdWUKCSAqLwoJcHVibGljIHZvaWQgc2V0QXV0b1Jlc3RhcnRpbmcoYm9vbGVhbiB2YWx1ZSkgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19SRVNUQVJULCB2YWx1ZSk7CgkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzLgoJICoKCSAqIEBwYXJhbSB2YWx1ZQoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaGluZyhib29sZWFuIHZhbHVlKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0gsIHZhbHVlKTsKCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCX0KCglwdWJsaWMgaW50IGdldFN0YXJ0dXBUaW1lb3V0KCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9TVEFSVFVQX1RJTUVPVVQpOwoJfQoKCXB1YmxpYyBpbnQgZ2V0UmVzdGFydE1vZHVsZVRpbWVvdXQoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX1JFU1RBUlRfTU9EVUxFX1RJTUVPVVQpOwoJfQoKCXB1YmxpYyBpbnQgZ2V0TW9kdWxlU3RhcnRUaW1lb3V0KCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCk7Cgl9CgkKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciBsb2NhbCBhdXRvLXB1Ymxpc2hpbmcuCgkgKiAKCSAqIEByZXR1cm4gaW50CgkgKi8KCXB1YmxpYyBib29sZWFuIGdldERlZmF1bHRBdXRvUHVibGlzaExvY2FsKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0QXV0b1B1Ymxpc2hMb2NhbCgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsKGJvb2xlYW4gYXV0bykgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMLCBhdXRvKTsKCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIGxvY2FsIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSB7CgkJcmV0dXJuIDE1OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldEF1dG9QdWJsaXNoTG9jYWxUaW1lKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRJbnQoUFJFRl9BVVRPX1BVQkxJU0hfTE9DQUxfVElNRSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbG9jYWwgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaExvY2FsVGltZShpbnQgYXV0bykgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19QVUJMSVNIX0xPQ0FMX1RJTUUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGJvb2xlYW4gZ2V0QXV0b1B1Ymxpc2hSZW1vdGUoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEJvb2xlYW4oUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFKTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHZhbHVlIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcGFyYW0gYXV0bwoJICovCglwdWJsaWMgdm9pZCBzZXRBdXRvUHVibGlzaFJlbW90ZShib29sZWFuIGF1dG8pIHsKCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGZvciByZW1vdGUgYXV0by1wdWJsaXNoaW5nLgoJICogCgkgKiBAcmV0dXJuIGludAoJICovCglwdWJsaWMgaW50IGdldERlZmF1bHRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKSB7CgkJcmV0dXJuIDYwOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgc2V0dGluZyBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHJldHVybiBpbnQKCSAqLwoJcHVibGljIGludCBnZXRBdXRvUHVibGlzaFJlbW90ZVRpbWUoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEVfVElNRSk7Cgl9CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgcmVtb3RlIGF1dG8tcHVibGlzaGluZy4KCSAqIAoJICogQHBhcmFtIGF1dG8KCSAqLwoJcHVibGljIHZvaWQgc2V0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKGludCBhdXRvKSB7CgkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9BVVRPX1BVQkxJU0hfUkVNT1RFX1RJTUUsIGF1dG8pOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKCkgewoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1BVQkxJU0gsIGlzRGVmYXVsdEF1dG9QdWJsaXNoaW5nKCkpOwoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1JFU1RBUlQsIGlzRGVmYXVsdEF1dG9SZXN0YXJ0aW5nKCkpOwoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TVEFSVFVQX1RJTUVPVVQsIDIxMDAwMSk7CgkJCgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9MT0NBTCwgZ2V0RGVmYXVsdEF1dG9QdWJsaXNoTG9jYWwoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9MT0NBTF9USU1FLCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hMb2NhbFRpbWUoKSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX0FVVE9fUFVCTElTSF9SRU1PVEUsIGdldERlZmF1bHRBdXRvUHVibGlzaFJlbW90ZSgpKTsKCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNIX1JFTU9URV9USU1FLCBnZXREZWZhdWx0QXV0b1B1Ymxpc2hSZW1vdGVUaW1lKCkpOwoJCQoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9SRVNUQVJUX01PRFVMRV9USU1FT1VULCAxMjAwMDEpOwoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCwgMzAwMDAxKTsKCQlib29sZWFuIHNhdmUgPSBmYWxzZTsKCQlpZiAocHJlZmVyZW5jZXMuaXNEZWZhdWx0KFBSRUZfU1RBUlRVUF9USU1FT1VUKSkgewoJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1NUQVJUVVBfVElNRU9VVCwgMjEwMDAwKTsKCQkJc2F2ZSA9IHRydWU7CgkJfQoJCWlmIChwcmVmZXJlbmNlcy5pc0RlZmF1bHQoUFJFRl9SRVNUQVJUX01PRFVMRV9USU1FT1VUKSkgewoJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX1JFU1RBUlRfTU9EVUxFX1RJTUVPVVQsIDEyMDAwMCk7CgkJCXNhdmUgPSB0cnVlOwoJCX0JCWlmIChwcmVmZXJlbmNlcy5pc0RlZmF1bHQoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCkpIHsKCQkJcHJlZmVyZW5jZXMuc2V0VmFsdWUoUFJFRl9NT0RVTEVfU1RBUlRfVElNRU9VVCwgMzAwMDAwKTsKCQkJc2F2ZSA9IHRydWU7CgkJfQoJCWlmIChzYXZlKQoJCQlTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKCX0KfQ==