LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS51dGlsOwoKaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CmltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CmltcG9ydCBqYXZhLnV0aWwuTGlzdDsKaW1wb3J0IGphdmEudXRpbC5NYXA7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JTW9kdWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLmludGVybmFsLlRyYWNlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLk1vZHVsZUZhY3RvcnlEZWxlZ2F0ZTsKLyoqCiAqIAogKiAKICogQHNpbmNlIDEuMAogKi8KcHVibGljIGFic3RyYWN0IGNsYXNzIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZXh0ZW5kcyBNb2R1bGVGYWN0b3J5RGVsZWdhdGUgewoJcHJvdGVjdGVkIHN0YXRpYyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKCQoJcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKCglwcm90ZWN0ZWQgTGlzdCBhZGRlZDsKCXByb3RlY3RlZCBMaXN0IHJlbW92ZWQ7CgoJLy8gbWFwIGZyb20gSVByb2plY3QgdG8gSU1vZHVsZVtdCglwcm90ZWN0ZWQgZmluYWwgTWFwIHByb2plY3RzID0gbmV3IEhhc2hNYXAoKTsKCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSBuZXcgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZS4KCSAqLwoJcHVibGljIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUoKSB7CgkJc3VwZXIoKTsKCQkKCQlmYWN0b3JpZXMuYWRkKHRoaXMpOwoJCQoJCWFkZExpc3RlbmVyKCk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcygpIHsKCQljYWNoZU1vZHVsZXModHJ1ZSk7Cgl9CgoKCS8qKgoJICogQ2FjaGUgYW55IHByZWV4aXN0aW5nIG1vZHVsZS4KCSAqIFRPRE86IFdoZW4vd2hlcmUgaXMgdGhpcyBjYWxsZWQ/CgkgKi8KCXByb3RlY3RlZCB2b2lkIGNhY2hlTW9kdWxlcyhib29sZWFuIGZvcmNlVXBkYXRlKSB7IAoJCXRyeSB7CgkJCUlQcm9qZWN0W10gcHJvamVjdHMyID0gZ2V0V29ya3NwYWNlUm9vdCgpLmdldFByb2plY3RzKCk7CgkJCWludCBzaXplID0gcHJvamVjdHMyLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCS8vVHJhY2UudHJhY2UoImNhY2hpbmc6ICIgKyB0aGlzICsgIiAiICsgcHJvamVjdHNbaV0gKyAiICIgKyBpc1ZhbGlkTW9kdWxlKHByb2plY3RzW2ldKSk7CgkJCQlpZighcHJvamVjdHMyW2ldLmlzQWNjZXNzaWJsZSgpKQoJCQkJCXJlbW92ZU1vZHVsZXMocHJvamVjdHMyW2ldKTsKCQkJCWVsc2UgaWYgKGlzVmFsaWRNb2R1bGUocHJvamVjdHMyW2ldKSAmJiAoZm9yY2VVcGRhdGUgfHwgbmVlZHNVcGRhdGluZyhwcm9qZWN0czJbaV0pKSApIHsKCQkJCQlhZGRNb2R1bGVzKHByb2plY3RzMltpXSk7CgkJCQl9IAoJCQl9CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgY2FjaGluZyBtb2R1bGVzIiwgZSk7CgkJfSBmaW5hbGx5IHsKCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwoJCX0KCX0KCglwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkc1VwZGF0aW5nKElQcm9qZWN0IHByb2plY3QpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgoJLyoqCgkgKiBSZXR1cm4gdGhlIHdvcmtzcGFjZSByb290LgoJICogCgkgKiBAcmV0dXJuIHRoZSB3b3Jrc3BhY2Ugcm9vdAoJICovCglwcml2YXRlIHN0YXRpYyBJV29ya3NwYWNlUm9vdCBnZXRXb3Jrc3BhY2VSb290KCkgewoJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbW9kdWxlcyBmb3IgdGhlIGdpdmVuIHByb2plY3QsIG9yIG51bGwKCSAqIGlmIHRoaXMgZmFjdG9yeSBkb2VzIG5vdCBoYXZlIGEgbW9kdWxlIGZvciB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1vZHVsZXMuCgkgKi8KCXB1YmxpYyBJTW9kdWxlW10gZ2V0TW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJdHJ5IHsKCQkJcmV0dXJuIChJTW9kdWxlW10pIHByb2plY3RzLmdldChwcm9qZWN0KTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQkvLyBpZ25vcmUKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJLyoqCgkgKiBBZGQgYSByZXNvdXJjZSBsaXN0ZW5lciB0byB0aGUgd29ya3NwYWNlLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYWRkTGlzdGVuZXIoKSB7CgkJaWYgKGxpc3RlbmVyICE9IG51bGwpCgkJCXJldHVybjsKCgkJbGlzdGVuZXIgPSBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CgkJCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLT4tIFByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgbGlzdGVuZXIgcmVzcG9uZGluZyB0byByZXNvdXJjZSBjaGFuZ2U6ICIgKyBldmVudC5nZXRUeXBlKCkgKyAiIC0+LSIpOwoJCQkJdHJ5IHsKCQkJCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7CgkJCQkJCgkJCQkJLy9pZiAoZGVsdGEuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTIHx8IGRlbHRhLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuTk9fQ0hBTkdFKQoJCQkJCS8vCXJldHVybjsKCQkJCQoJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSB2aXNpdG9yRGVsdGEpIHsKCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHZpc2l0b3JEZWx0YS5nZXRSZXNvdXJjZSgpOwoJCQkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5GSU5FU1QsICJyZXNvdXJjZTogIiArIHJlc291cmNlKTsKCQoJCQkJCQkJLy8gb25seSByZXNwb25kIGNoYW5nZXMgd2l0aGluIHByb2plY3RzCgkJCQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7CgkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgcmVzb3VyY2U7CgkJCQkJCQkJaGFuZGxlR2xvYmFsUHJvamVjdENoYW5nZShwcm9qZWN0LCB2aXNpdG9yRGVsdGEpOwoJCQkJCQkJCXJldHVybiB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmdldFByb2plY3QoKSAhPSBudWxsKSB7CgkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJfSBlbHNlCgkJCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CgkJCQkJLy9UcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJFcnJvciByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSIsIGUpOwoJCQkJfQoJCQkJZmlyZUdsb2JhbEV2ZW50cygpOwoJCQkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiLTwtIERvbmUgUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSByZXNwb25kaW5nIHRvIHJlc291cmNlIGNoYW5nZSAtPC0iKTsKCQkJfQoJCX07CgkJCgkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKCX0KCQoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZUdsb2JhbFByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQkvLyBoYW5kbGUgcHJvamVjdCBsZXZlbCBjaGFuZ2VzCgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCS8vVHJhY2UudHJhY2UoIkZpcmluZyB0bzogIiArIGZhY3RvcnkpOwoJCQlmYWN0b3J5LmhhbmRsZVByb2plY3RDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCQkKCQkvLyBoYW5kbGUgaW50ZXJuYWwgdXBkYXRlcwoJCWl0ZXJhdG9yID0gZmFjdG9yaWVzLml0ZXJhdG9yKCk7CgkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewoJCQlQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlIGZhY3RvcnkgPSAoUHJvamVjdE1vZHVsZUZhY3RvcnlEZWxlZ2F0ZSkgaXRlcmF0b3IubmV4dCgpOwoJCQkvL1RyYWNlLnRyYWNlKCJGaXJpbmcgdG86ICIgKyBmYWN0b3J5KTsKCQkJZmFjdG9yeS5oYW5kbGVQcm9qZWN0SW50ZXJuYWxDaGFuZ2UocHJvamVjdCwgZGVsdGEpOwoJCX0KCX0KCQoJLyoqCgkgKiBGaXJlIHRoZSBhY2N1bXVsYXRlZCBtb2R1bGUgZmFjdG9yeSBldmVudHMuCgkgKi8KCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaXJlR2xvYmFsRXZlbnRzKCkgewoJCVRyYWNlLnRyYWNlKFRyYWNlLkZJTkVTVCwgIkZpcmluZyBnbG9iYWwgbW9kdWxlIGV2ZW50Iik7CgkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3JpZXMuaXRlcmF0b3IoKTsKCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CgkJCVByb2plY3RNb2R1bGVGYWN0b3J5RGVsZWdhdGUgZmFjdG9yeSA9IChQcm9qZWN0TW9kdWxlRmFjdG9yeURlbGVnYXRlKSBpdGVyYXRvci5uZXh0KCk7CgkJCWZhY3RvcnkudXBkYXRlUHJvamVjdHMoKTsKCQl9Cgl9CgoJLyoqCgkgKiBUZW1wb3JhcnkgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHByb2plY3QgbW9kdWxlcyBhcmUgdXBkYXRlZC4KCSAqLwoJcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb2plY3RzKCkgewoJCUlNb2R1bGVbXSBtb2R1bGVzMiA9IGdldE1vZHVsZXMoKTsKCQlpZiAobW9kdWxlczIgIT0gbnVsbCkgewoJCQlpbnQgc2l6ZSA9IG1vZHVsZXMyLmxlbmd0aDsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKCQkJCWlmIChtb2R1bGVzMltpXSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpCgkJCQkJKChQcm9qZWN0TW9kdWxlKSBtb2R1bGVzMltpXSkudXBkYXRlKCk7CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBIYW5kbGUgY2hhbmdlcyB0byBhIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHBhcmFtIGRlbHRhIGEgcmVzb3VyY2UgZGVsdGEKCSAqLwoJcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2plY3RDaGFuZ2UoZmluYWwgSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKCQlpZighaW5pdGlhbGl6ZWQpCgkJCWNhY2hlTW9kdWxlcyhmYWxzZSk7CgkJaWYgKHByb2plY3RzLmNvbnRhaW5zS2V5KHByb2plY3QpKSB7CgkJCS8vIGFscmVhZHkgYSBtb2R1bGUKCQkJaWYgKCgoZGVsdGEuZ2V0S2luZCgpICYgIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpICE9IDApIHx8ICFpc1ZhbGlkTW9kdWxlKHByb2plY3QpKSB7CgkJCQlyZW1vdmVNb2R1bGVzKHByb2plY3QpOwoJCQl9CgkJfSBlbHNlIHsKCQkJLy8gbm90IGEgbW9kdWxlCgkJCWlmIChpc1ZhbGlkTW9kdWxlKHByb2plY3QpKSB7CgkJCQlhZGRNb2R1bGVzKHByb2plY3QpOwoJCQl9CgkJfQoJfQoJCgkvKioKCSAqIEhhbmRsZSBjaGFuZ2VzIHRvIGEgcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKiBAcGFyYW0gZGVsdGEgYSByZXNvdXJjZSBkZWx0YQoJICovCglwcml2YXRlIHZvaWQgaGFuZGxlUHJvamVjdEludGVybmFsQ2hhbmdlKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7CgkJZmluYWwgSVBhdGhbXSBwYXRocyA9IGdldExpc3RlbmVyUGF0aHMoKTsKCQlpZiAocGF0aHMgIT0gbnVsbCkgewoJCQlmaW5hbCBJTW9kdWxlW10gbW9kdWxlcyA9IGdldE1vZHVsZXMocHJvamVjdCk7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewoJCQkJZmluYWwgSU1vZHVsZSBtb2R1bGUgPSBtb2R1bGVzW2ldOwoJCQkJaWYgKG1vZHVsZSAhPSBudWxsICYmIG1vZHVsZSBpbnN0YW5jZW9mIFByb2plY3RNb2R1bGUpIHsKCQkJCQkvLyBjaGVjayBmb3IgbGlzdGVuZXIgcGF0aHMKCQkJCQlmaW5hbCBpbnQgc2l6ZSA9IHBhdGhzLmxlbmd0aDsKCQkJCQljbGFzcyBUZW1wIHsKCQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwoJCQkJCX0KCQkJCQlmaW5hbCBUZW1wIHRlbXAgPSBuZXcgVGVtcCgpOwoJCQkJCXRyeSB7CgkJCQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewoJCQkJCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgdmlzaXRvckRlbHRhKSB7CgkJCQkJCQkJaWYgKHRlbXAuZm91bmQpCgkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCQlJUGF0aCBwYXRoID0gdmlzaXRvckRlbHRhLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKCQkJCQkJCQkKCQkJCQkJCQlib29sZWFuIHByZWZpeCA9IGZhbHNlOwoJCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2l6ZSAmJiAhdGVtcC5mb3VuZDsgaisrKSB7CgkJCQkJCQkJCWlmIChwYXRoc1tqXS5lcXVhbHMocGF0aCkpCgkJCQkJCQkJCQl0ZW1wLmZvdW5kID0gdHJ1ZTsKCQkJCQkJCQkJZWxzZSBpZiAocGF0aC5pc1ByZWZpeE9mKHBhdGhzW2pdKSkKCQkJCQkJCQkJCXByZWZpeCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJCWlmICh0ZW1wLmZvdW5kKSB7CgkJCQkJCQkJCSgoUHJvamVjdE1vZHVsZSkgbW9kdWxlKS51cGRhdGUoKTsKCQkJCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCQkJCX0gZWxzZSBpZiAocHJlZml4KQoJCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCQllbHNlCgkJCQkJCQkJCXJldHVybiBmYWxzZTsKCQkJCQkJCX0KCQkJCQkJfSk7CgkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3Igc2VhcmNoaW5nIGZvciBsaXN0ZW5pbmcgcGF0aHMiLCBlKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBBZGQgYSBtb2R1bGUgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgoJICogCgkgKiBAcGFyYW0gcHJvamVjdCBhIHByb2plY3QKCSAqLwoJcHJvdGVjdGVkIHZvaWQgYWRkTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KSB7CgkJCgkJSU1vZHVsZVtdIG1vZHVsZXMgPSBjcmVhdGVNb2R1bGVzKHByb2plY3QpOwoJCWlmIChtb2R1bGVzID09IG51bGwgfHwgbW9kdWxlcy5sZW5ndGggPT0gMCkKCQkJcmV0dXJuOwoJCXByb2plY3RzLnB1dChwcm9qZWN0LCBtb2R1bGVzKTsKCQlhZGRlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJYWRkZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QobW9kdWxlcykpOwoJfQoKCS8qKgoJICogUmVtb3ZlIHRoZSBtb2R1bGVzIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gcHJvamVjdC4KCSAqIAoJICogQHBhcmFtIHByb2plY3QgYSBwcm9qZWN0CgkgKi8KCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZHVsZXMoSVByb2plY3QgcHJvamVjdCkgewoJCQoJCXRyeSB7CgkJCUlNb2R1bGVbXSBtb2R1bGVzID0gKElNb2R1bGVbXSkgcHJvamVjdHMuZ2V0KHByb2plY3QpOwoJCQkKCQkJcHJvamVjdHMucmVtb3ZlKHByb2plY3QpOwoJCQlpZiAocmVtb3ZlZCA9PSBudWxsKQoJCQkJcmVtb3ZlZCA9IG5ldyBBcnJheUxpc3QoMik7CgkJCWlmKG1vZHVsZXMgPT0gbnVsbCkKCQkJCXJldHVybjsKCQkJcmVtb3ZlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChtb2R1bGVzKSk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuU0VWRVJFLCAiRXJyb3IgcmVtb3ZpbmcgbW9kdWxlIHByb2plY3QiLCBlKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb2plY3QgbWF5IGNvbnRhaW4gbW9kdWxlcyBvZiB0aGUgY29ycmVjdCB0eXBlLgoJICogVGhpcyBtZXRob2QgaXMgdXNlZCBvbmx5IHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvamVjdCBtYXkgY29udGFpbiBtb2R1bGVzLCBhbmQKCSAqICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBkZWZpbml0ZWx5IGRvZXMgbm90CgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzVmFsaWRNb2R1bGUoSVByb2plY3QgcHJvamVjdCk7CgoJLyoqCgkgKiBDcmVhdGVzIHRoZSBtb2R1bGVzIGZvciBhIGdpdmVuIHByb2plY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9qZWN0IGEgcHJvamVjdCB0byBjcmVhdGUgbW9kdWxlcyBmb3IKCSAqIEByZXR1cm4gYSBwb3NzaWJseSBlbXB0eSBhcnJheSBvZiBtb2R1bGVzCgkgKi8KCXByb3RlY3RlZCBhYnN0cmFjdCBJTW9kdWxlW10gY3JlYXRlTW9kdWxlcyhJUHJvamVjdCBwcm9qZWN0KTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzIHRoYXQgdGhlIG1vZHVsZSBzaG91bGQgbGlzdGVuIHRvCgkgKiBmb3Igc3RhdGUgY2hhbmdlcy4gVGhlIHBhdGhzIHNob3VsZCBiZSBwcm9qZWN0IHJlbGF0aXZlIHBhdGhzLgoJICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGUgcGF0aHMuCgkgKgoJICogQHJldHVybiBhIHBvc3NpYmx5IGVtcHR5IGFycmF5IG9mIHBhdGhzCgkgKi8KCXByb3RlY3RlZCBJUGF0aFtdIGdldExpc3RlbmVyUGF0aHMoKSB7CgkJcmV0dXJuIG51bGw7Cgl9Cn0=