cGFja2FnZSBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLmNvcmU7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnAuIGFuZCBvdGhlcnMuCkFsbCByaWdodHMgcmVzZXJ2ZWQuIKAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwphcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjAuNQp3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MDUuaHRtbAqgCkNvbnRyaWJ1dG9yczoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW1wb3J0IGphdmEubmV0Lio7CgppbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7CmltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwppbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47CgovKioKICogRXh0ZXJuYWwgdG9vbHMgcGx1Zy1pbiBjbGFzcwogKi8KcHVibGljIGZpbmFsIGNsYXNzIEV4dGVybmFsVG9vbHNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzIjsgLy8kTk9OLU5MUy0xJDsKCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0NPTlNPTEVfSUQgPSBQTFVHSU5fSUQgKyAiLkxvZ0NvbnNvbGVWaWV3IjsgLy8kTk9OLU5MUy0xJDsKCQoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0FOVF9UT09MPSAiaWNvbnMvZnVsbC9vYmoxNi9hbnRfZmlsZS5naWYiOyAvLyROT04tTkxTLTEkOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0JVSUxERVI9ICJpY29ucy9mdWxsL29iajE2L2J1aWxkZXIuZ2lmIjsgLy8kTk9OLU5MUy0xJDsKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19KQVJfRklMRSA9ICJpY29ucy9mdWxsL29iajE2L2phcl9sX29iai5naWYiOyAvLyROT04tTkxTLTEkOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0NMQVNTUEFUSCA9ICJpY29ucy9mdWxsL29iajE2L2NsYXNzcGF0aC5naWYiOyAvLyROT04tTkxTLTEkOwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi90eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQ7CglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVhURVJOQUxfVE9PTCA9ICJpY29ucy9mdWxsL29iajE2L2V4dGVybmFsX3Rvb2xzLmdpZiI7IC8vJE5PTi1OTFMtMSQKCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19JTlZBTElEX0JVSUxEX1RPT0wgPSAiaWNvbnMvZnVsbC9vYmoxNi9pbnZhbGlkX2J1aWxkX3Rvb2wuZ2lmIjsgLy8kTk9OLU5MUy0xJAoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9FWFRFUk5BTF9UT09MUyA9ICJpY29ucy9mdWxsL3dpemJhbi9leHRfdG9vbHNfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKCQoJcHJpdmF0ZSBzdGF0aWMgRXh0ZXJuYWxUb29sc1BsdWdpbiBwbHVnaW47Cglwcml2YXRlIEV4dGVybmFsVG9vbHNSZWdpc3RyeSByZWdpc3RyeTsKCQoJLyoqCgkgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEV4dGVybmFsIFRvb2xzIHBsdWctaW4uCgkgKi8KCXB1YmxpYyBFeHRlcm5hbFRvb2xzUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKCQlzdXBlcihkZXNjcmlwdG9yKTsKCQlwbHVnaW4gPSB0aGlzOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmVyLgoJICogVGhpcyByZXByZXNlbnRzIHRoZSBydW50aW1lIHBsdWdpbi4KCSAqLwoJcHVibGljIHN0YXRpYyBFeHRlcm5hbFRvb2xzUGx1Z2luIGdldERlZmF1bHQoKSB7CgkJcmV0dXJuIHBsdWdpbjsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHJlZ2lzdHJ5IG9mIGV4dGVybmFsIHRvb2xzIHRoYXQgdGhlCgkgKiB1c2VyIGNhbiBydW4gdXNpbmcgdGhlIGV4dGVybmFsIHRvb2xzIG1lbnUuIERvZXMKCSAqIG5vdCBpbmNsdWRlIGV4dGVybmFsIHRvb2xzIHBhcnQgb2YgdGhlIGJ1aWxkIHByb2Nlc3MuCgkgKi8KCXB1YmxpYyBFeHRlcm5hbFRvb2xzUmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7CgkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpCgkJCXJlZ2lzdHJ5ID0gbmV3IEV4dGVybmFsVG9vbHNSZWdpc3RyeSgpOwoJCXJldHVybiByZWdpc3RyeTsKCX0KCgkvKioKCSAqIFdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgcGx1Zy1pbidzIGxvZwoJICogCgkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgdGV4dCB0byB3cml0ZSB0byB0aGUgbG9nCgkgKi8KCXB1YmxpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewoJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKFN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBleGNlcHRpb24pOwoJCWdldExvZygpLmxvZyhzdGF0dXMpOwoJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIEltYWdlRGVzY3JpcHRvciBmb3IgdGhlIGljb24gd2l0aCB0aGUgZ2l2ZW4gcGF0aAoJICogCgkgKiBAcmV0dXJuIHRoZSBJbWFnZURlc2NyaXB0b3Igb2JqZWN0CgkgKi8KCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7CgkJdHJ5IHsKCQkJVVJMIGluc3RhbGxVUkwgPSBnZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwoJCQlVUkwgdXJsID0gbmV3IFVSTChpbnN0YWxsVVJMLHBhdGgpOwoJCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsKTsKCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgkKCS8qIChub24tSmF2YWRvYykKCSAqIE1ldGhvZCBkZWNsYXJlZCBpbiBBYnN0cmFjdFVJUGx1Z2luLgoJICovCglwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZnMpIHsKCQlwcmVmcy5zZXREZWZhdWx0KElQcmVmZXJlbmNlQ29uc3RhbnRzLkFVVE9fU0FWRSwgZmFsc2UpOwoJCXByZWZzLnNldERlZmF1bHQoSVByZWZlcmVuY2VDb25zdGFudHMuSU5GT19MRVZFTCwgdHJ1ZSk7CgkJcHJlZnMuc2V0RGVmYXVsdChJUHJlZmVyZW5jZUNvbnN0YW50cy5WRVJCT1NFX0xFVkVMLCBmYWxzZSk7CgkJcHJlZnMuc2V0RGVmYXVsdChJUHJlZmVyZW5jZUNvbnN0YW50cy5ERUJVR19MRVZFTCwgZmFsc2UpOwoJCgkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZzLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0VSUk9SX1JHQiwgbmV3IFJHQigyNTUsIDAsIDApKTsgCQkvLyByZWQgLSBleGFjdGx5IHRoZSBzYW1lIGFzIGRlYnVnIENvbnNvbAoJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0RGVmYXVsdChwcmVmcywgSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9XQVJOSU5HX1JHQiwgbmV3IFJHQigyNTUsIDEwMCwgMCkpOyAJLy8gb3JhbmdlCgkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHByZWZzLCBJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fUkdCLCBuZXcgUkdCKDAsIDAsIDI1NSkpOyAJCS8vIGJsdWUKCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQocHJlZnMsIElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfVkVSQk9TRV9SR0IsIG5ldyBSR0IoMCwgMjAwLCAxMjUpKTsJLy8gZ3JlZW4KCQlQcmVmZXJlbmNlQ29udmVydGVyLnNldERlZmF1bHQocHJlZnMsIElQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfREVCVUdfUkdCLCBuZXcgUkdCKDAsIDAsIDApKTsJCQkvLyBibGFjawoJfQkKfQo=