LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAqgKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGaWxlOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUubW9kZWwuSU1vZHVsZVJlc291cmNlOwovKioKICogUHVibGlzaCBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBtb2R1bGUgb24gYSBzcGVjaWZpYyBzZXJ2ZXIuCiAqLwpwdWJsaWMgY2xhc3MgTW9kdWxlUHVibGlzaEluZm8gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9JRCA9ICJtb2R1bGUtaWQiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9JRFMgPSAicGFyZW50LWlkcyI7Cglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gInBhdGgiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQU1QID0gInN0YW1wIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTERFUiA9ICJmb2xkZXIiOwoKCXByaXZhdGUgU3RyaW5nIG1vZHVsZUlkOwoJcHJpdmF0ZSBTdHJpbmcgcGFyZW50c0lkOwoJcHJpdmF0ZSBJTW9kdWxlUmVzb3VyY2VbXSByZXNvdXJjZXMgPSBuZXcgSU1vZHVsZVJlc291cmNlWzBdOwoKCS8qKgoJICogTW9kdWxlUHVibGlzaEluZm8gY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHVibGljIE1vZHVsZVB1Ymxpc2hJbmZvKFN0cmluZyBwYXJlbnRzSWQsIFN0cmluZyBtb2R1bGVJZCkgewoJCXN1cGVyKCk7CgoJCXRoaXMucGFyZW50c0lkID0gcGFyZW50c0lkOwoJCXRoaXMubW9kdWxlSWQgPSBtb2R1bGVJZDsKCX0KCQoJLyoqCgkgKiBNb2R1bGVQdWJsaXNoSW5mbyBjb25zdHJ1Y3RvciBjb21tZW50LgoJICovCglwdWJsaWMgTW9kdWxlUHVibGlzaEluZm8oSU1lbWVudG8gbWVtZW50bykgewoJCXN1cGVyKCk7CgkJCgkJbG9hZChtZW1lbnRvKTsKCX0KCQoJcHVibGljIFN0cmluZyBnZXRNb2R1bGVJZCgpIHsKCQlyZXR1cm4gbW9kdWxlSWQ7Cgl9CgkKCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50c0lkKCkgewoJCXJldHVybiBwYXJlbnRzSWQ7Cgl9CgkKCXB1YmxpYyBJTW9kdWxlUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoKSB7CgkJcmV0dXJuIHJlc291cmNlczsKCX0KCQoJcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKElNb2R1bGVSZXNvdXJjZVtdIHJlcykgewoJCXJlc291cmNlcyA9IHJlczsKCX0KCQoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgbG9hZChJTWVtZW50byBtZW1lbnRvKSB7CgkJVHJhY2UudHJhY2UoVHJhY2UuRklORVNULCAiTG9hZGluZyBtb2R1bGUgcHVibGlzaCBpbmZvIGZvcjogIiArIG1lbWVudG8pOwoJCgkJdHJ5IHsKCQkJbW9kdWxlSWQgPSBtZW1lbnRvLmdldFN0cmluZyhNT0RVTEVfSUQpOwoJCQlwYXJlbnRzSWQgPSBtZW1lbnRvLmdldFN0cmluZyhQQVJFTlRfSURTKTsKCQoJCQlyZXNvdXJjZXMgPSBsb2FkUmVzb3VyY2UobWVtZW50byk7CgkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKCQkJVHJhY2UudHJhY2UoVHJhY2UuV0FSTklORywgIkNvdWxkIG5vdCBsb2FkIG1vZHVsZSBwdWJsaXNoIGluZm8gaW5mb3JtYXRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CgkJfQoJfQoJCglwcm90ZWN0ZWQgSU1vZHVsZVJlc291cmNlW10gbG9hZFJlc291cmNlKElNZW1lbnRvIG1lbWVudG8pIHsKCQlpZiAobWVtZW50byA9PSBudWxsKQoJCQlyZXR1cm4gbmV3IElNb2R1bGVSZXNvdXJjZVswXTsKCQkKCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDUpOwoJCUlNZW1lbnRvW10gY2hpbGRyZW4gPSBtZW1lbnRvLmdldENoaWxkcmVuKEZJTEUpOwoJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJU3RyaW5nIG5hbWUgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7CgkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFBBVEgpKTsKCQkJCWxvbmcgc3RhbXAgPSBMb25nLnBhcnNlTG9uZyhjaGlsZHJlbltpXS5nZXRTdHJpbmcoU1RBTVApKTsKCQkJCU1vZHVsZUZpbGUgZmlsZSA9IG5ldyBNb2R1bGVGaWxlKG5hbWUsIHBhdGgsIHN0YW1wKTsKCQkJCWxpc3QuYWRkKGZpbGUpOwoJCQl9CgkJfQoJCWNoaWxkcmVuID0gbWVtZW50by5nZXRDaGlsZHJlbihGT0xERVIpOwoJCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7CgkJCWludCBzaXplID0gY2hpbGRyZW4ubGVuZ3RoOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJU3RyaW5nIG5hbWUgPSBjaGlsZHJlbltpXS5nZXRTdHJpbmcoTkFNRSk7CgkJCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoY2hpbGRyZW5baV0uZ2V0U3RyaW5nKFBBVEgpKTsKCQkJCU1vZHVsZUZvbGRlciBmb2xkZXIgPSBuZXcgTW9kdWxlRm9sZGVyKG5hbWUsIHBhdGgpOwoJCQkJZm9sZGVyLnNldE1lbWJlcnMobG9hZFJlc291cmNlKGNoaWxkcmVuW2ldKSk7CgkJCQlsaXN0LmFkZChmb2xkZXIpOwoJCQl9CgkJfQoJCQoJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlczIgPSBuZXcgSU1vZHVsZVJlc291cmNlW2xpc3Quc2l6ZSgpXTsKCQlsaXN0LnRvQXJyYXkocmVzb3VyY2VzMik7CgkJcmV0dXJuIHJlc291cmNlczsKCX0KCQoJLyoqCgkgKiAKCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2F2ZShJTWVtZW50byBtZW1lbnRvKSB7CgkJdHJ5IHsKCQkJbWVtZW50by5wdXRTdHJpbmcoTU9EVUxFX0lELCBtb2R1bGVJZCk7CgkJCW1lbWVudG8ucHV0U3RyaW5nKFBBUkVOVF9JRFMsIHBhcmVudHNJZCk7CgkJCQoJCQlzYXZlUmVzb3VyY2UobWVtZW50bywgcmVzb3VyY2VzKTsKCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewoJCQlUcmFjZS50cmFjZShUcmFjZS5TRVZFUkUsICJDb3VsZCBub3Qgc2F2ZSBtb2R1bGUgcHVibGlzaCBpbmZvIiwgZSk7CgkJfQoJfQoJCglwcm90ZWN0ZWQgdm9pZCBzYXZlUmVzb3VyY2UoSU1lbWVudG8gbWVtZW50bywgSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMikgewoJCWlmIChyZXNvdXJjZXMyID09IG51bGwpCgkJCXJldHVybjsKCQlpbnQgc2l6ZSA9IHJlc291cmNlczIubGVuZ3RoOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCWlmIChyZXNvdXJjZXMyW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZpbGUpIHsKCQkJCUlNb2R1bGVGaWxlIGZpbGUgPSAoSU1vZHVsZUZpbGUpIHJlc291cmNlczJbaV07CgkJCQlJTWVtZW50byBjaGlsZCA9IG1lbWVudG8uY3JlYXRlQ2hpbGQoRklMRSk7CgkJCQljaGlsZC5wdXRTdHJpbmcoTkFNRSwgZmlsZS5nZXROYW1lKCkpOwoJCQkJY2hpbGQucHV0U3RyaW5nKFBBVEgsIGZpbGUuZ2V0TW9kdWxlUmVsYXRpdmVQYXRoKCkudG9Qb3J0YWJsZVN0cmluZygpKTsKCQkJCWNoaWxkLnB1dFN0cmluZyhTVEFNUCwgIiIgKyBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwoJCQl9IGVsc2UgewoJCQkJSU1vZHVsZUZvbGRlciBmb2xkZXIgPSAoSU1vZHVsZUZvbGRlcikgcmVzb3VyY2VzMltpXTsKCQkJCUlNZW1lbnRvIGNoaWxkID0gbWVtZW50by5jcmVhdGVDaGlsZChGT0xERVIpOwoJCQkJY2hpbGQucHV0U3RyaW5nKE5BTUUsIGZvbGRlci5nZXROYW1lKCkpOwoJCQkJY2hpbGQucHV0U3RyaW5nKFBBVEgsIGZvbGRlci5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkpOwoJCQkJSU1vZHVsZVJlc291cmNlW10gcmVzb3VyY2VzMyA9IGZvbGRlci5tZW1iZXJzKCk7CgkJCQlzYXZlUmVzb3VyY2UoY2hpbGQsIHJlc291cmNlczMpOwoJCQl9CgkJfQoJfQoJCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCXJldHVybiAiTW9kdWxlUHVibGlzaEluZm8gWyIgKyBtb2R1bGVJZCArICJdIjsKCX0KfQ==