LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7Ci8qKgogKiBIZWxwZXIgY2xhc3MgdGhhdCBzdG9yZXMgcHJlZmVyZW5jZSBpbmZvcm1hdGlvbiBmb3Igc2VydmVyIHRvb2xzLgogKi8KcHVibGljIGNsYXNzIFNlcnZlclByZWZlcmVuY2VzIGltcGxlbWVudHMgSVNlcnZlclByZWZlcmVuY2VzIHsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUkVTVEFSVCA9ICJhdXRvLXJlc3RhcnQiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQVVUT19QVUJMSVNIID0gImF1dG8tcHVibGlzaCI7CgkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0FVVE9fUkVQQUlSX01PRFVMRVMgPSAiYXV0by1yZXBhaXItbW9kdWxlcyI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9DUkVBVEVfSU5fV09SS1NQQUNFID0gImNyZWF0ZS13b3Jrc3BhY2UiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfU1RBUlRVUF9USU1FT1VUID0gInN0YXJ0LXRpbWVvdXQiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkVTVEFSVF9NT0RVTEVfVElNRU9VVCA9ICJyZXN0YXJ0LW1vZHVsZS10aW1lb3V0IjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUID0gIm1vZHVsZS1zdGFydC10aW1lb3V0IjsKCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BVQkxJU0hfTUFOQUdFUiA9ICJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUucHVibGlzaC5zbWFydCI7CgoJcHJpdmF0ZSBQcmVmZXJlbmNlcyBwcmVmZXJlbmNlczsKCglwcm90ZWN0ZWQgc3RhdGljIFNlcnZlclByZWZlcmVuY2VzIGluc3RhbmNlOwoKCS8qKgoJICogU2VydmVyUHJlZmVyZW5jZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwcml2YXRlIFNlcnZlclByZWZlcmVuY2VzKCkgewoJCXN1cGVyKCk7CgkJcHJlZmVyZW5jZXMgPSBTZXJ2ZXJQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCXB1YmxpYyBzdGF0aWMgU2VydmVyUHJlZmVyZW5jZXMgZ2V0U2VydmVyUHJlZmVyZW5jZXMoKSB7CgkJaWYgKGluc3RhbmNlID09IG51bGwpCgkJCWluc3RhbmNlID0gbmV3IFNlcnZlclByZWZlcmVuY2VzKCk7CgkJcmV0dXJuIGluc3RhbmNlOwoJfQoKCS8qKgoJICogUmV0dXJucyB3aGV0aGVyIHNlcnZlcnMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RhcnRlZCB3aGVuCgkgKiByZXF1aXJlZC4KCSAqCgkgKiBAcmV0dXJuIGJvb2xlYW4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNBdXRvUmVzdGFydGluZygpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihQUkVGX0FVVE9fUkVTVEFSVCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KCSAqIHJlcXVpcmVkLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBdXRvUmVzdGFydGluZygpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgb2NjdXIgYmVmb3JlIHN0YXJ0aW5nIHRoZQoJICogc2VydmVyLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0F1dG9QdWJsaXNoaW5nKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQVVUT19QVUJMSVNIKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgcHVibGlzaGluZyBzaG91bGQgb2NjdXIgYmVmb3JlIHN0YXJ0aW5nIHRoZQoJICogc2VydmVyLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBdXRvUHVibGlzaGluZygpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyBhbmQgY29uZmlndXJhdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlCgkgKiB3b3Jrc3BhY2UgKGFzIG9wcG9zZWQgdG8gaW4gbWV0YWRhdGEpLgoJICoKCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBpc0NyZWF0ZVJlc291cmNlc0luV29ya3NwYWNlKCkgewoJCXJldHVybiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFBSRUZfQ1JFQVRFX0lOX1dPUktTUEFDRSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgc2VydmVycyBhbmQgY29uZmlndXJhdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlCgkgKiB3b3Jrc3BhY2UgKGFzIG9wcG9zZWQgdG8gaW4gbWV0YWRhdGEpIGJ5IGRlZmF1bHQuCgkgKgoJICogQHJldHVybiBib29sZWFuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENyZWF0ZVJlc291cmNlc0luV29ya3NwYWNlKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFNldCB3aGV0aGVyIHNlcnZlcnMgYW5kIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkIGluIHRoZQoJICogd29ya3NwYWNlIChhcyBvcHBvc2VkIHRvIGluIG1ldGFkYXRhKS4KCSAqCgkgKiBAcGFyYW0gYm9vbGVhbgoJICovCglwdWJsaWMgdm9pZCBzZXRDcmVhdGVSZXNvdXJjZXNJbldvcmtzcGFjZShib29sZWFuIGIpIHsKCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0NSRUFURV9JTl9XT1JLU1BBQ0UsIGIpOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCS8qKgoJICogU2V0IHdoZXRoZXIgc2VydmVycyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcmVzdGFydGVkIHdoZW4KCSAqIHRoZXkgbmVlZCBhIHJlc3RhcnQuCgkgKgoJICogQHBhcmFtIGJvb2xlYW4KCSAqLwoJcHVibGljIHZvaWQgc2V0QXV0b1Jlc3RhcnRpbmcoYm9vbGVhbiB2YWx1ZSkgewoJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfQVVUT19SRVNUQVJULCB2YWx1ZSk7CgkJU2VydmVyUGx1Z2luLmdldEluc3RhbmNlKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Cgl9CgoJLyoqCgkgKiBTZXQgd2hldGhlciBwdWJsaXNoaW5nIHNob3VsZCBoYXBwZW4gYmVmb3JlIHRoZSBzZXJ2ZXIgc3RhcnRzLgoJICoKCSAqIEBwYXJhbSBib29sZWFuCgkgKi8KCXB1YmxpYyB2b2lkIHNldEF1dG9QdWJsaXNoaW5nKGJvb2xlYW4gdmFsdWUpIHsKCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX0FVVE9fUFVCTElTSCwgdmFsdWUpOwoJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQoKCXB1YmxpYyBpbnQgZ2V0U3RhcnR1cFRpbWVvdXQoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX1NUQVJUVVBfVElNRU9VVCk7Cgl9CgoJcHVibGljIGludCBnZXRSZXN0YXJ0TW9kdWxlVGltZW91dCgpIHsKCQlyZXR1cm4gcHJlZmVyZW5jZXMuZ2V0SW50KFBSRUZfUkVTVEFSVF9NT0RVTEVfVElNRU9VVCk7Cgl9CgoJcHVibGljIGludCBnZXRNb2R1bGVTdGFydFRpbWVvdXQoKSB7CgkJcmV0dXJuIHByZWZlcmVuY2VzLmdldEludChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUKTsKCX0KCglwdWJsaWMgdm9pZCBzZXREZWZhdWx0cygpIHsKCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19QVUJMSVNILCBpc0RlZmF1bHRBdXRvUHVibGlzaGluZygpKTsKCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KFBSRUZfQVVUT19SRVNUQVJULCBpc0RlZmF1bHRBdXRvUmVzdGFydGluZygpKTsKCQkvL3ByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9BVVRPX1JFUEFJUl9NT0RVTEVTLCBnZXREZWZhdWx0TW9kdWxlUmVwYWlyU3RhdHVzKCkpOwoJCXByZWZlcmVuY2VzLnNldERlZmF1bHQoUFJFRl9TVEFSVFVQX1RJTUVPVVQsIDIxMDAwMSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX1JFU1RBUlRfTU9EVUxFX1RJTUVPVVQsIDEyMDAwMSk7CgkJcHJlZmVyZW5jZXMuc2V0RGVmYXVsdChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VULCAzMDAwMDEpOwoJCWJvb2xlYW4gc2F2ZSA9IGZhbHNlOwoJCWlmIChwcmVmZXJlbmNlcy5pc0RlZmF1bHQoUFJFRl9TVEFSVFVQX1RJTUVPVVQpKSB7CgkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfU1RBUlRVUF9USU1FT1VULCAyMTAwMDApOwoJCQlzYXZlID0gdHJ1ZTsKCQl9CgkJaWYgKHByZWZlcmVuY2VzLmlzRGVmYXVsdChQUkVGX1JFU1RBUlRfTU9EVUxFX1RJTUVPVVQpKSB7CgkJCXByZWZlcmVuY2VzLnNldFZhbHVlKFBSRUZfUkVTVEFSVF9NT0RVTEVfVElNRU9VVCwgMTIwMDAwKTsKCQkJc2F2ZSA9IHRydWU7CgkJfQkJaWYgKHByZWZlcmVuY2VzLmlzRGVmYXVsdChQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VUKSkgewoJCQlwcmVmZXJlbmNlcy5zZXRWYWx1ZShQUkVGX01PRFVMRV9TVEFSVF9USU1FT1VULCAzMDAwMDApOwoJCQlzYXZlID0gdHJ1ZTsKCQl9CgkJaWYgKHNhdmUpCgkJCVNlcnZlclBsdWdpbi5nZXRJbnN0YW5jZSgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwoJfQp9Cg==