LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIudWkuaW50ZXJuYWwudmlld2VyczsKCmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7CgppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklNb25pdG9yZWRTZXJ2ZXJQb3J0OwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklTZXJ2ZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLkltYWdlUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLnVpLmludGVybmFsLlNlcnZlclVJUGx1Z2luOwovKioKICogTW9uaXRvciBwb3J0IGxhYmVsIHByb3ZpZGVyLgogKi8KcHVibGljIGNsYXNzIE1vbml0b3JMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKCXByb3RlY3RlZCBJU2VydmVyIHNlcnZlcjsKCglwdWJsaWMgTW9uaXRvckxhYmVsUHJvdmlkZXIoSVNlcnZlciBzZXJ2ZXIpIHsKCQlzdXBlcigpOwoJCXRoaXMuc2VydmVyID0gc2VydmVyOwoJfQoKCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CgkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZWxlbWVudDsKCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewoJCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKCQkJCXJldHVybiBJbWFnZVJlc291cmNlLmdldEltYWdlKEltYWdlUmVzb3VyY2UuSU1HX01PTklUT1JfT04pOwoJCQlyZXR1cm4gSW1hZ2VSZXNvdXJjZS5nZXRJbWFnZShJbWFnZVJlc291cmNlLklNR19NT05JVE9SX09GRik7CgkJfQoJCXJldHVybiBudWxsOwoJfQoKCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7CgkJSU1vbml0b3JlZFNlcnZlclBvcnQgcG9ydCA9IChJTW9uaXRvcmVkU2VydmVyUG9ydCkgZWxlbWVudDsKCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewoJCQlpZiAocG9ydC5pc1N0YXJ0ZWQoKSkKCQkJCXJldHVybiBTZXJ2ZXJVSVBsdWdpbi5nZXRSZXNvdXJjZSgiJXN0YXJ0ZWQiKTsKCQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlc3RvcHBlZCIpOwoJCX0gZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMSkKCQkJcmV0dXJuIG5vdE51bGwocG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0TmFtZSgpKTsKCQllbHNlIGlmIChjb2x1bW5JbmRleCA9PSAyKQoJCQlyZXR1cm4gcG9ydC5nZXRTZXJ2ZXJQb3J0KCkuZ2V0UG9ydCgpICsgIiI7CgkJZWxzZSBpZiAoY29sdW1uSW5kZXggPT0gMykKCQkJcmV0dXJuIHBvcnQuZ2V0TW9uaXRvclBvcnQoKSArICIiOwoJCWVsc2UgewoJCQlTdHJpbmdbXSBjb250ZW50ID0gcG9ydC5nZXRDb250ZW50VHlwZXMoKTsKCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCB8fCBjb250ZW50Lmxlbmd0aCA9PSAwKQoJCQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlQWxsIik7CgkJCQoJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJCWludCBzaXplID0gY29udGVudC5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlpZiAoaSA+IDApCgkJCQkJc2IuYXBwZW5kKCIsIik7CgkJCQlzYi5hcHBlbmQoZ2V0Q29udGVudFR5cGVTdHJpbmcoY29udGVudFtpXSkpOwoJCQl9CgkJCXJldHVybiBzYi50b1N0cmluZygpOwoJCX0KCX0KCQoJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGVTdHJpbmcoU3RyaW5nIHMpIHsKCQlpZiAoIndlYiIuZXF1YWxzKHMpKQoJCQlyZXR1cm4gU2VydmVyVUlQbHVnaW4uZ2V0UmVzb3VyY2UoIiVkaWFsb2dNb25pdG9yQ29udGVudFR5cGVXZWIiKTsKCQllbHNlIGlmICgid2Vic2VydmljZXMiLmVxdWFscyhzKSkKCQkJcmV0dXJuIFNlcnZlclVJUGx1Z2luLmdldFJlc291cmNlKCIlZGlhbG9nTW9uaXRvckNvbnRlbnRUeXBlV2ViU2VydmljZXMiKTsKCQllbHNlCgkJCXJldHVybiBzOwoJfQp9