LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBHYXJ5IEthcmFzaXVrIChJQk0gQ29ycG9yYXRpb24pIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGFkYXB0ZWQgZm9yIFhTTAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNsLmxhdW5jaGluZy50ZXN0czsKCmltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwppbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwoKcHVibGljIGNsYXNzIFRlc3RFbnZpcm9ubWVudCB7CgkKCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7CgkKCXByaXZhdGUgSVdvcmtzcGFjZQlfd29ya3NwYWNlOwoJcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+IF9wcm9qZWN0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVByb2plY3Q+KDIwKTsKCQoJcHVibGljIFRlc3RFbnZpcm9ubWVudCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlfd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwoJCWlmIChERUJVRyl7CgkJCV93b3Jrc3BhY2UuZ2V0Um9vdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKCQl9Cgl9CgkKCXB1YmxpYyBJUGF0aCBhZGRGb2xkZXIoSVBhdGggcm9vdCwgU3RyaW5nIGZvbGRlck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlJUGF0aCBwYXRoID0gcm9vdC5hcHBlbmQoZm9sZGVyTmFtZSk7CgkJY3JlYXRlRm9sZGVyKHBhdGgpOwoJCXJldHVybiBwYXRoOwoJfQoJCglwdWJsaWMgdm9pZCBpbmNyZW1lbnRhbEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb257CgkJZ2V0V29ya3NwYWNlKCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbnVsbCk7Cgl9CgkKCXB1YmxpYyB2b2lkIGZ1bGxCdWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uewoJCWdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Cgl9CgkKCXB1YmxpYyB2b2lkIHdhaXRGb3JCdWlsZCgpewoJCWJvb2xlYW4gd2FzSW50ZXJydXB0ZWQgPSBmYWxzZTsKCQlkbyB7CgkJCXRyeSB7CgkJCQlKb2IuZ2V0Sm9iTWFuYWdlcigpLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9NQU5VQUxfQlVJTEQsIG51bGwpOwoJCQkJd2FzSW50ZXJydXB0ZWQgPSBmYWxzZTsKCQkJfQoJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSl7CgkJCQl3YXNJbnRlcnJ1cHRlZCA9IHRydWU7CgkJCX0KCQl9IHdoaWxlKHdhc0ludGVycnVwdGVkKTsKCX0KCglwcml2YXRlIElGb2xkZXIgY3JlYXRlRm9sZGVyKElQYXRoIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA8PSAxKXJldHVybiBudWxsOwoJCQoJCUlGb2xkZXIgZm9sZGVyID0gX3dvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOwoJCWlmICghZm9sZGVyLmV4aXN0cygpKXsKCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKCQl9CgkJcmV0dXJuIGZvbGRlcjsKCX0KCglwdWJsaWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgbmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBfd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KG5hbWUpOwoJCUlXb3Jrc3BhY2VSdW5uYWJsZSBjcmVhdGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewoKCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCQkJcHJvamVjdC5jcmVhdGUobW9uaXRvcik7CgkJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7CQoJCQl9CQkKCQl9OwoJCQoJCV93b3Jrc3BhY2UucnVuKGNyZWF0ZSwgbnVsbCk7CgkJX3Byb2plY3RzLnB1dChuYW1lLCBwcm9qZWN0KTsKCQkKCQlyZXR1cm4gcHJvamVjdDsKCX0KCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCWlmIChERUJVRylyZXR1cm47CgkJZm9yIChJdGVyYXRvcjxJUHJvamVjdD4gaXQ9X3Byb2plY3RzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewoJCQlJUHJvamVjdCBwcm9qZWN0ID0gaXQubmV4dCgpOwoJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsKCQl9Cgl9CgoJcHVibGljIElQYXRoIGFkZEZpbGUoSVBhdGggZm9sZGVyLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBjb250ZW50cykgdGhyb3dzIENvcmVFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewoJCUlQYXRoIGZpbGVQYXRoID0gZm9sZGVyLmFwcGVuZChmaWxlTmFtZSk7CgkJY3JlYXRlRmlsZShmaWxlUGF0aCwgY29udGVudHMuZ2V0Qnl0ZXMoIlVURjgiKSk7CgkJcmV0dXJuIGZpbGVQYXRoOwoJfQoJCglwdWJsaWMgSVBhdGggYWRkRmlsZUZyb21SZXNvdXJjZShJUGF0aCBmb2xkZXIsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHBhdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlJUGF0aCBmaWxlUGF0aCA9IGZvbGRlci5hcHBlbmQoZmlsZU5hbWUpOwoJCWNyZWF0ZUZpbGVGcm9tUmVzb3VyY2UoZmlsZVBhdGgsIHBhdGgpOwoJCXJldHVybiBmaWxlUGF0aDsKCX0KCQoJcHJpdmF0ZSBJRmlsZSBjcmVhdGVGaWxlKElQYXRoIGZpbGVQYXRoLCBieXRlW10gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKCQlJRmlsZSBmaWxlID0gX3dvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7CgkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudHMpOwoJCWlmIChmaWxlLmV4aXN0cygpKWZpbGUuc2V0Q29udGVudHMoaW4sIHRydWUsIGZhbHNlLCBudWxsKTsKCQllbHNlIGZpbGUuY3JlYXRlKGluLCB0cnVlLCBudWxsKTsKCQlyZXR1cm4gZmlsZTsKCX0KCglwcml2YXRlIElGaWxlIGNyZWF0ZUZpbGVGcm9tUmVzb3VyY2UoSVBhdGggZmlsZVBhdGgsIFN0cmluZyBwYXRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CgkJSUZpbGUgZmlsZSA9IF93b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwoJCUlucHV0U3RyZWFtIGluID0gVGVzdEVudmlyb25tZW50LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0ocGF0aCk7CgkJaWYgKGZpbGUuZXhpc3RzKCkpZmlsZS5zZXRDb250ZW50cyhpbiwgdHJ1ZSwgZmFsc2UsIG51bGwpOwoJCWVsc2UgZmlsZS5jcmVhdGUoaW4sIHRydWUsIG51bGwpOwoJCXJldHVybiBmaWxlOwoJfQoJcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCl7CgkJcmV0dXJuIF93b3Jrc3BhY2U7Cgl9Cgp9Cg==