LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLyoqCiAqIAogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZXh0ZW5kcyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewoJcHJvdGVjdGVkIHN0YXRpYyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCQoJcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKCglwcm90ZWN0ZWQgTGlzdCBhZGRlZDsKCXByb3RlY3RlZCBMaXN0IHJlbW92ZWQ7CgoJLy8gbWFwIGZyb20gSVByb2plY3QgdG8gSU1vZHVsZVtdCglwcm90ZWN0ZWQgZmluYWwgTWFwIHByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KCSAqLwoJcHVibGljIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7CgkJc3VwZXIoKTsKCQkKCQlmYWN0b3JpZXMuYWRkKHRoaXMpOwoJCQoJCWFkZExpc3RlbmVyKCk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcygpIHsKCQljYWNoZU1vZHVsZXModHJ1ZSk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcyhib29sZWFuIGZvcmNlVXBkYXRlKSB7IAoJCXRyeSB7CgkJCUlQcm9qZWN0W10gcHJvamVjdHMyID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7CgkJCWludCBzaXplID0gcHJvamVjdHMyLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCS8vVHJhY2UudHJhY2UoImNhY2hpbmc6ICIgKyB0aGlzICsgIiAiICsgcHJvamVjdHNbaV0gKyAiICIgKyBpc1ZhbGlkTW9kdWxlKHByb2plY3RzW2ldKSk7CgkJCQlpZighcHJvamVjdHMyW2ldLmlzQWNjZXNzaWJsZSgpKQoJCQkJCXJlbW92ZU1vZHVsZXMocHJvamVjdHMyW2ldKTsKCQkJCWVsc2UgaWYgKGZvcmNlVXBkYXRlIHx8IG5lZWRzVXBkYXRpbmcocHJvamVjdHMyW2ldKSAmJiAoaXNWYWxpZE1vZHVsZShwcm9qZWN0czJbaV0pKSkgewoJCQkJCWFkZE1vZHVsZXMocHJvamVjdHMyW2ldKTsKCQkJCX0gCgkJCX0KCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBjYWNoaW5nIG1vZHVsZXMiLCBlKTsKCQl9IGZpbmFsbHkgewoJCQlpbml0aWFsaXplZCA9IHRydWU7CgkJfQoJfQoKCXByb3RlY3RlZCBib29sZWFuIG5lZWRzVXBkYXRpbmcoSVByb2plY3QgcHJvamVjdCkgewoJCXJldHVybiB0cnVlOwoJfQoKCgkvKioKCSAqIFJldHVybiB0aGUgd29ya3NwYWNlIHJvb3QuCgkgKiAKCSAqIEByZXR1cm4gdGhlIHdvcmtzcGFjZSByb290CgkgKi8KCXByaXZhdGUgc3RhdGljIElXb3Jrc3BhY2VSb290IGdldFdvcmtzcGFjZVJvb3QoKSB7CgkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtb2R1bGVzIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCwgb3IgbnVsbAoJICogaWYgdGhpcyBmYWN0b3J5IGRvZXMgbm90IGhhdmUgYSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbW9kdWxlcy4KCSAqLwoJcHVibGljIElNb2R1bGVbXSBnZXRNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpIHsKCQl0cnkgewoJCQlyZXR1cm4gKElNb2R1bGVbXSkgcHJvamVjdHMuZ2V0KHByb2plY3QpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCS8vIGlnbm9yZQoJCX0KCQlyZXR1cm4gbnVsbDsKCX0KCgkvKioKCSAqIEFkZCBhIHJlc291cmNlIGxpc3RlbmVyIHRvIHRoZSB3b3Jrc3BhY2UuCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRMaXN0ZW5lcigpIHsKCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKCQkJcmV0dXJuOwoKCQlsaXN0ZW5lciA9IG5ldyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPi0gUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBsaXN0ZW5lciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZTogIiArIGV2ZW50LmdldFR5cGUoKSArICIgLT4tIik7CgkJCQl0cnkgewoJCQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKCQkJCQkKCQkJCQkvL2lmIChkZWx0YS5nZXRGbGFncygpID09IElSZXNvdXJjZURlbHRhLk1BUktFUlMgfHwgZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5OT19DSEFOR0UpCgkJCQkJLy8JcmV0dXJuOwoJCQkJCgkJCQkJZGVsdGEuYWNjZXB0KG5ldyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7CgkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHZpc2l0b3JEZWx0YSkgewoJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gdmlzaXRvckRlbHRhLmdldFJlc291cmNlKCk7CgkJCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgInJlc291cmNlOiAiICsgcmVzb3VyY2UpOwoJCgkJCQkJCQkvLyBvbmx5IHJlc3BvbmQgY2hhbmdlcyB3aXRoaW4gcHJvamVjdHMKCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKCQkJCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZTsKCQkJCQkJCQloYW5kbGVHbG9iYWxQcm9qZWN0Q2hhbmdlKHByb2plY3QsIHZpc2l0b3JEZWx0YSk7CgkJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCQl9IGVsc2UgaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9IGVsc2UKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkvL1RyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIiwgZSk7CgkJCQl9CgkJCQlmaXJlR2xvYmFsRXZlbnRzKCk7CgkJCQlUcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICItPC0gRG9uZSBQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIHJlc3BvbmRpbmcgdG8gcmVzb3VyY2UgY2hhbmdlIC08LSIpOwoJCQl9CgkJfTsKCQkKCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwoJfQoJCgkvKioKCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCS8vIGhhbmRsZSBwcm9qZWN0IGxldmVsIGNoYW5nZXMKCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3Rvcmllcy5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBmYWN0b3J5ID0gKFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIGl0ZXJhdG9yLm5leHQoKTsKCQkJLy9UcmFjZS50cmFjZSgiRmlyaW5nIHRvOiAiICsgZmFjdG9yeSk7CgkJCWZhY3RvcnkuaGFuZGxlUHJvamVjdENoYW5nZShwcm9qZWN0LCBkZWx0YSk7CgkJfQoJCQoJCS8vIGhhbmRsZSBpbnRlcm5hbCB1cGRhdGVzCgkJaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCS8vVHJhY2UudHJhY2UoIkZpcmluZyB0bzogIiArIGZhY3RvcnkpOwoJCQlmYWN0b3J5LmhhbmRsZVByb2plY3RJbnRlcm5hbENoYW5nZShwcm9qZWN0LCBkZWx0YSk7CgkJfQoJfQoJCgkvKioKCSAqIEZpcmUgdGhlIGFjY3VtdWxhdGVkIG1vZHVsZSBmYWN0b3J5IGV2ZW50cy4KCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpcmVHbG9iYWxFdmVudHMoKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiRmlyaW5nIGdsb2JhbCBtb2R1bGUgZXZlbnQiKTsKCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3Rvcmllcy5pdGVyYXRvcigpOwoJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKCQkJUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSBmYWN0b3J5ID0gKFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUpIGl0ZXJhdG9yLm5leHQoKTsKCQkJZmFjdG9yeS51cGRhdGVQcm9qZWN0cygpOwoJCX0KCX0KCgkvKioKCSAqIFRlbXBvcmFyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgcHJvamVjdCBtb2R1bGVzIGFyZSB1cGRhdGVkLgoJICovCglwcml2YXRlIHZvaWQgdXBkYXRlUHJvamVjdHMoKSB7CgkJSU1vZHVsZVtdIG1vZHVsZXMyID0gZ2V0TW9kdWxlcygpOwoJCWlmIChtb2R1bGVzMiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gbW9kdWxlczIubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJaWYgKG1vZHVsZXMyW2ldIGluc3RhbmNlb2YgUHJvamVjdE1vZHVsZSkKCQkJCQkoKFByb2plY3RNb2R1bGUpIG1vZHVsZXMyW2ldKS51cGRhdGUoKTsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQoJICovCglwcml2YXRlIHZvaWQgaGFuZGxlUHJvamVjdENoYW5nZShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewoJCWlmKCFpbml0aWFsaXplZCkKCQkJY2FjaGVNb2R1bGVzKGZhbHNlKTsKCQlpZiAocHJvamVjdHMuY29udGFpbnNLZXkocHJvamVjdCkpIHsKCQkJLy8gYWxyZWFkeSBhIG1vZHVsZQoJCQlpZiAoKChkZWx0YS5nZXRLaW5kKCkgJiAgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgIT0gMCkgfHwgIWlzVmFsaWRNb2R1bGUocHJvamVjdCkpIHsKCQkJCXJlbW92ZU1vZHVsZXMocHJvamVjdCk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBub3QgYSBtb2R1bGUKCQkJaWYgKGlzVmFsaWRNb2R1bGUocHJvamVjdCkpIHsKCQkJCWFkZE1vZHVsZXMocHJvamVjdCk7CgkJCX0KCQl9Cgl9CgkKCS8qKgoJICogSGFuZGxlIGNoYW5nZXMgdG8gYSBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqIEBwYXJhbSBkZWx0YSBhIHJlc291cmNlIGRlbHRhCgkgKi8KCXByaXZhdGUgdm9pZCBoYW5kbGVQcm9qZWN0SW50ZXJuYWxDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQlmaW5hbCBJUGF0aFtdIHBhdGhzID0gZ2V0TGlzdGVuZXJQYXRocygpOwoJCWlmIChwYXRocyAhPSBudWxsKSB7CgkJCWZpbmFsIElNb2R1bGVbXSBtb2R1bGVzID0gZ2V0TW9kdWxlcyhwcm9qZWN0KTsKCQkJaWYgKG1vZHVsZXMgIT0gbnVsbCkgewoJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CgkJCQkJZmluYWwgSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW2ldOwoJCQkJCWlmIChtb2R1bGUgIT0gbnVsbCAmJiBtb2R1bGUgaW5zdGFuY2VvZiBQcm9qZWN0TW9kdWxlKSB7CgkJCQkJCS8vIGNoZWNrIGZvciBsaXN0ZW5lciBwYXRocwoJCQkJCQlmaW5hbCBpbnQgc2l6ZSA9IHBhdGhzLmxlbmd0aDsKCQkJCQkJY2xhc3MgVGVtcCB7CgkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7CgkJCQkJCX0KCQkJCQkJZmluYWwgVGVtcCB0ZW1wID0gbmV3IFRlbXAoKTsKCQkJCQkJdHJ5IHsKCQkJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHZpc2l0b3JEZWx0YSkgewoJCQkJCQkJCQlpZiAodGVtcC5mb3VuZCkKCQkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQkJSVBhdGggcGF0aCA9IHZpc2l0b3JEZWx0YS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7CgkJCQkJCQkJCQoJCQkJCQkJCQlib29sZWFuIHByZWZpeCA9IGZhbHNlOwoJCQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNpemUgJiYgIXRlbXAuZm91bmQ7IGorKykgewoJCQkJCQkJCQkJaWYgKHBhdGhzW2pdLmVxdWFscyhwYXRoKSkKCQkJCQkJCQkJCQl0ZW1wLmZvdW5kID0gdHJ1ZTsKCQkJCQkJCQkJCWVsc2UgaWYgKHBhdGguaXNQcmVmaXhPZihwYXRoc1tqXSkpCgkJCQkJCQkJCQkJcHJlZml4ID0gdHJ1ZTsKCQkJCQkJCQkJfQoJCQkJCQkJCQlpZiAodGVtcC5mb3VuZCkgewoJCQkJCQkJCQkJKChQcm9qZWN0TW9kdWxlKSBtb2R1bGUpLnVwZGF0ZSgpOwoJCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCQl9IGVsc2UgaWYgKHByZWZpeCkKCQkJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJCQllbHNlCgkJCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciBzZWFyY2hpbmcgZm9yIGxpc3RlbmluZyBwYXRocyIsIGUpOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQoKCS8qKgoJICogQWRkIGEgbW9kdWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKi8KCXByb3RlY3RlZCB2b2lkIGFkZE1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCQoJCUlNb2R1bGVbXSBtb2R1bGVzID0gY3JlYXRlTW9kdWxlcyhwcm9qZWN0KTsKCQlpZiAobW9kdWxlcyA9PSBudWxsIHx8IG1vZHVsZXMubGVuZ3RoID09IDApCgkJCXJldHVybjsKCQlwcm9qZWN0cy5wdXQocHJvamVjdCwgbW9kdWxlcyk7CgkJYWRkZWQgPSBuZXcgQXJyYXlMaXN0KDIpOwoJCWFkZGVkLmFkZEFsbChBcnJheXMuYXNMaXN0KG1vZHVsZXMpKTsKCX0KCgkvKioKCSAqIFJlbW92ZSB0aGUgbW9kdWxlcyB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICovCglwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2R1bGVzKElQcm9qZWN0IHByb2plY3QpIHsKCQkKCQl0cnkgewoJCQlJTW9kdWxlW10gbW9kdWxlcyA9IChJTW9kdWxlW10pIHByb2plY3RzLmdldChwcm9qZWN0KTsKCQkJCgkJCXByb2plY3RzLnJlbW92ZShwcm9qZWN0KTsKCQkJaWYgKHJlbW92ZWQgPT0gbnVsbCkKCQkJCXJlbW92ZWQgPSBuZXcgQXJyYXlMaXN0KDIpOwoJCQlpZihtb2R1bGVzID09IG51bGwpCgkJCQlyZXR1cm47CgkJCXJlbW92ZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QobW9kdWxlcykpOwoJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCVRyYWNlLnRyYWNlKFRyYWNlLlNFVkVSRSwgIkVycm9yIHJlbW92aW5nIG1vZHVsZSBwcm9qZWN0IiwgZSk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9qZWN0IG1heSBjb250YWluIG1vZHVsZXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgb25seSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2plY3QgbWF5IGNvbnRhaW4gbW9kdWxlcywgYW5kCgkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgZGVmaW5pdGVseSBkb2VzIG5vdAoJICovCglwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkTW9kdWxlKElQcm9qZWN0IHByb2plY3QpOwoKCS8qKgoJICogQ3JlYXRlcyB0aGUgbW9kdWxlcyBmb3IgYSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QgdG8gY3JlYXRlIG1vZHVsZXMgZm9yCgkgKiBAcmV0dXJuIGEgcG9zc2libHkgZW1wdHkgYXJyYXkgb2YgbW9kdWxlcwoJICovCglwcm90ZWN0ZWQgYWJzdHJhY3QgSU1vZHVsZVtdIGNyZWF0ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJlc291cmNlcyB0aGF0IHRoZSBtb2R1bGUgc2hvdWxkIGxpc3RlbiB0bwoJICogZm9yIHN0YXRlIGNoYW5nZXMuIFRoZSBwYXRocyBzaG91bGQgYmUgcHJvamVjdCByZWxhdGl2ZSBwYXRocy4KCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHBhdGhzLgoJICoKCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBwYXRocwoJICovCglwcm90ZWN0ZWQgSVBhdGhbXSBnZXRMaXN0ZW5lclBhdGhzKCkgewoJCXJldHVybiBudWxsOwoJfQp9