LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5pbnRlcm5ldC5tb25pdG9yLmNvcmUuaW50ZXJuYWwuaHR0cDsKCmltcG9ydCBvcmcuZWNsaXBzZS53c3QuaW50ZXJuZXQubW9uaXRvci5jb3JlLk1vbml0b3JDb3JlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmludGVybmV0Lm1vbml0b3IuY29yZS5pbnRlcm5hbC5SZXF1ZXN0OwovKioKICogCiAqLwpwdWJsaWMgY2xhc3MgSFRUUFJlcXVlc3QgZXh0ZW5kcyBSZXF1ZXN0IHsKCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUkVRVUVTVF9IRUFERVIgPSAicmVxdWVzdC1oZWFkZXIiOwoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9IRUFERVIgPSAicmVzcG9uc2UtaGVhZGVyIjsKCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1JFUVVFU1RfQk9EWSA9ICJyZXF1ZXN0LWJvZHkiOwoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9SRVNQT05TRV9CT0RZID0gInJlc3BvbnNlLWJvZHkiOwoJCglwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWSA9IG5ldyBieXRlWzBdOwoKCS8qKgoJICogSFRUUFJlcXVlc3RSZXNwb25zZSBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgSFRUUFJlcXVlc3QoaW50IGxvY2FsUG9ydCwgU3RyaW5nIHJlbW90ZUhvc3QsIGludCByZW1vdGVQb3J0KSB7CgkJc3VwZXIoTW9uaXRvckNvcmUuZmluZFByb3RvY29sQWRhcHRlcihNb25pdG9yQ29yZS5IVFRQX1BST1RPQ09MX0lEKSwgbG9jYWxQb3J0LCByZW1vdGVIb3N0LCByZW1vdGVQb3J0KTsKCX0KCQoJcHVibGljIGJ5dGVbXSBnZXRSZXF1ZXN0KGJ5dGUgdHlwZTIpIHsKCQlpZiAodHlwZTIgPT0gQUxMKQoJCQlyZXR1cm4gcmVxdWVzdDsKCQllbHNlIGlmICh0eXBlMiA9PSBUUkFOU1BPUlQpCgkJCXJldHVybiBnZXRSZXF1ZXN0SGVhZGVyKCk7CgkJZWxzZQoJCQlyZXR1cm4gZ2V0UmVxdWVzdENvbnRlbnQoKTsKCX0KCQoJcHVibGljIGJ5dGVbXSBnZXRSZXNwb25zZShieXRlIHR5cGUyKSB7CgkJaWYgKHR5cGUyID09IEFMTCkKCQkJcmV0dXJuIHJlc3BvbnNlOwoJCWVsc2UgaWYgKHR5cGUyID09IFRSQU5TUE9SVCkKCQkJcmV0dXJuIGdldFJlc3BvbnNlSGVhZGVyKCk7CgkJZWxzZQoJCQlyZXR1cm4gZ2V0UmVzcG9uc2VDb250ZW50KCk7Cgl9CgkKCXByb3RlY3RlZCBieXRlW10gZ2V0UmVxdWVzdEhlYWRlcigpIHsKCQlPYmplY3Qgb2JqID0gZ2V0T2JqZWN0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0hFQURFUik7CgkJaWYgKG9iaiA9PSBudWxsIHx8ICEob2JqIGluc3RhbmNlb2YgYnl0ZVtdKSkKCQkJcmV0dXJuIG51bGw7CgkJcmV0dXJuIChieXRlW10pIG9iajsKCX0KCQoJcHJvdGVjdGVkIGJ5dGVbXSBnZXRSZXF1ZXN0Q29udGVudCgpIHsKCQlPYmplY3Qgb2JqID0gZ2V0T2JqZWN0UHJvcGVydHkoSFRUUF9SRVFVRVNUX0JPRFkpOwoJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIGJ5dGVbXSkpCgkJCXJldHVybiBudWxsOwoJCXJldHVybiAoYnl0ZVtdKSBvYmo7Cgl9CgkKCXByb3RlY3RlZCBieXRlW10gZ2V0UmVzcG9uc2VIZWFkZXIoKSB7CgkJT2JqZWN0IG9iaiA9IGdldE9iamVjdFByb3BlcnR5KEhUVFBfUkVTUE9OU0VfSEVBREVSKTsKCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQoJCQlyZXR1cm4gbnVsbDsKCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOwoJfQoJCglwcm90ZWN0ZWQgYnl0ZVtdIGdldFJlc3BvbnNlQ29udGVudCgpIHsKCQlPYmplY3Qgb2JqID0gZ2V0T2JqZWN0UHJvcGVydHkoSFRUUF9SRVNQT05TRV9CT0RZKTsKCQlpZiAob2JqID09IG51bGwgfHwgIShvYmogaW5zdGFuY2VvZiBieXRlW10pKQoJCQlyZXR1cm4gbnVsbDsKCQlyZXR1cm4gKGJ5dGVbXSkgb2JqOwoJfQp9