cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAqgKgogKiBDb250cmlidXRvcnM6CiAqICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwovKioKICogSGVscGVyIGNsYXNzIHRvIGxvYWQgYW5kIHNhdmUgVG9tY2F0IHNlcnZlciBhbmQgaWRlbnRpZnkgY29uZmlndXJhdGlvbnMuCiAqLwpwdWJsaWMgY2xhc3MgVG9tY2F0U2VydmVyVXRpbCB7CgkvKioKCSAqIFRvbWNhdFNlcnZlclNlcmlhbGl6ZXIgY29uc3RydWN0b3IgY29tbWVudC4KCSAqLwoJcHJvdGVjdGVkIFRvbWNhdFNlcnZlclV0aWwoKSB7CgkJc3VwZXIoKTsKCX0KCQoJLyoqCgkgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGEgPGNvZGU+UGFja2FnZUZyYWdtZW50Um9vdDwvY29kZT4gZnJvbSBpdHMgPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3JtLgoJICovCglwcm90ZWN0ZWQgc3RhdGljIGludCBnZXRDbGFzc3BhdGhLaW5kRnJvbVN0cmluZyhTdHJpbmcga2luZFN0cikgewoJCS8vaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgicHJqIikpCgkJLy8JcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVDsKCQlpZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJ2YXIiKSkKCQkJcmV0dXJuIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEU7CgkJLy9pZiAoa2luZFN0ci5lcXVhbHNJZ25vcmVDYXNlKCJzcmMiKSkKCQkvLwlyZXR1cm4gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0U7CgkJaWYgKGtpbmRTdHIuZXF1YWxzSWdub3JlQ2FzZSgibGliIikpCgkJCXJldHVybiBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk7CgkJcmV0dXJuIC0xOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gZm9yIHRoZSBraW5kIG9mIGEgY2xhc3MgcGF0aCBlbnRyeS4KCSAqLwoJcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NwYXRoS2luZFRvU3RyaW5nKGludCBraW5kKSB7CgkJc3dpdGNoIChraW5kKSB7CgkJCS8vY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1BST0pFQ1QgOgoJCQkvLwlyZXR1cm4gInByaiI7CgkJCS8vY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6CgkJCS8vCXJldHVybiAic3JjIjsKCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlkgOgoJCQkJcmV0dXJuICJsaWIiOwoJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgoJCQkJcmV0dXJuICJ2YXIiOwoJCQlkZWZhdWx0IDoKCQkJCXJldHVybiAidW5rbm93biI7CgkJfQoJfQoJCgkvKioKCSAqIENyZWF0ZSdzIGEgY2xhc3NwYXRoIGVudHJ5IG9mIHRoZSBzcGVjaWZpZWQga2luZC4KCSAqCgkgKiBSZXR1cm5zIG51bGwgaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIHZhbGlkIGVudHJ5LgoJICovCglwcm90ZWN0ZWQgc3RhdGljIElDbGFzc3BhdGhFbnRyeSBjcmVhdGVDbGFzc3BhdGhFbnRyeShJUGF0aCBwYXRoLCBpbnQga2luZCwgSVBhdGggc291cmNlQXR0YWNobWVudFBhdGgsIElQYXRoIHNvdXJjZUF0dGFjaG1lbnRSb290UGF0aCkgewoJCXN3aXRjaCAoa2luZCkgewoJCQkvKmNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUOgoJCQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gSmF2YUNvcmUubmV3UHJvamVjdEVudHJ5KHBhdGgpOyovCgkKCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0xJQlJBUlk6CgkJCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKQoJCQkJCXJldHVybiBudWxsOwoJCQkJCgkJCQlyZXR1cm4gSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwoJCgkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9WQVJJQUJMRToKCQkJCXJldHVybiBKYXZhQ29yZS5uZXdWYXJpYWJsZUVudHJ5KHBhdGgsIHNvdXJjZUF0dGFjaG1lbnRQYXRoLCBzb3VyY2VBdHRhY2htZW50Um9vdFBhdGgpOwoJCgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9Cn0=