LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiCgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKoCoKICogQ29udHJpYnV0b3JzOgogKiAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5pbnRlcm5hbDsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwppbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwppbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLio7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZTsKLyoqCiAqIEEgbGFiZWwgcHJvdmlkZXIgZm9yIGFsbCBzZXJ2ZXIgcmVsYXRlZCBvYmplY3RzLgogKi8KcHVibGljIGNsYXNzIFNlcnZlckxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7CglwdWJsaWMgU2VydmVyTGFiZWxQcm92aWRlcigpIHsgfQoKCXByb3RlY3RlZCBJbWFnZSBnZXRNb2R1bGVJbWFnZShTdHJpbmcgdHlwZUlkKSB7CgkJaWYgKHR5cGVJZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCgkJSW1hZ2UgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlKHR5cGVJZCk7CgkJaW50IGluZCA9IHR5cGVJZC5pbmRleE9mKCIuIik7CgkJd2hpbGUgKGltYWdlID09IG51bGwgJiYgaW5kID49IDApIHsKCQkJdHlwZUlkID0gdHlwZUlkLnN1YnN0cmluZygwLCBpbmQpOwoJCQlpbWFnZSA9IEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UodHlwZUlkKTsKCQl9CgkJcmV0dXJuIGltYWdlOwoJfQoJCglwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldE1vZHVsZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgdHlwZUlkKSB7CgkJaWYgKHR5cGVJZCA9PSBudWxsKQoJCQlyZXR1cm4gbnVsbDsKCQkKCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwoJCWludCBpbmQgPSB0eXBlSWQuaW5kZXhPZigiLiIpOwoJCXdoaWxlIChpbWFnZSA9PSBudWxsICYmIGluZCA+PSAwKSB7CgkJCXR5cGVJZCA9IHR5cGVJZC5zdWJzdHJpbmcoMCwgaW5kKTsKCQkJaW1hZ2UgPSBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcih0eXBlSWQpOwoJCX0KCQlyZXR1cm4gaW1hZ2U7Cgl9CgoJLyoKCSAqIEBzZWUgSUxhYmVsUHJvdmlkZXIjZ2V0SW1hZ2UoT2JqZWN0KQoJICovCglwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3QgZWxlbWVudCkgewoJCXRyeSB7CgkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWVUeXBlKSB7CgkJCQlJUnVudGltZVR5cGUgcnVudGltZVR5cGUgPSAoSVJ1bnRpbWVUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHJ1bnRpbWVUeXBlLmdldElkKCkpOwoJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZSkgewoJCQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgZWxlbWVudDsKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7CgkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2VEZXNjcmlwdG9yKHNlcnZlclR5cGUuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXIpIHsKCQkJCUlTZXJ2ZXIgc2VydmVyID0gKElTZXJ2ZXIpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3Ioc2VydmVyLmdldFNlcnZlclR5cGUoKS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKSB7CgkJCQlJU2VydmVyQ29uZmlndXJhdGlvblR5cGUgY29uZmlnVHlwZSA9IChJU2VydmVyQ29uZmlndXJhdGlvblR5cGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZURlc2NyaXB0b3IoY29uZmlnVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb24pIHsKCQkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJU2VydmVyQ29uZmlndXJhdGlvbikgZWxlbWVudDsKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlRGVzY3JpcHRvcihjb25maWcuZ2V0U2VydmVyQ29uZmlndXJhdGlvblR5cGUoKS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1vZHVsZSkgewoJCQkJSU1vZHVsZSBtb2R1bGUgPSAoSU1vZHVsZSkgZWxlbWVudDsKCQkJCXJldHVybiBnZXRNb2R1bGVJbWFnZURlc2NyaXB0b3IobW9kdWxlLmdldFR5cGUoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElXb3JrYmVuY2hBZGFwdGVyKSB7CgkJCQlyZXR1cm4gKChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKG51bGwpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBpbWFnZSBkZXNjcmlwdG9yIiwgZSk7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCS8qCgkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldEltYWdlKE9iamVjdCkKCSAqLwoJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7CgkJdHJ5IHsKCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUnVudGltZVR5cGUpIHsKCQkJCUlSdW50aW1lVHlwZSBydW50aW1lVHlwZSA9IChJUnVudGltZVR5cGUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJ1bnRpbWUpIHsKCQkJCUlSdW50aW1lIHJ1bnRpbWUgPSAoSVJ1bnRpbWUpIGVsZW1lbnQ7CgkJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShydW50aW1lLmdldFJ1bnRpbWVUeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJUeXBlKSB7CgkJCQlJU2VydmVyVHlwZSBzZXJ2ZXJUeXBlID0gKElTZXJ2ZXJUeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2Uoc2VydmVyVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlcikgewoJCQkJSVNlcnZlciBzZXJ2ZXIgPSAoSVNlcnZlcikgZWxlbWVudDsKCQkJCWlmIChzZXJ2ZXIuZ2V0U2VydmVyVHlwZSgpID09IG51bGwpCgkJCQkJcmV0dXJuIG51bGw7CgkJCQkKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKHNlcnZlci5nZXRTZXJ2ZXJUeXBlKCkuZ2V0SWQoKSk7CgkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSkgewoJCQkJSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlIGNvbmZpZ1R5cGUgPSAoSVNlcnZlckNvbmZpZ3VyYXRpb25UeXBlKSBlbGVtZW50OwoJCQkJcmV0dXJuIEltYWdlUmVzb3VyY2UuZ2V0SW1hZ2UoY29uZmlnVHlwZS5nZXRJZCgpKTsKCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNlcnZlckNvbmZpZ3VyYXRpb24pIHsKCQkJCUlTZXJ2ZXJDb25maWd1cmF0aW9uIGNvbmZpZyA9IChJU2VydmVyQ29uZmlndXJhdGlvbikgZWxlbWVudDsKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKGNvbmZpZy5nZXRTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSgpLmdldElkKCkpOwoJCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CgkJCQlJTW9kdWxlIG1vZHVsZSA9IChJTW9kdWxlKSBlbGVtZW50OwoJCQkJcmV0dXJuIGdldE1vZHVsZUltYWdlKG1vZHVsZS5nZXRUeXBlKCkpOwoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiQ291bGQgbm90IGdldCBpbWFnZSBkZXNjcmlwdG9yIiwgZSk7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBzKSB7CgkJaWYgKHMgPT0gbnVsbCkKCQkJcmV0dXJuICIiOwoJCQoJCXJldHVybiBzOwoJfQoKCS8qCgkgKiBAc2VlIElMYWJlbFByb3ZpZGVyI2dldFRleHQoT2JqZWN0KQoJICovCglwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKCQlpZiAoZWxlbWVudCA9PSBudWxsKQoJCQlyZXR1cm4gIiI7CgoJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVsZW1lbnQpIHsKCQkJcmV0dXJuIGdldFN0cmluZygoKElFbGVtZW50KSBlbGVtZW50KS5nZXROYW1lKCkpOwoJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElSdW50aW1lVHlwZSkgewoJCQlyZXR1cm4gKChJUnVudGltZVR5cGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJU2VydmVyVHlwZSkgewoJCQlyZXR1cm4gKChJU2VydmVyVHlwZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwoJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTZXJ2ZXJDb25maWd1cmF0aW9uVHlwZSkgewoJCQlyZXR1cm4gKChJU2VydmVyQ29uZmlndXJhdGlvblR5cGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2xpZW50KSB7CgkJCXJldHVybiAoKElDbGllbnQpIGVsZW1lbnQpLmdldE5hbWUoKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTW9kdWxlKSB7CgkJCXJldHVybiAoKElNb2R1bGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKCQl9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJV29ya2JlbmNoQWRhcHRlcikgewoJCQlyZXR1cm4gKChJV29ya2JlbmNoQWRhcHRlcikgZWxlbWVudCkuZ2V0TGFiZWwobnVsbCk7CgkJfQoKCQlyZXR1cm4gIiI7Cgl9CgoJLyoKCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2FkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIpCgkgKi8KCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsgfQoKCS8qCgkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNpc0xhYmVsUHJvcGVydHkoT2JqZWN0LCBTdHJpbmcpCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qCgkgKiBAc2VlIElCYXNlTGFiZWxQcm92aWRlciNyZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyKQoJICovCglwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7IH0KCQoJLyoKCSAqIEBzZWUgSUJhc2VMYWJlbFByb3ZpZGVyI2Rpc3Bvc2UoKQoJICovCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeyB9Cn0K