cGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5jb3JlLmludGVybmFsLmNvbW1hbmQ7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4goCBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCiAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCqAqCiAqIENvbnRyaWJ1dG9yczoKICogICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5JVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwppbXBvcnQgb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuY29yZS5XZWJNb2R1bGU7CmltcG9ydCBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5pbnRlcm5hbC5jb3JlLlRvbWNhdFBsdWdpbjsKLyoqCiAqIENvbW1hbmQgdG8gbW9kaWZ5IHRoZSBwYXRoIG9mIGEgV2ViIG1vZHVsZS4KICovCnB1YmxpYyBjbGFzcyBTZXRXZWJNb2R1bGVQYXRoQ29tbWFuZCBleHRlbmRzIENvbmZpZ3VyYXRpb25Db21tYW5kIHsKCXByb3RlY3RlZCBpbnQgaW5kZXg7Cglwcm90ZWN0ZWQgV2ViTW9kdWxlIG9sZE1vZHVsZTsKCXByb3RlY3RlZCBTdHJpbmcgcGF0aDsKCgkvKioKCSAqIFNldFdlYk1vZHVsZVBhdGhDb21tYW5kIGNvbnN0cnVjdG9yIGNvbW1lbnQuCgkgKi8KCXB1YmxpYyBTZXRXZWJNb2R1bGVQYXRoQ29tbWFuZChJVG9tY2F0Q29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZ3VyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIGNvbnRleHRSb290KSB7CgkJc3VwZXIoY29uZmlndXJhdGlvbik7CgkJdGhpcy5pbmRleCA9IGluZGV4OwoJCXRoaXMucGF0aCA9IGNvbnRleHRSb290OwoJfQoKCS8qKgoJICogRXhlY3V0ZSB0aGUgY29tbWFuZC4KCSAqIEByZXR1cm4gYm9vbGVhbgoJICovCglwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgewoJCW9sZE1vZHVsZSA9IChXZWJNb2R1bGUpIGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmdldChpbmRleCk7CgkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwoJCQoJCVdlYk1vZHVsZSBtb2R1bGUgPSBuZXcgV2ViTW9kdWxlKHBhdGgsIG9sZE1vZHVsZS5nZXREb2N1bWVudEJhc2UoKSwgb2xkTW9kdWxlLmdldE1lbWVudG8oKSwgb2xkTW9kdWxlLmlzUmVsb2FkYWJsZSgpKTsKCQljb25maWd1cmF0aW9uLmFkZFdlYk1vZHVsZShpbmRleCwgbW9kdWxlKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhpcyBjb21tYW5kJ3MgZGVzY3JpcHRpb24uCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKCQlpZiAob2xkTW9kdWxlID09IG51bGwpCgkJCW9sZE1vZHVsZSA9IChXZWJNb2R1bGUpIGNvbmZpZ3VyYXRpb24uZ2V0V2ViTW9kdWxlcygpLmdldChpbmRleCk7CgkJCgkJcmV0dXJuIFRvbWNhdFBsdWdpbi5nZXRSZXNvdXJjZSgiJWNvbmZpZ3VyYXRpb25FZGl0b3JBY3Rpb25FZGl0V2ViTW9kdWxlRGVzY3JpcHRpb24iLCBvbGRNb2R1bGUuZ2V0UGF0aCgpLCBwYXRoKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhpcyBjb21tYW5kJ3MgbGFiZWwuCgkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKCSAqLwoJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBUb21jYXRQbHVnaW4uZ2V0UmVzb3VyY2UoIiVjb25maWd1cmF0aW9uRWRpdG9yQWN0aW9uRWRpdFdlYk1vZHVsZVBhdGgiKTsKCX0KCgkvKioKCSAqIFVuZG8gdGhlIGNvbW1hbmQuCgkgKi8KCXB1YmxpYyB2b2lkIHVuZG8oKSB7CgkJY29uZmlndXJhdGlvbi5yZW1vdmVXZWJNb2R1bGUoaW5kZXgpOwoJCWNvbmZpZ3VyYXRpb24uYWRkV2ViTW9kdWxlKGluZGV4LCBvbGRNb2R1bGUpOwoJfQp9