LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuaW50ZXJuYWw7CgppbXBvcnQgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLlJ1bnRpbWVEZWxlZ2F0ZTsKLyoqCiAqIAogKi8KcHVibGljIGNsYXNzIFJ1bnRpbWVXb3JraW5nQ29weSBleHRlbmRzIFJ1bnRpbWUgaW1wbGVtZW50cyBJUnVudGltZVdvcmtpbmdDb3B5IHsKCXByb3RlY3RlZCBTdHJpbmcgUFJPUF9JRF9TRVQgPSAiaWQtc2V0IjsKCXByb3RlY3RlZCBSdW50aW1lIHJ1bnRpbWU7Cglwcm90ZWN0ZWQgV29ya2luZ0NvcHlIZWxwZXIgd2NoOwoJCglwcm90ZWN0ZWQgUnVudGltZURlbGVnYXRlIHdvcmtpbmdDb3B5RGVsZWdhdGU7CgkKCS8vIGZyb20gZXhpc3RpbmcgcnVudGltZQoJcHVibGljIFJ1bnRpbWVXb3JraW5nQ29weShSdW50aW1lIHJ1bnRpbWUpIHsKCQlzdXBlcihydW50aW1lLmdldEZpbGUoKSk7CgkJdGhpcy5ydW50aW1lID0gcnVudGltZTsKCQkKCQlydW50aW1lVHlwZSA9IHJ1bnRpbWUuZ2V0UnVudGltZVR5cGUoKTsKCQkKCQltYXAgPSBuZXcgSGFzaE1hcChydW50aW1lLm1hcCk7CgkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwoJfQoJCgkvLyBuZXcgcnVudGltZQoJcHVibGljIFJ1bnRpbWVXb3JraW5nQ29weShJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgewoJCXN1cGVyKGZpbGUsIGlkLCBydW50aW1lVHlwZSk7CgkJd2NoID0gbmV3IFdvcmtpbmdDb3B5SGVscGVyKHRoaXMpOwoJCXdjaC5zZXREaXJ0eSh0cnVlKTsKCQkKCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwKSB7CgkJCWlkID0gU2VydmVyUGx1Z2luLmdlbmVyYXRlSWQoKTsKCQkJbWFwLnB1dChQUk9QX0lELCBpZCk7CgkJfSBlbHNlCgkJCXNldEF0dHJpYnV0ZShQUk9QX0lEX1NFVCwgdHJ1ZSk7CgkJCgkJLy8gdGhyb3cgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgaWQgYWxyZWFkeSBleGlzdHMKCX0KCglwdWJsaWMgYm9vbGVhbiBpc1dvcmtpbmdDb3B5KCkgewoJCXJldHVybiB0cnVlOwoJfQoKCXB1YmxpYyBJUnVudGltZVdvcmtpbmdDb3B5IGNyZWF0ZVdvcmtpbmdDb3B5KCkgewoJCXJldHVybiB0aGlzOwoJfQoKCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgaW50IHZhbHVlKSB7CgkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Cgl9CgoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBib29sZWFuIHZhbHVlKSB7CgkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgU3RyaW5nIHZhbHVlKSB7CgkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Cgl9CgoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBMaXN0IHZhbHVlKSB7CgkJd2NoLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCB2YWx1ZSk7Cgl9CgoJcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBNYXAgdmFsdWUpIHsKCQl3Y2guc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsIHZhbHVlKTsKCX0KCglwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CgkJd2NoLnNldE5hbWUobmFtZSk7CgkJYm9vbGVhbiBzZXQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9JRF9TRVQsIGZhbHNlKTsKCQlpZiAocnVudGltZSA9PSBudWxsICYmICFzZXQpCgkJCXNldEF0dHJpYnV0ZSgiaWQiLCBuYW1lKTsKCX0KCglwdWJsaWMgdm9pZCBzZXRUZXN0RW52aXJvbm1lbnQoYm9vbGVhbiBiKSB7CgkJc2V0QXR0cmlidXRlKFBST1BfVEVTVF9FTlZJUk9OTUVOVCwgYik7Cgl9CgoJcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKCQlyZXR1cm4gd2NoLmlzRGlydHkoKTsKCX0KCQoJcHVibGljIElSdW50aW1lIGdldE9yaWdpbmFsKCkgewoJCXJldHVybiBydW50aW1lOwoJfQoKCXB1YmxpYyB2b2lkIHNldExvY2tlZChib29sZWFuIGIpIHsKCQl3Y2guc2V0TG9ja2VkKGIpOwoJfQoKCXB1YmxpYyB2b2lkIHNldFByaXZhdGUoYm9vbGVhbiBiKSB7CgkJd2NoLnNldFByaXZhdGUoYik7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKElQYXRoIHBhdGgpIHsKCQlpZiAocGF0aCA9PSBudWxsKQoJCQlzZXRBdHRyaWJ1dGUoUFJPUF9MT0NBVElPTiwgKFN0cmluZyludWxsKTsKCQllbHNlCgkJCXNldEF0dHJpYnV0ZShQUk9QX0xPQ0FUSU9OLCBwYXRoLnRvU3RyaW5nKCkpOwoJfQoKCXB1YmxpYyBJUnVudGltZSBzYXZlKGJvb2xlYW4gZm9yY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewoJCW1vbml0b3IgPSBQcm9ncmVzc1V0aWwuZ2V0TW9uaXRvckZvcihtb25pdG9yKTsKCQltb25pdG9yLnN1YlRhc2soU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlc2F2aW5nVGFzayIsIGdldE5hbWUoKSkpOwoJCQoJCWlmICghZm9yY2UpCgkJCXdjaC52YWxpZGF0ZVRpbWVzdGFtcChnZXRPcmlnaW5hbCgpKTsKCQkKCQlJUnVudGltZSBvcmlnUnVudGltZSA9IHJ1bnRpbWU7CgkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKCQkJcnVudGltZSA9IG5ldyBSdW50aW1lKGZpbGUpOwoJCQoJCVN0cmluZyBvbGRJZCA9IGdldElkKCk7CgkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7CgkJYm9vbGVhbiBzZXQgPSBnZXRBdHRyaWJ1dGUoUFJPUF9JRF9TRVQsIGZhbHNlKTsKCQlpZiAoIW9sZElkLmVxdWFscyhuYW1lKSAmJiAhc2V0KSB7CgkJCXNldEF0dHJpYnV0ZSgiaWQiLCBuYW1lKTsKCQl9IGVsc2UKCQkJb2xkSWQgPSBudWxsOwoJCQoJCXJ1bnRpbWUuc2V0SW50ZXJuYWwodGhpcyk7CgkJcnVudGltZS5zYXZlVG9NZXRhZGF0YShtb25pdG9yKTsKCQl3Y2guc2V0RGlydHkoZmFsc2UpOwoJCQoJCWlmIChvbGRJZCAhPSBudWxsKQoJCQl1cGRhdGVSdW50aW1lUmVmZXJlbmNlcyhvbGRJZCwgbmFtZSwgb3JpZ1J1bnRpbWUpOwoJCQoJCXJldHVybiBydW50aW1lOwoJfQoKCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJ1bnRpbWVSZWZlcmVuY2VzKGZpbmFsIFN0cmluZyBvbGRJZCwgZmluYWwgU3RyaW5nIG5ld0lkLCBmaW5hbCBJUnVudGltZSBvcmlnUnVudGltZSkgewoJCWNsYXNzIFVwZGF0ZVJ1bnRpbWVSZWZlcmVuY2VzSm9iIGV4dGVuZHMgSm9iIHsKCQkJcHVibGljIFVwZGF0ZVJ1bnRpbWVSZWZlcmVuY2VzSm9iKCkgewoJCQkJc3VwZXIoU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIlc2F2aW5nVGFzayIsIG5ld0lkKSk7CgkJCX0KCgkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQkJCS8vIGZpeCAucnVudGltZSBmaWxlcwoJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7CgkJCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQkJUHJvamVjdFByb3BlcnRpZXMgcHJvcHMgPSAoUHJvamVjdFByb3BlcnRpZXMpIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdHNbaV0pOwoJCQkJCQlpZiAob2xkSWQuZXF1YWxzKHByb3BzLmdldFJ1bnRpbWVUYXJnZXRJZCgpKSkgewoJCQkJCQkJdHJ5IHsKCQkJCQkJCQlwcm9wcy5zZXRSdW50aW1lVGFyZ2V0SWQobmV3SWQsIG1vbml0b3IpOwoJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJCQkvLyBpZ25vcmUKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJLy8gc2F2ZSBzZXJ2ZXJzCgkJCQlpZiAocnVudGltZSAhPSBudWxsKSB7CgkJCQkJUmVzb3VyY2VNYW5hZ2VyIHJtID0gUmVzb3VyY2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7CgkJCQkJSVNlcnZlcltdIHNlcnZlcnMgPSBybS5nZXRTZXJ2ZXJzKCk7CgkJCQkJaWYgKHNlcnZlcnMgIT0gbnVsbCkgewoJCQkJCQlpbnQgc2l6ZSA9IHNlcnZlcnMubGVuZ3RoOwoJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCQkJaWYgKG9sZElkLmVxdWFscygoKFNlcnZlcilzZXJ2ZXJzW2ldKS5nZXRSdW50aW1lSWQoKSkpIHsKCQkJCQkJCQl0cnkgewoJCQkJCQkJCQlTZXJ2ZXJXb3JraW5nQ29weSB3YyA9IChTZXJ2ZXJXb3JraW5nQ29weSkgc2VydmVyc1tpXS5jcmVhdGVXb3JraW5nQ29weSgpOwoJCQkJCQkJCQl3Yy5zZXRSdW50aW1lSWQobmV3SWQpOwoJCQkJCQkJCQl3Yy5zYXZlKGZhbHNlLCBtb25pdG9yKTsKCQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCQkJCQkvLyBpZ25vcmUKCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKCQkJfQoJCX0KCQlVcGRhdGVSdW50aW1lUmVmZXJlbmNlc0pvYiBqb2IgPSBuZXcgVXBkYXRlUnVudGltZVJlZmVyZW5jZXNKb2IoKTsKCQlqb2Iuc2NoZWR1bGUoKTsKCX0KCQoJLyoqCgkgKiBSZWJ1aWxkIGFueSBwcm9qZWN0cyB0aGF0IGFyZSB0YXJnZXR0ZWQgdG8gdGhpcyBydW50aW1lLgoJICogCgkgKiBAcGFyYW0gaWQKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlYnVpbGRSdW50aW1lKGZpbmFsIElSdW50aW1lIHJ1bnRpbWUsIGZpbmFsIGJvb2xlYW4gYWRkKSB7CgkJaWYgKHJ1bnRpbWUgPT0gbnVsbCkKCQkJcmV0dXJuOwoKCQljbGFzcyBSZWJ1aWxkUnVudGltZVJlZmVyZW5jZXNKb2IgZXh0ZW5kcyBKb2IgewoJCQlwdWJsaWMgUmVidWlsZFJ1bnRpbWVSZWZlcmVuY2VzSm9iKCkgewoJCQkJc3VwZXIoU2VydmVyUGx1Z2luLmdldFJlc291cmNlKCIldGFza1BlcmZvcm1pbmciKSk7CgkJCX0KCgkJCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQkJCVN0cmluZyBpZCA9IHJ1bnRpbWUuZ2V0SWQoKTsKCQkJCQoJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKCQkJCWlmIChwcm9qZWN0cyAhPSBudWxsKSB7CgkJCQkJaW50IHNpemUgPSBwcm9qZWN0cy5sZW5ndGg7CgkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCQkJUHJvamVjdFByb3BlcnRpZXMgcHJvcHMgPSAoUHJvamVjdFByb3BlcnRpZXMpIFNlcnZlckNvcmUuZ2V0UHJvamVjdFByb3BlcnRpZXMocHJvamVjdHNbaV0pOwoJCQkJCQlpZiAoaWQuZXF1YWxzKHByb3BzLmdldFJ1bnRpbWVUYXJnZXRJZCgpKSkgewoJCQkJCQkJdHJ5IHsKCQkJCQkJCQlpZiAoYWRkKQoJCQkJCQkJCQlwcm9wcy5zZXRSdW50aW1lVGFyZ2V0KG51bGwsIHJ1bnRpbWUsIGZhbHNlLCBtb25pdG9yKTsKCQkJCQkJCQllbHNlCgkJCQkJCQkJCXByb3BzLnNldFJ1bnRpbWVUYXJnZXQocnVudGltZSwgbnVsbCwgZmFsc2UsIG1vbml0b3IpOwoJCQkJCQkJCXByb2plY3RzW2ldLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7CgkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQkKCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFNlcnZlclBsdWdpbi5QTFVHSU5fSUQsIDAsICIiLCBudWxsKTsKCQkJfQoJCX0KCQlSZWJ1aWxkUnVudGltZVJlZmVyZW5jZXNKb2Igam9iID0gbmV3IFJlYnVpbGRSdW50aW1lUmVmZXJlbmNlc0pvYigpOwoJCWpvYi5zY2hlZHVsZSgpOwoJfQoKCXB1YmxpYyBSdW50aW1lRGVsZWdhdGUgZ2V0V29ya2luZ0NvcHlEZWxlZ2F0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKQoJCQlyZXR1cm4gd29ya2luZ0NvcHlEZWxlZ2F0ZTsKCQkKCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKCQkJaWYgKHdvcmtpbmdDb3B5RGVsZWdhdGUgPT0gbnVsbCkgewoJCQkJdHJ5IHsKCQkJCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQkJCQlSdW50aW1lVHlwZSBydW50aW1lVHlwZTIgPSAoUnVudGltZVR5cGUpIHJ1bnRpbWVUeXBlOwoJCQkJCXdvcmtpbmdDb3B5RGVsZWdhdGUgPSAoUnVudGltZURlbGVnYXRlKSBydW50aW1lVHlwZTIuZ2V0RWxlbWVudCgpLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7CgkJCQkJd29ya2luZ0NvcHlEZWxlZ2F0ZS5pbml0aWFsaXplKHRoaXMpOwoJCQkJCVRyYWNlLnRyYWNlKFRyYWNlLlBFUkZPUk1BTkNFLCAiUnVudGltZVdvcmtpbmdDb3B5LmdldFdvcmtpbmdDb3B5RGVsZWdhdGUoKTogPCIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICI+ICIgKyBnZXRSdW50aW1lVHlwZSgpLmdldElkKCkpOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3QgY3JlYXRlIGRlbGVnYXRlICIgKyB0b1N0cmluZygpLCBlKTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gd29ya2luZ0NvcHlEZWxlZ2F0ZTsKCX0KCglwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewoJCXN1cGVyLmRpc3Bvc2UoKTsKCQlpZiAod29ya2luZ0NvcHlEZWxlZ2F0ZSAhPSBudWxsKQoJCQl3b3JraW5nQ29weURlbGVnYXRlLmRpc3Bvc2UoKTsKCX0KCgkvKioKCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0byB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewoJCXdjaC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGlzIHNlcnZlci4KCSAqCgkgKiBAcGFyYW0gbGlzdGVuZXIgamF2YS5iZWFucy5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewoJCXdjaC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKCX0KCQoJLyoqCgkgKiBGaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgoJICovCglwdWJsaWMgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewoJCXdjaC5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Cgl9CgkKCXB1YmxpYyB2b2lkIHNldERlZmF1bHRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewoJCXRyeSB7CgkJCWdldFdvcmtpbmdDb3B5RGVsZWdhdGUobW9uaXRvcikuc2V0RGVmYXVsdHMoKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWxsaW5nIGRlbGVnYXRlIHNldERlZmF1bHRzKCkgIiArIHRvU3RyaW5nKCksIGUpOwoJCX0KCX0KfQ==