LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDA2IEVjbGlwc2UgRm91bmRhdGlvbgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKiAKICogQ29udHJpYnV0b3JzOgogKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGplc3BlckBzZWxza2FiZXQub3JnCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXN0cy5mb3JtYXQ7CgppbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CmltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwoKaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKCmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7CmltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7CmltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwppbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7CmltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7CgpwdWJsaWMgY2xhc3MgVGVzdEZvcm1hdFByb2Nlc3NvclhNTCBleHRlbmRzIFRlc3RDYXNlIHsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNQTElUX01VTFRJX0FUVFJTID0gZmFsc2U7CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVCA9ICIgIjsKCglwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9IGZhbHNlOwoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTElORV9XSURUSCA9IDcyOwoKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfOCA9ICJVVEYtOCI7CgoJcHVibGljIFRlc3RGb3JtYXRQcm9jZXNzb3JYTUwoU3RyaW5nIG5hbWUpIHsKCQlzdXBlcihuYW1lKTsKCX0KCglwcml2YXRlIEZvcm1hdFByb2Nlc3NvclhNTCBmb3JtYXRQcm9jZXNzb3I7CgoJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKCQlmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Cgl9CgoJLyoqCgkgKiBtdXN0IHJlbGVhc2UgbW9kZWwgKGZyb20gZWRpdCkgYWZ0ZXIKCSAqIAoJICogQHBhcmFtIGZpbGVuYW1lCgkgKiAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoaXMgY2xhc3MgKFRlc3RTdHJ1Y3R1cmVkUGFydGl0aW9uZXIpCgkgKi8KCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7CgoJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwoJCXRyeSB7CgkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlcgoJCQkJCS5nZXRNb2RlbE1hbmFnZXIoKTsKCQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZW5hbWUpOwoJCQlpZiAoaW5TdHJlYW0gPT0gbnVsbCkKCQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkNhbid0IGZpbGUgcmVzb3VyY2Ugc3RyZWFtICIKCQkJCQkJKyBmaWxlbmFtZSk7CgkJCWZpbmFsIFN0cmluZyBiYXNlRmlsZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoZmlsZW5hbWUpLnRvU3RyaW5nKCk7CgkJCW1vZGVsID0gbW9kZWxNYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChiYXNlRmlsZSwgaW5TdHJlYW0sIAoJCQluZXcgVVJJUmVzb2x2ZXIoKSB7CgoJCQkJU3RyaW5nIGZCYXNlID0gYmFzZUZpbGUgOwoJCQkJCgkJCQlwdWJsaWMgU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKSB7CgkJCQkJcmV0dXJuIGZCYXNlOwoJCQkJfQoKCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7CgkJCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBmQmFzZSk7CgkJCQl9CgoJCQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7CgkJCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpKTsKCQkJCX0KCgkJCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpIHsKCQkJCQlpbnQgbGFzdFNsYXNoID0gYmFzZVJlZmVyZW5jZS5sYXN0SW5kZXhPZigiLyIpOwoJCQkJCWlmIChsYXN0U2xhc2ggPiAwKQoJCQkJCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoKzEpICsgdXJpOwoJCQkJCXJldHVybiBiYXNlUmVmZXJlbmNlOwoJCQkJfQoKCQkJCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKCQkJCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UpOyAKCQkJCX0KCgkJCQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQlwdWJsaWMgSUNvbnRhaW5lciBnZXRSb290TG9jYXRpb24oKSB7CgkJCQkJcmV0dXJuIG51bGw7CgkJCQl9CgoJCQkJcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7CgkJCQkJcmV0dXJuICBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oZ2V0TG9jYXRpb25CeVVSSSh1cmkpKTsKCQkJCX0KCgkJCQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdMb2NhdGlvbikgewoJCQkJCXRoaXMuZkJhc2UgPSBuZXdMb2NhdGlvbjsKCQkJCX0KCgkJCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKCQkJCX19KTsKCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewoJCQlleC5wcmludFN0YWNrVHJhY2UoKTsKCQl9CgkJcmV0dXJuIG1vZGVsOwoJfQoKCXByb3RlY3RlZCBib29sZWFuIGlzQnl0ZUFycmF5SWRlbnRpY2FsKGJ5dGUgYjFbXSwgYnl0ZSBiMltdKSB7CgkJaWYgKGIxLmxlbmd0aCAhPSBiMi5sZW5ndGgpCgkJCXJldHVybiBmYWxzZTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGIxLmxlbmd0aDsgKytpKQoJCQlpZiAoYjFbaV0gIT0gYjJbaV0pCgkJCQlyZXR1cm4gZmFsc2U7CgkJcmV0dXJuIHRydWU7Cgl9CgoJcHJvdGVjdGVkIHZvaWQgZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKFN0cmluZyBiZWZvcmVQYXRoLCBTdHJpbmcgYWZ0ZXJQYXRoKQoJCQl0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewoJCUlTdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlTW9kZWwgPSBudWxsLCBhZnRlck1vZGVsID0gbnVsbDsKCQl0cnkgewoJCQliZWZvcmVNb2RlbCA9IGdldE1vZGVsRm9yRWRpdChiZWZvcmVQYXRoKTsKCQkJYXNzZXJ0Tm90TnVsbCgiY291bGQgbm90IHJldHJpZXZlIHN0cnVjdHVyZWQgbW9kZWwgZm9yIDogIgoJCQkJCSsgYmVmb3JlUGF0aCwgYmVmb3JlTW9kZWwpOwoKCQkJYWZ0ZXJNb2RlbCA9IGdldE1vZGVsRm9yRWRpdChhZnRlclBhdGgpOwoJCQlhc3NlcnROb3ROdWxsKCJjb3VsZCBub3QgcmV0cmlldmUgc3RydWN0dXJlZCBtb2RlbCBmb3IgOiAiCgkJCQkJKyBhZnRlclBhdGgsIGFmdGVyTW9kZWwpOwoKCQkJSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByb2Nlc3NvcgoJCQkJCS5nZXRGb3JtYXRQcmVmZXJlbmNlcygpOwoJCQlmb3JtYXRQcmVmZXJlbmNlcy5zZXRMaW5lV2lkdGgoTUFYX0xJTkVfV0lEVEgpOwoJCQlmb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMoQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKTsKCQkJZm9ybWF0UHJlZmVyZW5jZXMuc2V0SW5kZW50KElOREVOVCk7CgkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZm9ybWF0UHJlZmVyZW5jZXMpCgkJCQkJLnNldFNwbGl0TXVsdGlBdHRycyhTUExJVF9NVUxUSV9BVFRSUyk7CgoJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0TW9kZWwoYmVmb3JlTW9kZWwpOwoKCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZvcm1hdHRlZEJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQliZWZvcmVNb2RlbC5zYXZlKGZvcm1hdHRlZEJ5dGVzKTsgLy8gImJlZm9yZU1vZGVsIiBzaG91bGQgbm93IGJlCgkJCQkJCQkJCQkJCS8vIGFmdGVyIHRoZSBmb3JtYXR0ZXIKCgkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBhZnRlckJ5dGVzID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwoJCQlhZnRlck1vZGVsLnNhdmUoYWZ0ZXJCeXRlcyk7CgoJCQlhc3NlcnRFcXVhbHMoIkZvcm1hdHRlZCBkb2N1bWVudCBkaWZmZXJzIGZyb20gdGhlIGV4cGVjdGVkIiwKCQkJCQluZXcgU3RyaW5nKGFmdGVyQnl0ZXMudG9CeXRlQXJyYXkoKSwgVVRGXzgpLCBuZXcgU3RyaW5nKAoJCQkJCQkJZm9ybWF0dGVkQnl0ZXMudG9CeXRlQXJyYXkoKSwgVVRGXzgpKTsKCgkJCS8vIERvIHRoZSBzYW1lIGNoZWNrIGluIGJpbmFyeSBmb3Iga2lja3MKCQkJYXNzZXJ0VHJ1ZSgiRm9ybWF0dGVkIGRvY3VtZW50IGRpZmZlcnMgZnJvbXRvIHRoZSBleHBlY3RlZCIsCgkJCQkJaXNCeXRlQXJyYXlJZGVudGljYWwoZm9ybWF0dGVkQnl0ZXMudG9CeXRlQXJyYXkoKSwKCQkJCQkJCWFmdGVyQnl0ZXMudG9CeXRlQXJyYXkoKSkpOwoJCX0gZmluYWxseSB7CgkJCWlmIChiZWZvcmVNb2RlbCAhPSBudWxsKQoJCQkJYmVmb3JlTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7CgkJCWlmIChhZnRlck1vZGVsICE9IG51bGwpCgkJCQlhZnRlck1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwoJCX0KCX0KCglwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlWG1sKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sCgkJCUlPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlmb3JtYXRBbmRBc3NlcnRFcXVhbHMoInRlc3RmaWxlcy94bWwvc2ltcGxlLXN0YW5kYWxvbmUueG1sIiwKCQkJCSJ0ZXN0ZmlsZXMveG1sL3NpbXBsZS1zdGFuZGFsb25lLWZtdC54bWwiKTsKCX0KCglwdWJsaWMgdm9pZCB0ZXN0UHJlc2VydmVGb3JtYXQoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwKCQlJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7CgkJZm9ybWF0QW5kQXNzZXJ0RXF1YWxzKCJ0ZXN0ZmlsZXMveG1sL3htbC1zcGFjZS1wcmVzZXJ2ZS1zdGFuZGFsb25lLnhtbCIsCgkJInRlc3RmaWxlcy94bWwveG1sLXNwYWNlLXByZXNlcnZlLXN0YW5kYWxvbmUtZm10LnhtbCIpOwoJfQoKCXB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2ZUZvcm1hdERURCgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLAoJCUlPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKCQlmb3JtYXRBbmRBc3NlcnRFcXVhbHMoInRlc3RmaWxlcy94bWwveG1sLXNwYWNlLXByZXNlcnZlLWR0ZC54bWwiLAoJCSJ0ZXN0ZmlsZXMveG1sL3htbC1zcGFjZS1wcmVzZXJ2ZS1kdGQtZm10LnhtbCIpOwoJfQoKfQo=